Files
infra/README.md

13 KiB

Infrastructure qpismont.fr

Infrastructure self-hosted complète hébergée sur serveur dédié, fournissant une plateforme DevOps avec Git, CI/CD, reverse proxy, VPN et monitoring.

Domaine : qpismont.fr Stack : Docker Swarm Repository : https://gitea.qpismont.fr/qpismont/infra


Vue d'ensemble

Cette infrastructure héberge l'ensemble des services nécessaires pour le développement et le déploiement de projets personnels :

  • Hébergement Git avec interface web (Gitea)
  • CI/CD automatisé pour builds et déploiements (Woodpecker)
  • Reverse proxy avec HTTPS automatique (Caddy)
  • Accès VPN sécurisé pour l'administration (WireGuard)
  • Monitoring des services et ressources (Prometheus + Perses)
  • Backups automatisés quotidiens vers serveur FTP

Services déployés

Production

Service Version Description URL
Gitea 1.24.7 Hébergement Git (alternative GitHub) https://gitea.qpismont.fr
Woodpecker CI 3.11.0 Plateforme CI/CD (fork de Drone) https://woodpecker.qpismont.fr
Caddy 2-alpine Reverse proxy + HTTPS automatique -
WireGuard latest Serveur VPN pour accès distant UDP:51820
Prometheus 3.7.2 Collecte de métriques (interne)
Perses latest Dashboards de monitoring (via VPN)
cAdvisor latest Métriques des containers (interne)
Backup latest Sauvegarde quotidienne (4h00) (interne)

Configuration

  • Timezone : Europe/Paris
  • OAuth : Gitea ↔ Woodpecker intégré
  • Admin : qpismont
  • Backup retention : 14 jours
  • Monitoring scrape : 10 secondes

Architecture

                                  Internet
                                     │
                        ┌────────────┼────────────┐
                        │            │            │
                  Port 80/443   Port 443/udp  Port 51820/udp
                        │            │            │
                        ▼            ▼            ▼
                [Caddy Proxy]    [HTTP/3]    [WireGuard VPN]
                        │                          │
            ┌───────────┼──────────┐              │
            │           │          │              │
       gitea:3000  woodpecker:8000 │         [Perses]
                                    │              │
                              www.qpismont.fr [Prometheus]
                              (désactivé)          │
                                              [cAdvisor]

┌──────────────────────────────────────────────────────────────┐
│                         CI/CD Pipeline                        │
│                                                                │
│  [Gitea] ←──── OAuth ────→ [Woodpecker Server]               │
│                                      │                         │
│                                      ▼                         │
│                            [Woodpecker Agent]                 │
│                                      │                         │
│                                      ▼                         │
│                            [Docker-in-Docker]                 │
│                           (build containers)                  │
└──────────────────────────────────────────────────────────────┘

┌──────────────────────────────────────────────────────────────┐
│                      Monitoring Stack                         │
│                                                                │
│  [Prometheus] ←─ scrape ─┬─ prometheus:9090 (self)          │
│       │                   ├─ reverse_caddy:2019 (metrics)     │
│       │                   └─ cadvisor:8080 (containers)       │
│       │                                                        │
│       └──→ [Perses] (visualisation via VPN)                  │
└──────────────────────────────────────────────────────────────┘

┌──────────────────────────────────────────────────────────────┐
│                       Backup System                           │
│                                                                │
│  [Backup Service] ──→ rclone/FTP ──→ [Serveur FTP distant]  │
│         │                                  │                  │
│         └─ Volumes Docker:                 └─ /backups/infra/│
│            • giteadata                      Format: .tar.gz   │
│            • woodpeckerdata (désactivé)    Rétention: 14j    │
│            • caddy configs (désactivé)     Cron: 4h00        │
│            • wireguard (désactivé)                            │
└──────────────────────────────────────────────────────────────┘

Réseaux Docker Swarm

Réseau Type Services
reverse overlay Caddy, Gitea, Woodpecker
wireguard_network overlay WireGuard, Perses
prometheus_network overlay Prometheus, Perses, cAdvisor, Caddy, Backup

Stack technique

Orchestration

  • Docker Engine avec Docker Swarm mode
  • Docker Compose v3 (Stack deployment)
  • Docker Secrets pour credentials sensibles
  • Docker Configs pour configurations versionnées

Infrastructure as Code

  • Configuration : docker-compose.yml
  • Déploiement : ./deploy.sh (génère timestamp pour versioning)
  • Contexte Docker distant : prod

Networking

  • 3 réseaux overlay isolés
  • Reverse proxy : Caddy avec Let's Encrypt automatique
  • HTTP/3 (QUIC) activé sur port 443/udp
  • VPN : WireGuard pour services internes

Storage

  • Volumes Docker : giteadata, woodpeckerdata, reversecaddydata, reversecaddyconfig, backuptemp
  • Host mounts : /home/user/wireguard-config, /var/run/docker.sock (CI/CD)

Monitoring

  • Métriques : Prometheus avec 10s scrape interval
  • Dashboards : Perses (accessible via VPN)
  • Container metrics : cAdvisor
  • Proxy metrics : Caddy admin API (:2019)

Backups

  • Solution : docker-volume-backup avec rclone
  • Fréquence : Quotidien à 4h00
  • Destination : Serveur FTP distant
  • Rétention : 14 jours
  • Format : .tar.gz compressé

Fonctionnalités

