> ⛔ **NE PAS COMMITER CE FICHIER TANT QUE LA MIGRATION N'EST PAS EN PLACE ET VALIDÉE.**
> C'est un plan de travail / aide-mémoire avec des éléments d'infra (IP, hostnames). On le supprime ou on le déplace hors du dépôt une fois la bascule faite.

# Migration Tailscale → tunnel auto-hébergé (VPS OVH)

But : se passer de Tailscale pour être **100 % maître** du chemin réseau téléphone → Pi → NAS, sans dépendre du serveur de contrôle de Tailscale.

---

## 0. Rappel : ce que Tailscale voit réellement

- **Contenu des photos** : chiffré de bout en bout (WireGuard). Tailscale **ne peut pas** le lire.
- **Métadonnées** : leur serveur de coordination connaît tes appareils, IP, horaires de connexion.
- **Relais DERP** : si le P2P direct échoue, le trafic *chiffré* transite par leurs relais (ils relaient sans déchiffrer).
- **Dépendance** : tu dépends de leur serveur de contrôle et tu fais confiance à leurs binaires.

→ Vouloir tout auto-héberger est légitime pour la **souveraineté / l'indépendance**, pas parce qu'ils liraient les photos.

---

## 1. Architecture cible (Option A — WireGuard pur, VPS en hub)

```
                 Internet
  [Téléphone] ─────────────► [VPS OVH]  ◄───────── [Pi]
   wg0 10.8.0.3              IP publique           wg0 10.8.0.2
                            wg0 10.8.0.1            │ LAN 192.168.1.136
                              (hub)                 ▼
                                              [NAS QNAP 192.168.1.124]
```

- Le **VPS** est le point de rendez-vous (IP publique, port UDP ouvert).
- Le **Pi** et le **téléphone** se connectent au VPS via WireGuard.
- Le trafic téléphone → Pi passe par le tunnel (via le VPS quand on est en 4G).
- Sur le **même WiFi que le Pi**, on garde la route LAN directe (192.168.1.136) → ne transite pas par le VPS.

### Plan d'adressage (VPN interne)
| Hôte       | IP WireGuard | Rôle            |
|------------|--------------|-----------------|
| VPS OVH    | `10.8.0.1`   | hub             |
| Pi         | `10.8.0.2`   | serveur PhotoSync |
| Téléphone  | `10.8.0.3`   | client appli    |

> Adresse du Pi vue par l'appli après migration : **`10.8.0.2`** (ou nom DNS interne si on en met un).

---

## 2. Pré-requis à réunir

- [ ] Accès SSH au VPS OVH (IP publique + user + clé/mot de passe).
- [ ] Un **port UDP** ouvert sur le firewall OVH (défaut WireGuard : `51820/udp`).
- [ ] Accès SSH au Pi (déjà en place).
- [ ] `wireguard` installé sur VPS et Pi : `sudo apt install wireguard`.
- [ ] App WireGuard officielle sur le téléphone (Play Store) — c'est le **client WireGuard**, pas Tailscale.

---

## 3. Génération des clés

Sur **chaque** machine (VPS, Pi) et pour le téléphone :

```bash
wg genkey | tee privatekey | wg pubkey > publickey
```

On obtient 3 paires (clé privée / clé publique). La privée **ne quitte jamais** sa machine ; on n'échange que les **clés publiques**.

---

## 4. Config du VPS (hub) — `/etc/wireguard/wg0.conf`

```ini
[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = <CLE_PRIVEE_VPS>
# NAT pour que les peers se voient entre eux
PostUp   = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o wg0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o wg0 -j MASQUERADE

# --- Pi ---
[Peer]
PublicKey = <CLE_PUBLIQUE_PI>
AllowedIPs = 10.8.0.2/32

# --- Téléphone ---
[Peer]
PublicKey = <CLE_PUBLIQUE_TELEPHONE>
AllowedIPs = 10.8.0.3/32
```

Activer le routage IP + démarrer :
```bash
echo 'net.ipv4.ip_forward = 1' | sudo tee /etc/sysctl.d/99-wg.conf
sudo sysctl --system
sudo systemctl enable --now wg-quick@wg0
```

---

## 5. Config du Pi — `/etc/wireguard/wg0.conf`

