Files
core/settings.py
Untone d87c0c522c
All checks were successful
Deploy on push / deploy (push) Successful in 9m43s
[0.9.22] - 2025-09-22
### Fixed
- 🔒 **OAuth Facebook**: Обновлена версия API с v13.0 до v18.0 (актуальная)
- 🔒 **OAuth Facebook**: Добавлены обязательные scope и параметры безопасности
- 🔒 **OAuth Facebook**: Улучшена обработка ошибок API и валидация ответов
- 🔒 **OAuth VK**: Обновлена версия API с v5.131 до v5.199+ (актуальная)
- 🔒 **OAuth VK**: Исправлен endpoint с `authors.get` на `users.get`
- 🔒 **OAuth GitHub**: Добавлены обязательные scope `read:user user:email`
- 🔒 **OAuth GitHub**: Улучшена обработка ошибок и получения email адресов
- 🔒 **OAuth Google**: Добавлены обязательные scope для OpenID Connect
- 🔒 **OAuth X/Twitter**: Исправлен endpoint с `authors/me` на `users/me`
- 🔒 **Session Cookies**: Автоматическое определение HTTPS через переменную окружения HTTPS_ENABLED
- 🏷️ **Type Safety**: Исправлена ошибка в OAuth регистрации провайдеров
2025-09-22 23:56:04 +03:00

101 lines
3.4 KiB
Python

"""Настройки приложения"""
import datetime
import os
from os import environ
from pathlib import Path
from typing import Literal
# Корневая директория проекта
ROOT_DIR = Path(__file__).parent.absolute()
DEV_SERVER_PID_FILE_NAME = "dev-server.pid"
PORT = environ.get("PORT") or 8000
# storages
DB_URL = (
environ.get("DATABASE_URL", "").replace("postgres://", "postgresql://")
or environ.get("DB_URL", "").replace("postgres://", "postgresql://")
or "sqlite:///discoursio.db"
)
DATABASE_URL = DB_URL
REDIS_URL = environ.get("REDIS_URL") or "redis://127.0.0.1"
# debug
GLITCHTIP_DSN = environ.get("GLITCHTIP_DSN")
# auth
ADMIN_SECRET = environ.get("AUTH_SECRET") or "nothing"
ADMIN_EMAILS = (
environ.get("ADMIN_EMAILS") or "services@discours.io,guests@discours.io,welcome@discours.io,test_admin@discours.io"
)
# own auth
ONETIME_TOKEN_LIFE_SPAN = 60 * 15 # 15 минут
SESSION_TOKEN_LIFE_SPAN = 60 * 60 * 24 * 30 # 30 дней
SESSION_TOKEN_HEADER = "Authorization"
JWT_ALGORITHM = "HS256"
JWT_SECRET_KEY = os.getenv("JWT_SECRET_KEY", "default_secret_key_change_in_production-ok?")
JWT_ISSUER = "discours"
JWT_EXPIRATION_DELTA = datetime.timedelta(days=30) # Токен действителен 30 дней
# URL фронтенда
FRONTEND_URL = os.getenv("FRONTEND_URL", "http://localhost:3000")
# Настройки OAuth провайдеров
OAUTH_CLIENTS = {
"GOOGLE": {
"id": os.getenv("GOOGLE_CLIENT_ID", ""),
"key": os.getenv("GOOGLE_CLIENT_SECRET", ""),
},
"GITHUB": {
"id": os.getenv("GITHUB_CLIENT_ID", ""),
"key": os.getenv("GITHUB_CLIENT_SECRET", ""),
},
"FACEBOOK": {
"id": os.getenv("FACEBOOK_APP_ID", ""),
"key": os.getenv("FACEBOOK_APP_SECRET", ""),
},
"X": {
"id": os.getenv("X_CLIENT_ID", ""),
"key": os.getenv("X_CLIENT_SECRET", ""),
},
"YANDEX": {
"id": os.getenv("YANDEX_CLIENT_ID", ""),
"key": os.getenv("YANDEX_CLIENT_SECRET", ""),
},
"VK": {
"id": os.getenv("VK_APP_ID", ""),
"key": os.getenv("VK_APP_SECRET", ""),
},
"TELEGRAM": {
"id": os.getenv("TELEGRAM_CLIENT_ID", ""),
"key": os.getenv("TELEGRAM_CLIENT_SECRET", ""),
},
}
# Настройки JWT
JWT_SECRET = os.getenv("JWT_SECRET", "your-secret-key")
JWT_ACCESS_TOKEN_EXPIRE_MINUTES = 30
JWT_REFRESH_TOKEN_EXPIRE_DAYS = int(environ.get("JWT_REFRESH_TOKEN_EXPIRE_DAYS", "30"))
# Настройки для HTTP cookies (используется в auth middleware)
SESSION_COOKIE_NAME = "session_token"
# 🔒 Автоматически определяем HTTPS на основе окружения
SESSION_COOKIE_SECURE = os.getenv("HTTPS_ENABLED", "true").lower() in ["true", "1", "yes"]
SESSION_COOKIE_HTTPONLY = True
SESSION_COOKIE_SAMESITE: Literal["lax", "strict", "none"] = "lax"
SESSION_COOKIE_MAX_AGE = 30 * 24 * 60 * 60 # 30 дней
MAILGUN_API_KEY = os.getenv("MAILGUN_API_KEY", "")
MAILGUN_DOMAIN = os.getenv("MAILGUN_DOMAIN", "discours.io")
# Search service configuration
SEARCH_MAX_BATCH_SIZE = int(os.environ.get("SEARCH_MAX_BATCH_SIZE", "25"))
SEARCH_CACHE_ENABLED = bool(os.environ.get("SEARCH_CACHE_ENABLED", "true").lower() in ["true", "1", "yes"])
SEARCH_CACHE_TTL_SECONDS = int(os.environ.get("SEARCH_CACHE_TTL_SECONDS", "300"))
SEARCH_PREFETCH_SIZE = int(os.environ.get("SEARCH_PREFETCH_SIZE", "200"))
MUVERA_INDEX_NAME = "discours"