import os from pathlib import Path # ── Загрузка .env ───────────────────────────────────────────────────── # Раньше .env не читался вообще (gunicorn не читает, systemd override сломан). # Теперь явно грузим его ДО os.getenv(). Путь — /opt/morozovka-portal/.env BASE_DIR = Path(__file__).resolve().parent.parent _ENV_FILE = BASE_DIR / ".env" try: from dotenv import load_dotenv if _ENV_FILE.is_file(): load_dotenv(_ENV_FILE, override=False) # override=False — systemd Environment важнее except ImportError: # python-dotenv не установлен — просто читаем вручную (без парсинга кавычек, нам хватит) if _ENV_FILE.is_file(): for line in _ENV_FILE.read_text(encoding="utf-8").splitlines(): line = line.strip() if not line or line.startswith("#") or "=" not in line: continue k, _, v = line.partition("=") k, v = k.strip(), v.strip().strip('"').strip("'") os.environ.setdefault(k, v) # ── База данных ─────────────────────────────────────────────────────── POSTGRES_USER = os.getenv("POSTGRES_USER", "morozovka") POSTGRES_PASSWORD = os.getenv("POSTGRES_PASSWORD", "rf-slf-1945") POSTGRES_DB = os.getenv("POSTGRES_DB", "morozovka_portal") POSTGRES_HOST = os.getenv("POSTGRES_HOST", "127.0.0.1") POSTGRES_PORT = os.getenv("POSTGRES_PORT", "5432") DATABASE_URL = f"postgresql+psycopg2://{POSTGRES_USER}:{POSTGRES_PASSWORD}@{POSTGRES_HOST}:{POSTGRES_PORT}/{POSTGRES_DB}" # ── Gitea ───────────────────────────────────────────────────────────── GITEA_URL = os.getenv("GITEA_URL", "http://127.0.0.1:3000") GITEA_PUBLIC_URL = os.getenv("GITEA_PUBLIC_URL", "https://git.morozovka.space") GITEA_CLIENT_ID = os.getenv("GITEA_CLIENT_ID", "66697efe-d88b-41fe-b3d5-6498d978e1fa") GITEA_CLIENT_SECRET = os.getenv("GITEA_CLIENT_SECRET", "gto_okjv2yj2jjrsqo6qeniz6nbnqulloo4x2rrwex6p4cqx7azrc27a") GITEA_API_TOKEN = os.getenv("GITEA_API_TOKEN", "") # Секрет для проверки подписи вебхуков Gitea. # ВАЖНО: если пусто — вебхук принимается БЕЗ проверки подписи. GITEA_WEBHOOK_SECRET = os.getenv("GITEA_WEBHOOK_SECRET", "") # ── Сессии / подписи ────────────────────────────────────────────────── WEB_SECRET = os.getenv("WEB_SECRET", "super-secret-morozovka-key-2026") # ── SMTP ────────────────────────────────────────────────────────────── SMTP_SERVER = os.getenv("SMTP_SERVER", "") SMTP_PORT = int(os.getenv("SMTP_PORT", "587")) SMTP_USER = os.getenv("SMTP_USER", "") SMTP_PASSWORD = os.getenv("SMTP_PASSWORD", "") SMTP_FROM = os.getenv("SMTP_FROM", "noreply@morozovka.space") GITEA_REDIRECT_URI = os.getenv("GITEA_REDIRECT_URI", "https://portal.morozovka.space/auth/callback") # ── Google Calendar sync ────────────────────────────────────────────── # Раньше CALENDAR_ID был захардкожен в google_sync.py — вынесли в env. GOOGLE_CALENDAR_ID = os.getenv("GOOGLE_CALENDAR_ID", "korneshoc@gmail.com") GOOGLE_CREDENTIALS_FILE = os.getenv( "GOOGLE_CREDENTIALS_FILE", str(BASE_DIR / "google_credentials.json"), ) # ── LLM ─────────────────────────────────────────────────────────────── LLM_ENABLED = os.getenv("LLM_ENABLED", "false").lower() == "true" LLM_API_BASE = os.getenv("LLM_API_BASE", "http://localhost:11434/v1") LLM_API_KEY = os.getenv("LLM_API_KEY", "ollama") LLM_MODEL = os.getenv("LLM_MODEL", "qwen2.5:14b") LLM_MAX_TOKENS = int(os.getenv("LLM_MAX_TOKENS", "1024")) LLM_TEMPERATURE = float(os.getenv("LLM_TEMPERATURE", "0.2")) LLM_TIMEOUT = int(os.getenv("LLM_TIMEOUT", "120")) LLM_MAX_HISTORY = int(os.getenv("LLM_MAX_HISTORY", "10"))