//nbkelley /homelab

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                  jellyseerr

VPN 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 0

Note: 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
└── youtube

Rather than storing the password in /etc/fstab:

sudo nano /root/.syno_credentials
# username=Iluvatar
# password=<password>
sudo chmod 600 /root/.syno_credentials

Then 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 0

The nofail,x-systemd.automount options prevent future NAS outages from blocking boot or container restarts.

Known Issues#

  • SMB mount fragility: The /data mount 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 indexer and System.Net.Http.HttpRequestException: Resource temporarily unavailable.
  • Diagnosis: VPN connectivity confirmed working via curl through 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=true to 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.

Sources#

  • ingested/chats/057-Troubleshooting Docker Service on Ubuntu Server.md

  • Live system inspection on servarr VM (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