Gitea

  • Hébergement de repositories Git illimité
  • Issues, Pull Requests, Wikis
  • OAuth provider pour Woodpecker
  • Interface web complète
  • API REST

Woodpecker CI

  • Pipelines CI/CD automatisés
  • Intégration native avec Gitea
  • Agent Docker-in-Docker
  • Limite : 1 workflow concurrent, CPU core 1
  • Support multi-architectures

Caddy

  • HTTPS automatique avec Let's Encrypt
  • HTTP/3 (QUIC) support
  • Renouvellement automatique des certificats
  • Métriques Prometheus exposées
  • Configuration simple (Caddyfile)

WireGuard

  • VPN moderne et rapide
  • Configuration : 1 peer (extensible)
  • Accès sécurisé aux services internes
  • Faible overhead

Monitoring

  • Prometheus : Collecte et stockage des métriques
  • Perses : Visualisation moderne (alternative Grafana)
  • cAdvisor : Métriques CPU, RAM, I/O des containers
  • Scrape automatique toutes les 10 secondes

Backups

  • Sauvegarde automatique quotidienne
  • Support FTP/SFTP via rclone
  • Compression gzip
  • Notifications optionnelles (Discord, Slack, Email)
  • Rétention configurable

URLs et accès

Services publics

Services internes (VPN requis)

VPN

  • Protocole : WireGuard
  • Port : 51820/udp
  • Config : /home/user/wireguard-config/peer1/

Déploiement

Le déploiement se fait via un contexte Docker distant vers le serveur de production :

./deploy.sh

Le script génère un timestamp pour versionner les configs et secrets, puis déploie le stack core sur le contexte prod.

Prérequis :

  • Contexte Docker prod configuré
  • Réseaux overlay créés (reverse, wireguard_network, prometheus_network)
  • Secrets configurés dans ./secrets/

Configuration

Secrets Docker

Secret Usage
woodpecker_agent_secret Communication server/agent Woodpecker
woodpecker_gitea_client OAuth client ID Gitea
woodpecker_gitea_secret OAuth client secret Gitea
backup_ftp_config Configuration rclone pour FTP

Configs Docker

Config Fichier source
caddy_config ./Caddyfile
prometheus_config ./prometheus.yml

Les configs et secrets sont versionnés avec ${DATETIME} pour forcer les mises à jour lors du déploiement.


Problèmes connus

⚠️ Service my_cv désactivé

Le Caddyfile contient des routes vers my_cv:80 mais le service n'existe plus dans docker-compose.yml (retiré dans commit f047317).

Impact : Routes qpismont.fr et www.qpismont.fr ne fonctionnent pas.

⚠️ Prometheus non-persistant

Prometheus n'a pas de volume Docker, les métriques sont perdues à chaque redémarrage du container.

Impact : Pas d'historique des métriques sur le long terme.

⚠️ Volumes backup partiellement désactivés

Seul giteadata est actuellement sauvegardé. Les autres volumes (woodpecker, caddy, wireguard) sont commentés dans docker-compose.yml.

Impact : Perte de données possible en cas d'incident sur ces volumes.


Documentation

Fichiers de documentation

  • README.md : Ce fichier - présentation générale
  • ANALYSE.md : Analyse détaillée de l'infrastructure + recommandations d'amélioration
  • BACKUP.md : Documentation complète du système de backup (configuration, utilisation, restauration)

Documentation externe


Maintenance

Routine

  • Quotidien : Backup automatique à 4h00
  • Hebdomadaire : Vérification logs et backups
  • Mensuel : Mise à jour des images Docker
  • Trimestriel : Test de restauration des backups

Monitoring

# Status des services
docker --context prod ps

# Logs d'un service
docker --context prod logs -f $(docker --context prod ps -q -f name=core_SERVICE)

# Métriques système
docker --context prod stats

Mises à jour

Modifier les versions dans docker-compose.yml puis :

./deploy.sh

Docker Swarm appliquera les changements de manière progressive.


Sécurité

Mesures en place

HTTPS automatique (Let's Encrypt) Secrets Docker (credentials chiffrés) Network isolation (3 réseaux séparés) VPN pour services internes (WireGuard) Resource limits sur CI/CD agent Backups automatisés quotidiens Non-root user pour Gitea (UID 1000)

Recommandations

Voir ANALYSE.md pour la liste complète des améliorations de sécurité suggérées.


Historique

2025-10-27

  • Upgrade vers Debian 13 (devcontainer)
  • Update Woodpecker v3.11.0
  • Update Gitea v1.24.7
  • Ajout WireGuard VPN
  • Ajout stack monitoring (Prometheus + Perses + cAdvisor)
  • Ajout système de backup automatique

2025-06-23

  • Retrait service my_cv (portfolio)
  • Update images Woodpecker et Gitea

Antérieur

  • Déploiement devcontainer Debian
  • Upgrades réguliers des services
  • Ajout Woodpecker CI
  • Migration vers Docker Swarm

Statistiques

  • Services actifs : 8
  • Réseaux overlay : 3
  • Volumes Docker : 5
  • Secrets Docker : 4
  • Configs Docker : 2
  • Ports exposés : 4 (80, 443/tcp, 443/udp, 51820/udp)
  • Backup size : ~50-500 MB (dépend des données Gitea)
  • Uptime target : 99%+

Licence et Auteur

Propriétaire : qpismont Usage : Personnel Repository : https://gitea.qpismont.fr/qpismont/infra


Dernière mise à jour : 27 octobre 2025