This commit is contained in:
2026-03-18 17:30:13 +01:00
parent 58a233236c
commit d80d912fb3
36 changed files with 3502 additions and 4 deletions
+66
View File
@@ -0,0 +1,66 @@
"""
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://pecflow:pecflow_dev_password@db:5432/pecflow"
# ── 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 = "pecflow"
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()