Note: In its current state, this guide was largely written by Claude Code but drawing from a mountain of messy notes, config files and outputs from my own server installation. I am in the process of manual review of each section - I have read everything through once and broadly it is correct, but I will update this note once full verification has been completed.
A comprehensive, beginner-friendly guide for building a home media server with automated content management, secure remote access, and VPN-protected downloads.
This guide walks you through setting up a complete home media server with:
- Plex Media Server - Stream your media library to any device
- Sonarr & Radarr - Automatically download and organize TV shows and movies
- Prowlarr - Centralized indexer management
- qBittorrent + NordVPN - VPN-protected torrent downloads
- Caddy - Secure HTTPS reverse proxy with automatic SSL certificates
- Jellyseerr - Let friends and family request content (optional)
- Bazarr - Automatic subtitle downloads (optional)
flowchart TB
subgraph Internet
WAN[Internet]
end
subgraph Router
R[Router<br/>Port Forward: 32400<br/>Optional: 80, 443]
end
subgraph Server["Your Server"]
subgraph Optional["Optional: Domain Access"]
Caddy[Caddy<br/>Reverse Proxy + Auto-SSL]
end
subgraph Core["Core Services"]
Plex[Plex<br/>:32400]
Jellyseerr[Jellyseerr<br/>:5055]
Sonarr[Sonarr<br/>:8989]
Radarr[Radarr<br/>:7878]
Prowlarr[Prowlarr<br/>:9696]
end
subgraph Download["Download Stack"]
qBit[qBittorrent<br/>:8080]
Nordlynx[Nordlynx<br/>VPN Tunnel]
end
end
subgraph VPN["VPN Endpoint"]
VPNEP[NordVPN Server]
end
WAN --> R
R -->|":32400"| Plex
R -->|":443 optional"| Caddy
Caddy --> Jellyseerr
Caddy --> Sonarr
Caddy --> Radarr
Sonarr --> qBit
Radarr --> qBit
Prowlarr --> Sonarr
Prowlarr --> Radarr
qBit --> Nordlynx
Nordlynx --> VPNEP
flowchart LR
subgraph SSD["SSD (Fast)"]
DL["~/downloads/<br/>complete/<br/>incomplete/"]
CFG["~/mediaserver/<br/>config/"]
end
subgraph HDD["HDD (Large)"]
MEDIA["/data/media/<br/>movies/<br/>tv/"]
end
DL -->|"Import & organize"| MEDIA
Before starting, you'll need:
- Hardware: A dedicated computer (Intel CPU recommended for hardware transcoding)
- The latest Ubuntu Server LTS: Fresh installation
- NordVPN subscription: For VPN-protected downloads
- Basic Linux knowledge: Comfortable with terminal commands
Optional: A domain name if you want pretty URLs like https://media.example.com instead of accessing services by IP address. See Part 3 for details.
See Hardware and Planning for detailed requirements.
| # | Chapter | Description |
|---|---|---|
| 0 | Introduction | What you're building and skill requirements |
| 1 | Hardware and Planning | Hardware requirements and planning checklist |
| 2 | Install Ubuntu | Ubuntu Server LTS installation |
| 3 | Install Docker | Docker Engine from official repository |
| 4 | SSH Security | Secure remote access with fail2ban |
| 5 | Storage Setup | Media and download directory structure |
| # | Chapter | Description |
|---|---|---|
| 6 | Install Plex | Plex Media Server with hardware transcoding |
| 7 | Docker Compose Stack | Deploy all containerized services |
| 8 | Configure qBittorrent | Torrent client setup behind VPN |
| 9 | Configure Prowlarr | Indexer management |
| 10 | Configure Sonarr | TV show automation |
| 11 | Configure Radarr | Movie automation |
| 12 | Configure Bazarr | Automatic subtitles (optional) |
| 13 | Configure Jellyseerr | Request management (optional) |
Note: Chapters 14-17 are optional. Plex has built-in remote access that works without a domain name or reverse proxy. These chapters are for users who want pretty URLs (
https://media.example.com) instead of IP addresses, or who want to expose other services (Jellyseerr, Sonarr, Radarr) externally with HTTPS.
| # | Chapter | Description |
|---|---|---|
| 14 | Domain and DNS | Purchase domain and configure DNS (optional) |
| 15 | Router Configuration | Port forwarding and static IP |
| 16 | Caddy Reverse Proxy | HTTPS with automatic SSL (optional) |
| 17 | DDNS Updater | Keep DNS updated with dynamic IP (optional) |
| 18 | Plex Remote Access | Enable streaming from anywhere |
| # | Chapter | Description |
|---|---|---|
| 19 | VPN Kill-Switch | Host-level VPN enforcement (optional) |
| 20 | Verification Checklist | Complete system verification |
| 21 | Maintenance | Updates, backups, and troubleshooting |
| Appendix | Description |
|---|---|
| A: NordVPN WireGuard Key | How to get your WireGuard private key |
| B: Indexer Guide | Understanding indexers and trackers |
| C: Troubleshooting | Common problems and solutions |
| D: Service Ports | Port reference table |
| E: File Paths | Directory structure reference |
| F: Plex Pass Features | Premium subscription features |
| G: Sharing with Others | Considerations for sharing your server |
| Service | URL | Purpose |
|---|---|---|
| Plex | http://server-ip:32400/web |
Media streaming |
| Sonarr | http://server-ip:8989 |
TV automation |
| Radarr | http://server-ip:7878 |
Movie automation |
| Prowlarr | http://server-ip:9696 |
Indexer management |
| Bazarr | http://server-ip:6767 |
Subtitles |
| Jellyseerr | http://server-ip:5055 |
Requests |
| qBittorrent | http://localhost:8080 |
Downloads (localhost only) |
| Path | Purpose |
|---|---|
/data/media/movies |
Movie library |
/data/media/tv |
TV show library |
~/downloads/complete |
Finished downloads |
~/downloads/incomplete |
In-progress downloads |
~/mediaserver/config |
Service configurations |
Ready-to-use configuration templates are in the configs/ directory:
docker-compose.yml- Full service stackexample.env- Environment variables templateCaddyfile.example- Reverse proxy configurationddns-config.json.example- DDNS updater configuration
- Check the Troubleshooting Appendix for common issues
- Each service has extensive documentation on their official websites
- The r/selfhosted community is helpful for general questions
The documentation/ directory contains the original rebuild documentation for restoring from backups. The PLAN.md file documents the architectural decisions made during the original server rebuild.
Ready to start? Begin with Chapter 0: Introduction