--- # Seeds the directory skeleton on the freshly created mediastore subvolume so # the arrs, nzbget and both jellyfins mount subPaths that already exist and are # owned by uid/gid 1000 (the uid every arrstack media pod runs as). mkdir -p is # idempotent, so re-running it on every sync is harmless and self-heals a tree # someone deleted by hand. # # Sync hook with BeforeHookCreation delete: ArgoCD replaces the completed Job # each sync instead of failing on the immutable pod template. No sync-wave is # needed -- the PVC applies in the same wave and the pod simply stays Pending # until it binds. apiVersion: batch/v1 kind: Job metadata: name: mediastore-bootstrap namespace: arrstack annotations: argocd.argoproj.io/hook: Sync argocd.argoproj.io/hook-delete-policy: BeforeHookCreation spec: backoffLimit: 6 ttlSecondsAfterFinished: 600 template: metadata: labels: app: mediastore-bootstrap spec: serviceAccountName: default automountServiceAccountToken: false restartPolicy: Never securityContext: runAsNonRoot: true runAsUser: 1000 runAsGroup: 1000 fsGroup: 1000 fsGroupChangePolicy: OnRootMismatch seccompProfile: type: RuntimeDefault containers: - name: mkdir image: docker.io/library/alpine:3 imagePullPolicy: IfNotPresent command: - sh - -c - | set -eu mkdir -p \ /media/fafflix/tvseries \ /media/fafflix/movies \ /media/cheeztv/tvseries \ /media/cheeztv/movies \ /media/nzbget/downloads/complete ls -la /media volumeMounts: - name: mediastore mountPath: /media securityContext: allowPrivilegeEscalation: false readOnlyRootFilesystem: true capabilities: drop: - ALL resources: requests: cpu: 10m memory: 32Mi limits: cpu: 200m memory: 128Mi volumes: - name: mediastore persistentVolumeClaim: claimName: mediastore