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).
[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.
[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 overlocalhost(DB_HOSTNAME=localhost,REDIS_HOSTNAME=localhost). Only the web port2283is 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:14image bundling the VectorChord andpgvecto.rsextensions. 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-openvinoimage with/dev/dripassed 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.