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 --version antwortet), Docker Compose-Plugin installiert (docker compose version antwortet), 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.

git clone https://demo.gitrust.eu/gitrust/gitrust.git
cd gitrust
docker build -t gitrust:latest .

À 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:

mkdir -p /opt/gitrust && cd /opt/gitrust

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“:

SECRET=$(openssl rand -hex 32)
sed -i "s/CHANGE_ME_openssl_rand_hex_32/$SECRET/" .env

Wählen Sie außerdem ein Passwort für PostgreSQL und ersetzen Sie beide Vorkommen:

DB_PASS=$(openssl rand -hex 16)
sed -i "s/CHANGE_ME_db_password/$DB_PASS/g" .env

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:

ls -la /opt/gitrust/

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:

docker compose up -d

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):

docker compose logs -f gitrust

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:

docker compose ps

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.)