Raccourcis clavier

Appuyez sur ← ou → pour passer d'un chapitre à l'autre

Appuyez sur S ou / pour rechercher dans la documentation

Appuyez sur ? pour afficher cette aide

Appuyez sur Échap pour masquer cette aide

Variables d'environnement

Le backend forge-api se configure par variables d'environnement. Il lit le fichier .env au démarrage avec dotenvy, puis lit les variables du processus. Ce chapitre liste les variables que le code lit réellement, avec leur défaut quand il existe. Il ne liste pas les 2 992 lignes du fichier modèle .env.example (mesure du 2026-10-03 : wc -l .env.example) : la plupart concernent des outils tiers et des connecteurs, pas le backend.

Règle de lecture. Une variable citée ici est lue par le code ; le fichier est indiqué quand il importe. Ce chapitre n'est pas exhaustif : il omet des options réservées à un module précis. Pour savoir si une variable est lue : grep -rn "NOM_DE_LA_VARIABLE" crates/*/src.

Priorité

  1. Les variables du processus (celles que pose le lanceur, podman ou la session) priment. dotenvy ne remplace jamais une variable déjà définie.
  2. Le fichier .env du répertoire courant complète ce qui manque.
  3. Les valeurs par défaut compilées dans le code s'appliquent en dernier.

Le code ne charge aucun fichier .env.staging ni .env.production. Pour un autre environnement, posez les variables dans le processus.

Les secrets de production ne sont pas dans le dépôt. Sur chaque hôte, un script d'initialisation génère les fichiers d'environnement sur la machine cible, avec des permissions restreintes, et n'imprime jamais les valeurs (script d'initialisation des secrets de l'hôte). OpenBao peut en plus surcharger des secrets au démarrage (voir la section « Secrets externes (OpenBao) » plus bas).

Pour générer un secret : openssl rand -hex 32.

Variables exigées au démarrage

Si l'une d'elles manque, forge-api s'arrête avec le code 1 (contrôle de démarrage du code).

VariableRôleRègle
DATABASE_URLURL PostgreSQLObligatoire
REDIS_URLURL Valkey (compatible Redis)Obligatoire. VALKEY_URL, si elle existe, est lue en premier pour la connexion
JWT_SECRETSecret de signature des jetons (HS256)32 caractères au moins, ni valeur par défaut connue, ni gabarit (change_me, replace_me, entre autres)

Serveur HTTP

VariableRôleDéfaut
PORTPort d'écoute3000
HOSTAdresse d'écoute (BIND_ADDRESS en repli)toutes les interfaces
APP_URLURL publique de l'applicationhttp://localhost:8008 (défaut de forge-core, port historique : l'API écoute sur 3000)
CORS_ORIGINSOrigines autorisées, séparées par des virguleshttp://localhost:8080, :8081, :8082
COOKIE_DOMAINDomaine des cookies de session en productionvide
FORGE_MAX_BODY_BYTESTaille maximale d'un corps de requête2 Mio
FORGE_MAX_UPLOAD_BYTESTaille maximale d'un envoi multipart25 Mio
CSP_HEADER, HSTS_HEADERRemplacent les en-têtes Content-Security-Policy et Strict-Transport-Securityvaleurs du code

Journalisation

VariableRôleDéfaut
RUST_LOGFiltre tracing-subscriberinfo,forge_api=debug,forge_mcp=debug quand la variable est absente ou invalide
LOG_FORMATpretty ou compact : sortie lisible. Toute autre valeur : JSONJSON

TRACING_JSON, posée dans podman-compose.yml, n'est lue que par forge_core::observability::init_tracing, que forge-api n'appelle pas : il appelle sa propre fonction init_tracing (crates/forge-api/src/main.rs). Elle ne change donc rien au format des journaux de forge-api.

Voir Journaux.

Authentification

