feat(finlab): alertes de prix par email (watcher sidecar, boucle 5 min) (#71)

Permet de configurer des alertes « préviens-moi par mail quand NVDA atteint 200$ »
depuis la Console IA. Un sidecar surveille les cours en continu.

- finlab/watcher.py : boucle toutes les 5 min, lit price_alerts.yaml (workspace),
  évalue les seuils above/below, envoie un email au franchissement. Anti-spam
  (1 mail/seuil, état .watcher-state.json, ré-armé en ré-éditant). Modes --once / --test
- Email via le relais postfix du lab (storage-01:25, SMTP_HOST) qui réécrit
  l'expéditeur en Gmail — AUCUN secret (pods k8s dans mynetworks)
- price_alerts.yaml : config seedée dans le workspace (email_to + rules), éditée
  par la Console IA sur demande
- deployment : conteneur sidecar `watcher` (boucle 5 min, ressources minimes)
- Dockerfile : seed price_alerts.yaml ; persona console + admin/ia/finlab.md documentés

Logique testée en local (SMTP mocké) : franchissement → envoi, anti-spam au 2e run,
seuil non atteint → rien.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
ALI YESILKAYA 2026-06-30 16:00:41 +02:00 committed by GitHub
parent b032820f23
commit 3c55ee968d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 207 additions and 1 deletions

View file

@ -99,6 +99,25 @@ spec:
volumeMounts:
- name: home
mountPath: /home/finlab
# ── WATCHER : alertes de prix par email (boucle 5 min → relais postfix storage-01) ──
- name: watcher
image: ghcr.io/alkatrazz24/funk-finlab:sha-73e2ad3
command: ["/opt/venv/bin/python", "-m", "finlab.watcher"]
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop: ["ALL"]
env:
# Relais SMTP du lab (storage-01) — accepte les pods k8s (mynetworks), pas de secret.
- { name: SMTP_HOST, value: "192.168.10.1" }
- { name: SMTP_PORT, value: "25" }
- { name: WATCH_INTERVAL, value: "300" }
resources:
requests: { cpu: 25m, memory: 192Mi }
limits: { cpu: 250m, memory: 384Mi }
volumeMounts:
- name: home
mountPath: /home/finlab
volumes:
- name: home
persistentVolumeClaim: