# Jellyfin Media Server (replaced Plex — no account or subscription required) # # Post-deploy setup: # 1. Access via plex.nook.family or jellyfin.nook.family # 2. Run the setup wizard: create admin account, add libraries: # - Movies → /media/movies # - TV Shows → /media/tv/shows # - Anime → /media/tv/anime # 3. Dashboard → Users → Add User for each family member # 4. Per user → Parental Controls → set max rating (PG-13 for Ben, PG for Chloe) # 5. Per user → set PIN if desired apiVersion: apps/v1 kind: Deployment metadata: name: jellyfin namespace: media labels: app: jellyfin spec: replicas: 0 strategy: type: Recreate selector: matchLabels: app: jellyfin template: metadata: labels: app: jellyfin spec: initContainers: # Ensure all media subdirectories exist on the hostPath volume - name: media-dirs image: busybox:latest command: - sh - -c - | mkdir -p \ /media/movies \ /media/tv/shows \ /media/tv/anime \ /media/documentaries \ /media/standup \ /media/concerts \ /media/kids \ /media/music \ /media/downloads/complete \ /media/downloads/incomplete chown -R 1000:1000 /media volumeMounts: - name: media mountPath: /media containers: - name: jellyfin image: lscr.io/linuxserver/jellyfin:latest env: - name: PUID value: "1000" - name: PGID value: "1000" - name: TZ value: "America/Chicago" ports: - containerPort: 8096 name: http volumeMounts: - name: config mountPath: /config - name: media mountPath: /media resources: requests: memory: 512Mi cpu: 500m limits: memory: 4Gi cpu: 2000m livenessProbe: httpGet: path: /health port: 8096 initialDelaySeconds: 60 periodSeconds: 30 readinessProbe: httpGet: path: /health port: 8096 initialDelaySeconds: 30 periodSeconds: 10 volumes: - name: config persistentVolumeClaim: claimName: jellyfin-config - name: media persistentVolumeClaim: claimName: media-data --- apiVersion: v1 kind: Service metadata: name: jellyfin namespace: media spec: selector: app: jellyfin ports: - name: http port: 8096 targetPort: 8096 type: ClusterIP