Docker-Installation: Starten Sie Gitrust in 30 Minuten mit Docker-Compose¶
Ziele¶
Am Ende dieses Tutorials wissen Sie:
- O1. Stellen Sie den minimalen Gitrust-Stack (Anwendung + PostgreSQL) mit Docker-Compose bereit
- **O2. Stellen Sie sicher, dass alle drei Dienste korrekt starten und fehlerfrei sind
- O3. Erstellen Sie das erste Administratorkonto und greifen Sie auf die Weboberfläche zu
Voraussetzungen¶
- Technisch: eine VM oder Linux-Maschine (Debian 12 / Ubuntu 22.04 oder höher), Docker Engine ≥ 24 installiert (
docker --versionantwortet), Docker Compose-Plugin installiert (docker compose versionantwortet), Ports 4000 und 2222 frei auf der Maschine - Image Docker gitrust : à construire localement à partir du code source (l'image n'est pas encore publiée sur un registre public). Suivez la section Construire l'image gitrust ci-dessous avant le
docker compose up. - Lehrreich: Es ist kein vorheriges Gitrust-Tutorial erforderlich – dies ist der Ausgangspunkt der Administratorreise
- Geschätzte Zeit: ~30 Minuten
Construire l'image gitrust¶
Image non encore publiée
gitrust fournit un Dockerfile multi-stage (Rust + Tailwind/DaisyUI) dans le dépôt source, mais aucune image officielle n'est encore publiée sur un registre public (Docker Hub, ghcr.io, quay.io). L'installation Docker officielle est donc expérimentale : il faut cloner le dépôt et construire l'image localement. Le support Docker production sera stabilisé dans une prochaine release.
À la fin, docker image ls | grep gitrust doit afficher l'image locale gitrust:latest. Le build prend ~8-15 min (compilation Rust en release + build CSS Tailwind). Si vous rencontrez une erreur, ouvrez une issue sur le dépôt source — le pipeline Docker n'a pas encore été testé en production.
Überblick¶
Bevor wir einen Befehl starten, wollen wir verstehen, was Docker-Compose orchestriert und warum.
Gitrust besteht in seiner Minimalkonfiguration aus drei Hauptdiensten. Stellen Sie sich das so vor, als würden sich drei Räume in einer Wohnung über ein internes Netzwerk gegenseitig anrufen:
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 ist der Kern: HTTP-Server (:4000) + SSH-Server (:2222), kompiliert in Rust. Es liest seine Konfiguration aus einer „.env“-Datei und schreibt nackte Git-Repositorys auf ein Docker-Volume. PostgreSQL speichert alle relationalen Daten (Konten, Organisationen, Repositorys, Probleme, PRs). Redis ist in der Mindestkonfiguration optional – es verwaltet Websitzungen und den Cache, sofern vorhanden.
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.
Schritt 1: Erstellen Sie das Arbeitsverzeichnis und die Konfigurationsdatei¶
Erstellen Sie ein Verzeichnis für Ihre Gitrust-Instanz und positionieren Sie sich darin:
Erstellen Sie die Konfigurationsdatei „.env“ mit den Mindestwerten. Müssen geändert werden die mit „CHANGE_ME“ gekennzeichneten Werte:
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
Generieren Sie nun einen robusten geheimen Schlüssel und ersetzen Sie den Wert in „.env“:
Wählen Sie außerdem ein Passwort für PostgreSQL und ersetzen Sie beide Vorkommen:
Erwartete Ausgabe (Verifizierung):
grep SECRET_KEY .env
# → SECRET_KEY=4a7f2c9e1b8d3f6a0e5c2b9d7f4a1e8c3b6d9f2a5e8c1b4d7f0a3e6c9b2d5f8a
Checkpoint: Führen Sie „grep CHANGE_ME .env“ aus – der Befehl sollte nichts zurückgeben. Wenn Zeilen zurückgegeben werden, wurden diese Werte nicht ersetzt und der Start schlägt fehl.
Schritt 2: Erstellen Sie die Datei docker-compose.yml¶
Erstellen Sie die folgende Datei „docker-compose.yml“ in „/opt/gitrust/“. Dieser Inhalt entspricht dem Gitrust-Mindeststack – er wird hier vollständig wiedergegeben, damit Sie ohne externe Abhängigkeiten loslegen können:
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: 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: Überprüfen Sie, ob beide Dateien in „/opt/gitrust/“ vorhanden sind:
Erwartete Ausgabe:
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
Schritt 3: Starten Sie den Stack und folgen Sie den Protokollen¶
Starten Sie alle Hintergrunddienste:
Erwartete Ausgabe:
[+] 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
Befolgen Sie die Anwendungsprotokolle, um den Start zu beobachten (Migrationen werden automatisch ausgeführt):
Erwartete Ausgabe (erste 15–20 Sekunden):
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
Drücken Sie Strg+C, um die Protokollüberwachung zu beenden (Container werden weiterhin ausgeführt).
Checkpoint: Überprüfen Sie den Gesundheitsstatus der Dienste:
Erwartete Ausgabe:
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
gitrust_app 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
In beiden Containern sollte „(gesund)“ angezeigt werden. Wenn „(starting)“ angezeigt wird, warten Sie 30 Sekunden und wiederholen Sie den Befehl. Wenn „(ungesund)“ angezeigt wird, überprüfen Sie die Protokolle mit „Docker Compose Logs Gitrust“ oder „Docker Compose Logs Postgres“.
Schritt 4: Erstellen Sie das erste Administratorkonto¶
Öffnen Sie Ihren Browser und gehen Sie zu „http://localhost:4000“.
Sie sollten die Gitrust-Homepage mit einem Registrierungsformular sehen. Da die Instanz leer ist, wird das erste erstellte Konto automatisch zum Administrator.
Remplissez le formulaire : - Pseudo: Ihre Administrator-ID (z. B. „admin“) - E-Mail: Ihre E-Mail-Adresse - Passwort: Wählen Sie ein sicheres Passwort (≥ 12 Zeichen)
Klicken Sie auf Mein Konto erstellen.
Erwartete Ausgabe in den Protokollen (sichtbar mit „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
Letzter Kontrollpunkt: Melden Sie sich mit Ihren Zugangsdaten an. Überprüfen Sie nach der Anmeldung, ob im Menü oben rechts ein Link „Administration“ angezeigt wird (oder navigieren Sie zu „http://localhost:4000/admin“). Diese Seite ist nur für Administratoren zugänglich. Ihre Anwesenheit bestätigt, dass Ihr Konto über die Administratorrolle verfügt.
Ihre Instanz-URL lautet „http://localhost:4000“ und Ihr Administratorkonto ist betriebsbereit.
Zusammenfassung¶
- ✓ O1 erreicht: Der Docker-Compose-Stack ist bereitgestellt – „docker compose ps“ zeigt zwei „(gesunde)“ Container an
- ✓ O2 erreicht: Die drei Dienste (App, PostgreSQL, internes Netzwerk) starten korrekt – die Protokolle zeigen „Gitrust ist bereit“ und die Migrationen werden angewendet
- ✓ O3 abgeschlossen: Das erste Administratorkonto wird erstellt und die Seite „/admin“ ist zugänglich
Und wenn es nicht klappt¶
| 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 |
Nächster Schritt¶
→ 02 – Systemd-Installation: native Binärdatei + Dienst: Entdecken Sie die Installation ohne Docker für eine Produktionsbereitstellung mit AppArmor-Härtung (~45 Min.)
Oder wenn Sie diese Instanz aus dem Internet zugänglich machen möchten:
→ 04 – In Produktion gehen: Reverse-Proxy TLS, SMTP, automatische Sicherung (~90 Min.)