diff --git a/runbooks/vpn-nas-vps-pont-api.md b/runbooks/vpn-nas-vps-pont-api.md index db5a571..b1cca63 100644 --- a/runbooks/vpn-nas-vps-pont-api.md +++ b/runbooks/vpn-nas-vps-pont-api.md @@ -152,6 +152,44 @@ Conforme au schéma **officiel** (wiki Extrafields / Table llx_extrafields) — ### Chaîne complète prouvée `Mac (ssh -J) → VPS → tunnel IKEv2 → NAS pont :8080 (/interventions fichinter) → Dolibarr 19 réel`. -Le pont **n'est pas exposé publiquement** : l'espace client (VPS) le relaiera en interne via le tunnel. +Le pont **n'est pas exposé publiquement** : l'espace client (VPS) le relaie en interne via le tunnel. -RESTE : espace client sur le VPS (proxy interne `/api` → `192.168.10.104:8080`, PAS d'`api.` public). +--- +## ✅ RÉALISÉ (2026-07-13) — Espace client déployé sur le VPS + pont `/api` (host-network) + +**Conteneur `navier-espace-web`** (nginx:alpine) sur le VPS, sert le front statique de l'espace +client (`/home/deploy/navier-espace-web`, rsync depuis `~/esp/navier-espace-client`) sur **:8085** +et **relaie `/api/` → le pont** `http://192.168.10.104:8080/` (conf `/home/deploy/espace.nginx.conf`). + +### ⚠️ Point réseau clé : atteindre le pont (tunnel IKEv2) depuis un conteneur +La politique IPsec ne capture QUE le trafic sourcé de l'IP VPN du VPS `192.168.2.1` +(`ip xfrm policy` : `src 192.168.2.1/32 dst 192.168.10.0/24`). Un conteneur **bridge** est SNAT +vers l'IP hôte → **hors tunnel → `curl pont` = 000**. Deux solutions : +- **RETENUE (sans firewall)** : lancer le conteneur en **`--network host`** → il source depuis + l'hôte (`192.168.2.1`) → le tunnel le transporte. C'est pourquoi `navier-espace-web` tourne en + `--network host` (écoute :8085, proxy_pass direct vers le pont). Prouvé : `/api/healthz` → 200. +- **Alternative (si un conteneur *bridge* doit joindre le pont, ex. NPM en direct)** : règle SNAT + `iptables -t nat -A POSTROUTING -s 172.16.0.0/12 -d 192.168.10.0/24 -j SNAT --to-source 192.168.2.1` + (+ persistance). **Non appliquée** (changement firmware du VPS partagé = à valider hors auto-mode). + +### Commandes +```bash +# déploiement statique +rsync -az --delete ~/esp/navier-espace-client/ navier-vps:/home/deploy/navier-espace-web/ +# conteneur (host-network pour joindre le pont via le tunnel) +sudo docker run -d --name navier-espace-web --restart unless-stopped --network host \ + -v /home/deploy/espace.nginx.conf:/etc/nginx/conf.d/default.conf:ro \ + -v /home/deploy/navier-espace-web:/usr/share/nginx/html:ro nginx:alpine +# vérif +curl http://127.0.0.1:8085/ # 200 (statique) +curl http://127.0.0.1:8085/api/healthz # 200 (pont via tunnel) +``` + +### RESTE (2 actions distinctes) +1. **URL publique de revue** : `:8085` est fermé au public (seul NPM 80/443 est ouvert). Pour une + URL SSL → **ajouter DNS `espace.navier-instruments.com A → 78.138.45.8` (LWS)**, puis NPM proxy + host `espace.…` → `78.138.45.8:8085` + Let's Encrypt (même schéma que `staging.` = `set $server 78.138.45.8`). +2. **Câblage données réelles** : le front est encore un **prototype** (login factice + `var DATA` en + dur). À implémenter : login → JWT ThingsBoard (le pont le valide), puis lecture parc/SAV/factures + via le pont (`/interventions` fichinter). ⚠️ Le pont est scopé SAV-atelier (RBAC techniciens/superviseurs) : + vérifier/ajouter les routes de lecture **client** avant de câbler (ne pas deviner l'API).