Custom provider hardcodes 10.2.0.2/32 but ProtonVPN assigns a different IP per session via their API. WireGuard handshake succeeds but ProtonVPN doesn't route traffic for the wrong IP. Native protonvpn provider fetches the correct IP assignment automatically and enables port forwarding.
Nook Media Stack — Operations Guide
What's Running
| Service | Purpose | Internal URL | Public URL |
|---|---|---|---|
| Plex | Streams media to family | plex.media.svc:32400 |
https://plex.nook.family |
| Overseerr | Family request portal | overseerr.media.svc:5055 |
https://watch.nook.family |
| Radarr | Movie automation | radarr.media.svc:7878 |
port-forward only |
| Sonarr | TV/anime automation | sonarr.media.svc:8989 |
port-forward only |
| Prowlarr | Indexer aggregator | prowlarr.media.svc:9696 |
port-forward only |
| qBittorrent | Torrent client (via ProtonVPN) | qbittorrent.media.svc:8080 |
port-forward only |
| Bazarr | Subtitle downloader | bazarr.media.svc:6767 |
port-forward only |
| FlareSolverr | Cloudflare bypass proxy | flaresolverr.media.svc:8191 |
internal only |
Credentials
All admin passwords: jfqb56as@@Fox
| Service | Username | Notes |
|---|---|---|
| qBittorrent | admin |
Web UI admin |
| Radarr | API key only | See below |
| Sonarr | API key only | See below |
| Prowlarr | API key only | See below |
API Keys (stored in pod configs, retrieve with commands below):
# Radarr
KUBECONFIG=~/.kube/legion-config kubectl exec -n media deployment/radarr -- \
cat /config/config.xml | grep ApiKey
# Sonarr
KUBECONFIG=~/.kube/legion-config kubectl exec -n media deployment/sonarr -- \
cat /config/config.xml | grep ApiKey
# Prowlarr
KUBECONFIG=~/.kube/legion-config kubectl exec -n media deployment/prowlarr -- \
cat /config/config.xml | grep ApiKey
Accessing Admin UIs
None of the backend services are exposed publicly. Use kubectl port-forward:
export KUBECONFIG=~/.kube/legion-config
# Radarr
kubectl port-forward -n media svc/radarr 7878:7878
# → http://localhost:7878
# Sonarr
kubectl port-forward -n media svc/sonarr 8989:8989
# → http://localhost:8989
# Prowlarr
kubectl port-forward -n media svc/prowlarr 9696:9696
# → http://localhost:9696
# qBittorrent
kubectl port-forward -n media svc/qbittorrent 8080:8080
# → http://localhost:8080
# Bazarr
kubectl port-forward -n media svc/bazarr 6767:6767
# → http://localhost:6767
Storage Layout
All media lives at /media on Legion:
/media/
├── movies/ ← Radarr deposits here → Plex "Movies" library
├── tv/
│ ├── shows/ ← Sonarr (TV) → Plex "TV Shows" library
│ └── anime/ ← Sonarr (anime) → Plex "Anime" library
└── downloads/
├── complete/ ← qBittorrent finished downloads (Radarr/Sonarr pick up from here)
└── incomplete/ ← qBittorrent in-progress
Family Accounts
Overseerr (watch.nook.family)
| Name | Role | Request Limits | |
|---|---|---|---|
| Will | andersonwilliam85@gmail.com | Admin | Unlimited |
| Fox | andersonfox07@gmail.com | User | Auto-approved, unlimited |
| Ben | andersonbenjamin2011@gmail.com | User | 5 movies/week, 3 shows/week, needs approval |
| Chloe | celizabeth0423@gmail.com | User | 3 movies/week, 2 shows/week, needs approval |
All family members sign in via Google OAuth (Cloudflare Access intercepts before the login page).
Plex (plex.nook.family)
Set up Plex Home managed users for the kids with content rating limits:
- Go to plex.tv → Settings → Managed Users
- Create profiles for Ben and Chloe with rating caps (PG-13 for Ben, PG for Chloe)
- Enable PIN on your profile
How Content Gets Added
Automatic (new releases)
Radarr monitors for new theatrical releases. To add a movie to the watchlist:
Radarr UI → Add Movie → search → set profile to HD-720p → Add
On Demand (family requests)
- Family member opens https://watch.nook.family
- Searches for movie/show → clicks Request
- Ben and Chloe's requests land in your Overseerr approval queue
- Fox's requests auto-approve
- Download starts within minutes of approval
Checking Download Status
# See active torrents
kubectl port-forward -n media svc/qbittorrent 8080:8080
# → http://localhost:8080
# Check what Radarr is waiting on
kubectl port-forward -n media svc/radarr 7878:7878
# → http://localhost:7878/activity/queue
Indexers (Prowlarr)
| Indexer | Type | Good For |
|---|---|---|
| YTS | Movies | All movies, excellent quality |
| Nyaa.si | Anime | All anime, essential |
| FlareSolverr | Proxy | Bypasses Cloudflare on other indexers |
To add more indexers: Prowlarr UI → Indexers → Add
VPN
All torrent traffic routes through ProtonVPN WireGuard (US-TX#253) via the gluetun sidecar in the qBittorrent pod. The VPN connection is automatic — if gluetun loses the tunnel, qBittorrent loses internet access entirely (kill switch by design).
To check VPN status:
KUBECONFIG=~/.kube/legion-config kubectl logs -n media deployment/qbittorrent -c gluetun | tail -20
To rotate to a different ProtonVPN server:
- Download a new WireGuard config from account.proton.me
vault kv patch secret/protonvpn private_key=<new_key> endpoint=<new_endpoint> peer_public_key=<new_peer_key>kubectl annotate externalsecret media-secrets -n media force-sync=$(date +%s) --overwritekubectl rollout restart deployment/qbittorrent -n media
Subtitles (Bazarr)
Bazarr automatically downloads subtitles for everything in your library.
- Configure subtitle providers: Bazarr UI → Settings → Providers → add OpenSubtitles.com (free account)
- Languages: English is default. Add others as needed.
Maintenance
Restart a service
KUBECONFIG=~/.kube/legion-config kubectl rollout restart deployment/<name> -n media
# Names: plex, radarr, sonarr, prowlarr, qbittorrent, bazarr, overseerr, flaresolverr
Check all pod health
KUBECONFIG=~/.kube/legion-config kubectl get pods -n media
View logs
KUBECONFIG=~/.kube/legion-config kubectl logs -n media deployment/radarr --tail=50
KUBECONFIG=~/.kube/legion-config kubectl logs -n media deployment/qbittorrent -c gluetun --tail=50
KUBECONFIG=~/.kube/legion-config kubectl logs -n media deployment/qbittorrent -c qbittorrent --tail=50
Update a service (pull latest image)
KUBECONFIG=~/.kube/legion-config kubectl rollout restart deployment/<name> -n media
All services use :latest tags — a restart pulls the newest image.
Add disk space later
When you get a new server/drive, update the PersistentVolume in k8s/media/pvc.yaml:
- Change
hostPath.pathto the new mount point - Increase
storagecapacity - Push to git → Argo CD syncs
Upgrading to Seerr (when ready)
Overseerr is being superseded by Seerr. To migrate:
- Edit
k8s/media/overseerr.yaml, change image toseerr/seerr:latest - Push to git — Argo CD will redeploy with config intact (same
/app/configPVC)