Kubernetes
For most Kubernetes deployments, the Helm chart is recommended. This guide covers raw manifest deployment for users who prefer direct control.
Prerequisites
Section titled “Prerequisites”- Kubernetes 1.19+
- kubectl configured for your cluster
- PostgreSQL (in-cluster or external)
Manifests
Section titled “Manifests”Namespace and Secret
Section titled “Namespace and Secret”apiVersion: v1kind: Namespacemetadata: name: media-stack---apiVersion: v1kind: Secretmetadata: name: postgres-secret namespace: media-stacktype: Opaquedata: password: cG9zdGdyZXMxMjM= # base64 encodedConfigMap
Section titled “ConfigMap”apiVersion: v1kind: ConfigMapmetadata: name: sonarr-config namespace: media-stackdata: sonarr-config.json: | { "rootFolders": [ { "path": "/tv", "accessible": true } ], "qualityProfiles": [ { "name": "HD - 1080p", "cutoff": 1080, "items": [ { "quality": { "id": 1, "name": "HDTV-1080p" }, "allowed": true }, { "quality": { "id": 2, "name": "WEBDL-1080p" }, "allowed": true } ] } ] }Deployment
Section titled “Deployment”apiVersion: apps/v1kind: Deploymentmetadata: name: sonarr namespace: media-stackspec: replicas: 1 selector: matchLabels: app: sonarr template: metadata: labels: app: sonarr spec: initContainers: - name: preparr-init image: ghcr.io/robbeverhelst/preparr:latest command: ["bun", "run", "dist/index.js", "--init"] env: - name: POSTGRES_HOST value: "postgres-service" - name: POSTGRES_PASSWORD valueFrom: secretKeyRef: name: postgres-secret key: password - name: SERVARR_URL value: "http://localhost:8989" - name: SERVARR_TYPE value: "sonarr" - name: SERVARR_ADMIN_PASSWORD value: "adminpass" - name: CONFIG_PATH value: "/config/sonarr-config.json" volumeMounts: - name: sonarr-config-volume mountPath: /config - name: config-json mountPath: /config/sonarr-config.json subPath: sonarr-config.json
containers: - name: sonarr image: linuxserver/sonarr:latest ports: - containerPort: 8989 env: - name: PUID value: "1000" - name: PGID value: "1000" volumeMounts: - name: sonarr-config-volume mountPath: /config - name: tv-storage mountPath: /tv livenessProbe: httpGet: path: / port: 8989 initialDelaySeconds: 60 periodSeconds: 30
- name: preparr-sidecar image: ghcr.io/robbeverhelst/preparr:latest ports: - containerPort: 9001 name: health env: - name: POSTGRES_HOST value: "postgres-service" - name: POSTGRES_PASSWORD valueFrom: secretKeyRef: name: postgres-secret key: password - name: SERVARR_URL value: "http://localhost:8989" - name: SERVARR_TYPE value: "sonarr" - name: SERVARR_ADMIN_PASSWORD value: "adminpass" - name: CONFIG_PATH value: "/config/sonarr-config.json" - name: CONFIG_WATCH value: "true" - name: HEALTH_PORT value: "9001" volumeMounts: - name: sonarr-config-volume mountPath: /config - name: config-json mountPath: /config/sonarr-config.json subPath: sonarr-config.json livenessProbe: httpGet: path: /health/live port: 9001 initialDelaySeconds: 30 periodSeconds: 30 readinessProbe: httpGet: path: /health/ready port: 9001 initialDelaySeconds: 10 periodSeconds: 10
volumes: - name: sonarr-config-volume emptyDir: {} - name: config-json configMap: name: sonarr-config - name: tv-storage persistentVolumeClaim: claimName: tv-pvcService
Section titled “Service”apiVersion: v1kind: Servicemetadata: name: sonarr-service namespace: media-stackspec: selector: app: sonarr ports: - name: http port: 8989 targetPort: 8989 - name: health port: 9001 targetPort: 9001Updating Configuration
Section titled “Updating Configuration”# Update the ConfigMapkubectl apply -f sonarr-configmap.yaml
# Restart the deployment to pick up changeskubectl rollout restart deployment/sonarr -n media-stackCommon Commands
Section titled “Common Commands”# Check pod statuskubectl get pods -n media-stack
# View init container logskubectl logs -n media-stack deployment/sonarr -c preparr-init
# View sidecar logskubectl logs -n media-stack deployment/sonarr -c preparr-sidecar -f
# Port forward for local accesskubectl port-forward -n media-stack svc/sonarr-service 8989:8989