VariableRôleDéfaut
JWT_EXPIRYDurée du jeton d'accès : 7d, 24h, 30m, 3600s ou un nombre de secondes7 jours
JWT_EXPIRY_SECSAlias en secondes, lu si JWT_EXPIRY est absente ou illisible7 jours
FORCE_2FAImpose un second facteur à la connexion par mot de passe (true ou 1) : code TOTP si le compte l'a enrôlé, sinon code envoyé par e-mailtrue
FORGE_MFA_TOTP_REQUIRED1 ou true : refuse la connexion d'un compte sans TOTP enrôlé, pour tous les comptesdésactivé
FORGE_MFA_REQUIRED_ROLESRôles séparés par des virgules (par exemple admin,owner) : même refus, pour ces rôles seulementvide
FORGE_PQC_ENABLED1 ajoute une signature ML-DSA-65 au jeton de session, en plus de HS256désactivé
NODE_ENV, ENVIRONMENT, RUST_ENV, APP_ENVDéclarent l'environnement. development, dev, local ou test déclarent un développementabsent = posture production
FORGE_DEV1, true ou yes déclare un développementabsent

Le silence ne relâche aucune garde : sans déclaration explicite de développement, forge-api applique la posture production.

Les deux réglages FORGE_MFA_* sont lus par la connexion par mot de passe. Un compte créé par le SSO n'a pas de second facteur applicatif : Authentik le porte en amont.

Le code de vérification envoyé par e-mail et le jeton intermédiaire du second facteur vivent quelques minutes dans Valkey (valeur fixe dans le code).

Clés de durcissement

VariableRôleRègle
AT_REST_ENCRYPTION_KEYRacine du chiffrement des secrets stockés (TOTP, identifiants de connecteurs, SSO)Distincte de JWT_SECRET. Sans elle, le code retombe sur JWT_SECRET
AUDIT_SIGNING_KEYSignature de la chaîne d'auditSans elle, la chaîne n'est pas signée
FORGE_STRICT_SECRETS1 rend les deux clés ci-dessus obligatoiresSans cette variable, leur absence est un avertissement
FORGE_TENANT_STRICT1 active le cloisonnement strict par organisationObligatoire hors développement déclaré, sinon arrêt au démarrage
FORGE_MULTI_TENANT_STRICTDésactive l'hydratation globale des identifiants de connecteursPosée sur les hôtes de production
PHI_AT_REST_KEYClé de 64 caractères hexadécimaux pour le chiffrement des données de santéObligatoire en production, tolérée absente en développement déclaré
PHI_AT_REST_KEY_PREVIOUSAncienne clé, lue en repli pendant une rotationOptionnelle
EXPORT_SEAL_KEYScellement des exportsOptionnelle. Absente : l'export scellé est indisponible

Détails : Sécurité.

Limiteurs de débit (connexion)

VariableRôleDéfaut
ACCOUNT_HASH_SALTSel du hachage d'identité par comptevide. Vide = limiteur par compte désactivé
ACCOUNT_RATE_LIMIT_FAILURES_BLOCKÉchecs avant blocage du comptedéfaut du code, non publié
ACCOUNT_RATE_LIMIT_WINDOW_SECSFenêtre de comptagedéfaut du code, non publié
ACCOUNT_RATE_LIMIT_BLOCK_SECSDurée du blocagedéfaut du code, non publié
AUTH_RATE_LIMIT_FAILURES_BACKOFFÉchecs par IP avant ralentissementdéfaut du code, non publié
AUTH_RATE_LIMIT_FAILURES_BLOCKÉchecs par IP avant blocagedéfaut du code, non publié
AUTH_RATE_LIMIT_BLOCK_DURATION_SECSDurée du blocage par IPdéfaut du code, non publié
AUTH_RATE_LIMIT_WHITELISTIP exemptées du seau par IP, séparées par des virgulesvide

Sources : les deux limiteurs de connexion du code.

Purges planifiées

Ces purges sont actives par défaut. Une variable à 0 (ou false) suspend la purge concernée.

VariableRôleDéfaut
RETENTION_SWEEP_ENABLEDPurge des journaux vocaux expirésactive
RETENTION_SWEEP_HOURSCadence de cette purge24
RETENTION_VOICE_DAYSDurée de conservation des journaux vocaux90
BACKUP_RETENTION_SWEEP_ENABLEDPurge des travaux de sauvegarde terminésactive
BACKUP_RETENTION_DAYSDurée de conservation des sauvegardes, en repli du réglage par cible de sauvegarde30
ACCOUNT_PURGE_ENABLEDEffacement définitif des comptes en attente de suppressionactive

