Deploying a Full Servarr + qBittorrent + Plex + Jellyfin Stack on Windows with Podman
đ Overview
This post documents how I deployed a full Servarr ecosystem (Radarr, Sonarr, Lidarr, Readarr, Prowlarr) with qBittorrent, Plex, and Jellyfin on Windows using Podman. Running this stack under Podman on Windows (via WSL2) comes with unique caveats: path mapping differences, networking quirks, and hardware transcoding limitations.
What started as a simple âletâs try Podman instead of Dockerâ experiment turned into a deep dive into container networking, Windows-Linux path translation, and the subtle differences between container runtimes. This post chronicles the journey from âthis should be straightforwardâ to âwhy canât Radarr find my downloadsâ to finally achieving a stable, unified media stack.
đ§ą Project / Setup Context
- Stack / Tools Used:
- Podman Desktop (Windows, WSL2 backend)
- LinuxServer.io images for qBittorrent, Radarr, Sonarr, Lidarr, Readarr, Prowlarr, Plex
- Official Jellyfin Docker image
- Windows directories mounted into WSL via
/mnt/c/...
- Windows Task Scheduler for autostart
- Initial Goals:
- Unified media stack in a single Pod
- Shared download/media paths across all containers
- Plex + Jellyfin serving the same libraries
- Persist configs on Windows file system for easy backup
- Replace existing Docker Desktop setup with Podman
- Constraints:
- Running inside WSL2 (no direct device passthrough)
- Windows firewall and port forwarding must be configured manually
- No reliable hardware transcoding (Intel/NVIDIA) via WSL2
- Limited to 16GB RAM for all containers
- Must maintain Wife Acceptance Factor (no service interruptions)
đĽ Roadblocks & Shortcomings
đ¨ Problem #1: Path Mismatch Across Containers
- What happened: Each container was mounting different internal paths (
/movies
,/tv
,/downloads
) - Symptoms:
- Radarr/Sonarr failed to import downloads with âpath does not existâ errors
- qBittorrent completed downloads but *arr apps couldnât find them
- Required awkward Remote Path Mappings that kept breaking
- Why it was frustrating: The exact same setup worked with Docker Compose, but Podmanâs path handling was subtly different
đ§Š Problem #2: Plex/Jellyfin Network Discovery Issues
- What happened: DLNA discovery didnât reach TVs on the LAN
- Symptoms:
- Plex clients could only connect manually via IP:port
- Jellyfin not found by smart TV apps
- Lost auto-discovery features that worked with Docker
- Why it was confusing: Network settings appeared identical between Docker and Podman configurations
đĽ Problem #3: Hardware Transcoding Unavailable
- What happened: Containers couldnât access
/dev/dri
under WSL2 - Symptoms:
- Only CPU transcoding available in both Plex and Jellyfin
- Heavy CPU load during simultaneous transcodes
- Stuttering playback on multiple concurrent streams
- Why it was maddening: Hardware transcoding worked fine with Docker Desktopâs native Windows containers
đ Problem #4: Autostart Challenges on Windows
- What happened:
podman generate systemd
doesnât apply to Windows - Symptoms:
- Pod didnât restart after reboots
- Had to manually start the entire stack each time
- Family complained about media being âdownâ after Windows updates
- Why it was painful: Lost the seamless restart behavior from Docker Desktop
đ§ How I Resolved the Issues
đ§ Fix for Problem #1: Unified Path Architecture
What didnât work:
- Different mount points per container
- Trying to use Remote Path Mappings
- Symlinks within WSL2
What ultimately worked:
1
2
3
4
5
6
7
8
9
10
11
12
13
# Unified host path mapping
volumes:
- type: bind
source: /mnt/c/Users/Dolfie/PodmanMedia
target: /data
# Inside every container:
# /data/downloads/incomplete
# /data/downloads/completed
# /data/movies
# /data/tv
# /data/music
# /data/books
Key insight: All containers must see identical paths for seamless file operations. The unified /data
mount eliminates path translation issues entirely.
đ ď¸ Fix for Problem #2: Bridge Networking with Explicit Port Mapping
The solution: Switched to bridge networking with explicit hostPort
mappings
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Pod configuration
apiVersion: v1
kind: Pod
spec:
containers:
- name: plex
ports:
- containerPort: 32400
hostPort: 32400
protocol: TCP
- name: jellyfin
ports:
- containerPort: 8096
hostPort: 8096
protocol: TCP
Acceptance: DLNA discovery is unreliable in WSL2 environment - use Plex/Jellyfin apps with manual server configuration instead.
đď¸ Fix for Problem #3: CPU Transcoding Optimization
Root cause: WSL2 doesnât provide reliable GPU passthrough for hardware transcoding.
Solution - Plex optimization:
1
2
3
4
5
# Plex transcoding settings
- PLEX_UID=1000
- PLEX_GID=1000
- TZ=America/New_York
- PLEX_CLAIM=claim-token-here
Jellyfin optimization:
1
2
3
4
5
6
environment:
- JELLYFIN_PublishedServerUrl=http://192.168.1.100:8096
resources:
limits:
memory: 4Gi
cpu: "2"
Alternative path: Consider running Plex for Windows natively, or migrate entire stack to Linux host for GPU support.
đ Fix for Problem #4: Windows Task Scheduler Autostart
The elegant solution: Windows Task Scheduler entry
- Create new task: âMedia Stack Autostartâ
- Trigger: At user logon
- Action: Start program
- Program:
powershell.exe
- Arguments:
-Command "podman play kube C:\Users\Dolfie\media-stack.yaml"
- Program:
- Settings: Run with highest privileges
Alternative: Use Podman Desktopâs autostart settings for individual containers.
đ What I Learned
Technical Insights
- Path consistency is critical: Unified mount points eliminate 90% of import/hardlink issues
- WSL2 networking is different: Bridge mode with explicit ports works better than host networking
- Hardware transcoding requires native containers: WSL2 adds too many abstraction layers
- Windows autostart needs creative solutions: Task Scheduler fills the systemd gap effectively
Process Improvements
- Test with realistic media files: Empty test libraries donât reveal path mapping issues
- Document network topology early: Understanding WSL2âs network bridge saves debugging time
- Plan for Windows-specific quirks: Donât assume Linux container patterns translate directly
Unexpected Discoveries
- Podmanâs resource management is more granular than Dockerâs
- LinuxServer.io images handle PUID/PGID mapping better than official images
- Jellyfinâs web interface is surprisingly responsive even with CPU-only transcoding
- Windows Defender can interfere with container file operations if not configured properly
đŻ Outcome & Next Steps
Success Metrics
- â 99.5% uptime over 3 months
- â 2TB movie library fully automated via Radarr
- â TV shows downloading and organizing automatically
- â Both Plex and Jellyfin serving content reliably
- â Family can access media from any device
What Iâd Improve Next Time
- Migrate to Linux host: Enable hardware transcoding and better performance
- Add VPN integration: Implement gluetun sidecar for secure downloading
- Implement monitoring: Add Prometheus/Grafana for container health monitoring
- Automate backups: Script regular config backups to cloud storage
Future Plans
- Create Kubernetes manifests for more advanced orchestration
- Implement Traefik reverse proxy for unified access
- Add automated media quality management
- Document migration path from Windows to Linux deployment
đ§ Related Resources / Tools
Essential Documentation
- Podman Desktop Documentation - Windows-specific setup guides
- LinuxServer.io Fleet - Container image documentation
- Servarr Wiki - Comprehensive setup and troubleshooting guides
Tools That Saved My Sanity
- Podman Desktop - GUI management for containers
- Windows Terminal - Better WSL2 command line experience
- WinSCP - Easy file transfer between Windows and WSL2
Configuration Files
- media-stack-podman - Complete Pod YAML and setup scripts
đŹ Final Thoughts
This project taught me that while Podman is an excellent Docker alternative, Windows deployment comes with unique challenges that require creative solutions. The key lesson: embrace the constraints rather than fighting them, and design your architecture around the platformâs strengths.
The three weeks of path mapping troubleshooting were frustrating, but resulted in a deeper understanding of how container filesystems work across different runtimes. I now have a media stack thatâs more resource-efficient than my previous Docker setup, with better isolation and security.
Most importantly, I learned that the homelab journey is about continuous iteration. This Windows Podman setup serves as an excellent stepping stone toward a future Linux deployment with full hardware acceleration, while providing immediate value to my familyâs media consumption needs.
Next challenge: implementing a proper VPN solution for secure downloading. The adventure continues! đ
Running into similar issues with Podman on Windows or have questions about this setup? Feel free to reach out via the contact methods in the footer, or check out the complete configuration files in the GitHub repository.