Tags: 0 - HomeLab Media Stack

Media Stack Architecture Diagram

Full System Architecture

graph TB
    subgraph USER["User Experience"]
        Browser["Browser"]
    end

    subgraph DNS["DNS Resolution"]
        Hosts["/etc/hosts<br>*.homelab.local -> 10.10.10.50"]
    end

    subgraph K8S["Kubernetes Layer - Routing"]
        Traefik["Traefik Ingress<br>10.10.10.50"]
        subgraph Ingress["Ingress Rules"]
            I1["jellyfin.homelab.local"]
            I2["jellyseerr.homelab.local"]
            I3["sonarr.homelab.local"]
            I4["radarr.homelab.local"]
            I5["prowlarr.homelab.local"]
            I6["transmission.homelab.local"]
            I7["bazarr.homelab.local"]
            I8["audiobookshelf.homelab.local"]
        end
        subgraph SvcEp["Headless Services + Endpoints"]
            EP["All point to 10.10.10.22<br>(worker-02)"]
        end
    end

    subgraph DOCKER["Docker Compose Layer - worker-02 (10.10.10.22)"]
        subgraph Request["Request & Discovery"]
            Jellyseerr["Jellyseerr<br>:5055"]
            Prowlarr["Prowlarr<br>:9696"]
        end
        subgraph Management["Media Management"]
            Sonarr["Sonarr<br>:8989"]
            Radarr["Radarr<br>:7878"]
            Bazarr["Bazarr<br>:6767"]
        end
        subgraph Download["Download"]
            Transmission["Transmission<br>:9091"]
        end
        subgraph Streaming["Streaming"]
            Jellyfin["Jellyfin<br>:8096"]
            Audiobookshelf["Audiobookshelf<br>:13378"]
        end
    end

    subgraph NFS["Storage Layer - HP Proxmox (10.10.10.11)"]
        ZFS["3.6TB ZFS Pool"]
        TV["/media-pool/tv"]
        Movies["/media-pool/movies"]
        Anime["/media-pool/anime"]
        DL["/media-pool/downloads"]
        Config["/media-pool/config"]
    end

    Browser --> Hosts
    Hosts --> Traefik
    Traefik --> Ingress
    Ingress --> SvcEp
    SvcEp --> DOCKER

    Jellyseerr -->|"requests"| Sonarr
    Jellyseerr -->|"requests"| Radarr
    Prowlarr -->|"syncs indexers"| Sonarr
    Prowlarr -->|"syncs indexers"| Radarr
    Sonarr -->|"sends torrents"| Transmission
    Radarr -->|"sends torrents"| Transmission
    Sonarr -->|"imports to"| TV
    Sonarr -->|"imports to"| Anime
    Radarr -->|"imports to"| Movies
    Transmission -->|"downloads to"| DL
    Bazarr -->|"subtitles for"| Sonarr
    Bazarr -->|"subtitles for"| Radarr
    Jellyfin -->|"serves from"| TV
    Jellyfin -->|"serves from"| Movies

    ZFS --- TV
    ZFS --- Movies
    ZFS --- Anime
    ZFS --- DL
    ZFS --- Config

    style USER fill:#1a1a2e,stroke:#e94560,color:#eee
    style K8S fill:#16213e,stroke:#0f3460,color:#eee
    style DOCKER fill:#1a1a2e,stroke:#533483,color:#eee
    style NFS fill:#0f3460,stroke:#e94560,color:#eee
    style Traefik fill:#e94560,stroke:#e94560,color:#fff
    style Jellyfin fill:#00a4dc,stroke:#00a4dc,color:#fff
    style Jellyseerr fill:#c059e8,stroke:#c059e8,color:#fff
    style Sonarr fill:#35c5f4,stroke:#35c5f4,color:#fff
    style Radarr fill:#ffc230,stroke:#ffc230,color:#000
    style Prowlarr fill:#a97534,stroke:#a97534,color:#fff
    style Transmission fill:#d33,stroke:#d33,color:#fff
    style Bazarr fill:#5a9e47,stroke:#5a9e47,color:#fff
    style Audiobookshelf fill:#4e7b2b,stroke:#4e7b2b,color:#fff

Request-to-Playback Flow

sequenceDiagram
    actor User
    participant JS as Jellyseerr
    participant Sonarr as Sonarr/Radarr
    participant P as Prowlarr
    participant T as Transmission
    participant B as Bazarr
    participant JF as Jellyfin
    participant NFS as NFS Storage

    User->>JS: Request TV show or movie
    JS->>Sonarr: Forward request

    Sonarr->>P: Search indexers
    P-->>Sonarr: Return best results

    Sonarr->>T: Send torrent
    T->>NFS: Download to /downloads

    T-->>Sonarr: Download complete
    Sonarr->>NFS: Import & rename to /tv or /movies

    B->>Sonarr: Check for new media
    B->>NFS: Download subtitles

    JF->>NFS: Detect new media in library
    User->>JF: Watch content

Network Topology

graph LR
    subgraph Proxmox["HP Proxmox Host"]
        PVE["Proxmox VE<br>10.10.10.11"]
        ZFS["3.6TB ZFS Pool"]
        NFSS["NFS Server"]
    end

    subgraph K3S["k3s Cluster"]
        CP["Control Plane<br>10.10.10.20"]
        W1["Worker-01<br>10.10.10.21"]
        W2["Worker-02<br>10.10.10.22"]
    end

    subgraph Services["Exposed Services"]
        TF["Traefik LB<br>10.10.10.50"]
    end

    PVE --- ZFS
    ZFS --- NFSS
    NFSS -->|"NFS mount"| W2
    CP --- W1
    CP --- W2
    W1 --- TF
    W2 --- TF
    TF -->|"*.homelab.local"| W2

    style Proxmox fill:#1a1a2e,stroke:#e94560,color:#eee
    style K3S fill:#16213e,stroke:#0f3460,color:#eee
    style Services fill:#0f3460,stroke:#e94560,color:#eee
    style TF fill:#e94560,stroke:#e94560,color:#fff
    style W2 fill:#533483,stroke:#533483,color:#fff