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
| Variable |
Défaut |
Obligatoire |
Description |
DATABASE_URL |
— |
Oui |
URL 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
| Variable |
Défaut |
Description |
SERVER_HOST |
0.0.0.0 |
Adresse d'écoute HTTP. En production derrière un reverse-proxy : 127.0.0.1. En développement : 0.0.0.0. |
SERVER_PORT |
3000 |
Port HTTP. Convention gitrust : 4000 en production. |
3. Logging
| Variable |
Défaut |
Description |
RUST_LOG |
debug |
Niveau 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
| Variable |
Défaut |
Description |
SSH_HOST_KEY_PATH |
./data/ssh_host_ed25519_key |
Chemin 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_PORT |
2222 |
Port d'écoute du serveur SSH Russh (intégré, distinct de sshd). |
SSH_LISTEN_ADDR |
0.0.0.0 |
Adresse d'écoute SSH. 127.0.0.1 si derrière un proxy nginx stream. |
SSH_PUBLIC_HOST |
localhost |
Nom d'hôte affiché dans les URLs de clone SSH dans l'UI. En production : FQDN public. |
MAX_SSH_KEY_SIZE |
16384 |
Taille maximale d'une clé SSH publique acceptée (octets). |
5. JWT et authentification
| Variable |
Défaut |
Description |
JWT_SECRET |
— |
SEC 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_MINUTES |
15 |
Durée de vie d'un JWT d'accès (minutes). |
JWT_ISSUER |
mon-app |
Valeur du claim iss dans le JWT. En production : FQDN public. |
REFRESH_TOKEN_EXPIRATION_DAYS |
7 |
Durée du refresh token (jours). Rotation à chaque usage. |
REMEMBER_ME_EXPIRATION_DAYS |
30 |
Duré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
| Variable |
Défaut |
Description |
SESSION_TIMEOUT_MINUTES |
30 |
Timeout d'inactivité d'une session (minutes). |
SESSION_BACKEND |
seaorm |
Backend de stockage : memory (volatil, dev uniquement), seaorm (PostgreSQL, recommandé), redis (multi-instances, nécessite REDIS_URL). |
REDIS_URL |
— |
URL Redis (obligatoire si SESSION_BACKEND=redis). Exemple : redis://localhost:6379. |
7. Rate limiting
| Variable |
Défaut |
Description |
RATE_LIMIT_LOGIN_PER_MINUTE |
5 |
Tentatives de connexion par IP par minute. Protection contre le brute force. |
RATE_LIMIT_REFRESH_PER_MINUTE |
10 |
Rafraîchissements de token par IP par minute. |
RATE_LIMIT_GENERAL_PER_MINUTE |
100 |
Limite globale sur tous les autres endpoints. 0 = désactivé (déconseillé). |
8. Cookies et debug
| Variable |
Défaut |
Description |
APP_DEBUG |
false |
SEC : 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_SECURE |
false |
Cookies envoyés uniquement via HTTPS. SEC : forcé à true si APP_DEBUG=false. |
COOKIE_SAME_SITE |
Lax |
Politique SameSite. Strict (le plus sûr, casse les redirections OAuth cross-site), Lax (compatible OAuth), None (nécessite Secure=true). |
9. Bootstrap admin initial
| Variable |
Défaut |
Description |
ADMIN_USERNAME |
admin |
Nom d'utilisateur du compte admin créé au premier démarrage (si la table users est vide). 3-64 caractères alphanumériques + _-. |
ADMIN_EMAIL |
admin@example.com |
Adresse e-mail du compte admin initial. Doit contenir @ + domaine avec .. |
ADMIN_PASSWORD |
— |
SEC OBLIGATOIRE — Mot de passe du compte admin initial. Minimum 8 caractères. À remplacer immédiatement après le premier démarrage. |
CREATE_DEFAULT_ADMIN |
true |
Mettre à false une fois d'autres admins créés pour désactiver la création automatique. |
10. Email SMTP
| Variable |
Défaut |
Description |
SMTP_HOST |
— |
Serveur SMTP. Obligatoire pour activer les e-mails. Sans cette variable, gitrust démarre mais les fonctionnalités e-mail sont désactivées. |
SMTP_PORT |
587 |
Port SMTP : 25 (non chiffré, interdit en prod), 465 (TLS natif), 587 (STARTTLS, recommandé), 1025 (dev/Mailpit). |
SMTP_USER |
— |
Identifiant SMTP. Souvent = adresse e-mail expéditrice. |
SMTP_PASSWORD |
— |
Mot de passe applicatif SMTP (pas le mot de passe du compte e-mail). |
SMTP_FROM |
— |
Adresse expéditeur. Doit être valide (validée par is_valid_email). En prod : valider DKIM/SPF sur le domaine. |
SMTP_FROM_NAME |
— |
Nom affiché dans le champ « De : » des e-mails. |
SMTP_USE_TLS |
true |
Activer TLS natif (port 465). |
SMTP_USE_STARTTLS |
true |
Activer STARTTLS (port 587). SEC : ne jamais désactiver les deux en production. |
SMTP_ACCEPT_INVALID_CERTS |
false |
SEC : accepter les certificats SMTP invalides. Warning au démarrage si true. Uniquement pour les serveurs de mail internes en développement. |
SMTP_CA_CERT_PATH |
— |
Chemin vers un CA personnalisé (PEM) pour valider le certificat SMTP. |
EMAIL_BASE_URL |
http://localhost:3000 |
URL 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_SIZE |
10 |
Nombre d'e-mails traités par tick du worker. |
EMAIL_QUEUE_RETRY_ATTEMPTS |
5 |
Tentatives d'envoi avant abandon. |
EMAIL_QUEUE_RETRY_DELAY_SECONDS |
300 |
Délai entre deux tentatives (secondes). |
EMAIL_QUEUE_INTERVAL_SECS |
30 |
Intervalle du tick du worker e-mail (secondes). |
EMAIL_VALIDATION_REQUIRED |
true |
Exiger 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
| Variable |
Défaut |
Description |
ALLOW_REGISTRATION |
false |
Autoriser 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)
| Variable |
Défaut |
Description |
APP_NAME |
Mon Application |
Nom affiché dans l'UI, les e-mails et la balise <title>. |
APP_THEME |
light |
Thème visuel. Valeurs : light, dark. |
DEFAULT_LOCALE |
fr |
Langue 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.
| Variable |
Défaut |
Description |
IMAP_HOST |
— |
Serveur IMAP. Obligatoire pour activer le traitement des bounces. |
IMAP_PORT |
993 |
Port IMAP : 993 (TLS direct, recommandé), 143 (STARTTLS). |
IMAP_USER |
= SMTP_USER |
Identifiant IMAP. |
IMAP_PASSWORD |
= SMTP_PASSWORD |
Mot de passe IMAP. |
IMAP_USE_TLS |
true |
TLS direct (port 993). |
IMAP_USE_STARTTLS |
false |
STARTTLS après connexion (port 143). |
IMAP_ACCEPT_INVALID_CERTS |
false |
Accepter les certificats invalides (warning si true). |
IMAP_MAILBOX |
INBOX |
Boîte à scanner pour les bounces. |
IMAP_POLL_INTERVAL_SECONDS |
300 |
Intervalle de poll (secondes). |
IMAP_SOCKET_TIMEOUT_SECS |
30 |
Timeout 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.
| Variable |
Défaut |
Description |
PASSWORD_CHANGE_RETRY_INTERVAL_SECS |
600 |
Retry e-mail changement de mot de passe (10 min). |
PASSWORD_CHANGE_RETRY_GAP_MINUTES |
20 |
Espacement minimum entre deux retries. |
PASSWORD_CHANGE_MAX_RETRIES |
3 |
Abandon après N échecs. |
PASSWORD_CHANGE_CLEANUP_INTERVAL_SECS |
86400 |
Nettoyage quotidien des demandes expirées. |
PASSWORD_CHANGE_EXPIRATION_HOURS |
24 |
Validité d'une demande de changement de mot de passe. |
PASSWORD_CHANGE_RATE_LIMIT_MAX |
3 |
Demandes maximum par fenêtre. |
PASSWORD_CHANGE_RATE_LIMIT_WINDOW_SECS |
3600 |
Fenêtre de rate limit (1 heure). |
PASSWORD_RESET_EXPIRATION_HOURS |
1 |
Validité du lien de réinitialisation de mot de passe. |
EMAIL_VALIDATION_EXPIRATION_HOURS |
24 |
Validité du lien de validation e-mail. |
JWT_CLEANUP_INTERVAL_SECS |
3600 |
Purge de la blacklist JWT expirés. |
COOKIE_PREFERENCE_MAX_AGE_SECS |
31536000 |
Durée de vie du cookie de préférences (locale/thème) — 1 an. |
PAGINATION_DEFAULT_PER_PAGE |
50 |
Taille par défaut des pages de liste. |
PAGINATION_MAX_PER_PAGE |
100 |
Taille maximale des pages de liste. |
15. Dépôts Git
| Variable |
Défaut |
Description |
GIT_REPOS_BASE_PATH |
./data/repos |
Chemin 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
| Variable |
Défaut |
Description |
STATIC_FILES_PATH |
./static |
Chemin du dossier des assets statiques (CSS, JS, images). En production avec systemd : chemin absolu (ex. /opt/gitrust/static). |
17. CI/CD Dagger
| Variable |
Défaut |
Description |
CI_ENABLED |
true |
Activation globale de la CI. false = plus aucune exécution de pipeline, mais l'UI reste accessible. |
CI_DAGGER_BIN |
dagger |
Chemin du binaire Dagger. En production : chemin absolu recommandé. |
CI_ENGINE_PATH |
./deployment/ci-engine |
Chemin du module CI (Easy Mode — interprète .gitrust-ci.yml). |
CI_MAX_CONCURRENT |
4 |
Pipelines exécutés simultanément. Au-delà : file d'attente. |
CI_DEFAULT_TIMEOUT |
3600 |
Timeout par défaut d'un pipeline (secondes). Surchargeable par pipeline. |
CI_WORKSPACE_PATH |
/tmp/gitrust-ci |
Dossier de travail temporaire CI (checkouts, artefacts). En production : /var/lib/gitrust-ci. |
CI_LOG_RETENTION_DAYS |
30 |
Rétention des logs de pipeline (jours). |
18. Runner CI distant (SSH + rsync)
| Variable |
Défaut |
Description |
CI_REMOTE_HOST |
localhost |
Host du runner CI. localhost = CI sur la même machine. |
CI_REMOTE_USER |
$USER |
Utilisateur SSH sur le runner. |
CI_REMOTE_PATH |
/opt/gitrust-ci |
Chemin de travail sur le runner. |
CI_REMOTE_SSH_KEY |
— |
Chemin de la clé privée SSH pour le runner. Optionnel si ssh-agent est chargé. |
CI_REMOTE_SSH_PORT |
22 |
Port SSH du runner. |
19. Import de dépôts externes
| Variable |
Défaut |
Description |
IMPORT_MAX_CONCURRENT |
2 |
Nombre maximum de clones concurrents. |
IMPORT_TIMEOUT_SECS |
1800 |
Timeout par import (secondes). Augmenter pour les gros monorepos. |
DB_WORKER_POOL_SIZE |
4 |
Pool de connexions DB dédié au worker d'import. Évite la saturation du pool HTTP principal. |
20. SBOM / Dependency-Track
| Variable |
Défaut |
Description |
CI_SBOM_ENABLED |
false |
Générer un SBOM (Software Bill of Materials) à chaque pipeline via Syft. Nécessite syft installé. |
CI_SYFT_BIN |
syft |
Chemin du binaire Syft. |
CI_DTRACK_ENABLED |
false |
Pousser le SBOM vers Dependency-Track (nécessite CI_SBOM_ENABLED=true). |
CI_DTRACK_URL |
— |
URL API de Dependency-Track (ex. https://dtrack.internal/api). |
CI_DTRACK_API_KEY |
— |
Clé API Dependency-Track (générer dans l'UI Dtrack : Administration > API keys). |
CI_DTRACK_FRONTEND_URL |
— |
URL UI Dependency-Track. Si absent : déduite de CI_DTRACK_URL. |
21. OAuth / SSO
| Variable |
Défaut |
Description |
OAUTH_ENCRYPTION_KEY |
— |
Clé de chiffrement AES-256-GCM des secrets OAuth en base. Générer avec openssl rand -hex 32. |
OAUTH_ENABLED |
false |
Activation globale OAuth. Fallback si pas de valeur en base. |
OAUTH_REDIRECT_BASE_URL |
http://localhost:3000 |
URL de base pour les callbacks OAuth : {URL}/api/v1/auth/oauth/{provider}/callback. |
OAUTH_GOOGLE_ENABLED |
false |
Activer Google OAuth. |
OAUTH_GOOGLE_CLIENT_ID |
— |
Client ID Google. |
OAUTH_GOOGLE_CLIENT_SECRET |
— |
Client Secret Google. |
OAUTH_GITHUB_ENABLED |
false |
Activer GitHub OAuth. |
OAUTH_GITHUB_CLIENT_ID |
— |
Client ID GitHub. |
OAUTH_GITHUB_CLIENT_SECRET |
— |
Client Secret GitHub. |
OAUTH_DISCORD_ENABLED |
false |
Activer Discord OAuth. |
OAUTH_DISCORD_CLIENT_ID |
— |
Client ID Discord. |
OAUTH_DISCORD_CLIENT_SECRET |
— |
Client Secret Discord. |
OAUTH_MICROSOFT_ENABLED |
false |
Activer Microsoft / Azure AD OAuth. |
OAUTH_MICROSOFT_CLIENT_ID |
— |
Client ID Azure (Application ID). |
OAUTH_MICROSOFT_CLIENT_SECRET |
— |
Client Secret Azure. |
OAUTH_MICROSOFT_TENANT |
common |
Tenant 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
| Variable |
Défaut |
Description |
SSH_GUARD_ENABLED |
true |
false = pass-through complet, ssh-guard ne fait rien. À éviter sauf urgence. |
SSH_GUARD_DRY_RUN |
false |
true = 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_PROFILE |
custom |
Preset : 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
| Variable |
Défaut |
Description |
SSH_GUARD_PROXY_PROTOCOL |
disabled |
Mode parsing PROXY : disabled, v1 (texte HAProxy legacy), v2 (binaire nginx stream / HAProxy moderne), any (auto-détection v1/v2). |
SSH_GUARD_PROXY_PROTOCOL_STRICT |
true |
true = 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_MS |
3000 |
Timeout (ms) pour lire l'en-tête PROXY après accept TCP. |
SSH_GUARD_TRUSTED_PROXIES |
— |
Obligatoire 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)
| Variable |
Défaut |
Description |
SSH_GUARD_BRUTE_FORCE_THRESHOLD |
5 |
Nombre d'échecs d'auth depuis une IP avant ban auto. 4294967295 (u32::MAX) = détecteur désactivé. |
SSH_GUARD_BRUTE_FORCE_WINDOW_SECS |
300 |
Fenêtre glissante (secondes). |
SSH_GUARD_USER_ENUM_THRESHOLD |
10 |
Nombre d'usernames distincts essayés depuis une IP. |
SSH_GUARD_USER_ENUM_WINDOW_SECS |
300 |
|
SSH_GUARD_KEY_SCAN_THRESHOLD |
10 |
Nombre de fingerprints de clé distincts essayés depuis une IP. |
SSH_GUARD_KEY_SCAN_WINDOW_SECS |
300 |
|
SSH_GUARD_CONN_FLOOD_PER_SEC |
10 |
Cap dur de nouvelles connexions TCP par IP par seconde. 0 ou u32::MAX = désactivé. |
SSH_GUARD_CONN_FLOOD_BURST |
20 |
Burst autorisé au-dessus du cap soutenu. |
SSH_GUARD_MAX_CONCURRENT_PER_IP |
10 |
Limite de sessions concurrentes par IP (placeholder, non encore appliqué). |
22.4 Ban
| Variable |
Défaut |
Description |
SSH_GUARD_AUTO_BAN_DURATION_SECS |
3600 |
TTL des bans posés par les détecteurs. 0 = ban permanent. |
22.5 Stockage
| Variable |
Défaut |
Description |
SSH_GUARD_STORE_BACKEND |
hybrid |
memory (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_MS |
1000 |
Intervalle entre deux flushs RAM → Postgres pour le mode hybrid. |
SSH_GUARD_EVENTS_RETENTION_DAYS |
90 |
Rétention de la table ssh_guard_events (utilisée par les détecteurs). Au-delà, les lignes sont purgées. |
22.6 Observabilité
| Variable |
Défaut |
Description |
SSH_GUARD_LOG_FORMAT |
json |
json (stable, fail2ban-friendly) ou text (debug uniquement). |
SSH_GUARD_LOG_TARGET |
stderr |
stderr (via tracing → journald), file (fichier dédié uniquement), both (les deux). |
SSH_GUARD_LOG_FILE |
/var/log/gitrust-ssh-guard.json |
Chemin du fichier dédié si LOG_TARGET=file ou both. Logrotate quasi obligatoire (sinon le fichier grossit sans limite). |
SSH_GUARD_METRICS_ENABLED |
true |
Expose 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
| Dimension |
Local (dev) |
Production |
DATABASE_URL host |
localhost |
Réseau privé |
SERVER_HOST |
0.0.0.0 |
127.0.0.1 (derrière nginx) |
SERVER_PORT |
3000 ou 4000 |
4000 (nginx devant) |
SSH_LISTEN_ADDR |
0.0.0.0 |
127.0.0.1 (nginx stream) |
SSH_PUBLIC_HOST |
localhost |
FQDN public |
COOKIE_SECURE |
false (HTTP) |
true (HTTPS, forcé) |
APP_DEBUG |
true |
false (force sécurité) |
EMAIL_BASE_URL |
http://localhost:... |
https://FQDN |
JWT_SECRET |
Valeur courte OK |
openssl rand -hex 64 |
ADMIN_PASSWORD |
Faible accepté |
Fort (≥ 16 caractères) |
ALLOW_REGISTRATION |
true |
false (instance fermée) |
RUST_LOG |
debug |
info ou warn |
GIT_REPOS_BASE_PATH |
Relatif (./data) |
Absolu (/opt/gitrust) |
Pour aller plus loin