Seerr (https://github.com/seerr-team/seerr) — media request management, migrated
from the orphaned overseerr deployment.
seerr/
namespace.yml # seerr namespace
pvc.yml # standalone Longhorn PVC (seerr-pvc, 5Gi)
deployment.yml # Deployment, strategy: Recreate, image :latest, /app/config
services.yml # ClusterIP service (seerr ns)
ingressroute.yml # IngressRoute -> seerr.stuffsclub.net, direct cross-ns to seerr-service
migrate-from-overseerr.sh # one-time cross-namespace volume clone
The old overseerr ran as a StatefulSet, which forced the PVC name
config-overseerr-0 and ordered identity it never needed. Seerr is a single
web app with one config volume — a Deployment + standalone PVC is simpler and
lets us name/clone the volume freely. Because it is one replica on a
ReadWriteOnce Longhorn volume, the Deployment uses strategy: Recreate; the
default RollingUpdate would deadlock trying to attach the RWO volume to a second
(surge) pod.
Back up first. The clone is non-destructive (overseerr keeps its own volume), so leaving overseerr scaled to 0 is your rollback.
- Create the shell so ArgoCD will adopt (not recreate) what we pre-make:
kubectl apply -f seerr/namespace.yml -f seerr/pvc.yml
- Clone the data (scales overseerr down, tar-pipes the volume across):
./migrate-from-overseerr.sh
- Start seerr: sync the
seerrArgoCD app (Deployment, services, ingress). Seerr boots on the migrated config and runs the in-place overseerr->seerr migration automatically. - Verify:
Then open https://seerr.stuffsclub.net and confirm your users/requests/settings.
kubectl -n seerr logs deploy/seerr -f # watch for migration success - Cut over DNS/ingress is already handled (the IngressRoute points at
seerr). Once happy, you can retire overseerr:
Until then overseerr stays at replicas=0 as a rollback. Its Service still holds LoadBalancer IP 192.168.0.54 — deleting the overseerr namespace frees it.
kubectl delete namespace overseerr # only after you're confident
- Config path changed: linuxserver/overseerr used
/config; the official seerr image uses/app/configand runs as UID 1000 (node). No PUID/PGID env needed. - Image pinned to
:latest(matches house convention;diun.enableannotation tracks updates).