VPS/runbooks/vpn-nas-vps-pont-api.md

108 lines
7.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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
portforward box. On l'évite en **inversant le sens** : le **VPS** (IPv4 publique stable) = **serveur**,
le **NAS** = **client qui compose** (dialout) → **aucun port à ouvrir sur la box**, pas d'IPv6.
**Reco : WireGuard** (moderne, léger, selfhosted/souverain, reconnexion propre). Sur DSM 6.2.4 = **conteneur Docker**.
Sousréseau VPN choisi : **`10.9.0.0/24`** (VPS = `10.9.0.1`, NAS = `10.9.0.2`).
- *Alternative simplicité :* Tailscale (WireGuard cléenmain, gère NAT/IPv6/clés) — service tiers.
- *Alternative « réutiliser l'existant » :* OpenVPN NASserveur (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=<contenu vps.key>
# [Peer] PublicKey=<nas.pub> 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=<contenu nas.key>
# [Peer] PublicKey=<vps.pub> Endpoint=<IP_PUBLIQUE_VPS>: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 "<mdp>"`.
- **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).