Files
2026-03-19 16:58:23 +01:00

67 lines
3.1 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.
"""
Configurazione worker legge le stesse variabili d'ambiente del backend.
"""
from functools import lru_cache
from pydantic import field_validator
from pydantic_settings import BaseSettings, SettingsConfigDict
class WorkerSettings(BaseSettings):
model_config = SettingsConfigDict(
env_file=".env",
env_file_encoding="utf-8",
case_sensitive=False,
extra="ignore",
)
# ── Ambiente ──────────────────────────────────────────────────────────────
app_env: str = "development"
log_level: str = "INFO"
# ── Database ──────────────────────────────────────────────────────────────
database_url: str = "postgresql+asyncpg://pechub:pechub_dev_password@db:5432/pechub"
# ── Redis ─────────────────────────────────────────────────────────────────
redis_url: str = "redis://redis:6379/0"
# ── MinIO ─────────────────────────────────────────────────────────────────
minio_endpoint: str = "minio:9000"
minio_access_key: str = "minioadmin"
minio_secret_key: str = "minioadmin"
minio_bucket: str = "pechub"
minio_use_ssl: bool = False
# ── Cifratura credenziali (ADR-002) ───────────────────────────────────────
encryption_key: str = "0" * 64
# ── Parametri IMAP sync ───────────────────────────────────────────────────
imap_idle_timeout_seconds: int = 1680 # 28 minuti (RFC 2177 ≤ 29 min)
imap_polling_interval_seconds: int = 60 # polling se IDLE non supportato
imap_max_fetch_per_cycle: int = 50 # max messaggi per ciclo di fetch
imap_max_error_count: int = 5 # errori consecutivi → status=error
imap_connect_timeout_seconds: int = 30 # timeout connessione iniziale
# ── Backoff esponenziale ──────────────────────────────────────────────────
backoff_initial_seconds: float = 1.0
backoff_multiplier: float = 2.0
backoff_max_seconds: float = 300.0 # 5 minuti massimo
@field_validator("encryption_key")
@classmethod
def validate_encryption_key(cls, v: str) -> str:
if len(v) != 64:
raise ValueError("ENCRYPTION_KEY deve essere 64 caratteri hex")
bytes.fromhex(v)
return v
@property
def encryption_key_bytes(self) -> bytes:
return bytes.fromhex(self.encryption_key)
@lru_cache
def get_settings() -> WorkerSettings:
return WorkerSettings()