← Back to list

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…

Andreas Regli · 2026-06-15 07:12 · 0 claps · 2.3 min read
#homelab #proxmox
Open on Medium ↗
Wiki topics: RAG · RAG & Retrieval 🎬 · Film & Television

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