Files
iiEsaywebUI/worker/config.py
2026-02-19 18:12:09 +00:00

133 lines
4.6 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
Конфигурация для воркера синхронизации Nextcloud -> Qdrant
Типизация и валидация настроек
"""
import os
from pathlib import Path
from dataclasses import dataclass
from typing import List, Optional
from dotenv import load_dotenv
# Загрузка переменных окружения: сначала worker/.env, затем корневой .env
load_dotenv()
root_env = Path(__file__).resolve().parent.parent / ".env"
load_dotenv(root_env)
@dataclass
class NextcloudConfig:
"""Конфигурация подключения к Nextcloud"""
url: str
username: str
password: str
scan_paths: List[str] # Пути для сканирования
@dataclass
class OpenWebUIConfig:
"""Конфигурация подключения к Open WebUI API"""
api_url: str
api_key: str
timeout: int = 300 # Таймаут для больших файлов (секунды)
@dataclass
class AuthentikConfig:
"""Конфигурация для маппинга пользователей Authentik"""
api_url: Optional[str] = None
api_token: Optional[str] = None
@dataclass
class WorkerConfig:
"""Основная конфигурация воркера"""
nextcloud: NextcloudConfig
openwebui: OpenWebUIConfig
authentik: AuthentikConfig
sync_interval: int = 300 # Интервал синхронизации (секунды)
max_file_size: int = 100 * 1024 * 1024 # Максимальный размер файла (100MB)
db_path: str = "sync_state.db" # Путь к SQLite БД для отслеживания состояния
log_level: str = "INFO"
def load_config() -> WorkerConfig:
"""
Загрузка и валидация конфигурации из переменных окружения
Returns:
WorkerConfig: Валидированная конфигурация
Raises:
ValueError: Если обязательные переменные не установлены
"""
# Nextcloud конфигурация
nc_url = os.getenv("DOMAIN_NEXTCLOUD", "").rstrip("/")
if not nc_url:
raise ValueError("DOMAIN_NEXTCLOUD не установлен в .env")
nc_user = os.getenv("NC_USER")
if not nc_user:
raise ValueError("NC_USER не установлен в .env")
nc_password = os.getenv("NC_APP_PASSWORD")
if not nc_password:
raise ValueError("NC_APP_PASSWORD не установлен в .env")
# Пути для сканирования (можно настроить через переменные окружения)
scan_paths = os.getenv(
"NC_SCAN_PATHS",
"/home/{username}/Documents,/home/{username}/Files,/Shared/Documents"
).split(",")
nextcloud_config = NextcloudConfig(
url=nc_url,
username=nc_user,
password=nc_password,
scan_paths=[path.strip() for path in scan_paths]
)
# Open WebUI конфигурация
webui_url = os.getenv("DOMAIN_OPENWEBUI", "").rstrip("/")
if not webui_url:
raise ValueError("DOMAIN_OPENWEBUI не установлен в .env")
webui_api_key = os.getenv("OPENWEBUI_API_KEY")
if not webui_api_key or webui_api_key == "твой_api_ключ_от_openwebui":
raise ValueError(
"OPENWEBUI_API_KEY не установлен или имеет значение по умолчанию. "
"Создайте API ключ в Open WebUI -> Settings -> Account -> API Keys"
)
timeout = int(os.getenv("OPENWEBUI_TIMEOUT", "300"))
openwebui_config = OpenWebUIConfig(
api_url=f"{webui_url}/api/v1",
api_key=webui_api_key,
timeout=timeout
)
# Authentik конфигурация (опционально)
authentik_url = os.getenv("DOMAIN_AUTHENTIK", "").rstrip("/")
authentik_token = os.getenv("AUTHENTIK_API_TOKEN")
authentik_config = AuthentikConfig(
api_url=authentik_url if authentik_url else None,
api_token=authentik_token
)
# Общие настройки воркера
sync_interval = int(os.getenv("SYNC_INTERVAL", "300"))
max_file_size = int(os.getenv("MAX_FILE_SIZE", str(100 * 1024 * 1024)))
db_path = os.getenv("DB_PATH", "sync_state.db")
log_level = os.getenv("LOG_LEVEL", "INFO")
return WorkerConfig(
nextcloud=nextcloud_config,
openwebui=openwebui_config,
authentik=authentik_config,
sync_interval=sync_interval,
max_file_size=max_file_size,
db_path=db_path,
log_level=log_level
)