Sources : crates/forge-api/src/routes/retention_worker.rs, routes/backup_retention/mod.rs, routes/account_purge_worker.rs et crates/forge-api/src/main.rs (lancement des trois planificateurs).

Messagerie (SMTP)

VariableRôleDéfaut
SMTP_HOSTServeur SMTPlocalhost
SMTP_PORTPort587
SMTP_USERCompte authentifié. C'est aussi l'adresse expéditriceaucun
SMTP_PASSWORDMot de passe du compteaucun
SMTP_SECUREtrue pour une connexion TLS directefalse
EMAIL_FROM, EMAIL_FROM_NAMEExpéditeur de repli et nom affichénom : Chatbotaurus

L'expéditeur est toujours le compte authentifié SMTP_USER : un From différent casse l'alignement SPF et DKIM (crates/forge-core/src/email/mod.rs). Il n'existe pas de variable SMTP_SKIP.

Authentification unique (Authentik, OIDC avec PKCE)

La route GET /api/v1/auth/oidc/login lit ces variables :

VariableRôleDéfaut
AUTHENTIK_SERVER_URLAdresse du serveur Authentikaucun : absente, la route répond 503 SSO_UNAVAILABLE
AUTHENTIK_CLIENT_IDIdentifiant du client OIDCaucun : même réponse 503
AUTHENTIK_CLIENT_SECRETSecret du client OIDCaucun : même réponse 503
AUTHENTIK_REDIRECT_URIURL de retour enregistrée chez Authentikhttp://localhost:8008/api/v1/auth/oidc/callback, défaut de développement : posez-la toujours
OIDC_ALLOW_UNVERIFIED_EMAIL1 ou true accepte un fournisseur qui n'émet pas email_verifiedrefus

La route de retour du backend est GET /api/v1/auth/oidc/callback (crates/forge-api/src/router.rs).

