apiVersion: apps/v1 kind: Deployment metadata: name: finlab namespace: ai spec: replicas: 1 # HOME + workspace sur un volume RWO (NFS) → pas de rolling à 2 pods sur le même volume. strategy: type: Recreate selector: matchLabels: app: finlab template: metadata: labels: app: finlab spec: imagePullSecrets: - name: ghcr-pull # PodSecurity « restricted » (ns ai). fsGroup 1000 → PVC NFS monté en /home/finlab. securityContext: runAsNonRoot: true runAsUser: 1000 runAsGroup: 1000 fsGroup: 1000 seccompProfile: type: RuntimeDefault # initContainer : prépare le workspace (seed robuste NFS) AVANT console + dashboard, # pour qu'il soit peuplé et inscriptible quand les deux conteneurs démarrent. initContainers: - name: seed image: ghcr.io/alkatrazz24/funk-finlab:sha-99ff321 command: ["/usr/local/bin/entrypoint-seed.sh"] securityContext: allowPrivilegeEscalation: false capabilities: drop: ["ALL"] volumeMounts: - name: home mountPath: /home/finlab containers: # ── CONSOLE : Claude Code dans un terminal web (ttyd), sous /console ── - name: console image: ghcr.io/alkatrazz24/funk-finlab:sha-99ff321 command: ["/usr/local/bin/entrypoint-console.sh"] securityContext: allowPrivilegeEscalation: false capabilities: drop: ["ALL"] ports: - name: console containerPort: 7681 readinessProbe: tcpSocket: { port: 7681 } initialDelaySeconds: 10 periodSeconds: 15 livenessProbe: tcpSocket: { port: 7681 } initialDelaySeconds: 30 periodSeconds: 30 # Claude Code est bursty : CPU moy. ~0,2 cœur mais throttlé ~11 % en pic à 1 cœur # (mesuré). On double le plafond CPU pour des bursts plus fluides. La RAM n'était pas # contrainte (~384 Mo) ; un peu de marge par confort. (La latence du modèle, elle, # reste côté API — non impactée par les ressources du pod.) resources: requests: { cpu: 300m, memory: 768Mi } limits: { cpu: "2", memory: 2Gi } volumeMounts: - name: home mountPath: /home/finlab # ── DASHBOARD : interface web (FastAPI), graphiques + données finlab ── - name: dashboard image: ghcr.io/alkatrazz24/funk-finlab:sha-99ff321 command: - /opt/venv/bin/uvicorn - dashboard.server:app - --host=0.0.0.0 - --port=8800 securityContext: allowPrivilegeEscalation: false capabilities: drop: ["ALL"] ports: - name: web containerPort: 8800 # FINLAB_HOME/PYTHONPATH viennent de l'image ; FINLAB_HOME = workspace (configs live). readinessProbe: httpGet: { path: /healthz, port: 8800 } initialDelaySeconds: 8 periodSeconds: 15 livenessProbe: httpGet: { path: /healthz, port: 8800 } initialDelaySeconds: 20 periodSeconds: 30 resources: requests: { cpu: 100m, memory: 256Mi } limits: { cpu: 500m, memory: 768Mi } 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-99ff321 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: claimName: finlab-data