feat(finlab): dashboard web (graphiques/portefeuille/actions) + fix seed NFS (#65)

Ajoute une interface graphique à finlab, en plus de la console Claude Code (les
deux cohabitent sur finance.lab.local) :

- dashboard/ : backend FastAPI (sans LLM/clé) exposant les données finlab en JSON
  (/api/portfolio, /api/scan, /api/ohlc, /api/plan, /api/alerts) + front statique
  (lightweight-charts) : graphiques chandeliers MM50/200 + volume, portefeuille
  (P&L/poids/secteurs), watchlists thématiques scannées, alertes, plan de trade R:R
- Découplage code/data : finlab lit ses configs depuis FINLAB_HOME si défini
  (workspace persistant) ; repli sur le dossier du package en dév local
- Image double usage (un build, deux conteneurs) : code → /opt/app, seed minimal
  (configs + persona + MCP) → workspace
- Fix seed NFS (cause racine du workspace vide) : WORKDIR n'est plus sur le volume
  (le runtime le créait en root sur NFS) ; seed déplacé dans un initContainer
  robuste (recrée le dossier s'il est non-inscriptible)
- Deployment : initContainer seed + 2 conteneurs (console ttyd -b /console, dashboard
  uvicorn) ; Service 2 ports ; IngressRoute 2 routes (/console + dashboard), basicAuth

Validé en local (podman) : seed OK, dashboard /api/portfolio → 16k€/10 positions
via FINLAB_HOME, endpoints ohlc/scan/plan/alerts OK, ttyd/claude/finlab présents.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
ALI YESILKAYA 2026-06-30 00:57:23 +02:00 committed by GitHub
parent 607e5e6c0a
commit 56cb32eacc
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
19 changed files with 700 additions and 149 deletions

View file

@ -0,0 +1,19 @@
#!/usr/bin/env bash
# initContainer : prépare le workspace persistant (PVC) AVANT le démarrage des conteneurs.
# Tourne en uid 1000. Robuste au piège NFS : si le point de montage / le dossier workspace a
# été créé root et non-inscriptible (fsGroup non honoré par le provisioner NFS), on le recrée
# (le parent /home/finlab est world-writable côté provisioner).
set -euo pipefail
WS="${WORKSPACE:-/home/finlab/workspace}"
if [ -d "$WS" ] && [ ! -w "$WS" ]; then
echo "seed: workspace présent mais non inscriptible → recréation"
rmdir "$WS" 2>/dev/null || true
fi
mkdir -p "$WS"
# cp no-clobber : pose les fichiers manquants (nouvelle image), préserve les edits existants.
cp -rn /opt/seed/. "$WS"/ 2>/dev/null || true
echo "seed: OK — $(ls -A "$WS" 2>/dev/null | wc -l) entrées dans $WS"