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
- Gitea : https://gitea.qpismont.fr
- Woodpecker : https://woodpecker.qpismont.fr
- Portfolio :
https://www.qpismont.fr(désactivé)
Services internes (VPN requis)
- Perses : http://perses:8080 (via WireGuard)
- Prometheus : http://prometheus:9090 (via WireGuard)
- Caddy Admin : http://reverse_caddy:2019 (métriques)
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
prodconfiguré - 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