Installation Docker : démarrez gitrust en 30 minutes avec docker-compose¶
Objectifs¶
À la fin de ce tutoriel, vous saurez :
- O1. Déployer la stack gitrust minimale (application + PostgreSQL) avec docker-compose
- O2. Vérifier que les trois services démarrent correctement et sont en bonne santé
- O3. Créer le premier compte administrateur et accéder à l'interface web
Pré-requis¶
- Technique : une VM ou machine Linux (Debian 12 / Ubuntu 22.04 ou supérieur), Docker Engine ≥ 24 installé (
docker --versionrépond), Docker Compose plugin installé (docker compose versionrépond), ports 4000 et 2222 libres sur la machine - Pédagogique : aucun tutoriel gitrust préalable requis — c'est le point de départ du parcours administrateur
- Temps estimé : ~30 minutes
Vue d'ensemble¶
Avant de lancer la moindre commande, comprenons ce que docker-compose va orchestrer et pourquoi.
gitrust est composé de trois services principaux dans sa configuration minimale. Pensez-y comme trois pièces d'un appartement qui s'appellent entre elles via un réseau interne :
graph TB
subgraph internet ["Internet / votre navigateur"]
B[Navigateur :4000]
S[Client git/SSH :2222]
end
subgraph docker ["Réseau Docker gitrust_net"]
A["gitrust-app
(Rust, port 4000 + 2222)
Lit la config depuis .env"]
P["postgres
(PostgreSQL 16, port 5432)
Stocke comptes, dépôts, issues"]
R["redis (optionnel)
(Redis 7, port 6379)
Sessions web + cache"]
end
B -->|HTTP| A
S -->|SSH| A
A -->|SQL| P
A -.->|sessions| R
gitrust-app est le cœur : serveur HTTP (:4000) + serveur SSH (:2222) compilé en Rust. Il lit sa configuration depuis un fichier .env et écrit les dépôts Git bare sur un volume Docker. PostgreSQL stocke toutes les données relationnelles (comptes, organisations, dépôts, issues, PRs). Redis est optionnel dans la configuration minimale — il gère les sessions web et le cache quand il est présent.
Dans ce tutoriel, nous utilisons la stack minimale (app + PostgreSQL) suffisante pour évaluer gitrust et démarrer une petite instance. La stack production avec Redis et SMTP se trouve dans template/docker/docker-compose.production.yml.
Étape 1 : Créez le répertoire de travail et le fichier de configuration¶
Créez un répertoire dédié à votre instance gitrust et positionnez-vous dedans :
Créez le fichier de configuration .env avec les valeurs minimales. Changez impérativement les valeurs marquées CHANGE_ME :
cat > .env << 'EOF'
# === gitrust — configuration minimale ===
# Changez toutes les valeurs CHANGE_ME avant de démarrer
# Clé secrète de l'application (générez avec : openssl rand -hex 32)
SECRET_KEY=CHANGE_ME_openssl_rand_hex_32
# URL publique de l'instance (sans slash final)
APP_URL=http://localhost:4000
# Base de données PostgreSQL
DATABASE_URL=postgres://gitrust:CHANGE_ME_db_password@postgres:5432/gitrust
POSTGRES_USER=gitrust
POSTGRES_PASSWORD=CHANGE_ME_db_password
POSTGRES_DB=gitrust
# Serveur SSH (port exposé à l'extérieur)
SSH_PORT=2222
# Mode de l'application
RUST_LOG=info
APP_ENV=production
EOF
Générez maintenant une clé secrète robuste et remplacez la valeur dans .env :
Choisissez également un mot de passe pour PostgreSQL et remplacez les deux occurrences :
Sortie attendue (vérification) :
grep SECRET_KEY .env
# → SECRET_KEY=4a7f2c9e1b8d3f6a0e5c2b9d7f4a1e8c3b6d9f2a5e8c1b4d7f0a3e6c9b2d5f8a
Checkpoint : exécutez grep CHANGE_ME .env — la commande doit ne rien retourner. Si elle retourne des lignes, ces valeurs n'ont pas été remplacées et le démarrage échouera.
Étape 2 : Créez le fichier docker-compose.yml¶
Créez le fichier docker-compose.yml suivant dans /opt/gitrust/. Ce contenu correspond à la stack minimale gitrust — il est reproduit ici intégralement pour que vous puissiez démarrer sans dépendance externe :
cat > docker-compose.yml << 'EOF'
# docker-compose.minimal.yml — Stack gitrust minimale (app + PostgreSQL)
# Cas d'usage : évaluation, développement, petite instance (<10 utilisateurs)
# Pour la production : utilisez docker-compose.production.yml (+ Redis + SMTP)
#
# Usage :
# docker compose up -d
# docker compose logs -f gitrust
# docker compose down
version: "3.9"
services:
# ── Base de données ───────────────────────────────────────────────────────
postgres:
image: postgres:16-alpine
container_name: gitrust_postgres
restart: unless-stopped
environment:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
volumes:
# Données persistantes — ne supprimez pas ce volume sans sauvegarde
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
interval: 10s
timeout: 5s
retries: 5
networks:
- gitrust_net
# ── Application gitrust ───────────────────────────────────────────────────
gitrust:
image: ghcr.io/gitrust/gitrust:latest
container_name: gitrust_app
restart: unless-stopped
depends_on:
postgres:
condition: service_healthy
env_file:
# Lit toutes les variables depuis .env — ne commitez jamais ce fichier
- .env
ports:
# Interface web — exposée sur toutes les interfaces de la machine hôte
- "4000:4000"
# Serveur SSH Git — exposé sur le port configuré dans .env
- "${SSH_PORT:-2222}:2222"
volumes:
# Dépôts Git bare — données critiques, sauvegardez ce volume
- git_repos:/var/lib/gitrust/repositories
# Clés SSH du serveur — générées au premier démarrage, persistez-les
- ssh_host_keys:/etc/gitrust/ssh
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:4000/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 30s
networks:
- gitrust_net
volumes:
# postgres_data : données relationnelles (comptes, dépôts, issues, PRs)
postgres_data:
# git_repos : dépôts Git bare (le contenu réel des commits)
git_repos:
# ssh_host_keys : clés SSH hôte (fingerprint de votre serveur)
ssh_host_keys:
networks:
gitrust_net:
driver: bridge
EOF
Checkpoint : vérifiez que les deux fichiers sont présents dans /opt/gitrust/ :
Sortie attendue :
total 16
drwxr-xr-x 2 root root 4096 avr 17 10:00 .
drwxr-xr-x 8 root root 4096 avr 17 09:55 ..
-rw------- 1 root root 612 avr 17 10:00 .env
-rw-r--r-- 1 root root 2048 avr 17 10:00 docker-compose.yml
Étape 3 : Démarrez la stack et suivez les logs¶
Démarrez tous les services en arrière-plan :
Sortie attendue :
[+] Running 4/4
✔ Network gitrust_gitrust_net Created 0.1s
✔ Volume "gitrust_postgres_data" Created 0.0s
✔ Container gitrust_postgres Started 0.8s
✔ Container gitrust_app Started 1.2s
Suivez les logs de l'application pour observer le démarrage (les migrations s'exécutent automatiquement) :
Sortie attendue (les 15-20 premières secondes) :
gitrust_app | 2026-04-17T10:00:15Z INFO gitrust > Starting gitrust v0.9.0
gitrust_app | 2026-04-17T10:00:15Z INFO gitrust > Connecting to database...
gitrust_app | 2026-04-17T10:00:16Z INFO gitrust > Running database migrations...
gitrust_app | 2026-04-17T10:00:17Z INFO gitrust > Applied 42 migrations successfully
gitrust_app | 2026-04-17T10:00:17Z INFO gitrust > Generating SSH host keys...
gitrust_app | 2026-04-17T10:00:17Z INFO gitrust > SSH host key fingerprint: SHA256:xxxxxxxxxxxxxxxxxxxx
gitrust_app | 2026-04-17T10:00:17Z INFO gitrust > HTTP server listening on 0.0.0.0:4000
gitrust_app | 2026-04-17T10:00:17Z INFO gitrust > SSH server listening on 0.0.0.0:2222
gitrust_app | 2026-04-17T10:00:17Z INFO gitrust > gitrust is ready
Appuyez sur Ctrl+C pour quitter le suivi des logs (les containers continuent de tourner).
Checkpoint : vérifiez l'état de santé des services :
Sortie attendue :
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
gitrust_app ghcr.io/gitrust/gitrust:latest "/usr/local/bin/gitr…" gitrust 2 minutes ago Up 2 minutes (healthy) 0.0.0.0:4000->4000/tcp, 0.0.0.0:2222->2222/tcp
gitrust_postgres postgres:16-alpine "docker-entrypoint.s…" postgres 2 minutes ago Up 2 minutes (healthy) 5432/tcp
Les deux containers doivent afficher (healthy). Si l'un affiche (starting), attendez 30 secondes et relancez la commande. S'il affiche (unhealthy), consultez les logs avec docker compose logs gitrust ou docker compose logs postgres.
Étape 4 : Créez le premier compte administrateur¶
Ouvrez votre navigateur et rendez-vous sur http://localhost:4000.
Vous devriez voir la page d'accueil gitrust avec un formulaire d'inscription. Comme l'instance est vierge, le premier compte créé devient automatiquement administrateur.
Remplissez le formulaire :
- Pseudo : votre identifiant administrateur (ex. admin)
- E-mail : votre adresse e-mail
- Mot de passe : choisissez un mot de passe robuste (≥ 12 caractères)
Cliquez sur Créer mon compte.
Sortie attendue dans les logs (visible avec docker compose logs -f gitrust) :
gitrust_app | 2026-04-17T10:05:00Z INFO gitrust::auth > New user registered: admin (id=1)
gitrust_app | 2026-04-17T10:05:00Z INFO gitrust::admin > First user promoted to administrator: admin
Checkpoint final : connectez-vous avec vos identifiants. Après la connexion, vérifiez que le menu en haut à droite affiche un lien Administration (ou naviguez vers http://localhost:4000/admin). Cette page n'est accessible qu'aux administrateurs — sa présence confirme que votre compte a bien le rôle admin.
L'URL de votre instance est http://localhost:4000 et votre compte administrateur est opérationnel.
Récapitulatif¶
- ✓ O1 accompli : la stack docker-compose est déployée —
docker compose psaffiche deux containers(healthy) - ✓ O2 accompli : les trois services (app, PostgreSQL, réseau interne) démarrent correctement — les logs montrent « gitrust is ready » et les migrations sont appliquées
- ✓ O3 accompli : le premier compte administrateur est créé et la page
/adminest accessible
Et si ça ne marche pas¶
| Symptôme | Cause probable | Correction |
|---|---|---|
Error: port 4000 is already in use au démarrage |
Un autre service occupe le port 4000 sur la machine hôte | Identifiez le service avec ss -tlnp \| grep 4000 ou lsof -i :4000. Arrêtez-le ou changez le port dans docker-compose.yml : remplacez "4000:4000" par "4001:4000" et accédez sur :4001 |
Le container gitrust_app affiche (unhealthy) ou redémarre en boucle |
La variable DATABASE_URL est incorrecte ou SECRET_KEY contient des caractères spéciaux non échappés |
Vérifiez avec docker compose logs gitrust \| grep ERROR. Assurez-vous que SECRET_KEY est bien une chaîne hexadécimale sans guillemets. Rechargez avec docker compose down && docker compose up -d |
La page http://localhost:4000 affiche « Connection refused » |
Le container n'est pas encore en (healthy) ou le port n'est pas exposé |
Attendez 30 secondes et rechargez. Si le problème persiste, vérifiez que votre pare-feu local (ufw status) autorise le port 4000 |
FATAL: password authentication failed for user "gitrust" dans les logs postgres |
Le mot de passe dans DATABASE_URL ne correspond pas à POSTGRES_PASSWORD |
Supprimez le volume PostgreSQL (docker compose down -v) et relancez — attention : supprime toutes les données |
Prochaine étape¶
→ 02 — Installation systemd : binaire natif + service : découvrez l'installation sans Docker pour un déploiement production avec hardening AppArmor (~45 min)
Ou si vous souhaitez rendre cette instance accessible depuis Internet :
→ 04 — Mise en production : reverse-proxy TLS, SMTP, sauvegarde automatique (~90 min)