Switch Plex → Jellyfin, fix gluetun IPv6 VPN issue

This commit is contained in:
Will Anderson
2026-04-11 00:11:41 -05:00
parent e08d7eaa03
commit a1c1c7b0f6
4 changed files with 32 additions and 47 deletions
@@ -23,7 +23,7 @@ spec:
# Ensure /dev/net/tun exists on the node # Ensure /dev/net/tun exists on the node
- name: tun-setup - name: tun-setup
image: busybox:latest image: busybox:latest
command: ["sh", "-c", "mkdir -p /dev/net && [ -c /dev/net/tun ] || mknod /dev/net/tun c 10 200 && chmod 666 /dev/net/tun"] command: ["sh", "-c", "mkdir -p /dev/net && [ -c /dev/net/tun ] || mknod /dev/net/tun c 10 200 && chmod 666 /dev/net/tun && sysctl -w net.ipv6.conf.all.disable_ipv6=1 || true"]
securityContext: securityContext:
privileged: true privileged: true
containers: containers:
+4 -4
View File
@@ -156,13 +156,13 @@ spec:
port: port:
number: 5055 number: 5055
--- ---
# plex.nook.family → Plex # plex.nook.family → Jellyfin (replaced Plex)
# NOTE: Also add in Cloudflare Zero Trust: # NOTE: Also add in Cloudflare Zero Trust:
# Hostname: plex.nook.family | Service: http://traefik.kube-system:80 # Hostname: plex.nook.family | Service: http://traefik.kube-system:80
apiVersion: networking.k8s.io/v1 apiVersion: networking.k8s.io/v1
kind: Ingress kind: Ingress
metadata: metadata:
name: plex name: jellyfin
namespace: media namespace: media
annotations: annotations:
traefik.ingress.kubernetes.io/router.entrypoints: websecure traefik.ingress.kubernetes.io/router.entrypoints: websecure
@@ -181,6 +181,6 @@ spec:
pathType: Prefix pathType: Prefix
backend: backend:
service: service:
name: plex name: jellyfin
port: port:
number: 32400 number: 8096
+26 -41
View File
@@ -1,41 +1,36 @@
# Plex Media Server # Jellyfin Media Server (replaced Plex — no account or subscription required)
# BEFORE FIRST DEPLOY: add claim token to Vault
# 1. Go to https://www.plex.tv/claim (token expires in 4 minutes)
# 2. vault kv put secret/plex claim_token=<token>
# 3. Then push and let Argo CD deploy
# After first startup the token is stored in config and can be left as-is
# #
# Post-deploy setup: # Post-deploy setup:
# 1. Access via plex.nook.family or port-forward :32400 # 1. Access via plex.nook.family or jellyfin.nook.family
# 2. Add libraries: # 2. Run the setup wizard: create admin account, add libraries:
# - Movies → /media/movies # - Movies → /media/movies
# - TV Shows → /media/tv/shows # - TV Shows → /media/tv/shows
# - Anime (TV Shows) → /media/tv/anime # - Anime → /media/tv/anime
# 3. Settings > Manage > Users & Sharing → create Plex Home managed users # 3. Dashboard → Users → Add User for each family member
# 4. Set content rating limits per child profile (G/PG/PG-13) # 4. Per user → Parental Controls → set max rating (PG-13 for Ben, PG for Chloe)
# 5. Enable PIN on adult profiles # 5. Per user → set PIN if desired
apiVersion: apps/v1 apiVersion: apps/v1
kind: Deployment kind: Deployment
metadata: metadata:
name: plex name: jellyfin
namespace: media namespace: media
labels: labels:
app: plex app: jellyfin
spec: spec:
replicas: 1 replicas: 1
strategy: strategy:
type: Recreate type: Recreate
selector: selector:
matchLabels: matchLabels:
app: plex app: jellyfin
template: template:
metadata: metadata:
labels: labels:
app: plex app: jellyfin
spec: spec:
containers: containers:
- name: plex - name: jellyfin
image: lscr.io/linuxserver/plex:latest image: lscr.io/linuxserver/jellyfin:latest
env: env:
- name: PUID - name: PUID
value: "1000" value: "1000"
@@ -43,19 +38,9 @@ spec:
value: "1000" value: "1000"
- name: TZ - name: TZ
value: "America/Chicago" value: "America/Chicago"
- name: VERSION
value: "docker"
- name: PLEX_CLAIM
valueFrom:
secretKeyRef:
name: media-secrets
key: PLEX_CLAIM
optional: true # safe after first boot
- name: ADVERTISE_IP
value: "https://plex.nook.family:443"
ports: ports:
- containerPort: 32400 - containerPort: 8096
name: plex name: http
volumeMounts: volumeMounts:
- name: config - name: config
mountPath: /config mountPath: /config
@@ -63,27 +48,27 @@ spec:
mountPath: /media mountPath: /media
resources: resources:
requests: requests:
memory: 1Gi memory: 512Mi
cpu: 500m cpu: 500m
limits: limits:
memory: 4Gi memory: 4Gi
cpu: 2000m cpu: 2000m
livenessProbe: livenessProbe:
httpGet: httpGet:
path: /identity path: /health
port: 32400 port: 8096
initialDelaySeconds: 60 initialDelaySeconds: 60
periodSeconds: 30 periodSeconds: 30
readinessProbe: readinessProbe:
httpGet: httpGet:
path: /identity path: /health
port: 32400 port: 8096
initialDelaySeconds: 30 initialDelaySeconds: 30
periodSeconds: 10 periodSeconds: 10
volumes: volumes:
- name: config - name: config
persistentVolumeClaim: persistentVolumeClaim:
claimName: plex-config claimName: jellyfin-config
- name: media - name: media
persistentVolumeClaim: persistentVolumeClaim:
claimName: media-data claimName: media-data
@@ -91,13 +76,13 @@ spec:
apiVersion: v1 apiVersion: v1
kind: Service kind: Service
metadata: metadata:
name: plex name: jellyfin
namespace: media namespace: media
spec: spec:
selector: selector:
app: plex app: jellyfin
ports: ports:
- name: plex - name: http
port: 32400 port: 8096
targetPort: 32400 targetPort: 8096
type: ClusterIP type: ClusterIP
+1 -1
View File
@@ -35,7 +35,7 @@ spec:
apiVersion: v1 apiVersion: v1
kind: PersistentVolumeClaim kind: PersistentVolumeClaim
metadata: metadata:
name: plex-config name: jellyfin-config
namespace: media namespace: media
spec: spec:
storageClassName: local-path storageClassName: local-path