Architecture EDGE / DEV / PROD — Reverse proxy centralisé
Objectif
Cette évolution stabilise l’infrastructure DataLab0 en séparant clairement les rôles :
- EDGE : reverse proxy, HTTPS, routage public ;
- DEV : environnement de développement applicatif ;
- PROD : environnement de production applicatif.
L’objectif est d’éviter que le reverse proxy soit hébergé dans une VM applicative. Le point d’entrée public devient un CT LXC dédié, plus léger et plus cohérent pour les services d’infrastructure.
Architecture validée
Internet
↓
IP publique Proxmox : 147.135.131.39
↓
NAT Proxmox
↓
CT EDGE : 192.168.100.12
↓
Nginx Proxy Manager
├── DEV -> 192.168.100.10:8080
└── PROD -> 192.168.100.11:8080
Machines
| Rôle | Type | ID | Nom | IP interne | SSH public |
|---|---:|---:|---|---|---|
| EDGE | CT LXC Debian 12 | 103 | PRO-DATALAB0-EDGE | 192.168.100.12 | 2224 |
| DEV | VM Ubuntu | 102 | datalab0-app-dev | 192.168.100.10 | 2222 |
| PROD | VM Ubuntu | 101 | datalab0-app-prod | 192.168.100.11 | 2223 |
| Template | VM template | 100 | UBUNTU-BASE-TEMPLATE | - | - |
Accès SSH
Depuis Windows PowerShell :
DEV
ssh -i $HOME\.ssh\id_ed25519 -p 2222 admin@147.135.131.39
PROD
ssh -i $HOME\.ssh\id_ed25519 -p 2223 admin@147.135.131.39
EDGE
ssh -i $HOME\.ssh\id_ed25519 -p 2224 root@147.135.131.39
DNS OVH
La zone DNS doit contenir :
appv2dev IN A 147.135.131.39
appv2 IN A 147.135.131.39
Les deux domaines pointent vers la même IP publique. Le routage réel est fait par Nginx Proxy Manager sur EDGE.
Domaines applicatifs
| Environnement | Domaine | Cible NPM |
|---|---|---|
| DEV | https://appv2dev.datalab0.com | 192.168.100.10:8080 |
| PROD | https://appv2.datalab0.com | 192.168.100.11:8080 |
NAT Proxmox
Les règles NAT publiques attendues sur le host Proxmox :
2222 -> 192.168.100.10:22
2223 -> 192.168.100.11:22
2224 -> 192.168.100.12:22
80 -> 192.168.100.12:80
81 -> 192.168.100.12:81
443 -> 192.168.100.12:443
Le port 8080 historique peut rester temporairement vers DEV pour debug, mais l’accès normal passe désormais par HTTPS via EDGE.
Vérifier les règles
iptables -t nat -L PREROUTING -n --line-numbers
Sauvegarder les règles
netfilter-persistent save
CT EDGE
Le CT EDGE héberge uniquement Nginx Proxy Manager.
Docker Compose EDGE
Chemin :
/opt/npm/docker-compose.yml
Contenu :
services:
npm:
image: jc21/nginx-proxy-manager:latest
restart: unless-stopped
ports:
- "80:80"
- "81:81"
- "443:443"
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
Commandes EDGE
cd /opt/npm
docker compose up -d
docker ps
Interface admin :
http://147.135.131.39:81
Proxy Hosts Nginx Proxy Manager
DEV
Domain Names: appv2dev.datalab0.com
Scheme: http
Forward Hostname / IP: 192.168.100.10
Forward Port: 8080
Options :
Block Common Exploits: enabled
Websockets Support: enabled
SSL: Let's Encrypt
Force SSL: enabled
HTTP/2: enabled
PROD
Domain Names: appv2.datalab0.com
Scheme: http
Forward Hostname / IP: 192.168.100.11
Forward Port: 8080
Options identiques à DEV.
Nettoyage réalisé
Nginx Proxy Manager a été supprimé des VMs DEV et PROD.
Les VMs applicatives ne doivent contenir que la stack DataLab0 :
- reverse-proxy applicatif ;
- workspace-web ;
- viewer-web ;
- api ;
- worker ;
- scheduler ;
- postgres ;
- redis ;
- minio.
Restart policy Docker
Les services applicatifs DEV/PROD doivent utiliser :
restart: unless-stopped
Le service reverse-proxy applicatif doit lui aussi avoir cette politique.
Vérification DEV / PROD
docker inspect v1_3-reverse-proxy-1 | grep -A 3 RestartPolicy
Résultat attendu :
"Name": "unless-stopped"
Vérification EDGE
docker inspect npm-npm-1 | grep -A 3 RestartPolicy
Docker au démarrage
Sur DEV, PROD et EDGE :
sudo systemctl enable docker
sudo systemctl status docker
Résultat attendu :
Loaded: ... enabled
Active: active (running)
Vérifications réseau
Depuis EDGE :
curl -I http://192.168.100.10:8080
curl -I http://192.168.100.11:8080
Résultat attendu :
HTTP/1.1 200 OK
Depuis le navigateur :
https://appv2dev.datalab0.com
https://appv2.datalab0.com
Déploiement DEV
Depuis Windows :
scp -i $HOME\.ssh\id_ed25519 -P 2222 .\saas_bi_docker_ready_v1_4_edge_architecture_docs_indexed.zip admin@147.135.131.39:~/projects/
Sur DEV :
cd ~/projects
mv v1_3 v1_3_backup_$(date +%Y%m%d_%H%M%S)
unzip saas_bi_docker_ready_v1_4_edge_architecture_docs_indexed.zip -d v1_3
cd v1_3
docker compose up -d --build --force-recreate
curl -I http://localhost:8080
Déploiement PROD
Depuis Windows :
scp -i $HOME\.ssh\id_ed25519 -P 2223 .\saas_bi_docker_ready_v1_4_edge_architecture_docs_indexed.zip admin@147.135.131.39:~/projects/
Sur PROD :
cd ~/projects
mv v1_3 v1_3_backup_$(date +%Y%m%d_%H%M%S)
unzip saas_bi_docker_ready_v1_4_edge_architecture_docs_indexed.zip -d v1_3
cd v1_3
docker compose up -d --build --force-recreate
curl -I http://localhost:8080
Points d’attention
- Les firewalls Proxmox sur les interfaces VM peuvent bloquer le trafic interne VM vers
vmbr1. - En cas de
502 Bad Gateway, tester depuis EDGE vers les IP internes. - En cas de timeout SSH, vérifier les règles NAT Proxmox.
- En cas d’échec Let’s Encrypt, vérifier que les ports 80 et 443 pointent bien vers EDGE.
Prochaine étape recommandée
La prochaine étape logique est Git + CI/CD :
branche dev -> déploiement automatique DEV
branche main -> déploiement contrôlé PROD