Installer gitrust comme service systemd (binaire natif)¶
Objectifs¶
À la fin de ce tutoriel, vous saurez :
- O1. Créer un utilisateur système
gitrustdédié et structurer l'arborescence/opt/gitrust - O2. Configurer PostgreSQL pour gitrust et vérifier la connexion
- O3. Écrire et activer un fichier
gitrust.serviceavec durcissement systemd - O4. Démarrer gitrust et confirmer que le serveur HTTP et SSH répondent
Pré-requis¶
- Technique : Debian 12 ou Ubuntu 22.04 LTS (ou dérivé) ; accès root ou sudo ;
curl,rsync,psqlinstallés ; Docker non requis (c'est précisément l'alternative binaire natif) - Pédagogique : Tutoriel 01-installation-docker lu ou notions équivalentes d'administration Linux
- Temps estimé : ~45 minutes
Vue d'ensemble¶
L'installation binaire natif place gitrust comme un service systemd classique, au même titre que nginx ou PostgreSQL. Il n'y a aucun conteneur : le binaire Rust s'exécute directement sous un utilisateur système dédié, avec un durcissement systemd (PrivateTmp, ProtectSystem, NoNewPrivileges).
graph LR
A[Binaire gitrust
/opt/gitrust/gitrust] -->|ExecStart| B[systemd unit
gitrust.service]
B -->|User=gitrust| C[Utilisateur système
gitrust]
C -->|R/W| D[/opt/gitrust/data
repos + clé SSH]
A -->|DATABASE_URL| E[PostgreSQL :5432]
A -->|:4000| F[Navigateur / nginx]
A -->|:2222| G[Client Git SSH]
Modèle mental : pensez à gitrust comme à nginx — un processus unique, lancé par systemd, propriétaire de ses données, sans jamais tourner en root.
Étape 1 : Créer l'utilisateur et l'arborescence¶
Créez un utilisateur système sans shell de login ni répertoire home personnel :
sudo useradd \
--system \
--home-dir /opt/gitrust \
--shell /usr/sbin/nologin \
--comment "Gitrust service" \
gitrust
Créez l'arborescence de travail :
sudo mkdir -p /opt/gitrust/data/repos
sudo mkdir -p /opt/gitrust/static
sudo chown -R gitrust:gitrust /opt/gitrust
sudo chmod 750 /opt/gitrust
Sortie attendue (vérification) :
$ ls -la /opt/gitrust/
total 20
drwxr-x--- 4 gitrust gitrust 4096 ...
drwxr-xr-x 3 gitrust gitrust 4096 ... data/
drwxr-xr-x 2 gitrust gitrust 4096 ... static/
Checkpoint O1 : id gitrust doit retourner une ligne avec uid=NNN(gitrust) gid=NNN(gitrust). Si la commande échoue, relisez l'étape 1.
Étape 2 : Installer PostgreSQL et créer la base gitrust¶
Installez PostgreSQL si ce n'est pas fait :
sudo apt-get update
sudo apt-get install -y postgresql postgresql-contrib
sudo systemctl enable --now postgresql
Créez l'utilisateur et la base de données :
sudo -u postgres psql <<'SQL'
CREATE USER gitrust WITH PASSWORD 'CHOISIR_UN_MOT_DE_PASSE_FORT';
CREATE DATABASE gitrust OWNER gitrust;
GRANT ALL PRIVILEGES ON DATABASE gitrust TO gitrust;
SQL
Vérifiez la connexion :
psql "postgres://gitrust:CHOISIR_UN_MOT_DE_PASSE_FORT@localhost:5432/gitrust" \
-c "SELECT version();"
Sortie attendue :
version
------------------------------------------------------------------------------------------------------------
PostgreSQL 15.x on x86_64-pc-linux-gnu, ...
(1 row)
Checkpoint O2 : Si psql retourne version(), la base est accessible. Conservez le mot de passe PostgreSQL pour l'étape suivante.
Étape 3 : Déployer le binaire gitrust¶
Sur votre machine de développement (ou sur le serveur si vous compilez localement) :
Puis transférez vers le serveur :
# Depuis la machine de développement
rsync -avz target/release/gitrust user@VOTRE_SERVEUR:/opt/gitrust/gitrust
rsync -avz static/ user@VOTRE_SERVEUR:/opt/gitrust/static/
Sur le serveur, rendez le binaire exécutable et attribuez-le à l'utilisateur gitrust :
sudo chown gitrust:gitrust /opt/gitrust/gitrust
sudo chmod 750 /opt/gitrust/gitrust
sudo chown -R gitrust:gitrust /opt/gitrust/static/
Alternative : si vous utilisez
deployment/deploy.sh(fourni dans le dépôt source), il effectue les étapes 1 à 5 automatiquement. Ce tutoriel décompose les étapes pour que vous compreniez ce que le script fait.
Étape 4 : Créer le fichier de configuration .env¶
Créez /opt/gitrust/.env avec les valeurs minimales de production :
sudo -u gitrust tee /opt/gitrust/.env <<'EOF'
# === BASE DE DONNÉES ===
DATABASE_URL=postgres://gitrust:CHOISIR_UN_MOT_DE_PASSE_FORT@localhost:5432/gitrust
# === SERVEUR HTTP ===
SERVER_HOST=127.0.0.1
SERVER_PORT=4000
RUST_LOG=info
# === SERVEUR SSH ===
SSH_PORT=2222
SSH_LISTEN_ADDR=0.0.0.0
SSH_HOST_KEY_PATH=/opt/gitrust/data/ssh_host_ed25519_key
SSH_PUBLIC_HOST=VOTRE_DOMAINE_OU_IP
# === DÉPÔTS GIT ===
GIT_REPOS_BASE_PATH=/opt/gitrust/data/repos
# === FICHIERS STATIQUES ===
STATIC_FILES_PATH=/opt/gitrust/static
# === JWT (OBLIGATOIRE — générer avec : openssl rand -hex 64) ===
JWT_SECRET=REMPLACER_PAR_OPENSSL_RAND_HEX_64
JWT_EXPIRATION_MINUTES=15
JWT_ISSUER=gitrust
# === SESSIONS ===
SESSION_TIMEOUT_MINUTES=30
SESSION_BACKEND=seaorm
# === COOKIES ===
COOKIE_SECURE=true
COOKIE_SAME_SITE=Lax
APP_DEBUG=false
# === ADMIN INITIAL ===
ADMIN_USERNAME=admin
ADMIN_EMAIL=admin@VOTRE_DOMAINE
ADMIN_PASSWORD=REMPLACER_PAR_MOT_DE_PASSE_FORT
# === EMAIL (optionnel au démarrage initial, configurer ensuite) ===
# SMTP_HOST=smtp.example.com
# SMTP_PORT=587
EMAIL_BASE_URL=https://VOTRE_DOMAINE
EOF
Sécurisez le fichier (il contient des secrets) :
Générez le vrai secret JWT :
Copiez la sortie et remplacez REMPLACER_PAR_OPENSSL_RAND_HEX_64 dans /opt/gitrust/.env.
Checkpoint : sudo -u gitrust stat /opt/gitrust/.env doit afficher Mode: 0600 et Uid: gitrust.
Étape 5 : Créer le fichier gitrust.service¶
Créez le fichier d'unité systemd :
sudo tee /etc/systemd/system/gitrust.service <<'EOF'
[Unit]
Description=Gitrust - Self-hosted Git platform
Documentation=https://demo.gitrust.eu/docs/
After=network.target postgresql.service
Requires=postgresql.service
[Service]
Type=simple
User=gitrust
Group=gitrust
WorkingDirectory=/opt/gitrust
EnvironmentFile=/opt/gitrust/.env
ExecStart=/opt/gitrust/gitrust
Restart=on-failure
RestartSec=5
TimeoutStartSec=30
TimeoutStopSec=30
# --- Durcissement systemd ---
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
PrivateTmp=true
PrivateDevices=true
ProtectKernelTunables=true
ProtectKernelModules=true
ProtectControlGroups=true
RestrictRealtime=true
RestrictSUIDSGID=true
LockPersonality=true
# Répertoires en écriture autorisés
ReadWritePaths=/opt/gitrust/data
# Si gitrust écoute sur un port < 1024 (ex: 80) :
# AmbientCapabilities=CAP_NET_BIND_SERVICE
[Install]
WantedBy=multi-user.target
EOF
Rechargez systemd et activez le service :
Sortie attendue :
Created symlink /etc/systemd/system/multi-user.target.wants/gitrust.service → /etc/systemd/system/gitrust.service.
Checkpoint O3 : systemctl is-enabled gitrust doit afficher enabled.
Étape 6 : Premier démarrage et vérification¶
Démarrez le service :
Attendez 3 secondes, puis vérifiez le statut :
Sortie attendue :
● gitrust.service - Gitrust - Self-hosted Git platform
Loaded: loaded (/etc/systemd/system/gitrust.service; enabled; vendor preset: enabled)
Active: active (running) since ... ago
Main PID: XXXX (gitrust)
Tasks: N (limit: NNNN)
Memory: NNM
CPU: NNNms
CGroup: /system.slice/gitrust.service
└─XXXX /opt/gitrust/gitrust
Vérifiez que les ports répondent :
# HTTP
curl -s -o /dev/null -w "%{http_code}" http://localhost:4000/
# Attendu : 200 ou 302
# SSH (vérification du fingerprint)
ssh-keyscan -p 2222 -H localhost 2>/dev/null | head -1
# Attendu : [localhost]:2222 ssh-ed25519 AAAA...
Consultez les logs pour les migrations automatiques :
Cherchez les lignes :
INFO gitrust_core::migrations: Running migrations...
INFO gitrust_core::migrations: Applied migration m20260325_000001_create_repositories
...
INFO gitrust_core::migrations: All migrations applied successfully
INFO rustwarden_core::services::default_admin_service: Admin user 'admin' created
Checkpoint O4 : curl http://localhost:4000/ retourne du HTML (code 200 ou 302). Le service est opérationnel.
Récapitulatif¶
- ✓ O1 accompli en créant l'utilisateur système
gitrustet l'arborescence/opt/gitrust - ✓ O2 accompli en configurant PostgreSQL et en vérifiant la connexion avec
psql - ✓ O3 accompli en rédigeant
gitrust.serviceavec les directives de durcissement systemd - ✓ O4 accompli en démarrant le service et en confirmant la réponse HTTP et SSH
Et si ça ne marche pas¶
| Symptôme | Cause probable | Correction |
|---|---|---|
Active: failed immédiatement après start |
.env manquant ou mal formé ; DATABASE_URL incorrecte |
journalctl -u gitrust -n 30 --no-pager pour voir l'erreur exacte ; vérifier que /opt/gitrust/.env existe et que DATABASE_URL est correct |
Permission denied dans les logs |
Répertoire data/ non accessible par l'utilisateur gitrust |
sudo chown -R gitrust:gitrust /opt/gitrust/data |
Address already in use sur le port 4000 |
Un autre processus utilise le port | sudo ss -tlnp | grep 4000 pour identifier le conflit |
JWT_SECRET trop court / refus de démarrage |
Le secret JWT est la valeur d'exemple ou fait moins de 32 bytes | Générer avec openssl rand -hex 64 et mettre à jour .env |
Les migrations échouent (migration error) |
Base de données inaccessible ou droits insuffisants | Vérifier DATABASE_URL et que l'utilisateur PG a GRANT ALL ON DATABASE gitrust |
curl: (7) Failed to connect |
Le service n'est pas encore démarré ou écoute sur 127.0.0.1 uniquement |
Tester depuis le serveur (pas depuis l'extérieur) ; vérifier SERVER_HOST=127.0.0.1 |
Prochaine étape¶
→ 03 — Premier démarrage : bootstrap admin, clé SSH hôte, vérification santé