66 lines
3.3 KiB
Markdown
66 lines
3.3 KiB
Markdown
# Jellyfin on Kubernetes
|
|
|
|
This project runs the existing Jellyfin server as one high-performance Pod on
|
|
`arschrock` in its dedicated `jellyfin` namespace. It is intentionally not
|
|
highly available and cannot fail over to an ODROID. CPU and memory have
|
|
scheduling requests but no limits.
|
|
|
|
The 500 TB media tree remains on the host and is mounted read-only at its
|
|
existing `/komposthaufen/multimedia` path. The Pod requires the existing
|
|
`Videos` directory and verifies that the path is backed by bcachefs before the
|
|
server starts. The Deployment also requires the explicit
|
|
`media.brunner.ninja/multimedia-ready=true` node label. The shared
|
|
`../media-storage-offline.sh` helper removes it and stops the media Pods before
|
|
unmounting; `../media-storage-online.sh` validates the mount before restoring
|
|
the label.
|
|
|
|
The retained 80 GiB `jellyfin-config` RBD PVC contains the migrated Arch data,
|
|
configuration, metadata, preview images, databases, and logs. Cache and
|
|
transcode activity use node-local ephemeral storage. The official Jellyfin
|
|
image is pinned to version 12.2. Before this major-version migration, the
|
|
complete PVC was backed up cold to the bcachefs-backed
|
|
`/komposthaufen/backups/jellyfin` directory on `arschrock`.
|
|
|
|
## Historical migration
|
|
|
|
The one-time Arch-to-Kubernetes copy tooling is preserved in Git history, not
|
|
as an active deployment path. The existing `jellyfin-config` PVC must not be
|
|
deleted or recreated during upgrades. The cold pre-12.2 backup remains under
|
|
`/komposthaufen/backups/jellyfin` on arschrock. Routine deployment is owned by
|
|
Argo CD. Jellyfin remains available at
|
|
`https://jellyfin.brunner.ninja` and directly on `192.168.0.2:8096`.
|
|
|
|
The historical `backup.sh` refuses to scale Jellyfin while Argo automatic
|
|
sync is enabled; suspend automatic sync deliberately before a cold backup,
|
|
then restore normal reconciliation afterward.
|
|
|
|
## Monitoring
|
|
|
|
The init container enables Jellyfin's native Prometheus endpoint. The
|
|
`ServiceMonitor` scrapes it internally, while the higher-priority Traefik route
|
|
restricts public access to `/metrics`. Alerts cover scrape availability,
|
|
restart loops, and PVC capacity. Existing node-exporter, Netdata, SMART, and
|
|
bcachefs monitoring remain in use.
|
|
|
|
## Helm and GitOps
|
|
|
|
This repository owns the Jellyfin chart: Deployment, Service, media guard,
|
|
ingress option, metrics middleware, and monitoring. The chart preserves the
|
|
existing Deployment selector used by `media-storage-offline.sh` and
|
|
`media-storage-online.sh`. The homelab's node pin, guarded hostPath, existing
|
|
PVC, public host and resource requests are selected in the
|
|
[GitOps values](https://code.brunner.ninja/feedc0de/homelab-gitops/src/branch/main/apps/jellyfin).
|
|
|
|
```sh
|
|
helm repo add brunner.ninja https://brunner.ninja/charts
|
|
helm repo update brunner.ninja
|
|
helm upgrade --install jellyfin brunner.ninja/jellyfin --namespace jellyfin --create-namespace
|
|
```
|
|
|
|
To install this checkout manually, run `./install.sh -f my-values.yaml` with
|
|
the target namespace and media mount configured. Main-branch CI validates,
|
|
publishes the chart using the upstream application Git tag plus `git describe`,
|
|
then promotes its exact version to GitOps. CI needs `PACKAGE_USERNAME`,
|
|
`PACKAGE_TOKEN`, and `GITOPS_TOKEN`, but no kubeconfig. The Jellyfin image is
|
|
the official upstream image and is selected by `Chart.yaml.appVersion`.
|