feat(apps): archive vers Garage puis supprime les chunks anciens de reading
Nouveau module app.etl.reading_retention : pour chaque chunk de `reading` entièrement plus vieux que APP_READING_RETENTION_DAYS (1095 jours), export CSV gzip reproductible vers Garage (SSE-C, sha256 en métadonnées), relecture et comparaison, puis drop_chunks ciblé sur ce seul chunk dans une transaction dédiée. --dry-run. Réglages APP_S3_* optionnels, jamais exigés par l'API. DAG Airflow `retention` quotidien à 03h20. 44 tests unitaires sans réseau ni base, tests d'intégrité du DAG, vérification --help dans l'image Airflow en CI. Docs 40-data et 20-backend. Closes #36
This commit is contained in:
@@ -76,9 +76,25 @@ class Settings(BaseSettings):
|
||||
expose_api_docs: bool | None = None
|
||||
metrics_token: SecretStr | None = None
|
||||
|
||||
# Compose passe `APP_METRICS_TOKEN` vide quand aucun jeton n'est posé : vide vaut absent, sinon
|
||||
# `/metrics` exigerait un `Bearer` sans valeur et plus rien ne pourrait le scruter.
|
||||
@field_validator("metrics_token", mode="before")
|
||||
s3_endpoint_url: str | None = None
|
||||
s3_region: str = "garage"
|
||||
s3_access_key: str | None = None
|
||||
s3_secret_key: SecretStr | None = None
|
||||
s3_bucket: str | None = None
|
||||
s3_sse_key: SecretStr | None = None
|
||||
reading_retention_days: int = Field(default=1095, ge=30)
|
||||
|
||||
# Compose passe `APP_METRICS_TOKEN` et les réglages S3 vides quand rien n'est posé : vide vaut
|
||||
# absent, sinon `/metrics` exigerait un `Bearer` sans valeur et l'archivage un endpoint vide.
|
||||
@field_validator(
|
||||
"metrics_token",
|
||||
"s3_endpoint_url",
|
||||
"s3_access_key",
|
||||
"s3_secret_key",
|
||||
"s3_bucket",
|
||||
"s3_sse_key",
|
||||
mode="before",
|
||||
)
|
||||
@classmethod
|
||||
def _jeton_vide_vaut_absent(cls, valeur: object) -> object:
|
||||
return None if valeur == "" else valeur
|
||||
|
||||
Reference in New Issue
Block a user