Aller au contenu principal

Référence des variables d'environnement

Chaque variable d'environnement que Tale lit au boot, sa valeur par défaut et la surface produit qu'elle contrôle. La référence opérateur complète pour `.env`.

12 min de lecture

Tale lit sa configuration depuis un unique fichier .env à la racine du dépôt. Environ une douzaine de variables sont obligatoires au premier boot ; les autres ajustent le comportement. Cette page liste chaque variable que .env.example ship, sa valeur par défaut et la surface produit qui la consomme.

Les groupes sont ordonnés selon le moment où tu en as besoin la première fois : identité de domaine, TLS, secrets, base de données, instance, observabilité, chiffrement des fournisseurs. Si une variable change de valeur, redémarre le conteneur plateforme (docker compose restart tale-platform tale-convex) pour qu'elle prenne effet.

Comment lire cette page

Chaque groupe est un tableau Nom | Défaut | Description. Les variables marquées Obligatoire doivent être définies pour que docker compose up réussisse. Les variables marquées Optionnel peuvent rester non définies ; la description nomme ce que désactiver la fonctionnalité signifie.

Le fichier .env.example ship des commentaires inline qui expliquent chaque variable dans son contexte ; cette page est la référence structurée et groupée pour le même ensemble.

Identité de domaine (obligatoire au premier boot)

NomDéfautDescription
HOSTlocalhostObligatoire. Nom d'hôte sans protocole. Utilisé pour le réseau Docker et le mail sortant.
SITE_URLhttps://localhostObligatoire. URL canonique complète incluant le schéma et tout port non standard. Les callbacks d'auth l'utilisent.
BASE_PATHnon définiOptionnel. Préfixe de chemin pour les déploiements en sous-chemin derrière un reverse proxy (ex. /app). Laisse vide pour la racine.

Le SITE_URL doit correspondre exactement à ce que l'utilisateur tape dans le navigateur. Un slash en queue, un port manquant ou http au lieu de https cassent le callback d'auth et produisent des boucles de sign-in.

TLS

NomDéfautDescription
TLS_MODEselfsignedUn de selfsigned, letsencrypt, external. Voir TLS et domaines.
TLS_EMAILnon définiE-mail de contact pour les notifications Let's Encrypt. Optionnel mais recommandé en production.

selfsigned fait tourner Caddy avec un certificat généré — le navigateur avertit, OK pour le développement. letsencrypt exige un vrai domaine et les ports 80/443 joignables depuis l'Internet public. external fait servir Caddy en HTTP brut ; un reverse proxy amont termine TLS.

Secrets de sécurité (obligatoire)

NomDéfautDescription
BETTER_AUTH_SECRETvaleur d'exemple dans le fichierObligatoire. Secret base64 pour le signeur de session Better Auth. Génère avec openssl rand -base64 32. La rotation invalide chaque session.
ENCRYPTION_SECRET_HEXvaleur d'exemple dans le fichierObligatoire. Clé hex de 32 octets. Clé AES-256 pour les credentials OAuth et intégrations et entrée HKDF pour la secret-box des garde-fous. Génère avec openssl rand -hex 32. La rotation invalide chaque ciphertext en base ; les opérateurs doivent réinscrire les secrets concernés.
INSTANCE_SECRETvaleur d'exemple dans le fichierObligatoire. Sert à dériver la clé admin Convex pour tale deploy. Le déploiement échoue si non défini.

Remplace les valeurs livrées dans .env.example avant d'exposer l'instance — ce sont des espaces réservés volontairement non sûrs.

Base de données

Tale fait tourner deux bases Postgres : la base opérationnelle (db, port 5432) derrière le backend Convex, et le corpus de connaissances (knowledge-db, port 5433) qui détient les fragments de documents, les embeddings et les pages crawlées. Les deux sont ParadeDB et partagent DB_PASSWORD, mais elles sont indépendantes — pointe l'une ou l'autre vers une infrastructure externe séparément.

NomDéfautDescription
DB_PASSWORDtale_password_change_meObligatoire. Mot de passe pour l'utilisateur Postgres auto-hébergé. Change-le avant la production. Utilisé par les deux conteneurs de base de données.
POSTGRES_URLconstruit depuis DB_PASSWORDOptionnel. Override de l'URL de la base opérationnelle construite automatiquement. Utilise-le pour pointer sur un Postgres externe ou un hôte/port non standard.
KNOWLEDGE_DATABASE_URLpostgresql://tale:${DB_PASSWORD}@knowledge-db:5432/tale_knowledgeOptionnel. URL de connexion que le backend Convex utilise pour le corpus de connaissances. Override pour relocaliser le corpus vers ton propre ParadeDB géré — la banque sensible à la résidence se déplace indépendamment.
KNOWLEDGE_DB_NAMEtale_knowledgeOptionnel. Nom de la base de connaissances. Le conteneur knowledge-db fourni crée cette base au premier boot.

