Skip to content

Media Server

Media and photo management services.

Service Host Purpose
Plex kontti Video streaming and media library
Kometa kontti Plex metadata and collection management
Immich kontti Photo and video backup and browsing
Music Assistant Home Assistant Smart home music integration

Plex, Kometa, and Immich run as Podman containers on kontti, managed by system-level Quadlets and provisioned with Ansible. Music Assistant runs as a Home Assistant add-on.


Plex

Plex serves as the central media library and streaming server. It runs using the LinuxServer.io image with host networking and hardware-accelerated transcoding via the AMD GPU (VA-API).

plex.container
[Container]
ContainerName=plex
Image=lscr.io/linuxserver/plex:latest
AutoUpdate=registry
Network=host

Volume=/var/lib/appdata/plex:/config:Z
Volume=/var/mnt/nfs-data:/data:Z

# AMD GPU hardware transcoding (VA-API)
AddDevice=/dev/dri:/dev/dri

Media files are stored on NFS and shared with other services through the same mount point. Plex library metadata is also synced to a vector database for natural-language search over the catalogue — see AI → plex-sync.

Kometa

Kometa runs nightly and manages Plex collections, posters, and metadata overlays. Collections are defined in YAML and templated with Ansible so they stay in version control.


Immich

Immich handles photo and video backup from phones and cameras. It runs as a Podman pod with four containers:

Container Role
immich-server API and web UI
immich-machine-learning Face recognition and CLIP search
immich-postgres Database
immich-redis Cache and job queue (Valkey image)

The machine learning container uses the OpenVINO runtime for GPU-accelerated inference on the AMD GPU, which noticeably speeds up face clustering and the CLIP-based smart search on large photo libraries.

immich-server.container (excerpt)
[Container]
Image=ghcr.io/immich-app/immich-server:v2
Pod=immich.pod
Volume=/var/mnt/nfs-data/media/photos:/data:Z
AddDevice=/dev/dri
ShmSize=2G

Photos are stored on NFS alongside other media. The ShmSize=2G setting is needed for video processing — the default shared memory is too small for transcoding larger files.

Architecture decisions

A few choices in the Immich deployment are worth calling out:

  • One pod, not a bridge network. All four containers join a single Podman pod (immich.pod), so they share one network namespace and reach each other over localhost (DB_HOSTNAME=localhost, REDIS_HOSTNAME=localhost). Only the web port 2283 is published to the host — nothing else is exposed. This mirrors how a Kubernetes pod groups tightly-coupled containers, and avoids managing a separate container network and inter-service hostnames.
  • Vectors live in Postgres. The database is not stock Postgres but Immich's postgres:14 image bundling the VectorChord and pgvecto.rs extensions. Both the CLIP smart-search embeddings and the face-recognition vectors are stored and queried in the same database as the rest of the metadata, rather than in a separate vector store.
  • GPU inference over CPU. The machine-learning container runs the v2-openvino image with /dev/dri passed through, so CLIP embedding and face clustering execute on the AMD iGPU via OpenVINO. Immich also ships a CPU-only image; the GPU variant was chosen because it noticeably speeds up the initial bulk indexing of a large library.

Music Assistant

Music Assistant runs as a Home Assistant add-on and acts as a music server for Sonos speakers and other players throughout the home. It handles library management, playback queues, and streaming from various music sources.

My experience

Plex has worked well. My media is already in formats that don't require transcoding, and since I have a lifetime Plex Pass, I haven't been motivated to explore alternatives.

Immich has been a good replacement for Google Photos — I no longer need to worry about running out of cloud storage. I don't take many photos, so it hasn't seen heavy use.

AI was a big help when setting up Kometa. The collections and overlay labels on cover art make browsing Plex a more personal experience.

Music Assistant is still at the experimentation stage.