Auto-sync Mon 12 Jan 20:05:01 CET 2026

This commit is contained in:
Lionel
2026-01-12 20:05:01 +01:00
parent 0ee9ecb8d4
commit 4e8cae74ba
4 changed files with 336 additions and 84 deletions

View File

@@ -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

View File

@@ -38,57 +38,131 @@
/dev/sda1 → /mnt/mediaserver # 4 TB /dev/sda1 → /mnt/mediaserver # 4 TB
# NFS Synology (backups) # NFS Synology (backups)
10.171.171.50:/volume1/Backups → /mnt/annecy annecy:/volume1/Backups → /mnt/annecy
``` ```
## Structure des fichiers ## Structure ~/lake/
``` ```
/home/lionel/ ~/lake/
── talloires-v2/ # Configurations Docker ── automation/ # Home Assistant, ESPHome, Signal, TGV-tracker
├── infra/ # Caddy, Authelia ├── homeassistant/
├── media/ # Jellyfin compose ├── esphome/
├── monitoring/ # Netdata, Dozzle ├── signal/
── tools/ # Shlink, Gitea compose ── tgv-tracker/
├── docker-mgmt/ # Arcane ├── infra/ # Caddy, Authelia
├── automation/ # Home Assistant ├── caddy/
── transmission/ # Transmission + WireGuard ── authelia/
├── mkdocs/ # Cette documentation ├── media/ # Jellyfin
── jellyfin/ # Config Jellyfin (3.6GB) ── jellyfin/
├── homeassistant/ # Config HA (dupliqué sur SSD) ├── monitoring/ # Arcane, Dozzle, Netdata
── arcane/ # Config Arcane ── arcane/
│ ├── dozzle/
/mnt/mediaserver/ │ └── netdata/
├── talloires/ # Données services ├── p2p/ # Legacy (voir servarr)
│ ├── caddy/ # Caddyfile + certs │ ├── transmission/
── gitea/ # Repos git + DB ── wireguard/
│ ├── homeassistant/ # Config active HA ├── servarr/ # Stack média automatisée (VPN)
── authelia/ # (si présent) ── gluetun/
├── jellyfin-cache/ # Cache Jellyfin │ ├── transmission/
├── netdata-cache/ # Cache Netdata │ ├── prowlarr/
├── movies/ # Bibliothèque films │ ├── radarr/
├── series/ # Bibliothèque séries │ └── sonarr/
── musicvideos/ # Clips musicaux ── tools/ # Gitea, Shlink, MkDocs, Glance, etc.
├── lionel/ # Médias Lionel ├── gitea/
├── fiona/ # Médias Fiona ├── shlink/
└── backups/ # Archives ├── mkdocs/
└── glance/
``` ```
## Réseaux Docker ## Réseaux Docker
```bash ```mermaid
# Réseau principal pour tous les services flowchart LR
talloires_net (172.18.0.0/16) subgraph lake_net[lake_net - Réseau principal]
CADDY[Caddy]
# Services connectés : AUTH[Authelia]
- caddy, authelia, gitea, jellyfin, homeassistant JELLYFIN[Jellyfin]
- mkdocs, shlink, shlink-web, arcane, dozzle GITEA[Gitea]
- netdata, signal-api, transmission, wireguard 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 ## Adresses IP
| Service | IP Locale | Tailscale | | Machine | IP LAN | IP Tailscale |
|---------|-----------|-----------| |---------|--------|--------------|
| Talloires | 10.171.171.7 | 10.171.171.1 | | Talloires | 10.171.171.7 | talloires.tailfd281f.ts.net |
| Annecy | 10.171.171.50 | 10.171.171.50 | | 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

View File

