diff --git a/docs/changelog/2026-01-12.md b/docs/changelog/2026-01-12.md
new file mode 100644
index 0000000..12f1607
--- /dev/null
+++ b/docs/changelog/2026-01-12.md
@@ -0,0 +1,96 @@
+# Changelog 2026-01-12
+
+## Servarr Stack — Migration VPN Complète
+
+### Contexte
+
+La stack Servarr avait initialement Transmission derrière le VPN (gluetun), mais Prowlarr, Sonarr et Radarr étaient exposés directement sur le réseau Docker, sans protection VPN.
+
+### Changements
+
+#### Architecture réseau
+
+| Service | Avant | Après |
+|---------|-------|-------|
+| Transmission | ✅ Via VPN | ✅ Via VPN |
+| Prowlarr | ❌ Direct | ✅ Via VPN |
+| Sonarr | ❌ Direct | ✅ Via VPN |
+| Radarr | ❌ Direct | ✅ Via VPN |
+
+#### Configuration Docker
+
+Tous les services utilisent maintenant `network_mode: "service:gluetun"` :
+
+```yaml
+services:
+ gluetun:
+ ports:
+ - "9091:9091" # Transmission
+ - "9696:9696" # Prowlarr
+ - "7878:7878" # Radarr
+ - "8989:8989" # Sonarr
+ environment:
+ - FIREWALL_OUTBOUND_SUBNETS=192.168.0.0/16,100.64.0.0/10
+
+ prowlarr:
+ network_mode: "service:gluetun"
+ depends_on:
+ gluetun:
+ condition: service_healthy
+
+ sonarr:
+ network_mode: "service:gluetun"
+ # ...
+
+ radarr:
+ network_mode: "service:gluetun"
+ # ...
+```
+
+#### Configuration des apps
+
+Les connexions internes ont été mises à jour dans les bases SQLite :
+
+| App | Setting | Ancienne valeur | Nouvelle valeur |
+|-----|---------|-----------------|-----------------|
+| Prowlarr | Download Client | `gluetun:9091` | `localhost:9091` |
+| Prowlarr | Sonarr App | `http://sonarr:8989` | `http://localhost:8989` |
+| Prowlarr | Radarr App | `http://radarr:7878` | `http://localhost:7878` |
+| Sonarr | Download Client | `gluetun:9091` | `localhost:9091` |
+| Radarr | Download Client | `gluetun:9091` | `localhost:9091` |
+
+### Avantages
+
+1. **Kill switch intégré** : Si gluetun tombe, aucun service n'a accès Internet
+2. **IP unique** : Tous les services apparaissent avec la même IP ProtonVPN
+3. **Sécurité renforcée** : Les indexeurs et API sont protégés par le VPN
+4. **Cohérence** : Architecture uniforme pour toute la stack
+
+### Vérification
+
+```bash
+# Vérifier l'IP VPN
+docker exec gluetun wget -qO- https://ipinfo.io/ip
+# Résultat: 5.253.204.x (ProtonVPN Luxembourg)
+
+# Tester la connectivité interne
+docker exec gluetun sh -c 'wget -qO- http://localhost:9696/ping'
+# Résultat: {"status":"OK"}
+```
+
+### Fichiers modifiés
+
+- `~/lake/servarr/docker-compose.yml` — nouvelle architecture
+- `~/lake/servarr/prowlarr/prowlarr.db` — connexions internes
+- `~/lake/servarr/sonarr/sonarr.db` — connexions internes
+- `~/lake/servarr/radarr/radarr.db` — connexions internes
+
+### Backup
+
+Ancien compose sauvegardé : `~/lake/servarr/docker-compose.yml.bak`
+
+### Notes
+
+- Caddy continue de proxyfier via `gluetun:PORT`
+- Le Caddyfile existant était déjà correct, seul un `caddy reload` était nécessaire
+- Le cache DNS de Caddy peut nécessiter un restart complet du container après modifications
diff --git a/docs/infra/overview.md b/docs/infra/overview.md
index c78ca09..9557a0c 100644
--- a/docs/infra/overview.md
+++ b/docs/infra/overview.md
@@ -38,57 +38,131 @@
/dev/sda1 → /mnt/mediaserver # 4 TB
# NFS Synology (backups)
-10.171.171.50:/volume1/Backups → /mnt/annecy
+annecy:/volume1/Backups → /mnt/annecy
```
-## Structure des fichiers
+## Structure ~/lake/
```
-/home/lionel/
-└── talloires-v2/ # Configurations Docker
- ├── infra/ # Caddy, Authelia
- ├── media/ # Jellyfin compose
- ├── monitoring/ # Netdata, Dozzle
- ├── tools/ # Shlink, Gitea compose
- ├── docker-mgmt/ # Arcane
- ├── automation/ # Home Assistant
- ├── transmission/ # Transmission + WireGuard
- ├── mkdocs/ # Cette documentation
- ├── jellyfin/ # Config Jellyfin (3.6GB)
- ├── homeassistant/ # Config HA (dupliqué sur SSD)
- └── arcane/ # Config Arcane
-
-/mnt/mediaserver/
-├── talloires/ # Données services
-│ ├── caddy/ # Caddyfile + certs
-│ ├── gitea/ # Repos git + DB
-│ ├── homeassistant/ # Config active HA
-│ └── authelia/ # (si présent)
-├── jellyfin-cache/ # Cache Jellyfin
-├── netdata-cache/ # Cache Netdata
-├── movies/ # Bibliothèque films
-├── series/ # Bibliothèque séries
-├── musicvideos/ # Clips musicaux
-├── lionel/ # Médias Lionel
-├── fiona/ # Médias Fiona
-└── backups/ # Archives
+~/lake/
+├── automation/ # Home Assistant, ESPHome, Signal, TGV-tracker
+│ ├── homeassistant/
+│ ├── esphome/
+│ ├── signal/
+│ └── tgv-tracker/
+├── infra/ # Caddy, Authelia
+│ ├── caddy/
+│ └── authelia/
+├── media/ # Jellyfin
+│ └── jellyfin/
+├── monitoring/ # Arcane, Dozzle, Netdata
+│ ├── arcane/
+│ ├── dozzle/
+│ └── netdata/
+├── p2p/ # Legacy (voir servarr)
+│ ├── transmission/
+│ └── wireguard/
+├── servarr/ # Stack média automatisée (VPN)
+│ ├── gluetun/
+│ ├── transmission/
+│ ├── prowlarr/
+│ ├── radarr/
+│ └── sonarr/
+└── tools/ # Gitea, Shlink, MkDocs, Glance, etc.
+ ├── gitea/
+ ├── shlink/
+ ├── mkdocs/
+ └── glance/
```
## Réseaux Docker
-```bash
-# Réseau principal pour tous les services
-talloires_net (172.18.0.0/16)
-
-# Services connectés :
-- caddy, authelia, gitea, jellyfin, homeassistant
-- mkdocs, shlink, shlink-web, arcane, dozzle
-- netdata, signal-api, transmission, wireguard
+```mermaid
+flowchart LR
+ subgraph lake_net[lake_net - Réseau principal]
+ CADDY[Caddy]
+ AUTH[Authelia]
+ JELLYFIN[Jellyfin]
+ GITEA[Gitea]
+ HA[Home Assistant]
+ MKDOCS[MkDocs]
+ GLUETUN[Gluetun]
+ end
+
+ subgraph gluetun_ns[Namespace Gluetun]
+ TRANS[Transmission]
+ PROWLARR[Prowlarr]
+ SONARR[Sonarr]
+ RADARR[Radarr]
+ end
+
+ CADDY --> AUTH
+ CADDY --> JELLYFIN
+ CADDY --> GITEA
+ CADDY --> HA
+ CADDY --> MKDOCS
+ CADDY --> GLUETUN
+ GLUETUN --> gluetun_ns
```
+| Réseau | CIDR | Usage |
+|--------|------|-------|
+| `lake_net` | 172.19.0.0/16 | Réseau principal, tous les services |
+| `gluetun namespace` | localhost | Services Servarr via VPN |
+
+## Services actifs
+
+| Service | Stack | Port | URL |
+|---------|-------|------|-----|
+| Caddy | infra | 80, 443 | - |
+| Authelia | infra | 9091 | auth.talloires.local |
+| Jellyfin | media | 8096 | jellyfin.talloires.local |
+| Home Assistant | automation | 8123 | homeassistant.talloires.local |
+| ESPHome | automation | 6052 | - |
+| Gitea | tools | 3000 | git.talloires.local |
+| MkDocs | tools | 8000 | docs.talloires.local |
+| Shlink | tools | 8080 | go.talloires.local |
+| Arcane | monitoring | 3552 | arcane.talloires.local |
+| Dozzle | monitoring | 8080 | dozzle.talloires.local |
+| Netdata | monitoring | 19999 | netdata.talloires.local |
+| Gluetun | servarr | 8000 | - |
+| Transmission | servarr | 9091 | transmission.talloires.tailfd281f.ts.net |
+| Prowlarr | servarr | 9696 | prowlarr.talloires.local |
+| Sonarr | servarr | 8989 | sonarr.talloires.local |
+| Radarr | servarr | 7878 | radarr.talloires.local |
+
## Adresses IP
-| Service | IP Locale | Tailscale |
-|---------|-----------|-----------|
-| Talloires | 10.171.171.7 | 10.171.171.1 |
-| Annecy | 10.171.171.50 | 10.171.171.50 |
+| Machine | IP LAN | IP Tailscale |
+|---------|--------|--------------|
+| Talloires | 10.171.171.7 | talloires.tailfd281f.ts.net |
+| Annecy | 10.171.171.50 | annecy.tailfd281f.ts.net |
+| Olympou (Mac) | 10.171.171.x | olympou.tailfd281f.ts.net |
+
+## Domaines
+
+| Domaine | Usage |
+|---------|-------|
+| `*.talloires.local` | Accès LAN |
+| `*.talloires.tailfd281f.ts.net` | Accès Tailscale |
+
+## Stockage média
+
+```
+/mnt/mediaserver/
+├── servarr/
+│ ├── torrents/ # Downloads Transmission
+│ └── media/
+│ ├── movies/ # Films (Radarr)
+│ └── tv/ # Séries (Sonarr)
+├── jellyfin/
+│ ├── movies/ # Bibliothèque legacy
+│ ├── series/ # Bibliothèque legacy
+│ ├── lionel/ # Médias Lionel
+│ └── fiona/ # Médias Fiona
+└── jellyfin-cache/ # Cache transcoding
+```
+
+## Dernière mise à jour
+
+- **2026-01-12** : Documentation de l'architecture VPN complète pour Servarr
diff --git a/docs/services/servarr.md b/docs/services/servarr.md
index 6440057..e421fbc 100644
--- a/docs/services/servarr.md
+++ b/docs/services/servarr.md
@@ -1,23 +1,24 @@
# Servarr Stack
-Stack complet et isolé pour la gestion automatisée des médias.
+Stack complet et isolé pour la gestion automatisée des médias, entièrement routé via VPN.
## Architecture
```mermaid
flowchart TB
subgraph Internet
- PROTON[ProtonVPN
WireGuard]
+ PROTON[ProtonVPN LU
WireGuard]
end
subgraph Gluetun[gluetun - VPN Container]
- TRANS[Transmission
:9091]
+ TRANS[Transmission
localhost:9091]
+ PROWLARR[Prowlarr
localhost:9696]
+ RADARR[Radarr
localhost:7878]
+ SONARR[Sonarr
localhost:8989]
end
- subgraph Servarr[servarr_internal network]
- PROWLARR[Prowlarr
:9696]
- RADARR[Radarr
:7878]
- SONARR[Sonarr
:8989]
+ subgraph Caddy[Reverse Proxy]
+ CADDY[Caddy + Authelia SSO]
end
subgraph Storage[/mnt/mediaserver/servarr]
@@ -25,8 +26,8 @@ flowchart TB
MEDIA[media/]
end
- PROTON --> Gluetun
- Gluetun --> TRANS
+ PROTON <--> Gluetun
+ CADDY -->|gluetun:*| Gluetun
TRANS --> TORRENTS
PROWLARR --> TRANS
RADARR --> TRANS
@@ -35,15 +36,25 @@ flowchart TB
SONARR --> MEDIA
```
+!!! success "Kill Switch Intégré"
+ Tous les services partagent le namespace réseau de gluetun via `network_mode: service:gluetun`.
+ Si le VPN tombe, **aucun service n'a accès à Internet**.
+
## Services
-| Service | Port | Fonction | URL |
-|---------|------|----------|-----|
-| **Gluetun** | - | VPN container (ProtonVPN) | - |
-| **Transmission** | 9091 | Client BitTorrent | [go/transmission](https://go.talloires.local/transmission) |
-| **Prowlarr** | 9696 | Gestionnaire d'indexeurs | [go/prowlarr](https://go.talloires.local/prowlarr) |
-| **Radarr** | 7878 | Gestion des films | [go/radarr](https://go.talloires.local/radarr) |
-| **Sonarr** | 8989 | Gestion des séries | [go/sonarr](https://go.talloires.local/sonarr) |
+| Service | Port interne | Fonction | URL |
+|---------|--------------|----------|-----|
+| **Gluetun** | 8000 (control) | VPN container (ProtonVPN LU) | - |
+| **Transmission** | 9091 | Client BitTorrent | [transmission.talloires.tailfd281f.ts.net](https://transmission.talloires.tailfd281f.ts.net) |
+| **Prowlarr** | 9696 | Gestionnaire d'indexeurs | [prowlarr.talloires.tailfd281f.ts.net](https://prowlarr.talloires.tailfd281f.ts.net) |
+| **Radarr** | 7878 | Gestion des films | [radarr.talloires.tailfd281f.ts.net](https://radarr.talloires.tailfd281f.ts.net) |
+| **Sonarr** | 8989 | Gestion des séries | [sonarr.talloires.tailfd281f.ts.net](https://sonarr.talloires.tailfd281f.ts.net) |
+
+!!! note "Accès LAN également disponible"
+ - `prowlarr.talloires.local`
+ - `sonarr.talloires.local`
+ - `radarr.talloires.local`
+ - `transmission.talloires.local` → **bloqué** (Tailscale uniquement)
## Structure des données
@@ -61,31 +72,96 @@ flowchart TB
Tous les services voient `/data/` qui pointe vers `/mnt/mediaserver/servarr/`.
Cela permet les **hardlinks** — pas de copie, déplacement instantané.
-## Configuration
+## Configuration réseau
-### Prowlarr → Apps
+### network_mode: service:gluetun
-Prowlarr doit être configuré pour pousser automatiquement les indexeurs vers Radarr/Sonarr :
+Tous les services utilisent `network_mode: "service:gluetun"`, ce qui signifie :
-1. Settings → Apps → Add
-2. Radarr : `http://radarr:7878`, API Key depuis Radarr Settings
-3. Sonarr : `http://sonarr:8989`, API Key depuis Sonarr Settings
+- Ils partagent le **même namespace réseau** que gluetun
+- Ils communiquent entre eux via **localhost**
+- Les ports sont exposés **uniquement par gluetun**
+- Pas d'accès direct au réseau Docker
-### Download Client (Transmission)
+```yaml
+# Exemple de configuration
+services:
+ gluetun:
+ ports:
+ - "9091:9091" # Transmission
+ - "9696:9696" # Prowlarr
+ - "7878:7878" # Radarr
+ - "8989:8989" # Sonarr
+ environment:
+ - FIREWALL_OUTBOUND_SUBNETS=192.168.0.0/16,100.64.0.0/10
+
+ prowlarr:
+ network_mode: "service:gluetun"
+ depends_on:
+ gluetun:
+ condition: service_healthy
+```
-Configuration identique pour Prowlarr, Radarr, Sonarr :
+### Configuration interne des apps
-- **Host** : `gluetun`
-- **Port** : `9091`
-- **Username** : voir `.env`
-- **Password** : voir `.env`
+| App | Setting | Valeur |
+|-----|---------|--------|
+| **Prowlarr** | Download Client → Transmission | `localhost:9091` |
+| **Prowlarr** | Apps → Sonarr | `localhost:8989` |
+| **Prowlarr** | Apps → Radarr | `localhost:7878` |
+| **Sonarr** | Download Client → Transmission | `localhost:9091` |
+| **Radarr** | Download Client → Transmission | `localhost:9091` |
-### Jellyfin
+!!! warning "Important"
+ Ne pas utiliser les noms de containers (`prowlarr`, `sonarr`, etc.) car ils ne sont pas résolvables dans ce mode réseau.
-Bibliothèques à ajouter :
+## VPN Configuration
-- Films : `/mnt/mediaserver/servarr/media/movies`
-- Séries : `/mnt/mediaserver/servarr/media/tv`
+### ProtonVPN WireGuard
+
+```bash
+# Vérifier l'IP VPN
+docker exec gluetun wget -qO- https://ipinfo.io/ip
+# Doit retourner une IP ProtonVPN Luxembourg (5.253.204.x)
+```
+
+| Paramètre | Valeur |
+|-----------|--------|
+| Provider | ProtonVPN |
+| Type | WireGuard |
+| Serveur | Luxembourg (LU#9) |
+| Peer Port | 51413 (Transmission) |
+
+### Firewall
+
+```yaml
+environment:
+ # Autorise accès depuis LAN et Tailscale
+ - FIREWALL_OUTBOUND_SUBNETS=192.168.0.0/16,100.64.0.0/10
+ # Port forwarding pour seeding
+ - FIREWALL_VPN_INPUT_PORTS=51413
+```
+
+## Caddy / Reverse Proxy
+
+Les services sont exposés via Caddy avec Authelia SSO :
+
+```caddyfile
+prowlarr.talloires.local, prowlarr.talloires.tailfd281f.ts.net {
+ @api path /api/*
+ handle @api {
+ reverse_proxy gluetun:9696
+ }
+ handle {
+ import authelia
+ reverse_proxy gluetun:9696
+ }
+ import internal_tls
+}
+```
+
+!!! info "API sans auth"
+ Les endpoints `/api/*` sont accessibles sans Authelia pour permettre la communication inter-apps.
## Vérifications
@@ -95,7 +171,16 @@ Bibliothèques à ajouter :
docker exec gluetun wget -qO- https://ipinfo.io
```
-Doit afficher une IP ProtonVPN (M247), pas ton IP réelle.
+Doit afficher une IP ProtonVPN (M247/Datacamp), pas ton IP réelle.
+
+### Connectivité interne
+
+```bash
+# Depuis gluetun, tester tous les services
+docker exec gluetun sh -c 'wget -qO- http://localhost:9696/ping' # Prowlarr
+docker exec gluetun sh -c 'wget -qO- http://localhost:8989/ping' # Sonarr
+docker exec gluetun sh -c 'wget -qO- http://localhost:7878/ping' # Radarr
+```
### Statut des containers
@@ -103,17 +188,11 @@ Doit afficher une IP ProtonVPN (M247), pas ton IP réelle.
cd ~/lake/servarr && docker compose ps
```
-### Logs
+### Health check gluetun
```bash
-# Gluetun (VPN)
-docker logs gluetun --tail 50
-
-# Transmission
-docker logs transmission --tail 50
-
-# Radarr
-docker logs radarr --tail 50
+docker inspect gluetun --format='{{.State.Health.Status}}'
+# Doit retourner: healthy
```
## Fichiers
@@ -122,8 +201,10 @@ docker logs radarr --tail 50
|---------|--------|
| Docker Compose | `~/lake/servarr/docker-compose.yml` |
| Environment | `~/lake/servarr/.env` |
+| Backup | `~/lake/servarr/docker-compose.yml.bak` |
| Données | `/mnt/mediaserver/servarr/` |
## Historique
+- **2026-01-12** : Migration complète — tous les services via VPN (network_mode: service:gluetun)
- **2026-01-08** : Déploiement initial avec Gluetun, Transmission, Prowlarr, Radarr, Sonarr
diff --git a/mkdocs.yml b/mkdocs.yml
index 06dcb95..eaa7f71 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -28,6 +28,7 @@ nav:
- Transmission: services/transmission.md
- Servarr: services/servarr.md
- Changelog:
+ - 2026-01-12: changelog/2026-01-12.md
- 2026-01-03: changelog/2026-01-03.md
- 2025-12-31: changelog/2025-12-31.md
- Vault: