# funk-finlab — console Claude Code web, spécialisée finance. # # Une vraie session Claude Code (sur l'ABONNEMENT de l'utilisateur, login persisté sur le # PVC) servie dans un terminal web (ttyd), dans un workspace où vit la boîte à outils finlab # (exposée en MCP). C'est l'esprit OpenAlice, mais c'est Claude Code + le toolkit maison — # aucune facturation API, aucun broker, lecture/analyse uniquement. FROM python:3.12-slim-bookworm # Node (pour le CLI claude-code) + git + tini (PID 1 propre). ttyd n'est PAS dans les dépôts # Debian bookworm → on récupère le binaire statique (musl) depuis les releases GitHub (pin). ARG TTYD_VERSION=1.7.7 RUN apt-get update && apt-get install -y --no-install-recommends \ curl ca-certificates git tini procps \ && curl -fsSL "https://github.com/tsl0922/ttyd/releases/download/${TTYD_VERSION}/ttyd.x86_64" \ -o /usr/local/bin/ttyd \ && chmod +x /usr/local/bin/ttyd \ && ttyd --version \ && curl -fsSL https://deb.nodesource.com/setup_22.x | bash - \ && apt-get install -y --no-install-recommends nodejs \ && npm install -g @anthropic-ai/claude-code \ && npm cache clean --force \ && apt-get clean && rm -rf /var/lib/apt/lists/* # Dépendances Python de finlab dans un venv dédié (séparé du workspace, donc non altérable # depuis la session). finlab lui-même est importé depuis le workspace (PYTHONPATH au runtime). COPY requirements.txt /opt/finlab/requirements.txt RUN python -m venv /opt/venv \ && /opt/venv/bin/pip install --no-cache-dir -r /opt/finlab/requirements.txt # « Seed » du workspace : copié dans le PVC au premier boot (sans écraser les edits ensuite). # Contient le code finlab, les configs (portefeuille/watchlists/alertes), la persona Claude # (CLAUDE.md), le branchement MCP finlab et les réglages d'autorisation. COPY finlab/ /opt/seed/finlab/ COPY webapp/ /opt/seed/webapp/ COPY portfolio.yaml watchlists.yaml alerts.yaml /opt/seed/ COPY workspace/CLAUDE.md /opt/seed/CLAUDE.md COPY workspace/.mcp.json /opt/seed/.mcp.json COPY workspace/.claude/ /opt/seed/.claude/ COPY entrypoint.sh /usr/local/bin/entrypoint.sh RUN chmod +x /usr/local/bin/entrypoint.sh # uid non-root (PodSecurity « restricted » du namespace ai). HOME et workspace vivent sur le # PVC monté en /home/finlab : ainsi ~/.claude (login abonnement) ET le workspace persistent. RUN useradd -m -u 1000 -s /bin/bash finlab ENV HOME=/home/finlab \ WORKSPACE=/home/finlab/workspace \ PATH=/opt/venv/bin:/usr/local/bin:/usr/bin:/bin \ PYTHONPATH=/home/finlab/workspace \ PYTHONUNBUFFERED=1 \ TZ=Europe/Paris USER 1000 WORKDIR /home/finlab/workspace EXPOSE 7681 ENTRYPOINT ["tini", "--", "/usr/local/bin/entrypoint.sh"]