duplicati.yaml 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. ---
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5. name: duplicati
  6. namespace: plex
  7. spec:
  8. strategy:
  9. type: Recreate
  10. selector:
  11. matchLabels:
  12. app: duplicati
  13. replicas: 1
  14. template:
  15. metadata:
  16. labels:
  17. app: duplicati
  18. annotations:
  19. backup.velero.io/backup-volumes-excludes: plex,media2,data
  20. spec:
  21. containers:
  22. - name: duplicati
  23. image: lscr.io/linuxserver/duplicati:2.2.0
  24. ports:
  25. - containerPort: 8200
  26. name: http-web-svc
  27. env:
  28. - name: TZ
  29. value: Etc/UTC
  30. - name: PUID
  31. value: "1000"
  32. - name: PGID
  33. value: "1000"
  34. - name: DUPLICATI__WEBSERVICE_PASSWORD
  35. valueFrom:
  36. secretKeyRef:
  37. name: duplicati
  38. key: DUPLICATI__WEBSERVICE_PASSWORD
  39. - name: SETTINGS_ENCRYPTION_KEY
  40. valueFrom:
  41. secretKeyRef:
  42. name: duplicati
  43. key: DUPLICATI__WEBSERVICE_PASSWORD
  44. volumeMounts:
  45. - mountPath: "/plex"
  46. name: plex
  47. - mountPath: "/media2"
  48. name: media2
  49. - mountPath: "/data"
  50. name: data
  51. - mountPath: "/config"
  52. name: config
  53. volumes:
  54. - name: plex
  55. persistentVolumeClaim:
  56. claimName: plex-pvc
  57. - name: media2
  58. persistentVolumeClaim:
  59. claimName: media2-pvc
  60. - name: data
  61. persistentVolumeClaim:
  62. claimName: data-ec-pvc
  63. - name: config
  64. persistentVolumeClaim:
  65. claimName: duplicati-pvc
  66. ---
  67. apiVersion: v1
  68. kind: Service
  69. metadata:
  70. name: duplicati-service
  71. namespace: plex
  72. spec:
  73. selector:
  74. app: duplicati
  75. type: ClusterIP
  76. ports:
  77. - name: duplicati-web-port
  78. protocol: TCP
  79. port: 8200
  80. targetPort: http-web-svc
  81. ---
  82. apiVersion: batch/v1
  83. kind: CronJob
  84. metadata:
  85. name: duplicati-run-tree
  86. namespace: plex
  87. spec:
  88. schedule: "0 0 * * 0"
  89. jobTemplate:
  90. spec:
  91. template:
  92. spec:
  93. containers:
  94. - name: tree
  95. image: alpine:3.18.4
  96. imagePullPolicy: IfNotPresent
  97. env:
  98. - name: NTFY_AUTH
  99. valueFrom:
  100. secretKeyRef:
  101. name: duplicati
  102. key: NTFY_AUTH
  103. command:
  104. - /bin/sh
  105. - -c
  106. - (tree /plex > /plex/tree.txt && tree /media2 > /media2/tree.txt) || curl -u $NTFY_AUTH -d 'error generating media tree' https://ntfy.jibby.org/media-tree
  107. volumeMounts:
  108. - mountPath: "/plex"
  109. name: plex
  110. - mountPath: "/media2"
  111. name: media2
  112. volumes:
  113. - name: plex
  114. persistentVolumeClaim:
  115. claimName: plex-pvc
  116. - name: media2
  117. persistentVolumeClaim:
  118. claimName: media2-pvc
  119. restartPolicy: OnFailure
  120. ---
  121. apiVersion: networking.k8s.io/v1
  122. kind: Ingress
  123. metadata:
  124. name: duplicati
  125. namespace: plex
  126. annotations:
  127. traefik.ingress.kubernetes.io/router.entrypoints: websecure
  128. traefik.ingress.kubernetes.io/router.middlewares: kube-system-lanonly@kubernetescrd
  129. spec:
  130. rules:
  131. - host: duplicati.lan.jibby.org
  132. http:
  133. paths:
  134. - path: /
  135. pathType: Prefix
  136. backend:
  137. service:
  138. name: duplicati-service
  139. port:
  140. number: 8200
  141. ---
  142. apiVersion: external-secrets.io/v1
  143. kind: ExternalSecret
  144. metadata:
  145. name: duplicati
  146. namespace: plex
  147. spec:
  148. target:
  149. name: duplicati
  150. deletionPolicy: Delete
  151. template:
  152. type: Opaque
  153. data:
  154. DUPLICATI__WEBSERVICE_PASSWORD: |-
  155. {{ .password }}
  156. NTFY_AUTH: |-
  157. {{ .ntfyuser }}:{{ .ntfypass }}
  158. data:
  159. - secretKey: password
  160. sourceRef:
  161. storeRef:
  162. name: bitwarden-login
  163. kind: ClusterSecretStore
  164. remoteRef:
  165. key: 15ef8c69-b0ed-4ca0-8871-b33b003c29de
  166. property: password
  167. - secretKey: ntfyuser
  168. sourceRef:
  169. storeRef:
  170. name: bitwarden-login
  171. kind: ClusterSecretStore
  172. remoteRef:
  173. key: 674fbf3d-531a-4ca6-afec-b1d7012d1a8a
  174. property: username
  175. - secretKey: ntfypass
  176. sourceRef:
  177. storeRef:
  178. name: bitwarden-login
  179. kind: ClusterSecretStore
  180. remoteRef:
  181. key: 674fbf3d-531a-4ca6-afec-b1d7012d1a8a
  182. property: password