Initial import: vesti.nixg.ru — новостной апрув-проект (web, crawler, classifier, publisher, openspec)

This commit is contained in:
kpa39l
2026-09-13 15:58:32 +00:00
commit c3f59f7b7a
113 changed files with 7065 additions and 0 deletions
+44
View File
@@ -0,0 +1,44 @@
# Конфигурация 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()