variables-environnement.md 21565 octets

Variables d'environnement

Référence exhaustive de toutes les variables d'environnement de gitrust. Ces variables se définissent dans le fichier .env (ou .env.production) et sont chargées une seule fois au démarrage. Modifier le fichier sans redémarrer le service n'a aucun effet.

Principe d'autonomie : ce tableau contient intégralement le contenu documenté de .env.example. La documentation ne référence pas le fichier source par lien — tout est ici.

Les variables marquées SEC ont des contraintes de sécurité vérifiées au démarrage : gitrust refuse de démarrer si elles ne sont pas conformes.


1. Base de données

VariableDéfautObligatoireDescription
DATABASE_URLOuiURL de connexion PostgreSQL. Format : postgres://USER:PASSWORD@HOST:PORT/DB. Le mot de passe doit être fort en production. PostgreSQL ne doit jamais binder sur 0.0.0.0 en production.

Exemples :

# Développement local (Docker Compose)
DATABASE_URL=postgres://gitrust:gitrust@localhost:5432/gitrust

# Production (réseau privé)
DATABASE_URL=postgres://gitrust:MOT_DE_PASSE_FORT@db.internal:5432/gitrust

2. Serveur HTTP

VariableDéfautDescription
SERVER_HOST0.0.0.0Adresse d'écoute HTTP. En production derrière un reverse-proxy : 127.0.0.1. En développement : 0.0.0.0.
SERVER_PORT3000Port HTTP. Convention gitrust : 4000 en production.

3. Logging

VariableDéfautDescription
RUST_LOGdebugNiveau de log (syntaxe tracing_subscriber::EnvFilter). Valeurs : error, warn, info, debug, trace. Syntaxe avancée : "info,gitrust_core=debug,sea_orm=warn".

4. Serveur SSH Git

VariableDéfautDescription
SSH_HOST_KEY_PATH./data/ssh_host_ed25519_keyChemin de la clé hôte SSH Ed25519. Générée automatiquement au premier démarrage si absente. SEC : permissions 600, propriétaire = utilisateur systemd. En production : chemin absolu.
SSH_PORT2222Port d'écoute du serveur SSH Russh (intégré, distinct de sshd).
SSH_LISTEN_ADDR0.0.0.0Adresse d'écoute SSH. 127.0.0.1 si derrière un proxy nginx stream.
SSH_PUBLIC_HOSTlocalhostNom d'hôte affiché dans les URLs de clone SSH dans l'UI. En production : FQDN public.
MAX_SSH_KEY_SIZE16384Taille maximale d'une clé SSH publique acceptée (octets).

5. JWT et authentification

VariableDéfautDescription
JWT_SECRETSEC OBLIGATOIRE — Secret de signature JWT. Minimum 32 bytes. Générer avec openssl rand -hex 64. Les valeurs exemples (change-me-in-production, etc.) sont explicitement rejetées au démarrage. Changer cette valeur invalide toutes les sessions actives.
JWT_EXPIRATION_MINUTES15Durée de vie d'un JWT d'accès (minutes).
JWT_ISSUERmon-appValeur du claim iss dans le JWT. En production : FQDN public.
REFRESH_TOKEN_EXPIRATION_DAYS7Durée du refresh token (jours). Rotation à chaque usage.
REMEMBER_ME_EXPIRATION_DAYS30Durée étendue quand « Se souvenir de moi » est coché. SEC : doit être ≥ REFRESH_TOKEN_EXPIRATION_DAYS et ≤ 90 jours. Au-delà de 60 jours : warning dans les logs.

6. Sessions

VariableDéfautDescription
SESSION_TIMEOUT_MINUTES30Timeout d'inactivité d'une session (minutes).
SESSION_BACKENDseaormBackend de stockage : memory (volatil, dev uniquement), seaorm (PostgreSQL, recommandé), redis (multi-instances, nécessite REDIS_URL).
REDIS_URLURL Redis (obligatoire si SESSION_BACKEND=redis). Exemple : redis://localhost:6379.

7. Rate limiting

VariableDéfautDescription
RATE_LIMIT_LOGIN_PER_MINUTE5Tentatives de connexion par IP par minute. Protection contre le brute force.
RATE_LIMIT_REFRESH_PER_MINUTE10Rafraîchissements de token par IP par minute.
RATE_LIMIT_GENERAL_PER_MINUTE100Limite globale sur tous les autres endpoints. 0 = désactivé (déconseillé).

