Aller au contenu

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            │
  └─────────────────────────────────────────────┘