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

S
Description
No description provided
Readme
92 KiB
Languages
HTML 98%
Shell 1.2%
Dockerfile 0.8%