8. Cookies et debug

VariableDéfautDescription
APP_DEBUGfalseSEC : true = logs verbeux, cookies non sécurisés (HTTP local). false = production, enforce COOKIE_SECURE=true même si défini à false. Ne jamais mettre true en production.
COOKIE_SECUREfalseCookies envoyés uniquement via HTTPS. SEC : forcé à true si APP_DEBUG=false.
COOKIE_SAME_SITELaxPolitique SameSite. Strict (le plus sûr, casse les redirections OAuth cross-site), Lax (compatible OAuth), None (nécessite Secure=true).

9. Bootstrap admin initial

VariableDéfautDescription
ADMIN_USERNAMEadminNom d'utilisateur du compte admin créé au premier démarrage (si la table users est vide). 3-64 caractères alphanumériques + _-.
ADMIN_EMAILadmin@example.comAdresse e-mail du compte admin initial. Doit contenir @ + domaine avec ..
ADMIN_PASSWORDSEC OBLIGATOIRE — Mot de passe du compte admin initial. Minimum 8 caractères. À remplacer immédiatement après le premier démarrage.
CREATE_DEFAULT_ADMINtrueMettre à false une fois d'autres admins créés pour désactiver la création automatique.

10. Email SMTP

VariableDéfautDescription
SMTP_HOSTServeur SMTP. Obligatoire pour activer les e-mails. Sans cette variable, gitrust démarre mais les fonctionnalités e-mail sont désactivées.
SMTP_PORT587Port SMTP : 25 (non chiffré, interdit en prod), 465 (TLS natif), 587 (STARTTLS, recommandé), 1025 (dev/Mailpit).
SMTP_USERIdentifiant SMTP. Souvent = adresse e-mail expéditrice.
SMTP_PASSWORDMot de passe applicatif SMTP (pas le mot de passe du compte e-mail).
SMTP_FROMAdresse expéditeur. Doit être valide (validée par is_valid_email). En prod : valider DKIM/SPF sur le domaine.
SMTP_FROM_NAMENom affiché dans le champ « De : » des e-mails.
SMTP_USE_TLStrueActiver TLS natif (port 465).
SMTP_USE_STARTTLStrueActiver STARTTLS (port 587). SEC : ne jamais désactiver les deux en production.
SMTP_ACCEPT_INVALID_CERTSfalseSEC : accepter les certificats SMTP invalides. Warning au démarrage si true. Uniquement pour les serveurs de mail internes en développement.
SMTP_CA_CERT_PATHChemin vers un CA personnalisé (PEM) pour valider le certificat SMTP.
EMAIL_BASE_URLhttp://localhost:3000URL de base pour les liens dans les e-mails. Obligatoire en prod sinon les liens pointent vers localhost. Doit commencer par http:// ou https://.
EMAIL_QUEUE_BATCH_SIZE10Nombre d'e-mails traités par tick du worker.
EMAIL_QUEUE_RETRY_ATTEMPTS5Tentatives d'envoi avant abandon.
EMAIL_QUEUE_RETRY_DELAY_SECONDS300Délai entre deux tentatives (secondes).
EMAIL_QUEUE_INTERVAL_SECS30Intervalle du tick du worker e-mail (secondes).
EMAIL_VALIDATION_REQUIREDtrueExiger la validation e-mail à l'inscription. Note : cette variable est documentée dans .env.example mais la valeur effective est contrôlée par le paramètre dynamique validation_email_required en base de données.

11. Inscription

VariableDéfautDescription
ALLOW_REGISTRATIONfalseAutoriser l'inscription publique. Note : valeur effective contrôlée par le paramètre dynamique allow_registration en base de données — voir Paramètres dynamiques.

12. Application (branding)

VariableDéfautDescription
APP_NAMEMon ApplicationNom affiché dans l'UI, les e-mails et la balise <title>.
APP_THEMElightThème visuel. Valeurs : light, dark.
DEFAULT_LOCALEfrLangue par défaut. Valeurs : fr, en, de, es, pt, it.

13. IMAP — traitement des bounces (optionnel)

Si IMAP_HOST est vide, la fonctionnalité est désactivée sans erreur.

