Comprendre les modèles de déploiement de gitrust¶
Ce que vous allez comprendre¶
- Comparer les trois topologies de déploiement (dev local, mono-machine prod, haute disponibilité) et leurs compromis
- Identifier les limites de la mise à l'échelle horizontale de gitrust dans sa version actuelle
- Évaluer quelle topologie correspond à votre contexte (taille d'équipe, contraintes de disponibilité, budget)
Le problème concret¶
Vous hébergez gitrust pour une équipe de 8 développeurs. Tout fonctionne bien, mais vous vous posez la question : faut-il un deuxième serveur pour la résilience ? Peut-on mettre gitrust derrière un load balancer ? Que se passe-t-il si le disque dur tombe ?
L'analogie¶
Les trois topologies ressemblent aux trois tailles de cuisine dans un restaurant : - Cuisine de maison (dev local) : tout sur le même plan de travail, pratique, pas question d'accueillir 50 couverts - Cuisine de restaurant (mono-machine prod) : séparation des postes, robuste, suffisant pour 20-50 couverts - Cuisine industrielle (HA) : plusieurs cuisines qui travaillent en parallèle, mais la coordination est un métier à part entière
La plupart des équipes de 3-20 personnes n'ont besoin que de la cuisine de restaurant.
Le modèle¶
Topologie 1 — Développement local¶
graph LR
subgraph "Machine du développeur"
G[gitrust :4000 + :2222]
PG[(PostgreSQL :5432)]
FS[./data/repos]
end
DEV[Navigateur / git] --> G
G --> PG
G --> FS
Caractéristiques :
- Tout sur la même machine, tout en localhost
- APP_DEBUG=true, COOKIE_SECURE=false, RUST_LOG=debug
- PostgreSQL lancé via docker compose up -d dans database/
- Pas de reverse-proxy, pas de TLS
- SESSION_BACKEND=memory acceptable (données perdues au redémarrage)
Usage : test de fonctionnalités, développement de plugins, démonstrations offline.
Topologie 2 — Mono-machine production (recommandée)¶
graph LR
subgraph "Internet"
CLI[Navigateur / git client]
end
subgraph "Serveur unique"
NGX[Nginx :443 TLS]
G[gitrust 127.0.0.1:4000
+ 0.0.0.0:2222]
PG[(PostgreSQL 127.0.0.1:5432)]
FS[/opt/gitrust/data/repos]
end
CLI -->|HTTPS :443| NGX
CLI -->|SSH :2222| G
NGX -->|proxy_pass| G
G --> PG
G --> FS
Caractéristiques :
- Nginx termine TLS et proxifie vers gitrust sur 127.0.0.1:4000
- PostgreSQL accessible uniquement en local
- Dépôts bare sur le disque local (ou volume attaché)
- Un seul processus gitrust, un seul PostgreSQL
- Sauvegarde avec pg_dump + rsync nocturne vers stockage externe
Dimensionnement indicatif :
| Équipe | vCPU | RAM | Disque |
|---|---|---|---|
| 1-5 personnes | 1-2 | 1 Go | 20 Go SSD |
| 6-20 personnes | 2-4 | 2-4 Go | 50-100 Go SSD |
| 20-50 personnes | 4-8 | 8 Go | 200+ Go SSD |
Limites : point de défaillance unique — si le serveur tombe, tout tombe. Acceptable si RTO < 1 h (restauration depuis sauvegarde sur nouvelle VM).
Topologie 3 — Haute disponibilité (HA)¶
graph LR
subgraph "Internet"
CLI[Navigateurs / git clients]
end
subgraph "Load balancer"
LB[HAProxy / Nginx LB
:443 + :2222]
end
subgraph "Backends gitrust"
G1[gitrust-1 :4000 + :2222]
G2[gitrust-2 :4000 + :2222]
end
subgraph "Données partagées"
PG[(PostgreSQL primaire
+ réplica lecture)]
NFS[Volume partagé NFS
ou S3-compatible]
end
CLI --> LB
LB --> G1
LB --> G2
G1 --> PG
G2 --> PG
G1 --> NFS
G2 --> NFS
Caractéristiques :
- Plusieurs instances gitrust derrière un load balancer
- PostgreSQL en mode primary/replica (streaming replication)
- SESSION_BACKEND=redis obligatoire (sessions partagées entre instances)
- Dépôts bare sur volume partagé (NFS, CEPH, ou objet S3 via FUSE)
Limites de la mise à l'échelle horizontale¶
Workers stateful¶
Les workers CI et Import sont des goroutines async dans le processus gitrust. Leur état (pipelines en cours, file d'attente) n'est pas partagé entre instances. En HA, il faut s'assurer qu'un seul nœud exécute les workers CI, ou accepter que des pipelines soient redémarrés si le nœud tombe.
Contournement actuel : désigner un nœud « primary » pour les workers (CI_ENABLED=true sur un seul nœud, CI_ENABLED=false sur les autres).
Dépôts bare sur volume partagé¶
Les dépôts Git bare doivent être accessibles depuis tous les nœuds gitrust. Options : - NFS : simple, suffisant pour la plupart des cas, mais latence réseau visible sur les gros push - CEPH / GlusterFS : haute performance distribuée, complexité opérationnelle élevée - S3-compatible (s3fs/mountpoint) : économique pour l'archivage, trop lent pour les accès Git fréquents - Réplication rsync en quasi-temps-réel : simple mais non-atomique (risque de dépôt corrompu pendant une réplication)
Recommandation : pour la grande majorité des équipes (< 50 personnes), la topologie mono-machine avec une bonne stratégie de sauvegarde offre un rapport complexité/disponibilité bien meilleur que la HA.
PostgreSQL en réplication¶
La réplication streaming PostgreSQL (primary/replica) est bien documentée et fiable. Le failover automatique nécessite un outil supplémentaire (Patroni, repmgr). Sans failover automatique, la HA PostgreSQL n'apporte qu'un RPO bas (perte de données minimale), pas un RTO bas (indisponibilité réduite).
Alternatives et compromis¶
| Critère | Mono-machine | HA (2 nœuds) |
|---|---|---|
| Complexité opérationnelle | Faible | Élevée |
| Coût infra | Faible | 2-3x |
| RTO (temps de restauration) | 15-60 min (depuis sauvegarde) | < 5 min (failover) |
| RPO (perte de données max) | Depuis la dernière sauvegarde | Quelques secondes (WAL) |
| Maintenance sans coupure | Non (redémarrage = coupure) | Oui (rolling update) |
| Adapté pour | Équipes 1-50 pers. | Équipes > 50 pers. ou SLA strict |
Pour la cible principale de gitrust (équipes de 3-20 personnes) : la topologie mono-machine avec sauvegarde quotidienne offre un RTO acceptable. Investissez plutôt dans une bonne stratégie de sauvegarde que dans une architecture HA complexe.
Vérifier votre compréhension¶
-
Votre équipe passe de 10 à 40 personnes. Quels indicateurs surveilleriez-vous sur votre serveur mono-machine pour décider si une migration vers la HA est nécessaire ?
-
En topologie HA avec deux nœuds gitrust et un volume NFS partagé, quel est le scénario de défaillance qui ne peut pas être résolu par la HA seule ? Que faut-il prévoir en plus ?