Architecture de référence¶
Ce chapitre décrit l'architecture de référence pour un déploiement Gitea en production, conçu pour la haute disponibilité et l'integration dans la zone Chaîne logicielle.
Vue d'ensemble¶
graph TD
Users["Utilisateurs"] -->|HTTPS + SSH| LB
subgraph Zone["Zone Chaine logicielle"]
LB["Caddy / Nginx (LB)"] --> G1["Gitea Instance 1"]
LB --> G2["Gitea Instance 2"]
G1 --> PG["PostgreSQL<br/>(Primary/Replica)"]
G1 --> Redis
G1 --> S3["S3 / MinIO"]
G2 --> PG
G2 --> Redis
G2 --> S3
end Composants¶
Gitea (application)¶
Le cœur du service. Chaque instance Gitea est stateless vis-à-vis du système de fichiers local : les dépôts Git peuvent etre stockes sur un volume partage ou sur le stockage objet (LFS).
| Parametre | Valeur recommandee |
|---|---|
| Version | Dernière stable (1.22+) |
| Replicas | 2 minimum pour la HA |
| Port HTTP | 3000 (interne) |
| Port SSH | 2222 (interne) |
| Configuration | /etc/gitea/app.ini |
PostgreSQL (base de données)¶
Stocke les metadonnees : utilisateurs, organisations, issues, pull requests, permissions, webhooks, audit log.
| Parametre | Valeur recommandee |
|---|---|
| Version | 16+ |
| Mode | Primary/Replica (streaming) |
| Stockage | SSD, 50 Go minimum |
| Connexions max | 200 |
| Sauvegardes | pg_dump quotidien + WAL archiving |
PostgreSQL obligatoire en production
SQLite est acceptable en dev/test. En production, utilisez PostgreSQL pour la concurrence, la réplication et la fiabilité.
Redis (cache et sessions)¶
Gère le cache applicatif, les sessions utilisateur et la file d'attente des tâches asynchrones (mail, webhooks).
| Parametre | Valeur recommandee |
|---|---|
| Version | 7+ |
| Mode | Standalone (Sentinel pour HA) |
| Mémoire | 512 Mo minimum |
| Persistence | AOF + RDB |
Stockage objet (S3 / MinIO)¶
Stocke les fichiers LFS, les avatars, les pieces jointes et les artefacts de packages. Decouple le stockage du système de fichiers local des instances Gitea.
| Parametre | Valeur recommandee |
|---|---|
| Solution | MinIO (self-hosted) ou S3 |
| Buckets | gitea-lfs, gitea-packages, gitea-attachments |
| Réplication | Erasure coding (MinIO) ou S3 Standard |
| Chiffrement | SSE-S3 ou SSE-KMS |
Reverse proxy (Caddy / Nginx)¶
Termine TLS, distribue le trafic HTTP vers les instances Gitea, gère le passthrough SSH.
| Parametre | Valeur recommandee |
|---|---|
| Solution | Caddy (TLS automatique) ou Nginx |
| TLS | Let's Encrypt ou certificat interne (PKI) |
| HTTP/2 | Active |
| Rate limiting | 100 req/s par IP |
Flux réseau¶
| Source | Destination | Port | Protocole | Usage |
|---|---|---|---|---|
| Utilisateur | Reverse proxy | 443 | HTTPS | Interface web, API, Git HTTP |
| Utilisateur | Reverse proxy | 22 | SSH | Git SSH |
| Reverse proxy | Gitea | 3000 | HTTP | Proxy applicatif |
| Reverse proxy | Gitea | 2222 | TCP | SSH passthrough |
| Gitea | PostgreSQL | 5432 | TCP | Base de données |
| Gitea | Redis | 6379 | TCP | Cache et sessions |
| Gitea | MinIO/S3 | 9000 | HTTPS | Stockage objet |
| Gitea | Keycloak | 443 | HTTPS | Authentification OIDC |
| CI Runner | Gitea | 443 | HTTPS | Fetch code, report status |
SSH passthrough¶
Pour que les utilisateurs accedent aux dépôts via SSH (git@gitea.example.com:org/repo.git), le reverse proxy doit router le trafic SSH vers Gitea.
Option 1 : port dedie (recommande)¶
graph LR
SSH["Port 22 (host)"] --> Gitea["Port 2222 (Gitea container)"] Configuration Caddy (layer 4, si supporte) ou ssh sur le host qui redirige vers le conteneur.
Option 2 : SSH passthrough via le host¶
Créer un utilisateur git sur le host qui delegue au conteneur Gitea :
# /home/git/.ssh/authorized_keys
# Chaque cle publique est ajoutee automatiquement par Gitea
command="/usr/local/bin/gitea-shell",no-port-forwarding,no-agent-forwarding ssh-ed25519 AAAA...
Stockage des dépôts¶
Option A : volume partage (NFS / GlusterFS)¶
Les dépôts Git sont stockes sur un volume partage entre les instances Gitea. Simple mais introduit un SPOF réseau et des problèmes de verrouillage.
Option B : stockage local + réplication (recommande)¶
Chaque instance Gitea a son propre stockage local. Un mécanisme de réplication (Gitea mirroring ou rsync) maintient les dépôts synchronises. Le reverse proxy route les écritures vers l'instance primaire.
Ecriture (push) ──> Instance Gitea 1 (primaire) ──> replication ──> Instance Gitea 2
Lecture (clone) ──> Instance Gitea 1 ou 2 (round-robin)
Simplification pour les petites équipes
Pour moins de 50 utilisateurs et 200 dépôts, une instance unique avec des sauvegardes régulières est suffisante. La HA n'est nécessaire que si le SLA exige > 99.9% de disponibilité.
Guide de dimensionnement¶
Par taille d'équipe¶
| Taille | Utilisateurs | Dépôts | Gitea | PostgreSQL | Redis | Stockage |
|---|---|---|---|---|---|---|
| Petite équipe | < 50 | < 200 | 1 instance, 1 vCPU, 512 Mo | 1 instance, 1 vCPU, 1 Go | 1 instance, 256 Mo | 50 Go |
| Équipe moyenne | 50-200 | 200-1000 | 2 instances, 2 vCPU, 1 Go | Primary + Replica, 2 vCPU, 4 Go | 1 instance, 512 Mo | 200 Go |
| Grande équipe | 200+ | 1000+ | 3+ instances, 4 vCPU, 2 Go | Primary + 2 Replicas, 4 vCPU, 8 Go | Sentinel, 1 Go | 1 To+ |
Metriques a surveiller¶
| Metrique | Seuil d'alerte | Action |
|---|---|---|
| CPU Gitea | > 80% sur 5 min | Ajouter une instance |
| RAM Gitea | > 85% | Augmenter la mémoire |
| Latence API p99 | > 2s | Vérifier PostgreSQL / Redis |
| Espace disque dépôts | > 80% | Étendre le stockage, nettoyer LFS |
| Connexions PostgreSQL | > 80% du max | Augmenter max_connections |
| Temps de réponse SSH | > 5s pour un clone | Vérifier réseau / stockage |
Diagramme de déploiement (Podman)¶
podman-compose.yml
┌─────────────────────────────────────────────┐
│ │
│ ┌────────┐ ┌────────┐ ┌────────┐ │
│ │ caddy │ │ gitea │ │ gitea │ │
│ │ :443 │──│ :3000 │ │ :3000 │ │
│ │ :22 │──│ :2222 │ │ :2222 │ │
│ └────────┘ └───┬────┘ └───┬────┘ │
│ │ │ │
│ ┌────────▼───────────▼──────┐ │
│ │ │ │
│ ┌─────▼──┐ ┌───────┐ ┌────────┐│ │
│ │postgres│ │ redis │ │ minio ││ │
│ │ :5432 │ │ :6379 │ │ :9000 ││ │
│ └────────┘ └───────┘ └────────┘│ │
│ │ │ │
│ └───────────────────────────┘ │
│ │
│ Volumes: gitea_data, postgres_data, │
│ redis_data, minio_data │
└─────────────────────────────────────────────┘