This stack prioritizes security with Tailscale-only access (no internet port exposure). Follow these steps for proper authentication setup.
Default credentials are compromised if exposed
- Access:
https://qbittorrent.YOUR_TAILSCALE_IP - Login with:
admin/adminpass - IMMEDIATELY change password:
- Tools → Options → Web UI
- Set "Username" and "Password"
- Check "Require authentication"
- Apply and save
- Restart container:
docker-compose restart qbittorrent
Requires initial setup for user management
- Access:
https://jellyfin.YOUR_TAILSCALE_IP - First access shows setup wizard
- Create your admin account
- Configure library paths
- Add additional users as needed
- Set playback permissions in Admin → Users
Requires active Plex subscription
Option A: Claim Token (Recommended)
- Visit: https://www.plex.tv/claim/ (valid for 4 minutes)
- Copy the claim token
- Add to .env:
PLEX_CLAIM_TOKEN=claim-XXXXXXXXX - Restart:
docker-compose restart plex - Access:
https://plex.YOUR_TAILSCALE_IP
Option B: Manual Account Linking
- Access:
https://plex.YOUR_TAILSCALE_IP - Sign in with your Plex account
- Complete setup wizard
- Link libraries
Integrates with Jellyfin, Radarr, Sonarr, Readarr
- Access:
https://jellyseerr.YOUR_TAILSCALE_IP - First access shows setup wizard
- Link Jellyfin instance:
- Jellyfin URL:
http://jellyfin:8096(internal Docker network) - API Key: Get from Jellyfin Admin → Dashboard → API Keys
- Link Radarr:
- Server URL:
http://radarr:7878 - API Key: Get from Radarr Settings → General
- Quality Profile: Select your preferred quality
- Link Sonarr:
- Server URL:
http://sonarr:8989 - API Key: Get from Sonarr Settings → General
- Create Jellyseerr user account for yourself
- Share Jellyseerr link with family members who can request media
Benefits:
- Users request movies/shows without direct *arr access
- Automatic approval workflow (optional)
- Integrates requested items into Radarr/Sonarr
No password required, but API key available
Recommended: Enable password protection
- Access:
https://sonarr.YOUR_TAILSCALE_IP(same for Radarr/Lidarr/Readarr) - Settings → General → Security
- Set "Authentication" to "Basic" or "Forms"
- Create username/password
- Repeat for each arr service
- Note API key in Settings → General for integrations
Manages indexers and integrations
- Access:
https://prowlarr.YOUR_TAILSCALE_IP - Settings → General → Security
- Enable password: "Basic" or "Forms"
- Create credentials
- Add indexers via built-in settings
Subtitle manager
- Access:
https://bazarr.YOUR_TAILSCALE_IP - Settings → Security (if available in your version)
- Otherwise relies on Tailscale access only
** WARNING: These provide system-level access without built-in authentication**
Secure Option 1: Disable in Production
- Comment out or remove these services from docker-compose.yml if not needed
- Manage Docker via CLI instead
Secure Option 2: Use Authelia Reverse Proxy (Advanced)
- Add Authelia container for authentication layer
- Route Termix/Dockhand through Authelia before TSDProxy
- See example in Future Setup section below
For Now: Minimum Security
- Only connect Tailscale as authorized users
- Restrict access at firewall level if possible
- Monitor access logs regularly
- Link Jellyfin: Settings → Jellyfin
- URL:
http://jellyfin:8096 - API Key: Get from Jellyfin Admin → Dashboard
- Link Radarr: Settings → Services → Radarr
- URL:
http://radarr:7878 - API Key: Get from Radarr Settings → General
- Link Sonarr: Settings → Services → Sonarr
- URL:
http://sonarr:8989 - API Key: Get from Sonarr Settings → General
- Link Readarr: Settings → Services → Readarr
- URL:
http://readarr:8787 - API Key: Get from Readarr Settings → General
- Create user account for yourself
- In Prowlarr: Settings → Apps
- Add each arr service:
- Sync Level: Add and Remove
- Server:
http://radarr:7878(internal Docker network) - API Key: Get from each app's Settings → General
- Test connection
- In each arr app: Settings → Download Clients
- Add qBittorrent:
- Host:
qbittorrent(Docker network) - Port:
8080(internal) - Username: qBittorrent UI credentials
- Test connection
- In Bazarr: Settings → Sonarr / Radarr
- Enable integration
- Set Sonarr URL:
http://sonarr:8989 - Set Radarr URL:
http://radarr:7878 - Add API keys
| Service | Location | Purpose |
|---|---|---|
| Radarr | Settings → General → API Key | Integrations (Prowlarr, Jellyseerr, etc) |
| Sonarr | Settings → General → API Key | Integrations |
| Lidarr | Settings → General → API Key | Integrations |
| Readarr | Settings → General → API Key | Integrations |
| Prowlarr | Settings → General → API Key | Testing, external apps |
| Jellyfin | Admin → Dashboard → API Keys | Jellyseerr, mobile apps |
| Plex | Settings → Remote Access | External sharing |
User's Device
↓ (Tailscale VPN)
Tailscale Network
↓
TSDProxy Container (Authentication via Tailscale)
↓
Internal arr_network (Docker)
Radarr (port 7878)
Sonarr (port 8989)
Lidarr (port 8686)
Readarr (port 8787)
Jellyfin (port 8096)
Plex (port 32400)
Prowlarr (port 9696)
qBittorrent (port 8080)
Bazarr (port 6767)
Termix (port 8080)
Dockhand (port 3000)
NO PORTS EXPOSED TO INTERNET
# Critical - Must set before first run
PUID=1000 # Your user ID
PGID=1000 # Your group ID
TZ=America/Toronto # Your timezone
TSDPROXY_AUTHKEY=tskey-auth-... # Tailscale auth (25min - must regenerate)
TSDPROXY_HOSTNAME=100.0.0.1 # Your Tailscale server IP
PLEX_CLAIM_TOKEN=claim-... # Plex claim token (optional, 4min lifespan)View all service logs:
cd ent/
docker-compose logs -fView specific service:
docker-compose logs -f radarr
docker-compose logs -f qbittorrentCheck TSDProxy connections:
docker-compose logs tsdproxy
# Should see "Connected to Tailscale"- Weekly: Check qBittorrent authentication is enforced
- Monthly: Review Tailscale device list (Settings → My devices)
- Quarterly: Update all container images (
docker-compose pull && docker-compose up -d) - On Changes: Update .env values (don't commit to git!)
Q: Can't reach services via Tailscale
- Verify Tailscale is running:
tailscale status - Check TSDProxy logs:
docker-compose logs tsdproxy - Confirm TSDPROXY_AUTHKEY is valid (regenerate if needed)
Q: qBittorrent login rejected after password change
- Restart container:
docker-compose restart qbittorrent - Wait 10 seconds for config to reload
- Retry login
Q: Jellyfin shows no libraries
- Check volume mounts:
docker-compose logs jellyfin - Verify /data/media exists on host
- Ensure PUID/PGID permissions allow access
Q: Prowlarr → Radarr connection fails
- Use internal Docker hostname:
http://radarr:7878 - Verify API key is correct
- Check both containers are running:
docker-compose ps