Welcome to my home server setup, everything runs on a old Debian machine via Docker for a self-hosted setup. It runs the full Servarr suite plus media management and VPN tunneling.
| Service | Port | Description |
|---|---|---|
| Gluetun | — | WireGuard VPN gateway |
| qBittorrent | 8181 | Torrent client (shares Gluetun network) |
| Prowlarr | 9696 | Indexer manager for Sonarr/Radarr |
| Sonarr | 8989 | TV show management |
| Radarr | 7878 | Movie management |
| Lidarr | 8686 | Music management |
| Bazarr | 6767 | Subtitle management |
| ytdl-sub | — | YouTube channel/playlist downloader |
| Seerr | 5055 | Request/manage media (Plex, Emby, Jellyfin) |
| Jellyfin | 8096 | Media server |
| Kavita | 5000 | Manga / book / comic reader |
| Portainer | 9443 | Docker management UI |
| Cloudflared | — | Cloudflare Tunnel for reverse proxy |
| deunhealth | — | Docker health-check monitor (restarts unhealthy containers) |
All services share the servarrnetwork external Docker network (172.39.0.0/24). The VPN gateway (Gluetun) acts as the gateway for qBittorrent and Prowlarr via network_mode: service:gluetun. The remaining services connect through the shared servarrnetwork with static IPs for reliable DNS/connectivity.
Static IP assignments:
| Service | IP |
|---|---|
| Gluetun | 172.39.0.2 |
| Sonarr | 172.39.0.3 |
| Radarr | 172.39.0.4 |
| Lidarr | 172.39.0.5 |
| Bazarr | 172.39.0.6 |
| ytdl-sub | 172.39.0.8 |
| Seerr | 172.39.0.9 |
| Jellyfin | 172.39.0.10 |
| Portainer | 172.39.0.12 |
| Kavita | 172.39.0.11 |
| Cloudflared | 172.39.0.14 |
Servarr/
├── README.md
├── .gitignore
├── cloudflared/
│ ├── compose.yml
│ ├── .env
│ └── .env.example
├── kavita/
│ └── compose.yml
├── portainer/
│ └── compose.yml
└── servarr/
├── compose.yml
├── .env
└── .env.example
- Docker and Docker Compose installed
- An external network
servarrnetworkcreated:docker network create servarrnetwork --subnet=172.39.0.0/24
- A WireGuard VPN provider (currently configured for Windscribe)
- A Cloudflare account with a tunnel configured (for
cloudflared)
- Copy
.env.exampleto.envin each directory and fill in your values:- VPN credentials (WireGuard keys, region, forwarded port)
PUID/PGIDfor file permissionsTZfor timezone
- Adjust the Gluetun VPN config in
servarr/.envif using a different provider. - Start the services:
# From the top-level directory docker compose -f servarr/compose.yml up -d docker compose -f cloudflared/compose.yml up -d docker compose -f portainer/compose.yml up -d docker compose -f kavita/compose.yml up -d
- NZBGet is included but commented out in
servarr/compose.yml. Uncomment to enable. - deunhealth monitors all containers and restarts any that become unhealthy.
- Jellyfin media directories (
/movies,/shows) are mounted read-only from the host at/home/sadsuite/data. - Seerr accesses media at
/home/sadsuite/dataand has its own config at./seerr.