Media Stack

The media stack provides automated media acquisition, organization, and playback, plus photo management. It consists of eight applications in the media namespace.

Architecture

flowchart LR
    subgraph Indexers
        PR[Prowlarr<br/>Indexer Manager]
    end

    subgraph Management
        SO[Sonarr<br/>TV Shows]
        RA[Radarr<br/>Movies]
        AB[Autobrr<br/>IRC Announces]
    end

    subgraph Download["Download Clients"]
        QB[qBittorrent<br/>Torrents]
        SAB[SABnzbd<br/>Usenet]
    end

    subgraph Storage
        NAS[(Synology NAS<br/>/volume1/media)]
    end

    subgraph Playback
        JF[Jellyfin<br/>Media Server]
    end

    PR -->|Manages indexers for| SO
    PR -->|Manages indexers for| RA
    AB -->|Grabs from IRC| QB
    SO -->|Sends to| QB
    SO -->|Sends to| SAB
    RA -->|Sends to| QB
    RA -->|Sends to| SAB
    QB -->|Downloads to| NAS
    SAB -->|Downloads to| NAS
    SO -->|Imports from| NAS
    RA -->|Imports from| NAS
    JF -->|Reads from| NAS

Application Summary

AppPurposeImageGatewayURL
JellyfinMedia server with GPU transcodingghcr.io/jellyfin/jellyfinenvoy-externaljellyfin.wibrow.dev
ImmichPhoto and video libraryghcr.io/immich-app/immich-serverenvoy-externalphotos.wibrow.dev
SonarrTV show managementghcr.io/home-operations/sonarrenvoy-internalsonarr.wibrow.dev
RadarrMovie managementghcr.io/home-operations/radarrenvoy-internalradarr.wibrow.dev
ProwlarrIndexer managementghcr.io/home-operations/prowlarrenvoy-internalprowlarr.wibrow.dev
AutobrrIRC announce monitoringghcr.io/autobrr/autobrrenvoy-internalautobrr.wibrow.dev
qBittorrentTorrent clientghcr.io/home-operations/qbittorrentenvoy-internalqbittorrent.wibrow.dev
SABnzbdUsenet clientghcr.io/home-operations/sabnzbdenvoy-internalsabnzbd.wibrow.dev

Image tags are pinned (most with digests) in each app's values.yaml and updated by Renovate.

Placement

AppsNodeWhy
Sonarr, Radarr, Prowlarr, Autobrr, qBittorrent, SABnzbdworker-07 (wibrow.dev/compute: "true")The bare-metal compute node
Immich server and machine learningworker-07 (pinned by hostname)Library and model cache are on worker-07's local ZFS pools
Jellyfinworker-04Intel iGPU for Quick Sync transcoding

Data Flow

  1. Prowlarr manages indexer configurations and syncs them to Sonarr and Radarr
  2. Autobrr monitors IRC announce channels and pushes matching torrents to qBittorrent
  3. Sonarr (TV) and Radarr (movies) search indexers and send downloads to qBittorrent or SABnzbd
  4. qBittorrent downloads to the NAS at downloads/qbittorrent; SABnzbd stages downloads on a local PVC (sabnzbd-downloads) and also mounts the NAS
  5. Sonarr and Radarr import completed downloads, renaming and organizing files into the library
  6. Jellyfin serves the library with hardware-accelerated transcoding

Shared Storage

The *arr apps, download clients and Jellyfin mount the same Synology NAS export:

yaml
persistence:
  media:
    type: nfs
    server: data
    path: /volume1/media
    globalMounts:
      - path: /data/nas-media

App config lives on per-app PVCs from the pvc component, backed up hourly by kopiur. Autobrr has no PVC; its state is in PostgreSQL.

Immich

Immich is a self-hosted photo and video library with mobile backup.

SettingValue
Controllersserver and machine-learning, both pinned to worker-07
LibraryPVC immich-library-media (openebs-hostpath-media, worker-07's RAIDZ1 pool at /var/mnt/media, reclaim policy Retain) mounted at /data
ML model cache10Gi on openebs-hostpath-fast
DatabaseDedicated immich CNPG cluster (VectorChord, PostgreSQL 16) via an inline ExternalSecret against cnpg-secrets-database; see Databases
CacheDragonfly instance immich-dragonfly (Redis-compatible)
AuthOAuth via Kanidm; the whole Immich system config is rendered from Infisical into the immich-config-secret Secret