RagnaLab Part 3: The Self-Hosted Media Stack
This post covers the full media setup. Jellyfin for streaming, Sonarr and Radarr for managing TV and movies, Prowlarr for indexers, and…
RagnaLab Part 3: The Self-Hosted Media Stack
This post covers the full media setup. Jellyfin for streaming, Sonarr and Radarr for managing TV and movies, Prowlarr for indexers, and Homepage and Uptime Kuma to keep an eye on everything.
Each service gets its own LXC container. Separating Jellyfin from the *arr stack is deliberate . Jellyfin may later get GPU passthrough for hardware transcoding, and keeping it isolated means you can do that without touching the rest.

CT 202 — Jellyfin
pct create 202 local:vztmpl/ubuntu-26.04-standard_26.04-1_amd64.tar.zst \
--hostname jellyfin \
--memory 4096 \
--cores 4 \
--rootfs local-lvm:40 \
--net0 name=eth0,bridge=vmbr0,ip=dhcp
4 cores and 40 GB — the extra space is for transcoding cache and metadata.
Install Docker (same process as Part 2), then deploy:
mkdir -p /data/config/jellyfin /data/media
mkdir -p /opt/stacks/jellyfin
cd /opt/stacks/jellyfin
cat > compose.yml << 'EOF'
services:
jellyfin:
image: jellyfin/jellyfin:latest
container_name: jellyfin
ports:
- "8096:8096"
volumes:
- /data/config/jellyfin:/config
- /data/media:/media
restart: unless-stopped
EOF
docker compose up -d
CT 203 — arr-stack
pct create 203 local:vztmpl/ubuntu-26.04-standard_26.04-1_amd64.tar.zst \
--hostname arr-stack \
--memory 2048 \
--cores 2 \
--rootfs local-lvm:20 \
--net0 name=eth0,bridge=vmbr0,ip=dhcp
Install Docker, then deploy Sonarr, Radarr, and Prowlarr together:
mkdir -p /data/config/{sonarr,radarr,prowlarr}
mkdir -p /data/media/{tv,movies,downloads}
mkdir -p /opt/stacks/arr
cd /opt/stacks/arr
cat > compose.yml << 'EOF'
services:
sonarr:
image: linuxserver/sonarr:latest
container_name: sonarr
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Zurich
ports:
- "8989:8989"
volumes:
- /data/config/sonarr:/config
- /data/media/tv:/tv
- /data/media/downloads:/downloads
restart: unless-stopped
radarr:
image: linuxserver/radarr:latest
container_name: radarr
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Zurich
ports:
- "7878:7878"
volumes:
- /data/config/radarr:/config
- /data/media/movies:/movies
- /data/media/downloads:/downloads
restart: unless-stopped
prowlarr:
image: linuxserver/prowlarr:latest
container_name: prowlarr
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Zurich
ports:
- "9696:9696"
volumes:
- /data/config/prowlarr:/config
restart: unless-stopped
EOF
docker compose up -d
CT 205 — Monitoring
Homepage gives you a clean dashboard with links to all your services. Uptime Kuma monitors them and alerts you when something goes down. They fit naturally alongside the media stack since you’ll want to keep an eye on all of it.
pct create 205 local:vztmpl/ubuntu-26.04-standard_26.04-1_amd64.tar.zst \
--hostname monitoring \
--memory 1024 \
--cores 1 \
--rootfs local-lvm:10 \
--net0 name=eth0,bridge=vmbr0,ip=dhcp
Install Docker, then deploy:
mkdir -p /opt/stacks/monitoring/homepage
cd /opt/stacks/monitoring
cat > compose.yml << 'EOF'
services:
homepage:
image: ghcr.io/gethomepage/homepage:latest
container_name: homepage
ports:
- "3000:3000"
volumes:
- /opt/stacks/monitoring/homepage:/app/config
restart: unless-stopped
uptime-kuma:
image: louislam/uptime-kuma:latest
container_name: uptime-kuma
ports:
- "3001:3001"
volumes:
- uptime_kuma_data:/app/data
restart: unless-stopped
volumes:
uptime_kuma_data:
EOF
docker compose up -d
Wiring up Homepage
Create /opt/stacks/monitoring/homepage/services.yaml:
- Media:
- Jellyfin:
href: http://jellyfin.homelab.local
icon: jellyfin.png
description: Media server
- Sonarr:
href: http://sonarr.homelab.local
icon: sonarr.png
description: TV management
- Radarr:
href: http://radarr.homelab.local
icon: radarr.png
description: Movie management
- Prowlarr:
href: http://prowlarr.homelab.local
icon: prowlarr.png
description: Indexer manager
- Infrastructure:
- Portainer:
href: http://portainer.homelab.local
icon: portainer.png
description: Container management
- Caddy:
href: http://caddy.homelab.local
icon: caddy.png
description: Reverse proxy
- Uptime Kuma:
href: http://uptime.homelab.local
icon: uptime-kuma.png
description: Monitoring
- AI:
- Claude:
href: http://claude.homelab.local
icon: anthropic.png
description: Claude Code host
- Databases:
- FalkorDB:
href: http://falkordb.homelab.local
icon: redis.png
description: Graph database
- IT Tools:
href: http://tools.homelab.local
icon: it-tools.png
description: Developer utilities
Up next: keeping all of this automatically updated and manageable from a single dashboard.

메타데이터
- post_id
- 28a2cfe61735
- slug
- ragnalab-part-3-the-self-hosted-media-stack-28a2cfe61735
- url
- https://medium.com/@Cstm/ragnalab-part-3-the-self-hosted-media-stack-28a2cfe61735
- canonical_url
- https://medium.com/@Cstm/ragnalab-part-3-the-self-hosted-media-stack-28a2cfe61735
- author_url
- https://medium.com/@Cstm
- status
- ok
- fetched_at
- 2026-06-23 03:48:11