# Runbook — VPN NAS↔VPS + pont SAV + `api.navier-instruments.com` > Objectif : exposer **un seul** service public (`api.navier-instruments.com`) qui relaie vers > le **pont** (interne, sur le NAS), lequel parle à la gestion (Dolibarr) + ThingsBoard. > **La gestion n'est JAMAIS exposée.** Documenté pour être reproductible — ne rien casser. ## Architecture cible ``` public ──HTTPS──▶ api.navier-instruments.com (VPS 78.138.45.8, Nginx Proxy Manager + SSL) │ ▼ VPN OpenVPN (le VPS est client du serveur OpenVPN du NAS) pont @navier/sav-pont (NAS 10.8.0.1:8080) │ ┌─────────┴─────────┐ ▼ ▼ Dolibarr (interne) ThingsBoard (navier-cloud.com) ``` ## Inventaire (état 2026-07-13) | Élément | Détail | |---|---| | **NAS** | Synology `N_instruments`, LAN `192.168.10.104`, **DSM 6.2.4**. SSH : `ssh nas` (SteveC, port **1981**, clé `id_ed25519_nas`). | | **NAS = serveur OpenVPN** | `server 10.8.0.0/24`, **proto `udp6`**, **port 1194**, `dev tun`. NAS = `10.8.0.1`. IP publique actuelle = **IPv6** `2a05:6e02:106c:fc10:...`. | | **Pont** | `@navier/sav-pont` (Node ≥20, TS). Source **propre** = repo `Ecosystem-Navier/SAV/pont` (Dockerfile, écoute **:8080**, métriques :9100). ⚠️ Le dossier `/volume1/docker/sav/` du NAS est un **dump de build cassé** (noms mélangés) → NE PAS l'utiliser. | | **Gestion** | Dolibarr en Docker sur le NAS (`/volume1/docker/dolibarr/`, image `tuxgasy/dolibarr` + mariadb). Interne uniquement. | | **VPS** | `78.138.45.8`, `ssh navier-vps` (user `deploy`). NPM (conteneur) fait le reverse-proxy + SSL. | ## Choix du VPN — recommandation : WireGuard (VPS serveur / NAS client) Contrainte : le serveur OpenVPN du NAS est en **`udp6`** + IP publique **IPv6** → dépendance IPv6 ou port‑forward box. On l'évite en **inversant le sens** : le **VPS** (IPv4 publique stable) = **serveur**, le **NAS** = **client qui compose** (dial‑out) → **aucun port à ouvrir sur la box**, pas d'IPv6. **Reco : WireGuard** (moderne, léger, self‑hosted/souverain, reconnexion propre). Sur DSM 6.2.4 = **conteneur Docker**. Sous‑réseau VPN choisi : **`10.9.0.0/24`** (VPS = `10.9.0.1`, NAS = `10.9.0.2`). - *Alternative simplicité :* Tailscale (WireGuard clé‑en‑main, gère NAT/IPv6/clés) — service tiers. - *Alternative « réutiliser l'existant » :* OpenVPN NAS‑serveur (voir annexe) — plus contraignant. ## Étape 1 — VPN WireGuard (VPS serveur, NAS client) 1. **VPS (root)** — serveur : ```bash sudo apt-get update && sudo apt-get install -y wireguard umask 077; wg genkey | tee /etc/wireguard/vps.key | wg pubkey > /etc/wireguard/vps.pub # /etc/wireguard/wg0.conf : # [Interface] Address=10.9.0.1/24 ListenPort=51820 PrivateKey= # [Peer] PublicKey= AllowedIPs=10.9.0.2/32 sudo systemctl enable --now wg-quick@wg0 sudo ufw allow 51820/udp # (ou règle firewall équivalente) ``` 2. **NAS (Docker, root)** — client (conteneur `linuxserver/wireguard`) : ```bash mkdir -p /volume1/docker/wireguard # /volume1/docker/wireguard/wg_confs/wg0.conf : # [Interface] Address=10.9.0.2/32 PrivateKey= # [Peer] PublicKey= Endpoint=:51820 AllowedIPs=10.9.0.1/32 PersistentKeepalive=25 docker run -d --name wireguard --cap-add NET_ADMIN --restart unless-stopped \ -v /volume1/docker/wireguard:/config linuxserver/wireguard ``` 3. **Vérifier** : `ssh navier-vps 'ping -c2 10.9.0.2'` (le VPS doit joindre le NAS). Le pont sera en **`10.9.0.2:8080`**. *(Générer les clés : `wg genkey|tee nas.key|wg pubkey>nas.pub` côté NAS ; échanger les .pub entre les deux.)* ## Étape 2 — Déployer le pont (sur le NAS, proprement) Depuis la **source du repo** (pas le dossier cassé). Le pont a un `Dockerfile` (écoute :8080). ```bash # sur le NAS (root — Docker DSM 6) mkdir -p /volume1/docker/sav-pont && cd /volume1/docker/sav-pont # récupérer Ecosystem-Navier/SAV/pont (git clone ou rsync du sous-dossier) docker build -t navier-sav-pont . # pont.env = VRAIE config (URL Dolibarr interne, ThingsBoard, secrets) — à recréer proprement docker run -d --name sav-pont --restart unless-stopped \ -p 8080:8080 --env-file /volume1/docker/sav-pont/pont.env navier-sav-pont curl -s http://localhost:8080/health # doit répondre 200 ``` ## Étape 3 — Exposer `api.navier-instruments.com` (VPS) 1. **DNS (LWS)** : `api.navier-instruments.com A 78.138.45.8` (+ `AAAA` si IPv6 VPS). 2. **NPM (Nginx Proxy Manager)** : Proxy Host `api.navier-instruments.com` → **`10.8.0.1:8080`** (le pont via le VPN) + **SSL Let's Encrypt** (Force SSL, HTTP/2). 3. Vérifier : `curl -I https://api.navier-instruments.com/health` → **200**. ## Étape 4 — Brancher les consommateurs - Espace client, PWA SAV atelier, webapp → base API = **`https://api.navier-instruments.com`** (le seul point d'entrée). ## Résilience / ne rien casser - VPN VPS : `openvpn-client@nas` en `enable` → reconnexion auto. Si NAS/box down → `api.` down → les consommateurs doivent **dégrader proprement** (cache / message « temporairement indisponible »). - **Dolibarr jamais exposé** — accessible seulement via le pont, **scopé par client**. - Ne pas exposer le port 9100 (métriques) publiquement. - Sauvegardes : base mariadb Dolibarr (sur le NAS) — vérifier la tâche de sauvegarde Synology. ## Vérifs de bout en bout ```bash ssh navier-vps 'ping -c2 10.8.0.1 && curl -s http://10.8.0.1:8080/health' curl -I https://api.navier-instruments.com/health ``` --- ## ✅ RÉALISÉ (2026-07-13) — VPN opérationnel = Freebox IKEv2 (pas WireGuard) WireGuard abandonné pour NAS↔VPS : le réseau du NAS (Freebox Pro) **filtre l'UDP sortant** (seul dport 53 passe, prouvé par tcpdump) → WireGuard (UDP) impossible depuis le NAS. **Retenu : serveur VPN IKEv2 de la Freebox Pro.** Montage : `VPS (client strongSwan) → 160189667.box.freepro.com (Freebox, VPN IKEv2) → LAN → NAS 192.168.10.104`. - **VPS** `/etc/ipsec.conf` conn `freebox` : `keyexchange=ikev2`, `right=160189667.box.freepro.com`, `rightsubnet=192.168.10.0/24` (route LAN seule — le VPS garde son net), `leftauth=eap-mschapv2`, `leftid`/`eap_identity=VPSNavier`, `leftsourceip=%config`, `auto=start`. Secrets : `/etc/ipsec.secrets` → `VPSNavier : EAP ""`. - **Fix cert indispensable** : copier `ISRG_Root_X1.pem` (+X2) **individuellement** dans `/etc/ipsec.d/cacerts/` (strongSwan ne lit qu'1 cert/fichier ; le bundle `ca-certificates.crt` ne suffit pas). - **Persistance** : `systemctl enable strongswan-starter`. Reconnexion : MOBIKE. - **Vérif OK** : `ping 192.168.10.104` + `curl http://192.168.10.104:4444` → 200. - **Mobile** : même serveur Freebox IKEv2 pour iPhone/Mac nativement (Réglages → VPN → IKEv2). RESTE : pont (NAS, conteneur :8080) + NPM `api.navier-instruments.com` → `192.168.10.104:8080` + DNS `api.` → 78.138.45.8 (LWS).