Auto-sync Mon 12 Jan 20:05:01 CET 2026
This commit is contained in:
96
docs/changelog/2026-01-12.md
Normal file
96
docs/changelog/2026-01-12.md
Normal 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
|
||||
@@ -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
|
||||
~/lake/
|
||||
├── automation/ # Home Assistant, ESPHome, Signal, TGV-tracker
|
||||
│ ├── homeassistant/
|
||||
│ ├── esphome/
|
||||
│ ├── signal/
|
||||
│ └── tgv-tracker/
|
||||
├── 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
|
||||
│ ├── 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)
|
||||
```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
|
||||
|
||||
# Services connectés :
|
||||
- caddy, authelia, gitea, jellyfin, homeassistant
|
||||
- mkdocs, shlink, shlink-web, arcane, dozzle
|
||||
- netdata, signal-api, transmission, wireguard
|
||||
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
|
||||
|
||||
@@ -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<br/>WireGuard]
|
||||
PROTON[ProtonVPN LU<br/>WireGuard]
|
||||
end
|
||||
|
||||
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
|
||||
|
||||
subgraph Servarr[servarr_internal network]
|
||||
PROWLARR[Prowlarr<br/>:9696]
|
||||
RADARR[Radarr<br/>:7878]
|
||||
SONARR[Sonarr<br/>: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
|
||||
|
||||
Configuration identique pour Prowlarr, Radarr, Sonarr :
|
||||
prowlarr:
|
||||
network_mode: "service:gluetun"
|
||||
depends_on:
|
||||
gluetun:
|
||||
condition: service_healthy
|
||||
```
|
||||
|
||||
- **Host** : `gluetun`
|
||||
- **Port** : `9091`
|
||||
- **Username** : voir `.env`
|
||||
- **Password** : voir `.env`
|
||||
### Configuration interne des apps
|
||||
|
||||
### Jellyfin
|
||||
| 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` |
|
||||
|
||||
Bibliothèques à ajouter :
|
||||
!!! warning "Important"
|
||||
Ne pas utiliser les noms de containers (`prowlarr`, `sonarr`, etc.) car ils ne sont pas résolvables dans ce mode réseau.
|
||||
|
||||
- Films : `/mnt/mediaserver/servarr/media/movies`
|
||||
- Séries : `/mnt/mediaserver/servarr/media/tv`
|
||||
## VPN Configuration
|
||||
|
||||
### 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
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user