VariableDéfautDescription
IMAP_HOSTServeur IMAP. Obligatoire pour activer le traitement des bounces.
IMAP_PORT993Port IMAP : 993 (TLS direct, recommandé), 143 (STARTTLS).
IMAP_USER= SMTP_USERIdentifiant IMAP.
IMAP_PASSWORD= SMTP_PASSWORDMot de passe IMAP.
IMAP_USE_TLStrueTLS direct (port 993).
IMAP_USE_STARTTLSfalseSTARTTLS après connexion (port 143).
IMAP_ACCEPT_INVALID_CERTSfalseAccepter les certificats invalides (warning si true).
IMAP_MAILBOXINBOXBoîte à scanner pour les bounces.
IMAP_POLL_INTERVAL_SECONDS300Intervalle de poll (secondes).
IMAP_SOCKET_TIMEOUT_SECS30Timeout socket read/write.

14. Tâches de fond — intervalles et expirations

Ces variables ont des valeurs par défaut raisonnables. Ne les ajustez que si vous avez un besoin spécifique.

VariableDéfautDescription
PASSWORD_CHANGE_RETRY_INTERVAL_SECS600Retry e-mail changement de mot de passe (10 min).
PASSWORD_CHANGE_RETRY_GAP_MINUTES20Espacement minimum entre deux retries.
PASSWORD_CHANGE_MAX_RETRIES3Abandon après N échecs.
PASSWORD_CHANGE_CLEANUP_INTERVAL_SECS86400Nettoyage quotidien des demandes expirées.
PASSWORD_CHANGE_EXPIRATION_HOURS24Validité d'une demande de changement de mot de passe.
PASSWORD_CHANGE_RATE_LIMIT_MAX3Demandes maximum par fenêtre.
PASSWORD_CHANGE_RATE_LIMIT_WINDOW_SECS3600Fenêtre de rate limit (1 heure).
PASSWORD_RESET_EXPIRATION_HOURS1Validité du lien de réinitialisation de mot de passe.
EMAIL_VALIDATION_EXPIRATION_HOURS24Validité du lien de validation e-mail.
JWT_CLEANUP_INTERVAL_SECS3600Purge de la blacklist JWT expirés.
COOKIE_PREFERENCE_MAX_AGE_SECS31536000Durée de vie du cookie de préférences (locale/thème) — 1 an.
PAGINATION_DEFAULT_PER_PAGE50Taille par défaut des pages de liste.
PAGINATION_MAX_PER_PAGE100Taille maximale des pages de liste.

15. Dépôts Git

VariableDéfautDescription
GIT_REPOS_BASE_PATH./data/reposChemin des dépôts bare. Structure : {base}/{owner}/{repo}.git. En production : chemin absolu (ex. /opt/gitrust/data/repos). SEC : path traversal bloqué au niveau service.

16. Fichiers statiques

VariableDéfautDescription
STATIC_FILES_PATH./staticChemin du dossier des assets statiques (CSS, JS, images). En production avec systemd : chemin absolu (ex. /opt/gitrust/static).

17. CI/CD Dagger

VariableDéfautDescription
CI_ENABLEDtrueActivation globale de la CI. false = plus aucune exécution de pipeline, mais l'UI reste accessible.
CI_DAGGER_BINdaggerChemin du binaire Dagger. En production : chemin absolu recommandé.
CI_ENGINE_PATH./deployment/ci-engineChemin du module CI (Easy Mode — interprète .gitrust-ci.yml).
CI_MAX_CONCURRENT4Pipelines exécutés simultanément. Au-delà : file d'attente.
CI_DEFAULT_TIMEOUT3600Timeout par défaut d'un pipeline (secondes). Surchargeable par pipeline.
CI_WORKSPACE_PATH/tmp/gitrust-ciDossier de travail temporaire CI (checkouts, artefacts). En production : /var/lib/gitrust-ci.
CI_LOG_RETENTION_DAYS30Rétention des logs de pipeline (jours).

18. Runner CI distant (SSH + rsync)

VariableDéfautDescription
CI_REMOTE_HOSTlocalhostHost du runner CI. localhost = CI sur la même machine.
CI_REMOTE_USER$USERUtilisateur SSH sur le runner.
CI_REMOTE_PATH/opt/gitrust-ciChemin de travail sur le runner.
CI_REMOTE_SSH_KEYChemin de la clé privée SSH pour le runner. Optionnel si ssh-agent est chargé.
CI_REMOTE_SSH_PORT22Port SSH du runner.

19. Import de dépôts externes

