Servarr - Media Automation Stack#
Overview#
Servarr is a full VM at 192.168.1.112 (hostname: servarr) running a Docker Compose media automation stack. All services depend on a NAS mount at /data for media storage. Download clients (qbittorrent, nzbget) and indexer (prowlarr) route through a Gluetun VPN container via network_mode: service:gluetun.
Note: This VM is distinct from Varda (192.168.1.131), which is a separate web server hosting ilmare.nbkelley.com.
VM Specs#
| Detail | Value |
|---|---|
| Hostname | servarr |
| IP | 192.168.1.112 |
| OS | Ubuntu 24.04.4 LTS (Noble) |
| Kernel | 6.8.0-107-generic |
| CPU | QEMU Virtual CPU, 4 vCPUs |
| RAM | 7.8 GB |
| Disk | 63 GB root (/dev/sda2 ext4, 38% used) |
| Hypervisor | Proxmox (Minas Tirith) |
Container Inventory#
Servarr Stack (/docker/servarr/compose.yaml)#
Network: servarrnetwork (172.39.0.0/24)
| Container | Image | IP | Port | Network Mode |
|---|---|---|---|---|
| gluetun | qmcgaw/gluetun |
172.39.0.2 | 6789, 6881, 8080, 9696, +VPN port | bridge |
| sonarr | lscr.io/linuxserver/sonarr |
172.39.0.3 | 8989 | bridge |
| radarr | lscr.io/linuxserver/radarr |
172.39.0.4 | 7878 | bridge |
| lidarr | lscr.io/linuxserver/lidarr |
172.39.0.5 | 8686 | bridge |
| bazarr | lscr.io/linuxserver/bazarr |
172.39.0.6 | 6767 | bridge |
| ytdl-sub | ghcr.io/jmbannon/ytdl-sub-gui |
172.39.0.8 | 8443 | bridge |
| qbittorrent | lscr.io/linuxserver/qbittorrent |
— (shared) | — | service:gluetun |
| nzbget | lscr.io/linuxserver/nzbget |
— (shared) | — | service:gluetun |
| prowlarr | lscr.io/linuxserver/prowlarr |
— (shared) | — | service:gluetun |
| deunhealth | qmcgaw/deunhealth |
none | — | none |
Jellyfin Stack (/docker/jellyfin/compose.yaml)#
Network: jellyfin_default (172.18.0.0/16)
| Container | Image | Port |
|---|---|---|
| jellyfin | lscr.io/linuxserver/jellyfin |
8096, 7359/udp, 1900/udp |
| jellyseerr | fallenbagel/jellyseerr |
5055 |
Jellyseerr reaches the *arr services via the host IP (192.168.1.112) and exposed ports.
Full compose files: Servarr Docker Compose Reference, Jellyfin Docker Compose Reference.
Architecture#
┌─────────────────────────┐
│ gluetun (VPN) │
│ 172.39.0.2 │
│ ┌─────────────────┐ │
│ │ qbittorrent │ │
│ │ nzbget │ │
│ │ prowlarr │ │
│ └─────────────────┘ │
│ (network_mode: svc) │
└──────┬──────────────────┘
│
servarrnetwork (172.39.0.0/24)
│
┌──────────────────┼──────────────────┐
│ │ │
sonarr (.3) radarr (.4) lidarr (.5)
bazarr (.6) ytdl-sub (.8)
jellyfin_default (172.18.0.0/16)
│
┌────────────┴────────────┐
│ │
jellyfin jellyseerrVPN provider: AirVPN (WireGuard). TZ: America/New_York (servarr stack), America/Los_Angeles (jellyfin stack).
NAS Storage#
All containers bind-mount /data for media access. This is a CIFS mount from the Synology NAS at 192.168.1.137.
fstab Entry#
//192.168.1.137/Documents/data /data cifs uid=1000,gid=1000,username=Iluvatar,password=<redacted>,iocharset=utf8 0 0Note: The password is currently stored in /etc/fstab. A credentials file approach (see below) would be more secure.
NAS Directory Structure#
/data/
├── books
├── downloads
│ ├── qbittorrent
│ │ ├── completed
│ │ ├── incomplete
│ │ └── torrents
│ └── nzbget
│ ├── completed
│ ├── intermediate
│ ├── nzb
│ ├── queue
│ └── tmp
├── movies
├── music
├── shows
└── youtubeRecommended: Credentials File (More Secure)#
Rather than storing the password in /etc/fstab:
sudo nano /root/.syno_credentials
# username=Iluvatar
# password=<password>
sudo chmod 600 /root/.syno_credentialsThen update /etc/fstab:
//192.168.1.137/Documents/data /data cifs credentials=/root/.syno_credentials,uid=1000,gid=1000,file_mode=0770,dir_mode=0770,vers=3.0,nofail,x-systemd.automount 0 0The nofail,x-systemd.automount options prevent future NAS outages from blocking boot or container restarts.
Known Issues#
- SMB mount fragility: The
/datamount can go stale if the NAS is unavailable. When this happens, containers that depend on/data(all of them) may fail to start or consume CPU in retry loops. - Jellyfin CPU burn: Jellyfin will retry failed NAS reads indefinitely, consuming high CPU. Stop Jellyfin during NAS outages.
- qbittorrent exit code 128: Can occur when gluetun VPN is unhealthy — the container receives a signal during dependency restart.
Indexer Troubleshooting#
BitSearch Connectivity Issue#
- Symptom: Prowlarr indexers failing with
Cardigann: Unable to connect to indexerandSystem.Net.Http.HttpRequestException: Resource temporarily unavailable. - Diagnosis: VPN connectivity confirmed working via
curlthrough Gluetun container, but Prowlarr (.NET environment) fails to connect. Issue isolated to Prowlarr’s DNS/SSL/IPv6 handling. - Attempted Fix: Added
DOTNET_SYSTEM_NET_DISABLEIPV6=trueto Prowlarr environment variables. Result: No change. - Next Steps: Test Prowlarr in bridge mode (outside VPN) to isolate whether the issue is VPN-specific or a Prowlarr configuration error.
Related Pages#
- Servarr Docker Compose Reference — full compose file
- Jellyfin Docker Compose Reference — jellyfin + jellyseerr compose
- Gluetun VPN Service
- Servarr Stack - Gluetun VPN Troubleshooting — historical troubleshooting session
- Proxmox Storage Management
- Varda Server (Ubuntu) — separate web server VM
Sources#
-
ingested/chats/057-Troubleshooting Docker Service on Ubuntu Server.md -
Live system inspection on
servarrVM (2026-05-01) -
/docker/servarr/compose.yaml,/docker/jellyfin/compose.yaml -
ingested/chats/097-Ubuntu Server Folder Display Issue Troubleshooting.md -
ingested/chats/2026-04-29-servarr-diagnosis.md