La forme opérationnelle auto-construite est postgresql://tale:${DB_PASSWORD}@db:5432. Convex attend cette URL sans nom de base ; le nom est dérivé de la configuration d'instance. Le corpus de connaissances vit dans tale_knowledge avec les schémas private_knowledge et public_web ; l'UI Paramètres > Résidence des données écrit une config par banque plus riche que ces variables brutes, couverte dans Résidence des données.

Observabilité

NomDéfautDescription
SENTRY_DSNnon définiDSN Sentry pour le suivi d'erreurs. Laisse vide pour désactiver. Compatible avec GlitchTip et Bugsink auto-hébergés.
SENTRY_TRACES_SAMPLE_RATEnon définiTaux d'échantillonnage optionnel pour les traces de performance (0.01.0). Le comportement par défaut dépend du déploiement.
METRICS_BEARER_TOKENnon définiToken bearer requis pour accéder aux endpoints Prometheus /metrics/*. Laisse vide pour rendre les endpoints inatteignables de l'extérieur.

Définir METRICS_BEARER_TOKEN expose deux endpoints derrière le token : /metrics/platform et /metrics/convex (les 261 métriques intégrées de Convex, qui portent désormais aussi les timings RAG et de crawl). Voir Configuration d'observabilité pour la configuration de scrape.

Chiffrement des secrets de fournisseur

NomDéfautDescription
SOPS_AGE_KEYnon définiClé secrète age inline. Chiffre providers/*.secrets.json. Mode par défaut après tale init. Plusieurs clés ne sont pas supportées en inline.
SOPS_AGE_KEY_FILEnon définiChemin vers un fichier avec une ou plusieurs clés age (une par ligne ; commentaires # autorisés). Obligatoire pour la rotation. S'exclut mutuellement avec la forme inline.

Si les deux clés age ne sont pas définies, Tale stocke providers/*.secrets.json en JSON clair en mode 0600. Atteins ce mode seulement si le disque hôte est chiffré au repos ou si les fichiers sont produits par un outillage externe (un montage de secret Kubernetes, un template Vault). Faire tourner une clé age, c'est ajouter la nouvelle clé, réenregistrer chaque fournisseur dans l'UI, puis retirer l'ancienne. Voir Secrets avec SOPS pour la marche complète de rotation.

La source de clé par variable d'environnement ne nécessite aucun commutateur de déploiement : un fournisseur peut lire sa clé depuis une variable d'environnement plutôt que depuis un fichier de secrets, tant que la variable est nommée avec le préfixe réservé TALE_PROVIDER_KEY_ (tout autre nom est rejeté). Le mécanisme — la barrière de préfixe, l'ordre de résolution, le plafond de 40 caractères, l'exigence de redémarrage — est documenté dans Fournisseurs.

Une source de jetons suit le même schéma pour le secret d'auth du courtier qu'elle lui envoie : elle lit depuis un sidecar chiffré token-sources/<slug>.secrets.json, ou depuis une variable d'environnement nommée avec le préfixe réservé TALE_TOKEN_SOURCE_ (tout autre nom est rejeté, donc le champ ne peut jamais pointer sur un secret de déploiement). La variable est par source ; définis-la ici ou dans ton gestionnaire de secrets pour que la plateforme et le backend Convex puissent tous deux la lire.

Drapeaux de fonctionnalité

Bascules optionnelles pour des fonctionnalités non activées par défaut. Chaque drapeau active ou désactive une fonctionnalité au boot ; basculer demande un redémarrage du conteneur plateforme.

NomDéfautDescription
TRUSTED_HEADERS_ENABLEDfalseActive le mode auth par trusted headers (identité fournie par le reverse proxy).
FILE_EVENTS_ENABLEDfalseActive les événements de surveillance de fichiers pour l'intégration OneDrive-sync.
TALE_DEPLOYMENT_CONFIG_ADMINSnon définiAllowlist de courriels (séparés par des virgules) des opérateurs autorisés à modifier la résidence des données du déploiement. Vide/non défini = lecture seule pour tous les admins.

Contrôleur de redémarrage

Le sidecar controller, à activer explicitement, alimente le bouton en un clic Appliquer & redémarrer de la page Résidence des données : il redémarre le conteneur convex après un changement de configuration, pour que la plateforme exposée au navigateur n'ait jamais besoin d'accéder au socket Docker. Active-le avec docker compose --profile controller up -d, puis définis les deux variables ci-dessous. Laisse-les non définies pour continuer à redémarrer convex à la main.

NomDéfautDescription
CONTROLLER_TOKENnon définiSecret HMAC partagé pour Appliquer & redémarrer. Le controller refuse de démarrer sans lui, et la plateforme signe chaque requête de redémarrage avec lui — les deux valeurs doivent correspondre. Génère-le avec openssl rand -hex 32.
CONTROLLER_URLnon définiURL de base que la plateforme utilise pour joindre le sidecar controller (p. ex. http://controller:8004 sur le réseau interne). Si celle-ci ou CONTROLLER_TOKEN est non définie, Appliquer & redémarrer montre plutôt la commande manuelle.

Réglage du retrieval RAG

Réglages optionnels pour la recherche dans la base de connaissances. Le chemin RAG en in-process (node-actions Convex) re-note les résultats avec un cross-encoder quand le re-ranking est activé. Tous portent le préfixe RAG_ et sont lus par les conteneurs platform et convex au boot ; après un changement, lance docker compose restart platform convex pour qu'il prenne effet.

NomDéfautDescription
RAG_RERANKING_ENABLEDfalseRe-note les candidats fusionnés BM25 + vecteur avec un cross-encoder avant de renvoyer les résultats. Améliore la précision au prix de la latence par requête.
RAG_RERANKING_MODELcross-encoder/ms-marco-MiniLM-L-6-v2Identifiant du modèle cross-encoder transmis au fournisseur de rerank.
RAG_RERANKING_PROVIDERlocalDoit être réglé sur api pour activer le re-ranking — il poste les candidats à un endpoint /rerank externe (compatible Cohere/Jina). local n'est plus supporté et échoue tout de suite.
RAG_RERANKING_TOP_K10Nombre maximal de résultats que le reranker renvoie. La réponse ne dépasse jamais le top_k de la requête.
RAG_RERANKING_CANDIDATES30Taille du pool de candidats fourni au reranker. Un pool plus large améliore la qualité de re-notation et coûte proportionnellement plus de temps par requête.
RAG_RERANKING_API_BASE_URLnon définiURL de base du fournisseur de rerank ; la plateforme appelle {base_url}/rerank. Obligatoire quand le re-ranking est activé.
RAG_RERANKING_API_KEYnon définiToken Bearer envoyé à l'endpoint de rerank externe. Laisse-le non défini pour les endpoints sans authentification.

Le re-ranking est livré désactivé parce qu'il ajoute de la latence par requête et dépend d'un endpoint externe. Active-le — en réglant RAG_RERANKING_PROVIDER=api et en pointant RAG_RERANKING_API_BASE_URL vers un service de rerank hébergé — quand la précision du retrieval compte plus que le temps de réponse. Il n'y a aucun modèle en in-process à télécharger ou à mettre en cache ; le re-ranking désactivé, la recherche renvoie le classement hybride BM25 + vecteur simple.

Sessions

NomDéfautDescription
SESSION_IDLE_TIMEOUT_MINUTESnon définiOptionnel. Déconnecte une session après ce nombre de minutes d'inactivité (11440). La fenêtre glisse à chaque activité et est appliquée côté serveur — sessions e-mail/mot de passe, SSO et trusted headers.

Laisse-le non défini pour conserver la durée de session par défaut. Si défini, une session inactive expire côté serveur une fois la fenêtre écoulée, tandis qu'une session active continue de glisser à chaque requête. Les Administrateurs d'organisation peuvent raccourcir la fenêtre effective par organisation — jamais l'allonger au-delà de ce plafond — via la politique de gouvernance du délai d'inactivité de session ; les sessions inactives sous cette politique sont révoquées par une passe qui tourne environ toutes les cinq minutes.

Ingestion de liens vidéo (yt-dlp)

Coller un lien vidéo dans le chat récupère sa transcription pour l'agent. YouTube bloque l'accès automatisé depuis les IP de centres de données/serveurs, ce qui peut échouer sur un déploiement cloud. Le déploiement embarque par défaut un fournisseur de PO tokens câblé d'origine (voir Ingestion vidéo pour le tableau complet) ; les options ci-dessous sont des surcharges et des escalades facultatives. Aucune ne garantit un contournement — une IP de sortie propre est le levier le plus important. Lues par le conteneur convex et réévaluées à chaque ingestion, donc une modification prend effet sans redémarrage.

NomDéfautDescription
VIDEO_INGEST_PROXY_URLnon définiAcheminer la sortie de yt-dlp via un proxy (une IP résidentielle/FAI fonctionne le mieux ; les proxys de centre de données sont généralement signalés aussi). Schémas : http, https, socks4, socks4a, socks5, socks5h — privilégie socks5h:// pour que le DNS soit résolu au niveau du proxy.
VIDEO_INGEST_POT_PROVIDER_URLhttp://bgutil-provider:4416 (intégré)URL de base du fournisseur de PO tokens qui fournit les tokens GVS levant le mur anti-bot de YouTube. Par défaut, le sidecar compose bgutil-provider quand le plugin intégré est présent — à définir uniquement pour pointer vers un fournisseur sur un autre hôte.
VIDEO_INGEST_FETCH_POTalways dès qu'un fournisseur est branchéQuand yt-dlp demande des PO tokens au fournisseur (never/auto/always). Le auto de yt-dlp n'en demande jamais pour la requête player — précisément là où le mur anti-bot frappe —, Tale passe donc à always dès qu'un fournisseur est présent. never contourne un fournisseur défaillant.
VIDEO_INGEST_YTDLP_PLUGIN_DIRS/opt/yt-dlp/plugins (intégré)Répertoire depuis lequel yt-dlp charge les plugins — chaque plugin imbriqué un niveau plus bas (<dir>/<nom>/yt_dlp_plugins/…). Par défaut, le répertoire de plugins bgutil intégré quand il est présent ; ne le remplace que pour ajouter tes propres plugins.
VIDEO_INGEST_COOKIES_FILEnon définiChemin vers un fichier de cookies Netscape. Des cookies invités issus d'une session privée augmentent la limite de débit sans risque de bannissement ; des cookies de compte débloquent le contenu restreint mais risquent le compte.
VIDEO_INGEST_PLAYER_CLIENTdefault,tv_simplyListe de repli des clients de lecture YouTube, séparés par des virgules. Quand un fournisseur de PO tokens est branché, la valeur par défaut s'élargit à default,mweb,tv_simply (mweb exige un token GVS) ; définis-la explicitement pour forcer une liste.
VIDEO_INGEST_PO_TOKENnon définiPO token défini manuellement (CLIENT.CONTEXT+TOKEN). Surtout pour les tests — les tokens sont liés à l'ID de la vidéo et éphémères ; privilégie le fournisseur.
VIDEO_INGEST_IMPERSONATEnon définiCible d'imitation TLS/JA3 du navigateur (p. ex. safari). Nécessite curl_cffi dans l'image ; à laisser non défini sauf disponibilité connue.
VIDEO_INGEST_BIN_DIRnon définiRépertoire ajouté en tête du PATH du processus enfant yt-dlp/ffmpeg, pour qu'un yt-dlp auto-provisionné (et son runtime Deno) installé hors des répertoires bin intégrés soit trouvé en premier. L'image convex intègre yt-dlp dans le PATH, donc laisse-le non défini là ; définis-le sur un hôte ou une machine de dev avec sa propre toolchain.
VIDEO_INGEST_FFMPEG_LOCATION/usr/bin/ffmpegChemin absolu vers le ffmpeg que yt-dlp utilise pour la post-production (conversion des sous-titres, extraction audio). À surcharger quand ffmpeg vit ailleurs — p. ex. le /opt/homebrew/bin/ffmpeg de Homebrew sur une machine de dev macOS.

Aucune de ces options ne garantit le succès face à la détection adaptative de YouTube. Les vidéos publiques ordinaires, les plateformes moins agressives ou un déploiement à IP résidentielle/auto-hébergé fonctionnent généralement sans elles. Voir pièces jointes du chat pour l'usage des transcriptions ingérées.

Où cela s'inscrit

Les variables ici sont la surface de contact de l'opérateur ; la surface UI qui en consomme la plupart vit sous Plateforme administration. Les clés de fournisseur sont la moitié-et-moitié : les clés elles-mêmes vivent dans providers/*.secrets.json, mais l'UI sous Paramètres > Fournisseurs IA est ainsi que tu les ajoutes et les fais tourner en pratique. La lecture suivante à mettre en file est Fournisseurs — elle couvre la forme fichier, les modes SOPS et le comportement de résolution et de failover.

© 2026 Tale par Ruler GmbH — certifié ISO 27001 et SOC 2.

Tale est sous licence MIT — libre d'utilisation, de modification et de distribution.