VariableDéfautDescription
IMPORT_MAX_CONCURRENT2Nombre maximum de clones concurrents.
IMPORT_TIMEOUT_SECS1800Timeout par import (secondes). Augmenter pour les gros monorepos.
DB_WORKER_POOL_SIZE4Pool de connexions DB dédié au worker d'import. Évite la saturation du pool HTTP principal.

20. SBOM / Dependency-Track

VariableDéfautDescription
CI_SBOM_ENABLEDfalseGénérer un SBOM (Software Bill of Materials) à chaque pipeline via Syft. Nécessite syft installé.
CI_SYFT_BINsyftChemin du binaire Syft.
CI_DTRACK_ENABLEDfalsePousser le SBOM vers Dependency-Track (nécessite CI_SBOM_ENABLED=true).
CI_DTRACK_URLURL API de Dependency-Track (ex. https://dtrack.internal/api).
CI_DTRACK_API_KEYClé API Dependency-Track (générer dans l'UI Dtrack : Administration > API keys).
CI_DTRACK_FRONTEND_URLURL UI Dependency-Track. Si absent : déduite de CI_DTRACK_URL.

21. OAuth / SSO

VariableDéfautDescription
OAUTH_ENCRYPTION_KEYClé de chiffrement AES-256-GCM des secrets OAuth en base. Générer avec openssl rand -hex 32.
OAUTH_ENABLEDfalseActivation globale OAuth. Fallback si pas de valeur en base.
OAUTH_REDIRECT_BASE_URLhttp://localhost:3000URL de base pour les callbacks OAuth : {URL}/api/v1/auth/oauth/{provider}/callback.
OAUTH_GOOGLE_ENABLEDfalseActiver Google OAuth.
OAUTH_GOOGLE_CLIENT_IDClient ID Google.
OAUTH_GOOGLE_CLIENT_SECRETClient Secret Google.
OAUTH_GITHUB_ENABLEDfalseActiver GitHub OAuth.
OAUTH_GITHUB_CLIENT_IDClient ID GitHub.
OAUTH_GITHUB_CLIENT_SECRETClient Secret GitHub.
OAUTH_DISCORD_ENABLEDfalseActiver Discord OAuth.
OAUTH_DISCORD_CLIENT_IDClient ID Discord.
OAUTH_DISCORD_CLIENT_SECRETClient Secret Discord.
OAUTH_MICROSOFT_ENABLEDfalseActiver Microsoft / Azure AD OAuth.
OAUTH_MICROSOFT_CLIENT_IDClient ID Azure (Application ID).
OAUTH_MICROSOFT_CLIENT_SECRETClient Secret Azure.
OAUTH_MICROSOFT_TENANTcommonTenant Azure AD : "common" (comptes perso + pro), "organizations" (pro uniquement), ou GUID du tenant.

22. Durcissement SSH (SSH_GUARD_*)

Variables consommées par la crate gitrust-ssh-guard. Toutes sont préfixées SSH_GUARD_. Pour le détail des comportements, voir Configurer ssh-guard et ssh-guard : détection d'attaques SSH.

Modèle de configuration : SSH_GUARD_PROFILE sélectionne un preset cohérent (direct / nginx / haproxy / private / custom). Chaque autre variable override individuellement le défaut du preset.

22.1 Kill switch et profil

VariableDéfautDescription
SSH_GUARD_ENABLEDtruefalse = pass-through complet, ssh-guard ne fait rien. À éviter sauf urgence.
SSH_GUARD_DRY_RUNfalsetrue = les détecteurs tournent et émettent les événements ip_banned, mais aucun ban n'est persisté. Idéal pour valider un nouveau seuil.
SSH_GUARD_PROFILEcustomPreset : direct (Internet direct), nginx (derrière nginx stream + PROXY v2), haproxy (derrière HAProxy), private (réseau interne, détecteurs OFF), custom (aucun preset).

22.2 PROXY protocol

VariableDéfautDescription
SSH_GUARD_PROXY_PROTOCOLdisabledMode parsing PROXY : disabled, v1 (texte HAProxy legacy), v2 (binaire nginx stream / HAProxy moderne), any (auto-détection v1/v2).
SSH_GUARD_PROXY_PROTOCOL_STRICTtruetrue = drop si en-tête PROXY absent ou invalide quand le mode est activé. false = fallback sur peer_addr avec warn (utile en transition).
SSH_GUARD_PROXY_PROTOCOL_TIMEOUT_MS3000Timeout (ms) pour lire l'en-tête PROXY après accept TCP.
SSH_GUARD_TRUSTED_PROXIESObligatoire si PROXY activé. Liste CIDR (séparée par virgules) des proxies autorisés à émettre un en-tête PROXY. Sans cette protection, n'importe qui pourrait forger une IP cliente. Exemple : 127.0.0.1/32,::1/128.

22.3 Détecteurs (seuils + fenêtres)

VariableDéfautDescription
SSH_GUARD_BRUTE_FORCE_THRESHOLD5Nombre d'échecs d'auth depuis une IP avant ban auto. 4294967295 (u32::MAX) = détecteur désactivé.
SSH_GUARD_BRUTE_FORCE_WINDOW_SECS300Fenêtre glissante (secondes).
SSH_GUARD_USER_ENUM_THRESHOLD10Nombre d'usernames distincts essayés depuis une IP.
SSH_GUARD_USER_ENUM_WINDOW_SECS300
SSH_GUARD_KEY_SCAN_THRESHOLD10Nombre de fingerprints de clé distincts essayés depuis une IP.
SSH_GUARD_KEY_SCAN_WINDOW_SECS300
SSH_GUARD_CONN_FLOOD_PER_SEC10Cap dur de nouvelles connexions TCP par IP par seconde. 0 ou u32::MAX = désactivé.
SSH_GUARD_CONN_FLOOD_BURST20Burst autorisé au-dessus du cap soutenu.
SSH_GUARD_MAX_CONCURRENT_PER_IP10Limite de sessions concurrentes par IP (placeholder, non encore appliqué).

22.4 Ban

VariableDéfautDescription
SSH_GUARD_AUTO_BAN_DURATION_SECS3600TTL des bans posés par les détecteurs. 0 = ban permanent.

22.5 Stockage

VariableDéfautDescription
SSH_GUARD_STORE_BACKENDhybridmemory (DashMap, perdu au restart), postgres (chaque write en DB), hybrid (RAM chaude + write-through DB + rehydrate au boot — défaut recommandé).
SSH_GUARD_STORE_FLUSH_INTERVAL_MS1000Intervalle entre deux flushs RAM → Postgres pour le mode hybrid.
SSH_GUARD_EVENTS_RETENTION_DAYS90Rétention de la table ssh_guard_events (utilisée par les détecteurs). Au-delà, les lignes sont purgées.

22.6 Observabilité

VariableDéfautDescription
SSH_GUARD_LOG_FORMATjsonjson (stable, fail2ban-friendly) ou text (debug uniquement).
SSH_GUARD_LOG_TARGETstderrstderr (via tracing → journald), file (fichier dédié uniquement), both (les deux).
SSH_GUARD_LOG_FILE/var/log/gitrust-ssh-guard.jsonChemin du fichier dédié si LOG_TARGET=file ou both. Logrotate quasi obligatoire (sinon le fichier grossit sans limite).
SSH_GUARD_METRICS_ENABLEDtrueExpose les métriques Prometheus (placeholder, exposition future).

22.7 Validations bloquantes au démarrage

gitrust refuse de démarrer si :

  • SSH_GUARD_PROXY_PROTOCOL est activé sans SSH_GUARD_TRUSTED_PROXIES (forge d'IP triviale sinon).
  • SSH_GUARD_LOG_TARGET=file ou both sans SSH_GUARD_LOG_FILE valide.

Le message d'erreur identifie la variable fautive.


Récapitulatif local vs production

DimensionLocal (dev)Production
DATABASE_URL hostlocalhostRéseau privé
SERVER_HOST0.0.0.0127.0.0.1 (derrière nginx)
SERVER_PORT3000 ou 40004000 (nginx devant)
SSH_LISTEN_ADDR0.0.0.0127.0.0.1 (nginx stream)
SSH_PUBLIC_HOSTlocalhostFQDN public
COOKIE_SECUREfalse (HTTP)true (HTTPS, forcé)
APP_DEBUGtruefalse (force sécurité)
EMAIL_BASE_URLhttp://localhost:...https://FQDN
JWT_SECRETValeur courte OKopenssl rand -hex 64
ADMIN_PASSWORDFaible acceptéFort (≥ 16 caractères)
ALLOW_REGISTRATIONtruefalse (instance fermée)
RUST_LOGdebuginfo ou warn
GIT_REPOS_BASE_PATHRelatif (./data)Absolu (/opt/gitrust)

Pour aller plus loin