From 4e8cae74ba541157cca2a14f16af95a337c32cc8 Mon Sep 17 00:00:00 2001 From: Lionel Date: Mon, 12 Jan 2026 20:05:01 +0100 Subject: [PATCH] Auto-sync Mon 12 Jan 20:05:01 CET 2026 --- docs/changelog/2026-01-12.md | 96 ++++++++++++++++++++ docs/infra/overview.md | 158 ++++++++++++++++++++++++--------- docs/services/servarr.md | 165 ++++++++++++++++++++++++++--------- mkdocs.yml | 1 + 4 files changed, 336 insertions(+), 84 deletions(-) create mode 100644 docs/changelog/2026-01-12.md 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: