fix: corrected ApplicationSet template, drop secret stubs from manifests

- appset: goTemplate, filename-based app names, .path.path IS the directory,
  exclude apps/root from the glob (v3.5 git files-generator schema)
- remove empty Secret stubs: with prune:true they would overwrite live
  secret values (openwebui, paperless, vaultwarden-admin-token, password)
- secrets stay cluster-managed, not in git
This commit is contained in:
2026-08-28 16:15:08 -03:00
parent 35a65fe436
commit 510e18e5dc
17 changed files with 2138 additions and 5 deletions
+150
View File
@@ -0,0 +1,150 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: archivebox
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: archivebox
strategy:
type: Recreate
template:
metadata:
labels:
app: archivebox
spec:
containers:
- env:
- name: SONIC_HOST
value: sonic.default.svc.cluster.local
- name: SONIC_PORT
value: '1491'
- name: SEARCH_BACKEND_ENGINE
value: sonic
- name: SONIC_PASSWORD
valueFrom:
secretKeyRef:
key: password
name: password
- name: ADMIN_USERNAME
value: ivanch
- name: ADMIN_PASSWORD
valueFrom:
secretKeyRef:
key: password
name: password
- name: CSRF_TRUSTED_ORIGINS
value: archive.haven
- name: ALLOWED_HOSTS
value: '*'
- name: PUBLIC_ADD_VIEW
value: 'false'
image: archivebox/archivebox:latest
imagePullPolicy: Always
name: archivebox
ports:
- containerPort: 8000
protocol: TCP
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /data
name: archivebox-data
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
volumes:
- name: archivebox-data
persistentVolumeClaim:
claimName: archivebox-data
status:
availableReplicas: 1
conditions:
- lastTransitionTime: '2026-05-19T01:51:47Z'
lastUpdateTime: '2026-07-22T10:14:38Z'
message: ReplicaSet "archivebox-bb7f58db4" has successfully progressed.
reason: NewReplicaSetAvailable
status: 'True'
type: Progressing
- lastTransitionTime: '2026-08-28T06:04:13Z'
lastUpdateTime: '2026-08-28T06:04:13Z'
message: Deployment has minimum availability.
reason: MinimumReplicasAvailable
status: 'True'
type: Available
observedGeneration: 94
readyReplicas: 1
replicas: 1
terminatingReplicas: 0
updatedReplicas: 1
---
apiVersion: v1
kind: Service
metadata:
name: archivebox-svc
namespace: default
spec:
internalTrafficPolicy: Cluster
ipFamilies:
- IPv4
ipFamilyPolicy: SingleStack
ports:
- port: 8000
protocol: TCP
targetPort: 8000
selector:
app: archivebox
sessionAffinity: None
type: ClusterIP
status:
loadBalancer: {}
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: archivebox-ingress
namespace: default
spec:
ingressClassName: nginx
rules:
- host: archive.haven
http:
paths:
- backend:
service:
name: archivebox-svc
port:
number: 8000
path: /
pathType: Prefix
status:
loadBalancer:
ingress:
- ip: 192.168.20.204
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: archivebox-data
namespace: default
spec:
accessModes:
- ReadWriteOnce
resources:
limits:
storage: 30Gi
requests:
storage: 10Gi
storageClassName: nfs-client
volumeMode: Filesystem
status:
accessModes:
- ReadWriteOnce
capacity:
storage: 10Gi
phase: Bound
+189
View File
@@ -0,0 +1,189 @@
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app.kubernetes.io/name: changedetection
name: changedetection
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: changedetection
strategy:
type: Recreate
template:
metadata:
labels:
app.kubernetes.io/name: changedetection
spec:
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- preference:
matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- iris
weight: 100
containers:
- env:
- name: PUID
value: '1000'
- name: PGID
value: '1000'
- name: TZ
value: Etc/UTC
- name: BASE_URL
value: http://change.haven/
- name: PLAYWRIGHT_DRIVER_URL
value: ws://localhost:3000
image: lscr.io/linuxserver/changedetection.io:latest
imagePullPolicy: Always
name: changedetection
ports:
- containerPort: 5000
name: http
protocol: TCP
resources:
limits:
cpu: '2'
memory: 1Gi
requests:
cpu: 100m
memory: 256Mi
securityContext:
allowPrivilegeEscalation: false
runAsUser: 0
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /config
name: config
- env:
- name: SCREEN_WIDTH
value: '1920'
- name: SCREEN_HEIGHT
value: '1024'
- name: SCREEN_DEPTH
value: '16'
- name: MAX_CONCURRENT_CHROME_PROCESSES
value: '10'
image: dgtlmoon/sockpuppetbrowser:latest
imagePullPolicy: Always
name: browser-sockpuppet-chrome
ports:
- containerPort: 3000
name: ws
protocol: TCP
resources: {}
securityContext:
allowPrivilegeEscalation: false
capabilities:
add:
- SYS_ADMIN
drop:
- ALL
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
volumes:
- name: config
persistentVolumeClaim:
claimName: changedetection-config
status:
availableReplicas: 1
conditions:
- lastTransitionTime: '2026-08-04T16:20:08Z'
lastUpdateTime: '2026-08-04T16:32:45Z'
message: ReplicaSet "changedetection-77cd668cf4" has successfully progressed.
reason: NewReplicaSetAvailable
status: 'True'
type: Progressing
- lastTransitionTime: '2026-08-28T06:05:12Z'
lastUpdateTime: '2026-08-28T06:05:12Z'
message: Deployment has minimum availability.
reason: MinimumReplicasAvailable
status: 'True'
type: Available
observedGeneration: 22
readyReplicas: 1
replicas: 1
terminatingReplicas: 0
updatedReplicas: 1
---
apiVersion: v1
kind: Service
metadata:
labels:
app.kubernetes.io/name: changedetection
name: changedetection
namespace: default
spec:
internalTrafficPolicy: Cluster
ipFamilies:
- IPv4
ipFamilyPolicy: SingleStack
ports:
- name: http
port: 5000
protocol: TCP
targetPort: http
selector:
app.kubernetes.io/name: changedetection
sessionAffinity: None
type: ClusterIP
status:
loadBalancer: {}
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
labels:
app.kubernetes.io/name: changedetection
name: changedetection
namespace: default
spec:
ingressClassName: nginx
rules:
- host: change.haven
http:
paths:
- backend:
service:
name: changedetection
port:
number: 5000
path: /
pathType: Prefix
status:
loadBalancer:
ingress:
- ip: 192.168.20.204
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: changedetection-config
namespace: default
spec:
accessModes:
- ReadWriteOnce
resources:
limits:
storage: 2Gi
requests:
storage: 1Gi
storageClassName: nfs-client
volumeMode: Filesystem
status:
accessModes:
- ReadWriteOnce
capacity:
storage: 1Gi
phase: Bound
+171
View File
@@ -0,0 +1,171 @@
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app.kubernetes.io/name: havenllo
name: havenllo
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: havenllo
strategy:
type: Recreate
template:
metadata:
labels:
app.kubernetes.io/name: havenllo
spec:
containers:
- env:
- name: HAVENLLO_DATABASE_PATH
value: /data/havenllo.db
- name: HAVENLLO_LISTEN_ADDR
value: :8080
image: git.ivanch.me/ivanch/havenllo:latest
imagePullPolicy: Always
livenessProbe:
failureThreshold: 3
httpGet:
path: /api/health
port: http
scheme: HTTP
initialDelaySeconds: 10
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 2
name: havenllo
ports:
- containerPort: 8080
name: http
protocol: TCP
readinessProbe:
failureThreshold: 3
httpGet:
path: /api/health
port: http
scheme: HTTP
initialDelaySeconds: 2
periodSeconds: 5
successThreshold: 1
timeoutSeconds: 2
resources:
limits:
cpu: 500m
memory: 256Mi
requests:
cpu: 50m
memory: 64Mi
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
readOnlyRootFilesystem: true
runAsUser: 0
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /data
name: data
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
volumes:
- name: data
persistentVolumeClaim:
claimName: havenllo-data
status:
availableReplicas: 1
conditions:
- lastTransitionTime: '2026-07-14T13:21:13Z'
lastUpdateTime: '2026-07-21T21:06:45Z'
message: ReplicaSet "havenllo-5d4f8ccb4f" has successfully progressed.
reason: NewReplicaSetAvailable
status: 'True'
type: Progressing
- lastTransitionTime: '2026-08-28T06:04:17Z'
lastUpdateTime: '2026-08-28T06:04:17Z'
message: Deployment has minimum availability.
reason: MinimumReplicasAvailable
status: 'True'
type: Available
observedGeneration: 41
readyReplicas: 1
replicas: 1
terminatingReplicas: 0
updatedReplicas: 1
---
apiVersion: v1
kind: Service
metadata:
labels:
app.kubernetes.io/name: havenllo
name: havenllo
namespace: default
spec:
internalTrafficPolicy: Cluster
ipFamilies:
- IPv4
ipFamilyPolicy: SingleStack
ports:
- name: http
port: 8080
protocol: TCP
targetPort: 8080
selector:
app.kubernetes.io/name: havenllo
sessionAffinity: None
type: ClusterIP
status:
loadBalancer: {}
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: havenllo
namespace: default
spec:
ingressClassName: nginx-https
rules:
- host: havenllo.haven
http:
paths:
- backend:
service:
name: havenllo
port:
number: 8080
path: /
pathType: Prefix
tls:
- hosts:
- havenllo.haven
secretName: havenllo-tls
status:
loadBalancer:
ingress:
- ip: 192.168.20.204
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: havenllo-data
namespace: default
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: nfs-client
volumeMode: Filesystem
status:
accessModes:
- ReadWriteOnce
capacity:
storage: 1Gi
phase: Bound
+226
View File
@@ -0,0 +1,226 @@
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app.kubernetes.io/name: homepage
name: homepage
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: homepage
strategy:
type: Recreate
template:
metadata:
labels:
app.kubernetes.io/name: homepage
spec:
automountServiceAccountToken: true
containers:
- env:
- name: POD_IP
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: status.podIP
- name: HOMEPAGE_ALLOWED_HOSTS
value: '*'
image: ghcr.io/gethomepage/homepage:latest
imagePullPolicy: Always
livenessProbe:
failureThreshold: 3
httpGet:
path: /
port: 3000
scheme: HTTP
initialDelaySeconds: 30
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1
name: homepage
ports:
- containerPort: 3000
name: http
protocol: TCP
readinessProbe:
failureThreshold: 3
httpGet:
path: /
port: 3000
scheme: HTTP
initialDelaySeconds: 5
periodSeconds: 5
successThreshold: 1
timeoutSeconds: 1
resources:
limits:
cpu: 500m
memory: 512Mi
requests:
cpu: 100m
memory: 128Mi
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /app/config/logs
name: logs
- mountPath: /app/config
name: homepage-config
- mountPath: /app/public/images
name: homepage-config
subPath: images
dnsPolicy: ClusterFirst
enableServiceLinks: true
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
serviceAccount: homepage
serviceAccountName: homepage
terminationGracePeriodSeconds: 30
volumes:
- name: homepage-config
persistentVolumeClaim:
claimName: homepage-config
- emptyDir: {}
name: logs
status:
availableReplicas: 1
conditions:
- lastTransitionTime: '2026-05-19T01:51:47Z'
lastUpdateTime: '2026-08-17T09:07:50Z'
message: ReplicaSet "homepage-7b47bf67fb" has successfully progressed.
reason: NewReplicaSetAvailable
status: 'True'
type: Progressing
- lastTransitionTime: '2026-08-28T06:04:23Z'
lastUpdateTime: '2026-08-28T06:04:23Z'
message: Deployment has minimum availability.
reason: MinimumReplicasAvailable
status: 'True'
type: Available
observedGeneration: 96
readyReplicas: 1
replicas: 1
terminatingReplicas: 0
updatedReplicas: 1
---
apiVersion: v1
kind: Service
metadata:
labels:
app.kubernetes.io/name: homepage
name: homepage
namespace: default
spec:
internalTrafficPolicy: Cluster
ipFamilies:
- IPv4
ipFamilyPolicy: SingleStack
ports:
- name: http
port: 3000
protocol: TCP
targetPort: http
selector:
app.kubernetes.io/name: homepage
sessionAffinity: None
type: ClusterIP
status:
loadBalancer: {}
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
labels:
app.kubernetes.io/name: homepage
name: homepage
namespace: default
spec:
ingressClassName: nginx
rules:
- host: homepage.haven
http:
paths:
- backend:
service:
name: homepage
port:
number: 3000
path: /
pathType: Prefix
status:
loadBalancer:
ingress:
- ip: 192.168.20.204
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: homepage-config
namespace: default
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
storageClassName: nfs-client
volumeMode: Filesystem
status:
accessModes:
- ReadWriteMany
capacity:
storage: 1Gi
phase: Bound
---
apiVersion: v1
data:
bookmarks.yaml: "- Developer:\n - Github:\n - abbr: GH\n href:\
\ https://github.com/\n"
custom.css: ''
custom.js: ''
docker.yaml: ''
kubernetes.yaml: 'mode: cluster
'
services.yaml: "- Essentials:\n - AdGuard Home:\n href: http://adguard.haven/\n\
\ icon: adguard-home\n widget:\n type: adguard\n \
\ url: http://adguard.haven/\n username: ivanch\n password:\
\ ESVEPnull\n - AdGuard Home 2:\n href: http://adguard2.haven/\n \
\ icon: adguard-home\n widget:\n type: adguard\n \
\ url: http://adguard2.haven/\n username: ivanch\n password:\
\ ESVEPnull\n - Home Assistant:\n href: http://homeassistant.haven/\n\
\ - Traefik:\n href: http://traefik.haven/\n - Dockge:\n href:\
\ http://dockge.haven/\n - Proxmox:\n href: https://proxmox.haven:8006/\n\
\ widget:\n type: proxmox\n url: https://proxmox.haven:8006/\n\
\ token: homepage@pam!token\n secret: 7cadfc2d-560a-4bb4-8d5f-a29f394bc9a0\n\
\n- Media:\n - Jellyfin:\n href: http://tv.haven/\n icon: jellyfin.png\n\
\ widget:\n type: jellyfin\n url: http://tv.haven/\n\
\ key: c933070d9c8341bf8c64e7a792aaa6b9\n enableBlocks: true\n\
\ enableNowPlaying: true\n - Sonarr:\n href: http://sonarr.haven/\n\
\ - Radarr:\n href: http://radarr.haven/\n - Prowlarr:\n href:\
\ http://prowlarr.haven/\n\n- Storage:\n - Transmission:\n href: http://transmission.haven/\n\
\ - qBitTorrent:\n href: http://qbittorrent.haven/\n - OpenMediaVault:\n\
\ href: http://omv.haven/\n - ArchiveBox:\n href: http://archive.haven/\n\
\ - FileBrowser:\n href: http://files.haven/\n - Paperless:\n \
\ href: http://paperless.haven/\n\n- Other:\n - Uptime Kuma:\n href:\
\ http://uptimekuma.haven/\n - WireGuard:\n href: http://vpn.haven/\n\
\ - Beszel:\n href: http://beszel.haven/\n\n- Zephyr:\n - Gitea:\n\
\ href: http://gitea.ivanch.me/\n - Portainer:\n href: http://portainer.ivanch.me/\n\
\ - Nginx Proxy Manager:\n href: http://manager.ivanch.me/\n - Homepage:\n\
\ href: http://ivanch.me/\n"
settings.yaml: ''
widgets.yaml: "- kubernetes:\n cluster:\n show: true\n cpu: true\n\
\ memory: true\n # network: true\n showLabel: true\n label:\
\ \"Haven\"\n nodes:\n show: true\n cpu: true\n memory: true\n\
\ showLabel: true\n- resources:\n backend: resources\n expanded: true\n\
\ cpu: true\n memory: true\n network: default\n- search:\n provider:\
\ duckduckgo\n target: _blank\n"
kind: ConfigMap
metadata:
labels:
app.kubernetes.io/name: homepage
name: homepage
namespace: default
+106
View File
@@ -0,0 +1,106 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: it-tools
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: it-tools
strategy:
type: Recreate
template:
metadata:
labels:
app: it-tools
spec:
containers:
- image: corentinth/it-tools:latest
imagePullPolicy: Always
name: it-tools
ports:
- containerPort: 80
protocol: TCP
readinessProbe:
failureThreshold: 3
httpGet:
path: /
port: 80
scheme: HTTP
initialDelaySeconds: 5
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
status:
availableReplicas: 1
conditions:
- lastTransitionTime: '2026-05-19T01:51:47Z'
lastUpdateTime: '2026-07-22T10:14:45Z'
message: ReplicaSet "it-tools-6fc797dd48" has successfully progressed.
reason: NewReplicaSetAvailable
status: 'True'
type: Progressing
- lastTransitionTime: '2026-08-28T06:04:26Z'
lastUpdateTime: '2026-08-28T06:04:26Z'
message: Deployment has minimum availability.
reason: MinimumReplicasAvailable
status: 'True'
type: Available
observedGeneration: 93
readyReplicas: 1
replicas: 1
terminatingReplicas: 0
updatedReplicas: 1
---
apiVersion: v1
kind: Service
metadata:
name: it-tools-svc
namespace: default
spec:
internalTrafficPolicy: Cluster
ipFamilies:
- IPv4
ipFamilyPolicy: SingleStack
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: it-tools
sessionAffinity: None
type: ClusterIP
status:
loadBalancer: {}
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: it-tools-ingress
namespace: default
spec:
ingressClassName: nginx
rules:
- host: tools.haven
http:
paths:
- backend:
service:
name: it-tools-svc
port:
number: 80
path: /
pathType: Prefix
status:
loadBalancer:
ingress:
- ip: 192.168.20.204
+120
View File
@@ -0,0 +1,120 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: openwebui
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: openwebui
strategy:
type: Recreate
template:
metadata:
labels:
app: openwebui
spec:
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- preference:
matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- iris
weight: 100
containers:
- env:
- name: PUID
value: '1000'
- name: PGID
value: '1000'
- name: TZ
value: America/Sao_Paulo
- name: DATABASE_URL
valueFrom:
secretKeyRef:
key: DATABASE_URL
name: openwebui-secret
- name: PLAYWRIGHT_WS_URL
value: ws://browserless.default.svc.cluster.local:3000
image: ghcr.io/open-webui/open-webui:main-slim
imagePullPolicy: Always
name: openwebui
ports:
- containerPort: 8080
protocol: TCP
resources:
limits:
cpu: '1'
memory: 2Gi
requests:
cpu: 250m
memory: 512Mi
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /app/backend/data
name: openwebui-data
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
volumes:
- name: openwebui-data
persistentVolumeClaim:
claimName: openwebui-data
apiVersion: v1
kind: Service
metadata:
name: openwebui
namespace: default
spec:
internalTrafficPolicy: Cluster
ipFamilies:
- IPv4
ipFamilyPolicy: SingleStack
ports:
- port: 8080
protocol: TCP
targetPort: 8080
selector:
app: openwebui
sessionAffinity: None
type: ClusterIP
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: openwebui
namespace: default
spec:
ingressClassName: nginx
rules:
- host: openwebui.haven
http:
paths:
- backend:
service:
name: openwebui
port:
number: 8080
path: /
pathType: Prefix
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: openwebui-data
namespace: default
spec:
accessModes:
- ReadWriteOnce
resources:
limits:
storage: 10Gi
requests:
storage: 5Gi
storageClassName: nfs-client
volumeMode: Filesystem
+158
View File
@@ -0,0 +1,158 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: paperless
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: paperless
strategy:
type: Recreate
template:
metadata:
labels:
app: paperless
spec:
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- preference:
matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- iris
weight: 100
containers:
- env:
- name: PUID
value: '1000'
- name: PGID
value: '1000'
- name: PAPERLESS_URL
value: http://paperless.haven
- name: PAPERLESS_TIME_ZONE
value: America/Sao_Paulo
- name: PAPERLESS_OCR_LANGUAGE
value: por
- name: PAPERLESS_OCR_LANGUAGES
value: por
- name: PAPERLESS_OCR_USER_ARGS
value: '{"invalidate_digital_signatures": true}'
- name: PAPERLESS_DBHOST
value: postgresql.haven
- name: PAPERLESS_DBNAME
valueFrom:
secretKeyRef:
key: PAPERLESS_DBNAME
name: paperless-secret
- name: PAPERLESS_DBUSER
valueFrom:
secretKeyRef:
key: PAPERLESS_DBUSER
name: paperless-secret
- name: PAPERLESS_DBPASSWORD
valueFrom:
secretKeyRef:
key: PAPERLESS_DBPASSWORD
name: paperless-secret
- name: PAPERLESS_REDIS
value: redis://redis.haven:6379
- name: PAPERLESS_PORT
value: '8000'
- name: PAPERLESS_SECRET_KEY
valueFrom:
secretKeyRef:
key: PAPERLESS_SECRET_KEY
name: paperless-secret
image: ghcr.io/paperless-ngx/paperless-ngx:latest
imagePullPolicy: Always
name: paperless
ports:
- containerPort: 8000
name: paperless-port
protocol: TCP
resources:
limits:
cpu: '4'
memory: 1Gi
requests:
cpu: 100m
memory: 256Mi
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /usr/src/paperless/data
name: paperless-data
subPath: data
- mountPath: /usr/src/paperless/media
name: paperless-data
subPath: media
- mountPath: /usr/src/paperless/export
name: paperless-data
subPath: export
- mountPath: /usr/src/paperless/consume
name: paperless-data
subPath: consume
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
volumes:
- name: paperless-data
persistentVolumeClaim:
claimName: paperless-data
apiVersion: v1
kind: Service
metadata:
name: paperless
namespace: default
spec:
internalTrafficPolicy: Cluster
ipFamilies:
- IPv4
ipFamilyPolicy: SingleStack
ports:
- port: 8000
protocol: TCP
targetPort: paperless-port
selector:
app: paperless
sessionAffinity: None
type: ClusterIP
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: paperless
namespace: default
spec:
ingressClassName: nginx
rules:
- host: paperless.haven
http:
paths:
- backend:
service:
name: paperless
port:
number: 8000
path: /
pathType: Prefix
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: paperless-data
namespace: default
spec:
accessModes:
- ReadWriteMany
resources:
limits:
storage: 15Gi
requests:
storage: 5Gi
storageClassName: nfs-client
volumeMode: Filesystem
+131
View File
@@ -0,0 +1,131 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: playwright
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: playwright
strategy:
type: Recreate
template:
metadata:
labels:
app: playwright
spec:
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- preference:
matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- iris
weight: 100
containers:
- command:
- npx
- -y
- playwright@1.58.0
- run-server
- --port
- '3000'
- --host
- 0.0.0.0
env:
- name: TZ
value: America/Sao_Paulo
image: mcr.microsoft.com/playwright:v1.58.0-noble
imagePullPolicy: Always
name: playwright
ports:
- containerPort: 3000
protocol: TCP
resources:
limits:
cpu: '4'
memory: 4Gi
requests:
cpu: 500m
memory: 512Mi
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /dev/shm
name: dshm
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
volumes:
- emptyDir:
medium: Memory
name: dshm
status:
availableReplicas: 1
conditions:
- lastTransitionTime: '2026-05-29T15:54:24Z'
lastUpdateTime: '2026-07-22T10:14:35Z'
message: ReplicaSet "playwright-86c74d7c78" has successfully progressed.
reason: NewReplicaSetAvailable
status: 'True'
type: Progressing
- lastTransitionTime: '2026-08-28T06:04:14Z'
lastUpdateTime: '2026-08-28T06:04:14Z'
message: Deployment has minimum availability.
reason: MinimumReplicasAvailable
status: 'True'
type: Available
observedGeneration: 95
readyReplicas: 1
replicas: 1
terminatingReplicas: 0
updatedReplicas: 1
---
apiVersion: v1
kind: Service
metadata:
name: playwright
namespace: default
spec:
internalTrafficPolicy: Cluster
ipFamilies:
- IPv4
ipFamilyPolicy: SingleStack
ports:
- port: 3000
protocol: TCP
targetPort: 3000
selector:
app: playwright
sessionAffinity: None
type: ClusterIP
status:
loadBalancer: {}
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: playwright
namespace: default
spec:
ingressClassName: nginx
rules:
- host: playwright.haven
http:
paths:
- backend:
service:
name: playwright
port:
number: 3000
path: /
pathType: Prefix
status:
loadBalancer:
ingress:
- ip: 192.168.20.204
+176
View File
@@ -0,0 +1,176 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: qbittorrent
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: qbittorrent
strategy:
type: Recreate
template:
metadata:
labels:
app: qbittorrent
spec:
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- preference:
matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- iris
weight: 100
containers:
- env:
- name: PUID
value: '1000'
- name: PGID
value: '1000'
- name: TZ
value: Etc/UTC
- name: WEBUI_PORT
value: '4300'
- name: TORRENTING_PORT
value: '6881'
image: lscr.io/linuxserver/qbittorrent:5.0.4
imagePullPolicy: Always
name: qbittorrent
ports:
- containerPort: 4300
name: webui-port
protocol: TCP
- containerPort: 6881
name: qbit-tcp
protocol: TCP
- containerPort: 6881
name: qbit-udp
protocol: UDP
resources:
limits:
cpu: '1'
memory: 512Mi
requests:
cpu: 200m
memory: 256Mi
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /config
name: qbittorrent-config
- mountPath: /nas
name: nas-storage
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
volumes:
- name: qbittorrent-config
persistentVolumeClaim:
claimName: qbittorrent-config
- name: nas-storage
nfs:
path: /export/Storage
server: 192.168.15.99
status:
availableReplicas: 1
conditions:
- lastTransitionTime: '2026-05-19T01:51:48Z'
lastUpdateTime: '2026-07-22T10:14:39Z'
message: ReplicaSet "qbittorrent-56dbf5f6c" has successfully progressed.
reason: NewReplicaSetAvailable
status: 'True'
type: Progressing
- lastTransitionTime: '2026-08-28T06:04:17Z'
lastUpdateTime: '2026-08-28T06:04:17Z'
message: Deployment has minimum availability.
reason: MinimumReplicasAvailable
status: 'True'
type: Available
observedGeneration: 100
readyReplicas: 1
replicas: 1
terminatingReplicas: 0
updatedReplicas: 1
---
apiVersion: v1
kind: Service
metadata:
name: qbittorrent
namespace: default
spec:
externalTrafficPolicy: Cluster
internalTrafficPolicy: Cluster
ipFamilies:
- IPv4
ipFamilyPolicy: SingleStack
ports:
- name: webui
nodePort: 30948
port: 4300
protocol: TCP
targetPort: webui-port
- name: torrent-tcp
nodePort: 30183
port: 6881
protocol: TCP
targetPort: qbit-tcp
- name: torrent-udp
nodePort: 30183
port: 6881
protocol: UDP
targetPort: qbit-udp
selector:
app: qbittorrent
sessionAffinity: None
type: NodePort
status:
loadBalancer: {}
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: qbittorrent
namespace: default
spec:
ingressClassName: nginx
rules:
- host: qbittorrent.haven
http:
paths:
- backend:
service:
name: qbittorrent
port:
number: 4300
path: /
pathType: Prefix
status:
loadBalancer:
ingress:
- ip: 192.168.20.204
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: qbittorrent-config
namespace: default
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: nfs-client
volumeMode: Filesystem
status:
accessModes:
- ReadWriteOnce
capacity:
storage: 1Gi
phase: Bound
+136
View File
@@ -0,0 +1,136 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: searxng
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: searxng
strategy:
type: Recreate
template:
metadata:
labels:
app: searxng
spec:
containers:
- env:
- name: PUID
value: '1000'
- name: PGID
value: '1000'
image: searxng/searxng:latest
imagePullPolicy: Always
name: searxng
ports:
- containerPort: 8080
name: searxng-port
protocol: TCP
resources:
limits:
cpu: 500m
memory: 512Mi
requests:
cpu: 100m
memory: 256Mi
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /etc/searxng
name: searxng-config
dnsPolicy: ClusterFirst
enableServiceLinks: false
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
volumes:
- name: searxng-config
persistentVolumeClaim:
claimName: searxng-config
status:
availableReplicas: 1
conditions:
- lastTransitionTime: '2026-05-19T01:51:48Z'
lastUpdateTime: '2026-07-22T10:15:23Z'
message: ReplicaSet "searxng-d6869bf47" has successfully progressed.
reason: NewReplicaSetAvailable
status: 'True'
type: Progressing
- lastTransitionTime: '2026-08-28T06:04:24Z'
lastUpdateTime: '2026-08-28T06:04:24Z'
message: Deployment has minimum availability.
reason: MinimumReplicasAvailable
status: 'True'
type: Available
observedGeneration: 93
readyReplicas: 1
replicas: 1
terminatingReplicas: 0
updatedReplicas: 1
---
apiVersion: v1
kind: Service
metadata:
name: searxng
namespace: default
spec:
internalTrafficPolicy: Cluster
ipFamilies:
- IPv4
ipFamilyPolicy: SingleStack
ports:
- port: 8080
protocol: TCP
targetPort: searxng-port
selector:
app: searxng
sessionAffinity: None
type: ClusterIP
status:
loadBalancer: {}
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: searxng
namespace: default
spec:
ingressClassName: nginx
rules:
- host: search.haven
http:
paths:
- backend:
service:
name: searxng
port:
number: 8080
path: /
pathType: Prefix
status:
loadBalancer:
ingress:
- ip: 192.168.20.204
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: searxng-config
namespace: default
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
storageClassName: nfs-client
volumeMode: Filesystem
status:
accessModes:
- ReadWriteMany
capacity:
storage: 1Gi
phase: Bound
+79
View File
@@ -0,0 +1,79 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: sonic
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: sonic
strategy:
type: Recreate
template:
metadata:
labels:
app: sonic
spec:
containers:
- env:
- name: SEARCH_BACKEND_PASSWORD
valueFrom:
secretKeyRef:
key: password
name: password
image: archivebox/sonic:latest
imagePullPolicy: Always
name: sonic
ports:
- containerPort: 1491
protocol: TCP
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
status:
availableReplicas: 1
conditions:
- lastTransitionTime: '2026-05-19T01:51:47Z'
lastUpdateTime: '2026-07-22T10:15:06Z'
message: ReplicaSet "sonic-b89458d6c" has successfully progressed.
reason: NewReplicaSetAvailable
status: 'True'
type: Progressing
- lastTransitionTime: '2026-08-28T06:04:13Z'
lastUpdateTime: '2026-08-28T06:04:13Z'
message: Deployment has minimum availability.
reason: MinimumReplicasAvailable
status: 'True'
type: Available
observedGeneration: 93
readyReplicas: 1
replicas: 1
terminatingReplicas: 0
updatedReplicas: 1
---
apiVersion: v1
kind: Service
metadata:
name: sonic-svc
namespace: default
spec:
internalTrafficPolicy: Cluster
ipFamilies:
- IPv4
ipFamilyPolicy: SingleStack
ports:
- port: 1491
protocol: TCP
targetPort: 1491
selector:
app: sonic
sessionAffinity: None
type: ClusterIP
status:
loadBalancer: {}
+157
View File
@@ -0,0 +1,157 @@
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: stirlingpdf
name: stirlingpdf
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: stirlingpdf
strategy:
type: Recreate
template:
metadata:
labels:
app: stirlingpdf
spec:
containers:
- env:
- name: TZ
value: America/Sao_Paulo
- name: DOCKER_ENABLE_SECURITY
value: 'false'
- name: SECURITY_ENABLELOGIN
value: 'false'
image: stirlingtools/stirling-pdf:latest
imagePullPolicy: Always
name: stirlingpdf
ports:
- containerPort: 8080
name: http
protocol: TCP
readinessProbe:
failureThreshold: 3
httpGet:
path: /
port: 8080
scheme: HTTP
initialDelaySeconds: 20
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1
resources:
limits:
cpu: '2'
memory: 2Gi
requests:
cpu: 100m
memory: 1Gi
securityContext:
allowPrivilegeEscalation: false
runAsUser: 0
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /configs
name: config
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
volumes:
- name: config
persistentVolumeClaim:
claimName: stirlingpdf-config
status:
availableReplicas: 1
conditions:
- lastTransitionTime: '2026-08-12T01:49:00Z'
lastUpdateTime: '2026-08-12T01:49:43Z'
message: ReplicaSet "stirlingpdf-5d9d988965" has successfully progressed.
reason: NewReplicaSetAvailable
status: 'True'
type: Progressing
- lastTransitionTime: '2026-08-28T06:05:17Z'
lastUpdateTime: '2026-08-28T06:05:17Z'
message: Deployment has minimum availability.
reason: MinimumReplicasAvailable
status: 'True'
type: Available
observedGeneration: 11
readyReplicas: 1
replicas: 1
terminatingReplicas: 0
updatedReplicas: 1
---
apiVersion: v1
kind: Service
metadata:
labels:
app: stirlingpdf
name: stirlingpdf
namespace: default
spec:
internalTrafficPolicy: Cluster
ipFamilies:
- IPv4
ipFamilyPolicy: SingleStack
ports:
- name: http
port: 8080
protocol: TCP
targetPort: http
selector:
app: stirlingpdf
sessionAffinity: None
type: ClusterIP
status:
loadBalancer: {}
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
labels:
app: stirlingpdf
name: stirlingpdf
namespace: default
spec:
ingressClassName: nginx
rules:
- host: stirling.haven
http:
paths:
- backend:
service:
name: stirlingpdf
port:
number: 8080
path: /
pathType: Prefix
status:
loadBalancer:
ingress:
- ip: 192.168.20.204
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: stirlingpdf-config
namespace: default
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: nfs-client
volumeMode: Filesystem
status:
accessModes:
- ReadWriteOnce
capacity:
storage: 1Gi
phase: Bound
+155
View File
@@ -0,0 +1,155 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: uptimekuma
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: uptimekuma
strategy:
type: Recreate
template:
metadata:
labels:
app: uptimekuma
spec:
containers:
- env:
- name: PUID
value: '1000'
- name: PGID
value: '1000'
image: louislam/uptime-kuma:2
imagePullPolicy: Always
livenessProbe:
failureThreshold: 3
httpGet:
path: /
port: 3001
scheme: HTTP
initialDelaySeconds: 30
periodSeconds: 60
successThreshold: 1
timeoutSeconds: 1
name: uptimekuma
ports:
- containerPort: 3001
name: uptimekuma-port
protocol: TCP
readinessProbe:
failureThreshold: 3
httpGet:
path: /
port: 3001
scheme: HTTP
initialDelaySeconds: 5
periodSeconds: 5
successThreshold: 1
timeoutSeconds: 1
resources:
limits:
cpu: 500m
memory: 256Mi
requests:
cpu: 100m
memory: 128Mi
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /app/data
name: uptimekuma-config
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
volumes:
- name: uptimekuma-config
persistentVolumeClaim:
claimName: uptimekuma-config
status:
availableReplicas: 1
conditions:
- lastTransitionTime: '2026-05-19T01:51:48Z'
lastUpdateTime: '2026-07-22T10:17:49Z'
message: ReplicaSet "uptimekuma-5cdbf7d589" has successfully progressed.
reason: NewReplicaSetAvailable
status: 'True'
type: Progressing
- lastTransitionTime: '2026-08-28T06:04:55Z'
lastUpdateTime: '2026-08-28T06:04:55Z'
message: Deployment has minimum availability.
reason: MinimumReplicasAvailable
status: 'True'
type: Available
observedGeneration: 94
readyReplicas: 1
replicas: 1
terminatingReplicas: 0
updatedReplicas: 1
---
apiVersion: v1
kind: Service
metadata:
name: uptimekuma
namespace: default
spec:
internalTrafficPolicy: Cluster
ipFamilies:
- IPv4
ipFamilyPolicy: SingleStack
ports:
- port: 3001
protocol: TCP
targetPort: uptimekuma-port
selector:
app: uptimekuma
sessionAffinity: None
type: ClusterIP
status:
loadBalancer: {}
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: uptimekuma
namespace: default
spec:
ingressClassName: nginx
rules:
- host: uptimekuma.haven
http:
paths:
- backend:
service:
name: uptimekuma
port:
number: 3001
path: /
pathType: Prefix
status:
loadBalancer:
ingress:
- ip: 192.168.20.204
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: uptimekuma-config
namespace: default
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
storageClassName: nfs-client
volumeMode: Filesystem
status:
accessModes:
- ReadWriteMany
capacity:
storage: 1Gi
phase: Bound
+152
View File
@@ -0,0 +1,152 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: vaultwarden
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: vaultwarden
strategy:
type: Recreate
template:
metadata:
labels:
app: vaultwarden
spec:
containers:
- env:
- name: DOMAIN
value: https://vault.haven
- name: ADMIN_TOKEN
valueFrom:
secretKeyRef:
key: ADMIN_TOKEN
name: vaultwarden-admin-token
image: vaultwarden/server:latest
imagePullPolicy: Always
livenessProbe:
failureThreshold: 6
httpGet:
path: /alive
port: vault-port
scheme: HTTP
periodSeconds: 15
successThreshold: 1
timeoutSeconds: 3
name: vaultwarden
ports:
- containerPort: 80
name: vault-port
protocol: TCP
readinessProbe:
failureThreshold: 3
httpGet:
path: /alive
port: vault-port
scheme: HTTP
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 3
resources:
limits:
cpu: 250m
memory: 256Mi
requests:
cpu: 250m
memory: 64Mi
startupProbe:
failureThreshold: 30
httpGet:
path: /alive
port: vault-port
scheme: HTTP
periodSeconds: 5
successThreshold: 1
timeoutSeconds: 3
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /data
name: vaultwarden-data
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
volumes:
- name: vaultwarden-data
persistentVolumeClaim:
claimName: vaultwarden-data
apiVersion: v1
kind: Service
metadata:
name: vaultwarden
namespace: default
spec:
internalTrafficPolicy: Cluster
ipFamilies:
- IPv4
ipFamilyPolicy: SingleStack
ports:
- port: 80
protocol: TCP
targetPort: vault-port
selector:
app: vaultwarden
sessionAffinity: None
type: ClusterIP
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: vaultwarden
namespace: default
spec:
ingressClassName: nginx
rules:
- host: vault.haven
http:
paths:
- backend:
service:
name: vaultwarden
port:
number: 80
path: /
pathType: Prefix
tls:
- hosts:
- vault.haven
secretName: vaultwarden-tls
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: vaultwarden-public
namespace: default
spec:
ingressClassName: nginx
rules:
- host: vault.ivanch.me
http:
paths:
- backend:
service:
name: vaultwarden
port:
number: 80
path: /
pathType: Prefix
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: vaultwarden-data
namespace: default
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
storageClassName: nfs-client
volumeMode: Filesystem