Picarones / docker-compose.yml
Claude
fix(compose): retire le tag Ollama devinΓ©, garde la paramΓ©trisation
b0f08c7 unverified
Raw
History Blame
5.99 kB
# docker-compose.yml β€” Picarones
#
# Services disponibles :
# - picarones : interface web + benchmarks (port 7860)
# - ollama : LLMs locaux (port 11434, profil optionnel)
#
# Usage :
# docker compose up -d # Picarones seul
# docker compose --profile ollama up -d # Picarones + Ollama
# docker compose down
#
# Variables d'environnement :
# CrΓ©er un fichier .env Γ  la racine (voir .env.example)
#
# Defaults fail-closed (P0 durcissement) :
# - le port n'est publiΓ© que sur 127.0.0.1 (poser PICARONES_BIND=0.0.0.0
# pour exposer délibérément derrière un reverse-proxy/TLS) ;
# - PICARONES_PUBLIC_MODE=1 par dΓ©faut : moteurs OCR cloud + LLM
# mutualisΓ©s dΓ©sactivΓ©s, browse roots confinΓ©s ;
# - PICARONES_CSRF_REQUIRED=1 par dΓ©faut.
# Un opΓ©rateur institutionnel surcharge ces valeurs en connaissance
# de cause via .env ; l'inverse (ouvert par dΓ©faut) serait un foot-gun.
services:
# ────────────────────────────────────────────────
# Service principal : Picarones
# ────────────────────────────────────────────────
picarones:
build:
context: .
dockerfile: Dockerfile
target: runtime
image: picarones:latest
container_name: picarones
restart: unless-stopped
ports:
# Bind localhost par dΓ©faut β€” exposition LAN/WAN = choix explicite.
- "${PICARONES_BIND:-127.0.0.1}:${PICARONES_PORT:-7860}:7860"
volumes:
# Corpus Γ  benchmarker (lecture seule)
- "${CORPUS_DIR:-./corpus}:/app/corpus:ro"
# Rapports gΓ©nΓ©rΓ©s (lecture/Γ©criture)
- "${RAPPORTS_DIR:-./rapports}:/app/rapports:rw"
# Historique SQLite (persistant)
- picarones_history:/home/picarones/.picarones
environment:
# LLM APIs
- OPENAI_API_KEY=${OPENAI_API_KEY:-}
- ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY:-}
- MISTRAL_API_KEY=${MISTRAL_API_KEY:-}
# OCR cloud APIs
- GOOGLE_APPLICATION_CREDENTIALS=${GOOGLE_APPLICATION_CREDENTIALS:-}
- AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID:-}
- AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY:-}
- AWS_DEFAULT_REGION=${AWS_DEFAULT_REGION:-eu-west-1}
- AZURE_DOC_INTEL_ENDPOINT=${AZURE_DOC_INTEL_ENDPOINT:-}
- AZURE_DOC_INTEL_KEY=${AZURE_DOC_INTEL_KEY:-}
# Ollama (si le service ollama est actif)
- OLLAMA_BASE_URL=http://ollama:11434
# SΓ©curitΓ© β€” fail-closed par dΓ©faut (cf. en-tΓͺte du fichier).
# Surcharger explicitement dans .env pour un dΓ©ploiement
# institutionnel derrière SSO/reverse-proxy.
- PICARONES_PUBLIC_MODE=${PICARONES_PUBLIC_MODE:-1}
- PICARONES_CSRF_REQUIRED=${PICARONES_CSRF_REQUIRED:-1}
# Python
- PYTHONUNBUFFERED=1
- PYTHONIOENCODING=utf-8
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:7860/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 20s
networks:
- picarones_net
# ────────────────────────────────────────────────
# Service optionnel : Ollama (LLMs locaux)
# Activer avec : docker compose --profile ollama up
# ────────────────────────────────────────────────
ollama:
# Image paramΓ©trable pour la reproductibilitΓ© : poser
# ``OLLAMA_IMAGE=ollama/ollama:<tag>`` dans .env pour Γ©pingler une
# version (recommandΓ© en institutionnel β€” ``latest`` peut dΓ©river
# entre deux pulls). DΓ©faut ``latest`` conservΓ© pour ne pas casser
# le profil optionnel avec un tag codΓ© en dur non vΓ©rifiΓ©.
image: ${OLLAMA_IMAGE:-ollama/ollama:latest}
container_name: picarones_ollama
restart: unless-stopped
profiles:
- ollama
ports:
- "${OLLAMA_PORT:-11434}:11434"
volumes:
- ollama_models:/root/.ollama
environment:
# Sprint S6.4 β€” restriction CORS Ollama. Avant : ``*`` permet
# Γ  n'importe quel site web visitΓ© par l'utilisateur d'appeler
# l'API Ollama interne via son navigateur (CSRF cross-origin).
# En mode dΓ©faut, on n'autorise que le service web Picarones
# (rΓ©seau Docker interne) ; un opΓ©rateur peut surcharger via
# ``OLLAMA_ORIGINS`` env var pour ajouter un origin de
# dΓ©veloppement (ex : ``http://localhost:3000``).
# NB : le service web s'appelle ``picarones`` (pas ``web``) β€”
# l'origin rΓ©seau Docker interne doit donc Γͺtre picarones:7860.
- OLLAMA_ORIGINS=${OLLAMA_ORIGINS:-http://picarones:7860,http://localhost:7860}
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:11434/api/tags"]
interval: 30s
timeout: 10s
retries: 5
start_period: 30s
networks:
- picarones_net
# ────────────────────────────────────────────────
# Volumes persistants
# ────────────────────────────────────────────────
volumes:
picarones_history:
driver: local
ollama_models:
driver: local
# ────────────────────────────────────────────────
# RΓ©seau interne
# ────────────────────────────────────────────────
networks:
picarones_net:
driver: bridge