# Конфигурация publisher-service. Все секреты/настройки из env (.env). # Правило: секреты НЕ в коде, только в .env (не коммитить). import os from pathlib import Path from dotenv import load_dotenv BASE = Path(__file__).resolve().parents[3] # /opt/vesti (корень проекта) # override=False: env-переменные, уже заданные окружением (Docker: compose environment/env_file), # имеют приоритет над .env; на хосте (пустой env) значения подхватываются из .env. load_dotenv(BASE / ".env") DEFAULT_CHANNELS = "@dedinit_vesti" from dataclasses import dataclass def _channels_list(raw: str | None) -> list[str]: """Разбирает VESTI_BOT_CHANNELS: '@a,@b' -> ['@a','@b']. Пустые отбрасывает.""" if not raw: return [DEFAULT_CHANNELS] return [c.strip() for c in raw.split(",") if c.strip()] @dataclass class Settings: """Читает env ПРИ СОЗДАНИИ (после load_dotenv). Секреты — только из env/.env.""" bot_token: str = "" tg_proxy: str = "" # пусто → читаем из env (TG_PROXY); дефолт SOCKS5 127.0.0.1:1080 channels: list[str] = None # type: ignore port: int = 8410 api_base: str = "https://api.telegram.org" def __post_init__(self): if self.channels is None: self.channels = _channels_list(os.getenv("VESTI_BOT_CHANNELS", "")) self.bot_token = self.bot_token or os.getenv("VESTI_BOT_TOKEN", "") self.tg_proxy = self.tg_proxy or os.getenv("TG_PROXY", "socks5://127.0.0.1:1080") self.port = self.port or int(os.getenv("PUBLISHER_PORT", "8410")) settings = Settings()