Aller au contenu

Architecture VPS Docker

Une architecture multi-stack Docker désigne une organisation où plusieurs groupes de services (stacks) coexistent sur un même serveur, chacun défini par son propre fichier docker-compose.yaml. Chaque stack est autonome mais peut communiquer avec les autres via un réseau Docker partagé.

Cette infrastructure est déployée sur un VPS Hostinger KVM 4 :

  • 16 GB RAM / 4 vCPU / Debian
  • 6 stacks Docker interconnectées
  • 1 reverse proxy (Caddy) comme unique point d’entrée
StackServicesFonctionRAM estimée
security-stackCaddy, CrowdSecReverse proxy + WAF~500 MB
n8n-stackN8N, 5 workers, PostgreSQL, RedisAutomatisation~2 GB
ai-stackQdrant, Claude Ollama API, RedisIA et vecteurs~4 GB
odoo-stackOdoo 18, PostgreSQLERP~1.5 GB
monitoring-stackPrometheus, Grafana, Alertmanager, OTELObservabilité~1.5 GB
notify-stackDIUN, ntfyNotifications~200 MB
Internet
▼ (ports 80, 443, 443/udp)
┌─────────────────────────────────────────────────────┐
│ Caddy (security-stack) │
│ ├─ TLS automatique (Let's Encrypt) │
│ ├─ HTTP/3 QUIC │
│ └─ CrowdSec bouncer (WAF) │
└───────────────────────┬─────────────────────────────┘
▼ (réseau webproxy)
┌───────────────────┼───────────────────┐
│ │ │
▼ ▼ ▼
┌─────────┐ ┌─────────────┐ ┌──────────┐
│ N8N │ │ Grafana │ │ Odoo │
│ :5678 │ │ :3000 │ │ :8069 │
└─────────┘ └─────────────┘ └──────────┘

Quatre critères ont orienté ce choix architectural :

  1. Simplicité opérationnelle — Kubernetes introduit une complexité significative (etcd, control plane, ingress controllers) inadaptée à un serveur unique. Docker Compose permet de démarrer une stack en une commande.

  2. Contraintes de ressources — L’overhead Kubernetes (2-4 GB RAM pour le control plane) consommerait 15-25% des ressources disponibles. Docker Compose n’a pas cet overhead.

  3. Absence de besoin de scaling horizontal — Cette infrastructure ne nécessite pas d’auto-scaling ou de répartition sur plusieurs nœuds. Le scaling vertical (plus de RAM/CPU) suffit.

  4. Courbe d’apprentissage — La maîtrise de Compose est acquise, celle de Kubernetes demanderait un investissement disproportionné pour ce cas d’usage.

ProblèmeSolution apportée
Isolation des pannesUne stack défaillante n’impacte pas les autres
Déploiement indépendantMise à jour d’un service sans redémarrer tout le système
Gestion des dépendancesChaque stack gère ses propres versions (PostgreSQL N8N ≠ PostgreSQL Odoo)
SécuritéPoint d’entrée unique avec TLS + WAF
ObservabilitéStack dédiée au monitoring de toutes les autres

stacks_vps/
├── security-stack/ # Caddy + CrowdSec
├── n8n-stack/ # N8N en mode queue
├── ai-stack/ # Qdrant + Claude Ollama
├── odoo-stack/ # Odoo 18 ERP
├── monitoring-stack/ # Prometheus + Grafana
├── notify-stack/ # DIUN + ntfy
├── workflows/ # Documentation N8N
├── docs-external/ # 📦 Submodule: docs CLI externes
├── n8n-exports/ # 📦 Submodule: exports workflows N8N
├── blog/ # 📦 Submodule: ce blog (Astro)
└── scripts/ # Scripts de déploiement

Toutes les stacks communiquent via le réseau externe webproxy :

networks:
webproxy:
external: true

Ce réseau bridge permet à Caddy de router le trafic vers n’importe quel conteneur, quelle que soit sa stack d’origine. Les services s’adressent par leur nom de conteneur (ex: n8n:5678).

Fenêtre de terminal
# Créer le réseau partagé (une seule fois)
docker network create webproxy
# Démarrer toutes les stacks
./scripts/deploy-all.sh start
# Vérifier le status
./scripts/deploy-all.sh status
# Voir les logs d'une stack
./scripts/deploy-all.sh logs n8n-stack
# Redémarrer une stack spécifique
./scripts/deploy-all.sh restart odoo-stack
  1. security-stack — Le reverse proxy doit être prêt avant les autres
  2. monitoring-stack — Pour observer le démarrage des services
  3. Autres stacks — Dans n’importe quel ordre

LimiteImpactMitigation
Serveur uniqueSingle point of failureBackups réguliers + monitoring
Pas de HA nativeDowntime lors des mises à jourFenêtres de maintenance planifiées
Scaling vertical uniquementPlafond hardwareMigration possible vers multi-nœuds

Si le concept N8N + Odoo est répliqué pour d’autres entreprises :

  • Migration vers Kubernetes devient pertinente
  • Chaque client pourrait avoir son namespace isolé
  • Les stacks actuelles serviraient de templates Helm

Si les besoins IA augmentent :

  • L’ai-stack (4 GB) est la plus gourmande
  • Externalisation possible vers un service cloud GPU
  • L’architecture découplée facilite cette migration

Si 16 GB RAM devient insuffisant :

  • Option 1 : Upgrade VPS vers 32 GB
  • Option 2 : Déporter certaines stacks (monitoring, IA) vers un second serveur
  • Le réseau webproxy peut être étendu en overlay multi-host

  • Glossaire — Définitions des termes techniques