```ini
[Interface]
Address = 10.8.0.2/24
PrivateKey = <CLE_PRIVEE_PI>

[Peer]
PublicKey = <CLE_PUBLIQUE_VPS>
Endpoint = <IP_PUBLIQUE_VPS>:51820
AllowedIPs = 10.8.0.0/24
# garde le tunnel ouvert derrière le NAT de la box
PersistentKeepalive = 25
```

```bash
sudo systemctl enable --now wg-quick@wg0
```

> Le Pi reste joignable sur son LAN `192.168.1.136` ET sur `10.8.0.2` via le tunnel.

---

## 6. Config du téléphone (app WireGuard)

Profil à importer (ou QR code généré côté VPS) :

```ini
[Interface]
Address = 10.8.0.3/24
PrivateKey = <CLE_PRIVEE_TELEPHONE>
DNS = 1.1.1.1   # optionnel

[Peer]
PublicKey = <CLE_PUBLIQUE_VPS>
Endpoint = <IP_PUBLIQUE_VPS>:51820
# uniquement le sous-réseau VPN → split tunnel (le reste du trafic reste normal)
AllowedIPs = 10.8.0.0/24
PersistentKeepalive = 25
```

> `AllowedIPs = 10.8.0.0/24` = **split tunnel** : seul le trafic vers le Pi passe dans le VPN, le reste de la navigation du téléphone est inchangé.

Générer le QR pour importer facilement (sur le VPS) :
```bash
sudo apt install qrencode
qrencode -t ansiutf8 < telephone.conf
```

---

## 7. Modifs côté application PhotoSync

- [ ] Remplacer l'IP/host du Pi utilisée par l'appli : `100.x.x.x` (Tailscale) → **`10.8.0.2`**.
  - Vérifier `mobile/app.json`, fichiers de config/env, et toute URL en dur (`grep -rn "100\." mobile/` et l'host Tailscale actuel).
- [ ] Garder un fallback LAN `192.168.1.136` quand le téléphone est sur le WiFi maison (la sonde parallèle `Promise.any` existante peut tester les deux).
- [ ] Re-tester : « Tester la connexion » + un upload en 4G et un en WiFi.

---

## 8. Validation (avant de désinstaller Tailscale)

```bash
# depuis le Pi
ping -c3 10.8.0.1          # VPS
sudo wg show               # handshake récent attendu

# depuis le VPS
ping -c3 10.8.0.2          # Pi
ping -c3 10.8.0.3          # téléphone (tunnel actif)
```

- [ ] Upload photo OK en **WiFi maison** (passe en direct LAN).
- [ ] Upload photo OK en **4G** (passe par le VPS).
- [ ] Sauvegarde arrière-plan (Option B natif) OK avec la nouvelle IP.

Quand tout est vert :
- [ ] Désactiver/désinstaller Tailscale sur le Pi et le téléphone.
- [ ] **Supprimer ou sortir ce fichier du dépôt** (contient des éléments d'infra).

---

## 9. Points d'attention

- **Bande passante VPS** : en 4G, les uploads photo consomment la bande passante OVH. Vérifier le débit/quota de l'offre VPS (souvent OK, mais à valider sur de grosses vidéos).
- **Sécurité VPS** : n'ouvrir que `51820/udp` côté WireGuard ; garder SSH protégé (clé only, fail2ban).
- **Persistance** : `PersistentKeepalive = 25` indispensable côté Pi et téléphone pour traverser le NAT de la box.
- **Sauvegarde des clés** : conserver les clés privées hors dépôt (gestionnaire de secrets / coffre), jamais dans Git.

---

## Annexe — Option B : Headscale (si on veut garder le confort Tailscale)

Au lieu de WireGuard pur, on auto-héberge **Headscale** (serveur de contrôle Tailscale open-source) sur le VPS :

- ✅ On garde l'app cliente Tailscale (MagicDNS, ACL faciles, NAT traversal → **P2P direct** qui économise la bande passante du VPS).
- ✅ Le « cerveau » tourne sur **ton** VPS → plus de dépendance à la société Tailscale.
- ➖ Un peu plus de pièces à maintenir que WireGuard pur.

Reco : pour seulement téléphone + Pi, **WireGuard pur (Option A)** est le plus simple et le plus souverain. Headscale si on veut le confort + le P2P direct automatique.
