Files
202601docs/docs/services/servarr.md
2026-01-12 20:05:01 +01:00

211 lines
5.8 KiB
Markdown

# Servarr Stack
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 LU<br/>WireGuard]
end
subgraph Gluetun[gluetun - VPN Container]
TRANS[Transmission<br/>localhost:9091]
PROWLARR[Prowlarr<br/>localhost:9696]
RADARR[Radarr<br/>localhost:7878]
SONARR[Sonarr<br/>localhost:8989]
end
subgraph Caddy[Reverse Proxy]
CADDY[Caddy + Authelia SSO]
end
subgraph Storage[/mnt/mediaserver/servarr]
TORRENTS[torrents/]
MEDIA[media/]
end
PROTON <--> Gluetun
CADDY -->|gluetun:*| Gluetun
TRANS --> TORRENTS
PROWLARR --> TRANS
RADARR --> TRANS
SONARR --> TRANS
RADARR --> 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
| 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
```
/mnt/mediaserver/servarr/
├── torrents/
│ ├── incomplete/ # Downloads en cours
│ └── complete/ # Downloads terminés
└── media/
├── movies/ # Films (Radarr → Jellyfin)
└── tv/ # Séries (Sonarr → Jellyfin)
```
!!! tip "Hardlinks"
Tous les services voient `/data/` qui pointe vers `/mnt/mediaserver/servarr/`.
Cela permet les **hardlinks** — pas de copie, déplacement instantané.
## Configuration réseau
### network_mode: service:gluetun
Tous les services utilisent `network_mode: "service:gluetun"`, ce qui signifie :
- 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
```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 interne des apps
| 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` |
!!! warning "Important"
Ne pas utiliser les noms de containers (`prowlarr`, `sonarr`, etc.) car ils ne sont pas résolvables dans ce mode réseau.
## 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
### VPN actif
```bash
docker exec gluetun wget -qO- https://ipinfo.io
```
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
```bash
cd ~/lake/servarr && docker compose ps
```
### Health check gluetun
```bash
docker inspect gluetun --format='{{.State.Health.Status}}'
# Doit retourner: healthy
```
## Fichiers
| Fichier | Chemin |
|---------|--------|
| 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