From aacfa70c45bf1afb319d351325eddb324fe43fd9 Mon Sep 17 00:00:00 2001 From: kisfenyo Date: Tue, 16 Dec 2025 18:23:34 +0100 Subject: [PATCH] Initial commit: servarr-system manifests --- .gitignore | 14 + argocd-apps/homelab.yaml | 61 +++ servarr-system/servarr.yaml | 775 ++++++++++++++++++++++++++++++++++++ 3 files changed, 850 insertions(+) create mode 100644 .gitignore create mode 100644 argocd-apps/homelab.yaml create mode 100644 servarr-system/servarr.yaml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3010186 --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +# Never commit actual secrets +**/secrets.yaml +**/secrets/*.yaml +*.secret.yaml + +# Editor files +.idea/ +.vscode/ +*.swp +*.swo + +# OS files +.DS_Store +Thumbs.db diff --git a/argocd-apps/homelab.yaml b/argocd-apps/homelab.yaml new file mode 100644 index 0000000..17ac9c0 --- /dev/null +++ b/argocd-apps/homelab.yaml @@ -0,0 +1,61 @@ +--- +# ArgoCD Project for homelab applications +# Projects provide logical grouping and access control +apiVersion: argoproj.io/v1alpha1 +kind: AppProject +metadata: + name: homelab + namespace: argocd +spec: + description: Viktor's homelab applications + # Allow deploying to any namespace + destinations: + - namespace: '*' + server: https://kubernetes.default.svc + # Allow any cluster-scoped resources + clusterResourceWhitelist: + - group: '*' + kind: '*' + # Allow all namespaced resources + namespaceResourceWhitelist: + - group: '*' + kind: '*' + # Source repos this project can pull from + sourceRepos: + - https://gitea.dooplex.hu/viktor/homelab-manifests.git + - https://gitea.dooplex.hu/viktor/* +--- +# Servarr Application (sonarr, radarr, prowlarr, qbittorrent) +apiVersion: argoproj.io/v1alpha1 +kind: Application +metadata: + name: servarr + namespace: argocd + finalizers: + - resources-finalizer.argocd.argoproj.io +spec: + project: homelab + source: + repoURL: https://gitea.dooplex.hu/viktor/homelab-manifests.git + targetRevision: main + path: servarr-system + destination: + server: https://kubernetes.default.svc + namespace: servarr-system + syncPolicy: + # Start with manual sync until you're comfortable + # automated: + # prune: true + # selfHeal: true + # allowEmpty: false + syncOptions: + - CreateNamespace=true + - PruneLast=true + - ApplyOutOfSyncOnly=true + # Retry on transient failures + retry: + limit: 3 + backoff: + duration: 5s + factor: 2 + maxDuration: 3m diff --git a/servarr-system/servarr.yaml b/servarr-system/servarr.yaml new file mode 100644 index 0000000..40facd1 --- /dev/null +++ b/servarr-system/servarr.yaml @@ -0,0 +1,775 @@ +--- +apiVersion: v1 +kind: Namespace +metadata: + name: servarr-system + labels: + app.kubernetes.io/managed-by: argocd + app.kubernetes.io/name: preparr + app.kubernetes.io/instance: preparr +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: postgres-config + namespace: servarr-system + labels: + app.kubernetes.io/name: preparr + app.kubernetes.io/instance: preparr + app: postgres +data: + POSTGRES_USER: "postgres" + POSTGRES_PASSWORD: "postgres123" + POSTGRES_DB: "servarr" +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: prowlarr-config + namespace: servarr-system + labels: + app.kubernetes.io/name: preparr + app.kubernetes.io/instance: preparr + app: prowlarr +data: + prowlarr-config.json: | + {"apiKey":"c04914c6bfad445a3edc23e5edbca4d1","applications":[{"apiKey":"2bac5d00dca43258313c734821a15c4c","baseUrl":"http://sonarr.servarr-system.svc:8989","name":"Sonarr","prowlarrUrl":"http://prowlarr.servarr-system.svc:9696","syncLevel":"fullSync"},{"apiKey":"4fac7d10eca54269424d835a2edc15d2","baseUrl":"http://radarr.servarr-system.svc:7878","name":"Radarr","prowlarrUrl":"http://prowlarr.servarr-system.svc:9696","syncLevel":"fullSync"}],"indexers":[{"enable":true,"name":"nCore","priority":25}]} +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: qbittorrent-config + namespace: servarr-system + labels: + app.kubernetes.io/instance: preparr + app.kubernetes.io/name: preparr + app: qbittorrent +data: + qbittorrent-config.json: | + {} +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: radarr-config + namespace: servarr-system + labels: + app.kubernetes.io/name: preparr + app.kubernetes.io/instance: preparr + app: radarr +data: + radarr-config.json: | + {"apiKey":"4fac7d10eca54269424d835a2edc15d2","downloadClients":[{"configContract":"QBittorrentSettings","enable":true,"fields":[{"name":"host","value":"192.168.0.202"},{"name":"port","value":8080},{"name":"username","value":"admin"},{"name":"password","value":"doodooP4ssWD001!"},{"name":"category","value":"movies"}],"implementation":"QBittorrent","implementationName":"qBittorrent","name":"qBittorrent","priority":1}],"prowlarrSync":true,"qualityProfiles":[{"cutoff":1080,"items":[{"allowed":true,"quality":{"id":1,"name":"Bluray-1080p"}},{"allowed":true,"quality":{"id":2,"name":"WEBDL-1080p"}}],"name":"HD - 1080p","upgradeAllowed":true}],"rootFolders":[{"accessible":true,"path":"/movies"}]} +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: sonarr-config + namespace: servarr-system + labels: + app.kubernetes.io/name: preparr + app.kubernetes.io/instance: preparr + app: sonarr +data: + sonarr-config.json: | + {"apiKey":"2bac5d00dca43258313c734821a15c4c","downloadClients":[{"configContract":"QBittorrentSettings","enable":true,"fields":[{"name":"host","value":"192.168.0.202"},{"name":"port","value":8080},{"name":"username","value":"admin"},{"name":"password","value":"doodooP4ssWD001!"},{"name":"category","value":"tv"}],"implementation":"QBittorrent","implementationName":"qBittorrent","name":"qBittorrent","priority":1}],"prowlarrSync":true,"qualityProfiles":[{"cutoff":1080,"items":[{"allowed":true,"quality":{"id":1,"name":"HDTV-1080p"}},{"allowed":true,"quality":{"id":2,"name":"WEBDL-1080p"}}],"name":"HD - 1080p","upgradeAllowed":true}],"rootFolders":[{"accessible":true,"path":"/tv"}]} +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: radarr-config-pvc + namespace: servarr-system + labels: + app.kubernetes.io/name: preparr + app.kubernetes.io/instance: preparr + app: radarr +spec: + accessModes: + - ReadWriteOnce + storageClassName: longhorn + resources: + requests: + storage: 1Gi +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: sonarr-config-pvc + namespace: servarr-system + labels: + app.kubernetes.io/name: preparr + app.kubernetes.io/instance: preparr + app: sonarr +spec: + accessModes: + - ReadWriteOnce + storageClassName: longhorn + resources: + requests: + storage: 1Gi +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: qbittorrent-config-pvc + namespace: servarr-system + labels: + app.kubernetes.io/name: preparr + app.kubernetes.io/instance: preparr + app: qbittorrent +spec: + accessModes: + - ReadWriteOnce + storageClassName: longhorn + resources: + requests: + storage: 1Gi +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: prowlarr-config-pvc + namespace: servarr-system + labels: + app.kubernetes.io/name: preparr + app.kubernetes.io/instance: preparr + app: prowlarr +spec: + accessModes: + - ReadWriteOnce + storageClassName: longhorn + resources: + requests: + storage: 1Gi +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: postgres-pvc + namespace: servarr-system + labels: + app.kubernetes.io/name: preparr + app.kubernetes.io/instance: preparr + app: postgres +spec: + accessModes: + - ReadWriteOnce + storageClassName: longhorn + resources: + requests: + storage: 8Gi +--- +apiVersion: v1 +kind: Service +metadata: + name: postgres + namespace: servarr-system + labels: + app.kubernetes.io/name: preparr + app.kubernetes.io/instance: preparr + app: postgres +spec: + type: ClusterIP + selector: + app: postgres + ports: + - port: 5432 + targetPort: 5432 +--- +apiVersion: v1 +kind: Service +metadata: + name: prowlarr + namespace: servarr-system + labels: + app.kubernetes.io/name: preparr + app.kubernetes.io/instance: preparr + app: prowlarr + annotations: + external-dns.alpha.kubernetes.io/hostname: prowlarr.home +spec: + type: LoadBalancer + loadBalancerIP: 192.168.0.201 + selector: + app: prowlarr + ports: + - name: webui + port: 9696 + targetPort: 9696 + protocol: TCP +--- +apiVersion: v1 +kind: Service +metadata: + name: qbittorrent + namespace: servarr-system + labels: + app.kubernetes.io/name: preparr + app.kubernetes.io/instance: preparr + app: qbittorrent + annotations: + external-dns.alpha.kubernetes.io/hostname: qbittorrent.home +spec: + type: ClusterIP + selector: + app: qbittorrent + ports: + - name: webui + port: 8080 + targetPort: 8080 + - name: bittorrent + port: 6881 + targetPort: 6881 +--- +apiVersion: v1 +kind: Service +metadata: + name: radarr + namespace: servarr-system + labels: + app.kubernetes.io/name: preparr + app.kubernetes.io/instance: preparr + app: radarr + annotations: + external-dns.alpha.kubernetes.io/hostname: radarr.home +spec: + type: ClusterIP + selector: + app: radarr + ports: + - name: webui + port: 7878 + targetPort: 7878 + protocol: TCP +--- +apiVersion: v1 +kind: Service +metadata: + name: sonarr + namespace: servarr-system + labels: + app.kubernetes.io/name: preparr + app.kubernetes.io/instance: preparr + app: sonarr + annotations: + external-dns.alpha.kubernetes.io/hostname: sonarr.home +spec: + type: ClusterIP + selector: + app: sonarr + ports: + - name: webui + port: 8989 + targetPort: 8989 + protocol: TCP +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: postgres + namespace: servarr-system + labels: + app.kubernetes.io/name: preparr + app.kubernetes.io/instance: preparr + app: postgres +spec: + replicas: 1 + selector: + matchLabels: + app: postgres + template: + metadata: + labels: + app: postgres + spec: + containers: + - name: postgres + image: "postgres:16-alpine" + envFrom: + - configMapRef: + name: postgres-config + ports: + - containerPort: 5432 + resources: + limits: + cpu: 500m + memory: 512Mi + requests: + cpu: 100m + memory: 256Mi + volumeMounts: + - name: postgres-data + mountPath: /var/lib/postgresql/data + subPath: data + readinessProbe: + exec: + command: + - pg_isready + - -U + - postgres + initialDelaySeconds: 5 + periodSeconds: 5 + volumes: + - name: postgres-data + persistentVolumeClaim: + claimName: postgres-pvc +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: prowlarr + namespace: servarr-system + labels: + app.kubernetes.io/name: preparr + app.kubernetes.io/instance: preparr + app: prowlarr +spec: + replicas: 1 + selector: + matchLabels: + app: prowlarr + template: + metadata: + labels: + app: prowlarr + spec: + securityContext: + fsGroup: 1000 + initContainers: + - name: preparr-init + image: ghcr.io/robbeverhelst/preparr:latest + imagePullPolicy: IfNotPresent + env: + - name: POSTGRES_HOST + value: "postgres" + - name: POSTGRES_PORT + value: "5432" + - name: POSTGRES_USER + value: "postgres" + - name: POSTGRES_PASSWORD + valueFrom: + secretKeyRef: + name: preparr-postgresql + key: password + - name: POSTGRES_DB + value: "servarr" + - name: SERVARR_URL + value: "http://192.168.0.201:9696" + - name: SERVARR_TYPE + value: "prowlarr" + - name: SERVARR_ADMIN_USER + valueFrom: + secretKeyRef: + name: default-user + key: username + - name: SERVARR_ADMIN_PASSWORD + valueFrom: + secretKeyRef: + name: default-user + key: password + - name: SERVARR_API_KEY + value: "c04914c6bfad445a3edc23e5edbca4d1" + - name: CONFIG_PATH + value: "/tmp/config/prowlarr-config.json" + command: ["/bin/sh", "-c", "if [ ! -f /config/prowlarr-config.json ]; then cp /tmp/config/prowlarr-config.json /config/prowlarr-config.json; fi; bun run dist/index.js --init"] + volumeMounts: + - name: prowlarr-config-volume + mountPath: /config + - name: prowlarr-config-file + mountPath: /tmp/config + containers: + - name: prowlarr + image: "linuxserver/prowlarr:latest" + env: + - name: PUID + value: "1000" + - name: PGID + value: "1000" + - name: TZ + value: "Europe/Budapest" + ports: + - containerPort: 9696 + resources: + limits: + cpu: 500m + memory: 512Mi + requests: + cpu: 100m + memory: 256Mi + volumeMounts: + - name: prowlarr-config-volume + mountPath: /config + readinessProbe: + httpGet: + path: /api/v1/system/status + port: 9696 + httpHeaders: + - name: X-Api-Key + value: "c04914c6bfad445a3edc23e5edbca4d1" + initialDelaySeconds: 60 + periodSeconds: 10 + volumes: + - name: prowlarr-config-volume + persistentVolumeClaim: + claimName: prowlarr-config-pvc + - name: prowlarr-config-file + configMap: + name: prowlarr-config + items: + - key: prowlarr-config.json + path: prowlarr-config.json +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: qbittorrent + namespace: servarr-system + labels: + app.kubernetes.io/name: preparr + app.kubernetes.io/instance: preparr + app: qbittorrent +spec: + replicas: 1 + selector: + matchLabels: + app: qbittorrent + template: + metadata: + labels: + app: qbittorrent + spec: + initContainers: + - name: preparr-init + image: ghcr.io/robbeverhelst/preparr:latest + imagePullPolicy: IfNotPresent + securityContext: + runAsUser: 0 + runAsGroup: 0 + env: + - name: POSTGRES_HOST + value: "postgres" + - name: POSTGRES_PORT + value: "5432" + - name: POSTGRES_USER + value: "postgres" + - name: POSTGRES_PASSWORD + valueFrom: + secretKeyRef: + name: preparr-postgresql + key: password + - name: POSTGRES_DB + value: "servarr" + - name: SERVARR_TYPE + value: "qbittorrent" + - name: QBITTORRENT_USER + value: "admin" + - name: QBITTORRENT_PASSWORD + value: "doodooP4ssWD001!" + - name: SERVARR_ADMIN_USER + valueFrom: + secretKeyRef: + name: default-user + key: username + - name: SERVARR_ADMIN_PASSWORD + valueFrom: + secretKeyRef: + name: default-user + key: password + - name: QBITTORRENT_URL + value: "http://192.168.0.199:8080" + - name: CONFIG_PATH + value: "/config/qbittorrent-config.json" + - name: QBITTORRENT_DOWNLOADS_PATH + value: "/downloads" + command: ["/bin/sh", "-c", "if [ ! -f /config/qbittorrent-config.json ]; then cp /tmp/config/qbittorrent-config.json /config/qbittorrent-config.json; fi; bun run dist/index.js --init"] + volumeMounts: + - name: qbittorrent-config-volume + mountPath: /config + - name: qbittorrent-config-file + mountPath: /tmp/config + containers: + - name: qbittorrent + image: "linuxserver/qbittorrent:latest" + env: + - name: PUID + value: "1000" + - name: PGID + value: "1000" + - name: TZ + value: "Europe/Budapest" + - name: WEBUI_PORT + value: "8080" + - name: CONFIG_PATH + value: "/config/qbittorrent-config.json" + ports: + - containerPort: 8080 + - containerPort: 6881 + resources: + limits: + cpu: 1000m + memory: 1Gi + requests: + cpu: 100m + memory: 256Mi + volumeMounts: + - name: qbittorrent-config-volume + mountPath: /config + - mountPath: /mnt/2_hdd + name: 2hdd + - mountPath: /mnt/1_hdd + name: 1hdd + readinessProbe: + httpGet: + path: / + port: 8080 + initialDelaySeconds: 30 + periodSeconds: 10 + volumes: + - name: qbittorrent-config-volume + persistentVolumeClaim: + claimName: qbittorrent-config-pvc + - name: qbittorrent-config-file + configMap: + name: qbittorrent-config + items: + - key: qbittorrent-config.json + path: qbittorrent-config.json + - hostPath: + path: /mnt/2_hdd + type: Directory + name: 2hdd + - hostPath: + path: /mnt/1_hdd + type: Directory + name: 1hdd +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: radarr + namespace: servarr-system + labels: + app.kubernetes.io/name: preparr + app.kubernetes.io/instance: preparr + app: radarr +spec: + replicas: 1 + selector: + matchLabels: + app: radarr + template: + metadata: + labels: + app: radarr + spec: + securityContext: + fsGroup: 1000 + initContainers: + - name: preparr-init + image: ghcr.io/robbeverhelst/preparr:latest + imagePullPolicy: IfNotPresent + env: + - name: POSTGRES_HOST + value: "postgres" + - name: POSTGRES_PORT + value: "5432" + - name: POSTGRES_USER + value: "postgres" + - name: POSTGRES_PASSWORD + valueFrom: + secretKeyRef: + name: preparr-postgresql + key: password + - name: POSTGRES_DB + value: "servarr" + - name: SERVARR_URL + value: "http://192.168.0.203:7878" + - name: SERVARR_TYPE + value: "radarr" + - name: SERVARR_ADMIN_USER + valueFrom: + secretKeyRef: + name: default-user + key: username + - name: SERVARR_ADMIN_PASSWORD + valueFrom: + secretKeyRef: + name: default-user + key: password + - name: SERVARR_API_KEY + value: "4fac7d10eca54269424d835a2edc15d2" + - name: CONFIG_PATH + value: "/config/radarr-config.json" + command: ["/bin/sh", "-c", "if [ ! -f /config/radarr-config.json ]; then cp /tmp/config/radarr-config.json /config/radarr-config.json; fi; bun run dist/index.js --init"] + volumeMounts: + - name: radarr-config-volume + mountPath: /config + - name: radarr-config-file + mountPath: /tmp/config + - mountPath: /mnt/2_hdd + name: 2hdd + containers: + - name: radarr + image: "linuxserver/radarr:latest" + env: + - name: PUID + value: "1000" + - name: PGID + value: "1000" + - name: TZ + value: "Europe/Budapest" + ports: + - containerPort: 7878 + resources: + limits: + cpu: 500m + memory: 512Mi + requests: + cpu: 100m + memory: 256Mi + volumeMounts: + - name: radarr-config-volume + mountPath: /config + - mountPath: /mnt/2_hdd + name: 2hdd + readinessProbe: + httpGet: + path: /api/v3/system/status + port: 7878 + httpHeaders: + - name: X-Api-Key + value: "4fac7d10eca54269424d835a2edc15d2" + initialDelaySeconds: 60 + periodSeconds: 10 + volumes: + - name: radarr-config-volume + persistentVolumeClaim: + claimName: radarr-config-pvc + - name: radarr-config-file + configMap: + name: radarr-config + items: + - key: radarr-config.json + path: radarr-config.json + - hostPath: + path: /mnt/2_hdd + type: Directory + name: 2hdd +--- +# Source: preparr/templates/sonarr.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: sonarr + namespace: servarr-system + labels: + app.kubernetes.io/name: preparr + app.kubernetes.io/instance: preparr + app: sonarr +spec: + replicas: 1 + selector: + matchLabels: + app: sonarr + template: + metadata: + labels: + app: sonarr + spec: + securityContext: + fsGroup: 1000 + initContainers: + - name: preparr-init + image: ghcr.io/robbeverhelst/preparr:latest + imagePullPolicy: IfNotPresent + env: + - name: POSTGRES_HOST + value: "postgres" + - name: POSTGRES_PORT + value: "5432" + - name: POSTGRES_USER + value: "postgres" + - name: POSTGRES_PASSWORD + valueFrom: + secretKeyRef: + name: preparr-postgresql + key: password + - name: POSTGRES_DB + value: "servarr" + - name: SERVARR_URL + value: "http://192.168.0.202:8989" + - name: SERVARR_TYPE + value: "sonarr" + - name: SERVARR_ADMIN_USER + valueFrom: + secretKeyRef: + name: default-user + key: username + - name: SERVARR_ADMIN_PASSWORD + valueFrom: + secretKeyRef: + name: default-user + key: password + - name: SERVARR_API_KEY + value: "2bac5d00dca43258313c734821a15c4c" + - name: CONFIG_PATH + value: "/config/sonarr-config.json" + command: ["/bin/sh", "-c", "if [ ! -f /config/sonarr-config.json ]; then cp /tmp/config/sonarr-config.json /config/sonarr-config.json; fi; bun run dist/index.js --init"] + volumeMounts: + - name: sonarr-config-volume + mountPath: /config + - name: sonarr-config-file + mountPath: /tmp/config + - mountPath: /mnt/1_hdd + name: 1hdd + containers: + - name: sonarr + image: "linuxserver/sonarr:latest" + imagePullPolicy: IfNotPresent + env: + - name: PUID + value: "1000" + - name: PGID + value: "1000" + - name: TZ + value: "Europe/Budapest" + ports: + - name: webui + containerPort: 8989 + protocol: TCP + resources: + limits: + cpu: 500m + memory: 512Mi + requests: + cpu: 100m + memory: 256Mi + volumeMounts: + - name: sonarr-config-volume + mountPath: /config + - mountPath: /mnt/1_hdd + name: 1hdd + readinessProbe: + httpGet: + path: /api/v3/system/status + port: 8989 + httpHeaders: + - name: X-Api-Key + value: "2bac5d00dca43258313c734821a15c4c" + initialDelaySeconds: 60 + periodSeconds: 10 + volumes: + - name: sonarr-config-volume + persistentVolumeClaim: + claimName: sonarr-config-pvc + - name: sonarr-config-file + configMap: + name: sonarr-config + items: + - key: sonarr-config.json + path: sonarr-config.json + - hostPath: + path: /mnt/1_hdd + type: Directory + name: 1hdd +---