Picarones / .env.example
Claude
fix(web): entity_extractor fail-closed dans TOUS les modes (P0.2)
101e6ba unverified
# Variables d'environnement supportΓ©es par Picarones.
#
# Copier en ``.env`` et remplir selon votre dΓ©ploiement :
#
# cp .env.example .env
# editor .env
#
# ``docker-compose.yml`` lit ``.env`` automatiquement. Pour un appel
# direct ``docker run``, ajouter ``--env-file .env``.
# ════════════════════════════════════════════════════════════════════
# Mode de dΓ©ploiement
# ════════════════════════════════════════════════════════════════════
#
# Picarones supporte deux modes de dΓ©ploiement, chacun avec un profil
# de sΓ©curitΓ© distinct :
#
# β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
# β”‚ Mode public β”‚ HuggingFace Space, dΓ©mo en ligne, anonyme β”‚
# β”‚ β”‚ β†’ ``PICARONES_PUBLIC_MODE=1`` β”‚
# β”‚ β”‚ β†’ CSRF dΓ©sactivΓ© (anonyme) β”‚
# β”‚ β”‚ β†’ cloud OCR/LLM bloquΓ©s β”‚
# β”‚ β”‚ β†’ rate limit par IP β”‚
# β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
# β”‚ Mode institutionnel β”‚ DΓ©ploiement BnF, universitΓ©, archive β”‚
# │ │ → derrière SSO (Shibboleth/CAS/OIDC) │
# β”‚ β”‚ β†’ ``PICARONES_CSRF_REQUIRED=1`` β”‚
# β”‚ β”‚ β†’ ``PICARONES_CSRF_SECRET=<32 bytes hex>`` β”‚
# β”‚ β”‚ OBLIGATOIRE β€” l'app refuse de dΓ©marrer β”‚
# β”‚ β”‚ sans secret (Sprint S6.9). β”‚
# β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
# ──────────────────────────────────────────────────────────────────
# Mode public (HuggingFace Space, dΓ©mo)
# ──────────────────────────────────────────────────────────────────
# Active le mode public. Valeurs acceptΓ©es : ``1``, ``true``, ``yes``.
# En mode public : OCR cloud bloquΓ©s, browse roots confinΓ©s,
# entity_extractor dΓ©sactivΓ© (sauf allowlist), rate limit par IP.
#
# NB : docker-compose.yml (chemin local) met ``PICARONES_PUBLIC_MODE=1``
# par dΓ©faut. Mettre ``0`` uniquement pour un dΓ©ploiement institutionnel
# contrôlé (derrière SSO + reverse-proxy TLS). CSRF n'est PAS forcé par
# le compose local (théÒtre sans secret stable) β€” voir
# docker-compose.prod.yml qui exige PICARONES_CSRF_SECRET.
PICARONES_PUBLIC_MODE=
# ──────────────────────────────────────────────────────────────────
# Mode institutionnel (production)
# ──────────────────────────────────────────────────────────────────
# Active la protection CSRF (double-submit cookie + HMAC).
# OBLIGATOIRE en production, en complΓ©ment d'un SSO.
PICARONES_CSRF_REQUIRED=
# Secret HMAC pour signer les tokens CSRF.
# OBLIGATOIRE si ``PICARONES_CSRF_REQUIRED=1`` β€” sans secret stable,
# tous les tokens sont invalidΓ©s Γ  chaque redΓ©marrage du process,
# ce qui dΓ©grade gravement l'UX (toutes les sessions actives reΓ§oivent
# 403 jusqu'Γ  reload manuel).
#
# GΓ©nΓ©rer une fois et persister dans le secret manager institutionnel
# (Vault / AWS Secrets Manager / Kubernetes Secret) :
#
# openssl rand -hex 32
#
# Ne JAMAIS committer ce secret. Ne JAMAIS le mettre dans un Dockerfile
# ni dans un docker-compose.yml versionnΓ©.
PICARONES_CSRF_SECRET=
# Liste de chemins (sΓ©parateur : ``:`` Unix / ``;`` Windows) que
# ``/api/corpus/browse`` et ``/api/reports`` autorisent. Surcharge
# le dΓ©faut.
PICARONES_BROWSE_ROOTS=
# Allowlist (sΓ©parateur virgule) des dotted paths d'extracteurs NER
# autorisΓ©s via le champ ``entity_extractor`` du payload web.
# Vide = le champ entity_extractor est REFUSÉ côté web dans TOUS les
# modes (import+appel dynamique = surface rΓ©seau trop puissante,
# mΓͺme hors mode public/derriΓ¨re SSO). La CLI reste libre.
# Renseigner explicitement pour autoriser des dotted paths prΓ©cis :
# monpkg.ner:SpacyExtractor,autrepkg.ner:Fn
PICARONES_ENTITY_EXTRACTOR_ALLOWLIST=
# ──────────────────────────────────────────────────────────────────
# docker-compose β€” rΓ©seau & images
# ──────────────────────────────────────────────────────────────────
# Interface de bind du port hΓ΄te (docker-compose.yml).
# DΓ©faut fail-closed : 127.0.0.1 (accessible uniquement en local).
# Mettre ``0.0.0.0`` pour exposer délibérément (derrière TLS/proxy).
PICARONES_BIND=127.0.0.1
# Image Ollama (docker-compose.yml, profil ``ollama``).
# DΓ©faut : ollama/ollama:latest. Γ‰pingler une version pour la
# reproductibilitΓ© institutionnelle, ex : OLLAMA_IMAGE=ollama/ollama:0.3.14
OLLAMA_IMAGE=
# Plafonds applicatifs.
# MAX_UPLOAD_MB : plafond dur PAR fichier (streaming, rejet 413).
# MAX_TOTAL_UPLOAD_MB : plafond dur CUMULΓ‰ par requΓͺte d'upload.
PICARONES_MAX_UPLOAD_MB=100
PICARONES_MAX_TOTAL_UPLOAD_MB=500
PICARONES_MAX_CONCURRENT_JOBS=2
PICARONES_RATE_LIMIT_PER_HOUR=5
# Attribut ``Secure`` des cookies (CSRF, langue). Vide = auto :
# ``Secure`` UNIQUEMENT sur HuggingFace Space (HTTPS certain).
# DΓ©couplΓ© de PUBLIC_MODE : Β« mutualisΓ© Β» n'implique pas Β« HTTPS Β»
# (le compose local est public_mode=1 mais http://127.0.0.1).
# Forcer ``1`` derrière un reverse-proxy TLS (fait par
# docker-compose.prod.yml), ``0`` pour un dΓ©bogage explicite.
# NB : CSRF requis + cookies non-Secure + dΓ©ploiement exposΓ©
# (HF Space / mode public) β‡’ refus de dΓ©marrage (config incohΓ©rente).
PICARONES_SECURE_COOKIES=
# Surcharge la Content-Security-Policy si nΓ©cessaire.
# La CSP par dΓ©faut conserve ``script-src/style-src 'unsafe-inline'``
# (dette connue : ~30 handlers onclick inline dans la SPA, migration
# vers addEventListener planifiΓ©e). En institutionnel durci, fournir
# ici une CSP sans unsafe-inline une fois le frontend migrΓ©.
PICARONES_CSP=
# ──────────────────────────────────────────────────────────────────
# ClΓ©s API LLM (optionnel β€” uniquement si vous utilisez un pipeline LLM)
# ──────────────────────────────────────────────────────────────────
OPENAI_API_KEY=
ANTHROPIC_API_KEY=
MISTRAL_API_KEY=
# ──────────────────────────────────────────────────────────────────
# ClΓ©s API OCR cloud (optionnel)
# ──────────────────────────────────────────────────────────────────
GOOGLE_APPLICATION_CREDENTIALS=
AZURE_DOC_INTEL_ENDPOINT=
AZURE_DOC_INTEL_KEY=
# ──────────────────────────────────────────────────────────────────
# RΓ©seau / port d'exposition.
#
# NB : variable utilisΓ©e UNIQUEMENT par ``docker-compose.yml`` pour
# mapper le port hΓ΄te (cf. ligne ``${PICARONES_PORT:-7860}:7860``).
# Le code Python ne la lit pas β€” pour changer le port serveur,
# utiliser ``picarones serve --port <N>`` ou modifier le CMD du
# Dockerfile.
# ──────────────────────────────────────────────────────────────────
PICARONES_PORT=7860
# ──────────────────────────────────────────────────────────────────
# Persistance (Sprint A8) β€” chemin de la base SQLite des jobs.
# Override pour sortir du conteneur (volume montΓ©).
# ──────────────────────────────────────────────────────────────────
PICARONES_JOBS_DB=