ForgeConfig lit aussi SSO_AUTHENTIK_ENABLED, AUTHENTIK_SLUG, AUTHENTIK_CALLBACK_URL, AUTHENTIK_LOGOUT_URL et AUTHENTIK_ROLE_MAPPING (crates/forge-core/src/config.rs, bloc authentik). Mesure du 2026-10-03 : aucun code hors de config.rs ne consomme ces champs (grep -rn "\.sso\." crates/*/src ne rend rien en dehors de ce fichier). Ils n'ont donc aucun effet sur la connexion SSO aujourd'hui.

Modèles de langage (Ollama)

VariableRôleDéfaut
OLLAMA_BASE_URLAdresse d'Ollamahttp://localhost:11434
OLLAMA_MODELModèle de générationministral-3:3b dans la configuration ; ministral-3:3b-instruct dans l'orchestrateur (OLLAMA_DEFAULT_MODEL en repli)
OLLAMA_EMBEDDING_MODELModèle d'embeddings du client Ollama. Le pipeline RAG n'en dépend pas : il vectorise en local avec fastembed (voir EMBEDDING_MODEL)paraphrase-multilingual-MiniLM-L12-v2
OLLAMA_TIMEOUT_SECSDélai d'une requête (configuration)120
OLLAMA_MAX_RETRIESNouvelles tentatives2
OLLAMA_TEMPERATURETempérature (orchestrateur)0,5
OLLAMA_MAX_TOKENSLongueur maximale de réponse (orchestrateur)800

La liste des modèles souverains (crates/forge-core/src/model_governance.rs) nomme cas/eurollm-1.7b-instruct-q8 (rôle Main, réservé à la traduction : le code précise qu'il ne sert jamais à l'appel d'outil), ministral-3:3b (repli de génération, et défaut de OLLAMA_MODEL) et l'embedder ci-dessus. Aucun défaut du code ne désigne un fournisseur hors UE.

Recherche vectorielle et RAG

VariableRôleDéfaut
QDRANT_URLAdresse gRPC de Qdranthttp://localhost:6334
QDRANT_HOSTAdresse REST utilisée par la sonde de santédérivée de QDRANT_URL
QDRANT_API_KEYClé d'APIaucune
QDRANT_COLLECTION_PREFIXPréfixe des collectionsforge
EMBEDDING_MODELModèle fastembed du pipeline RAG : multilingual (ou variable absente) donne paraphrase-multilingual-MiniLM-L12-v2, 384 dimensions (crates/forge-core/src/rag/embedder.rs)multilingual
QDRANT_VECTOR_SIZEDimension des vecteurs768 dans la configuration, 384 à la création des collections au démarrage
RAG_CHUNK_SIZE, RAG_CHUNK_OVERLAPDécoupage des documents512 et 64
RAG_TOP_K, RAG_SCORE_THRESHOLDPassages retenus et seuil5 et 0,7
ANTI_HALLUCINATION_THRESHOLDSeuil de la garde anti-hallucination0,75

L'embedder du pipeline produit des vecteurs de 384 dimensions. Si vous posez QDRANT_VECTOR_SIZE, posez 384 : une collection créée avec une autre dimension refuse chaque insertion (crates/forge-api/src/main.rs).

Secrets externes (OpenBao)

OpenBao est facultatif. Si BAO_ADDR est posée, il surcharge les secrets d'exécution au démarrage ; sinon les secrets viennent de l'environnement.

VariableRôleDéfaut
BAO_ADDRAdresse du serveurabsente : OpenBao désactivé
BAO_TOKENJeton d'accèsaucun
BAO_KV_MOUNTPoint de montage KV v2secret
BAO_KV_PREFIXPréfixe sous le montagechatbotaurus
BAO_NAMESPACEEspace de nomsaucun
BAO_TIMEOUT_SECSDélai HTTP10
BAO_AUDIT_REQUIREDVrai : le démarrage est refusé si aucun périphérique d'audit n'est actif côté coffrefaux
BAO_CACERT, BAO_CLIENT_CERT, BAO_CLIENT_KEYTLS mutuelaucun

Voix

VariableRôleDéfaut
STT_PROVIDERMoteur de transcription : speaches, kyutai ou mistralspeaches
STT_ENDPOINTAdresse du moteur de transcriptionà définir (voir le paragraphe sous le tableau)
STT_MODELModèle de transcriptionSystran/faster-whisper-large-v3
STT_LANGUAGELanguefr
STT_API_KEYClé d'API du moteur de transcriptionaucune
TTS_PROVIDERMoteur de synthèsekokoro
TTS_ENDPOINTAdresse du moteur de synthèseà définir
TTS_ENDPOINT_SPEACHESAdresse du service qui sert l'allemandabsente : service non déployé

Les défauts de STT_ENDPOINT et TTS_ENDPOINT dans le code sont des adresses publiques qui ne servent rien. Définissez toujours ces deux variables. Le code refuse un point d'accès hors UE.

Supervision

VariableRôleDéfaut
PROMETHEUS_BEARER_TOKENJeton d'accès au point /metricsabsent : session plateforme élevée exigée
FORGE_SIEM_ENABLED1 exporte la chaîne d'audit vers VictoriaLogsdésactivé
FORGE_SIEM_URLAdresse de VictoriaLogshttp://localhost:9428

Voir Supervision.

Connecteurs

CONNECTOR_CATALOGUE_DIR désigne le dossier des manifestes ; le défaut est ./connectors (crates/forge-api/src/main.rs).

Les fichiers connectors/*.yaml interpolent l'environnement avec ${VARIABLE:-défaut} (valeur de repli) ou ${VARIABLE:?message} (la valeur vaut une chaîne vide si la variable est absente ; le message n'est qu'une indication et n'arrête pas le chargement). Chaque connecteur déclare ses propres variables ; pour Odoo : ODOO_URL, ODOO_DATABASE, ODOO_USERNAME, ODOO_API_KEY. Voir Fichiers de configuration.

Frontend (forge-ui)

Le frontend est une application wasm : elle ne lit aucune variable d'environnement dans le navigateur. En web, elle appelle le chemin relatif /api/v1 du même domaine. Sur les cibles natives, l'adresse de l'API se fixe à la compilation avec API_URL ; le défaut est http://localhost:3000/api/v1 (crates/forge-ui/src/config/api.rs).

Voir aussi