Add project and deployment instruction (docs/DEPLOYMENT.md)
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
132
worker/config.py
Normal file
132
worker/config.py
Normal file
@@ -0,0 +1,132 @@
|
||||
"""
|
||||
Конфигурация для воркера синхронизации 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
|
||||
)
|
||||
Reference in New Issue
Block a user