# ServiceDefinition: plex # Source of truth: spec docs/13-service-catalog.md, row 1 (the catalog's largest service). # public | egress internet | config on Longhorn (metadata DB, DR-noncritical/reacquirable) | # auth: native (Plex accounts, NOT Keycloak — docs/13 + docs/15 documented exception). # Validates against schemas/servicedefinition.schema.json. # # BULK MEDIA (spec bulk-tier requirement, docs/04) — OPEN PREREQUISITE, intentionally NOT declared # here yet (the requirement ID is cited in the WS-APPS report, not as a token here: this change does # NOT exercise the bulk tier, so it must not be selected as a "touched" requirement whose in-cluster # conformance test is still a Phase-1 gap). # The Plex library belongs on the `bulk` tier (docs/04 / docs/13 cross-cutting note: metadata DB # on replicated Longhorn, large library on bulk). The `bulk` StorageClass exists # (platform/longhorn/storageclasses.yaml) and the schema+renderer both support `class: bulk`, but # that class is a documented STUB: OQ-2 (external NFS/SMB backing) is UNRESOLVED and the NFS CSI # driver is not installed, so a `bulk` PVC will not bind and would leave the Plex pod Pending. # To onboard the running Plex shell now (compute + config + public exposure), the media volume is # omitted. Once OQ-2 is resolved and `bulk` provisions, attach the library with a one-line add: # storage: # - name: media # class: bulk # external mount; size omitted (sized outside the cluster) # then re-render. See the WS-APPS report for the full bulk-media finding. name: plex kind: container source: image: plexinc/pms-docker:latest exposure: public # edge port-forward + public DNS; clients + Seerr reach it (docs/09; R-DNS/R-NET) egress: internet # normal WAN egress (docs/03; R-NET-05) storage: - name: config size: 8Gi class: longhorn # Plex DB/metadata: replicated app state on the 3-replica tier (docs/04; R-STATE-01/02) dependencies: [] # default-deny: reaches only DNS; clients/Seerr reach IT (docs/03; R-NET-01/02) ingressRoutes: - host: plex.home.keithjackson.dev port: 32400 # Plex web UI + API served on 32400 (wildcard TLS at the Gateway; docs/08/09) auth: mode: native # Plex account auth — documented exception, NOT Keycloak (docs/13/15; R-IDP-02) update: channel: stable # R-UPD-01 (never pre-release) range: ">=1.40.0" # acceptable versions (advisory; image-automation off during onboarding) cadence: "0 4 * * 0" # weekly stable check/apply autoRollbackOnFailedHealth: true # R-UPD-03 observability: metrics: true slis: - up # R-OBS-01: service-down alert backup: # The config volume is on the longhorn (replicated, "irreplaceable") tier, so the L0 Kyverno # backup policy (R-STATE-03) forbids `reacquirable` here — it must reference an off-cluster # schedule. Plex's metadata DB (library index, thumbnails, watch state) is expensive to rebuild, # so it is backed up off-cluster. The bulk library itself, once attached, is the `reacquirable` # part (docs/04) and is NOT covered by this schedule. policy: daily-offcluster # off-cluster backup of the longhorn config volume (docs/04; R-STATE-03)