@@ -1,23 +1,24 @@
# Servarr Stack # 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 ## Architecture
```mermaid ```mermaid
flowchart TB flowchart TB
subgraph Internet subgraph Internet
PROTON[ProtonVPN<br/>WireGuard] PROTON[ProtonVPN LU<br/>WireGuard]
end end
subgraph Gluetun[gluetun - VPN Container] subgraph Gluetun[gluetun - VPN Container]
TRANS[Transmission<br/>:9091] TRANS[Transmission<br/>localhost:9091]
PROWLARR[Prowlarr<br/>localhost:9696]
RADARR[Radarr<br/>localhost:7878]
SONARR[Sonarr<br/>localhost:8989]
end end
subgraph Servarr[servarr_internal network] subgraph Caddy[Reverse Proxy]
PROWLARR[Prowlarr<br/>:9696] CADDY[Caddy + Authelia SSO]
RADARR[Radarr<br/>:7878]
SONARR[Sonarr<br/>:8989]
end end
subgraph Storage[/mnt/mediaserver/servarr] subgraph Storage[/mnt/mediaserver/servarr]
@@ -25,8 +26,8 @@ flowchart TB
MEDIA[media/] MEDIA[media/]
end end
PROTON --> Gluetun PROTON <--> Gluetun
Gluetun --> TRANS CADDY -->|gluetun:*| Gluetun
TRANS --> TORRENTS TRANS --> TORRENTS
PROWLARR --> TRANS PROWLARR --> TRANS
RADARR --> TRANS RADARR --> TRANS
@@ -35,15 +36,25 @@ flowchart TB
SONARR --> MEDIA 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 ## Services
| Service | Port | Fonction | URL | | Service | Port interne | Fonction | URL |
|---------|------|----------|-----| |---------|--------------|----------|-----|
| **Gluetun** | - | VPN container (ProtonVPN) | - | | **Gluetun** | 8000 (control) | VPN container (ProtonVPN LU) | - |
| **Transmission** | 9091 | Client BitTorrent | [go/transmission](https://go.talloires.local/transmission) | | **Transmission** | 9091 | Client BitTorrent | [transmission.talloires.tailfd281f.ts.net](https://transmission.talloires.tailfd281f.ts.net) |
| **Prowlarr** | 9696 | Gestionnaire d'indexeurs | [go/prowlarr](https://go.talloires.local/prowlarr) | | **Prowlarr** | 9696 | Gestionnaire d'indexeurs | [prowlarr.talloires.tailfd281f.ts.net](https://prowlarr.talloires.tailfd281f.ts.net) |
| **Radarr** | 7878 | Gestion des films | [go/radarr](https://go.talloires.local/radarr) | | **Radarr** | 7878 | Gestion des films | [radarr.talloires.tailfd281f.ts.net](https://radarr.talloires.tailfd281f.ts.net) |
| **Sonarr** | 8989 | Gestion des séries | [go/sonarr](https://go.talloires.local/sonarr) | | **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 ## Structure des données
@@ -61,31 +72,96 @@ flowchart TB
Tous les services voient `/data/` qui pointe vers `/mnt/mediaserver/servarr/`. Tous les services voient `/data/` qui pointe vers `/mnt/mediaserver/servarr/`.
Cela permet les **hardlinks** — pas de copie, déplacement instantané. 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 - Ils partagent le **même namespace réseau** que gluetun
2. Radarr : `http://radarr:7878`, API Key depuis Radarr Settings - Ils communiquent entre eux via **localhost**
3. Sonarr : `http://sonarr:8989`, API Key depuis Sonarr Settings - 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` | App | Setting | Valeur |
- **Port** : `9091` |-----|---------|--------|
- **Username** : voir `.env` | **Prowlarr** | Download Client → Transmission | `localhost:9091` |
- **Password** : voir `.env` | **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` ### ProtonVPN WireGuard
- Séries : `/mnt/mediaserver/servarr/media/tv`
```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 ## Vérifications
@@ -95,7 +171,16 @@ Bibliothèques à ajouter :
docker exec gluetun wget -qO- https://ipinfo.io 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 ### Statut des containers
@@ -103,17 +188,11 @@ Doit afficher une IP ProtonVPN (M247), pas ton IP réelle.
cd ~/lake/servarr && docker compose ps cd ~/lake/servarr && docker compose ps
``` ```
### Logs ### Health check gluetun
```bash ```bash
# Gluetun (VPN) docker inspect gluetun --format='{{.State.Health.Status}}'
docker logs gluetun --tail 50 # Doit retourner: healthy
# Transmission
docker logs transmission --tail 50
# Radarr
docker logs radarr --tail 50
``` ```
## Fichiers ## Fichiers
@@ -122,8 +201,10 @@ docker logs radarr --tail 50
|---------|--------| |---------|--------|
| Docker Compose | `~/lake/servarr/docker-compose.yml` | | Docker Compose | `~/lake/servarr/docker-compose.yml` |
| Environment | `~/lake/servarr/.env` | | Environment | `~/lake/servarr/.env` |
| Backup | `~/lake/servarr/docker-compose.yml.bak` |
| Données | `/mnt/mediaserver/servarr/` | | Données | `/mnt/mediaserver/servarr/` |
## Historique ## 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 - **2026-01-08** : Déploiement initial avec Gluetun, Transmission, Prowlarr, Radarr, Sonarr

View File

@@ -28,6 +28,7 @@ nav:
- Transmission: services/transmission.md - Transmission: services/transmission.md
- Servarr: services/servarr.md - Servarr: services/servarr.md
- Changelog: - Changelog:
- 2026-01-12: changelog/2026-01-12.md
- 2026-01-03: changelog/2026-01-03.md - 2026-01-03: changelog/2026-01-03.md
- 2025-12-31: changelog/2025-12-31.md - 2025-12-31: changelog/2025-12-31.md
- Vault: - Vault: