reworking default namespace

This commit is contained in:
2026-08-28 19:44:21 -03:00
parent 8debf442ce
commit f1a8cf7ec4
14 changed files with 1131 additions and 1546 deletions
+124 -115
View File
@@ -1,3 +1,39 @@
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: sonic
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: sonic
template:
metadata:
labels:
app: sonic
spec:
containers:
- name: sonic
image: archivebox/sonic:latest
imagePullPolicy: Always
ports:
- containerPort: 1491
env:
- name: SEARCH_BACKEND_PASSWORD
valueFrom:
secretKeyRef:
name: password
key: password
resources:
requests:
memory: "64Mi"
cpu: "50m"
limits:
memory: "128Mi"
cpu: "200m"
---
apiVersion: apps/v1 apiVersion: apps/v1
kind: Deployment kind: Deployment
metadata: metadata:
@@ -8,80 +44,69 @@ spec:
selector: selector:
matchLabels: matchLabels:
app: archivebox app: archivebox
strategy:
type: Recreate
template: template:
metadata: metadata:
labels: labels:
app: archivebox app: archivebox
spec: spec:
containers: containers:
- env: - name: archivebox
- name: SONIC_HOST image: archivebox/archivebox:latest
value: sonic.default.svc.cluster.local imagePullPolicy: Always
- name: SONIC_PORT ports:
value: '1491' - containerPort: 8000
- name: SEARCH_BACKEND_ENGINE env:
value: sonic - name: SONIC_HOST
- name: SONIC_PASSWORD value: "sonic.default.svc.cluster.local"
valueFrom: - name: SONIC_PORT
secretKeyRef: value: "1491"
key: password - name: SEARCH_BACKEND_ENGINE
name: password value: "sonic"
- name: ADMIN_USERNAME - name: SONIC_PASSWORD
value: ivanch valueFrom:
- name: ADMIN_PASSWORD secretKeyRef:
valueFrom: name: password
secretKeyRef: key: password
key: password - name: ADMIN_USERNAME
name: password value: "ivanch"
- name: CSRF_TRUSTED_ORIGINS - name: ADMIN_PASSWORD
value: archive.haven valueFrom:
- name: ALLOWED_HOSTS secretKeyRef:
value: '*' name: password
- name: PUBLIC_ADD_VIEW key: password
value: 'false' - name: CSRF_TRUSTED_ORIGINS
image: archivebox/archivebox:latest value: "archive.haven"
imagePullPolicy: Always - name: ALLOWED_HOSTS
name: archivebox value: "*"
ports: - name: PUBLIC_ADD_VIEW
- containerPort: 8000 value: "false"
protocol: TCP volumeMounts:
resources: {} - name: archivebox-data
terminationMessagePath: /dev/termination-log mountPath: /data
terminationMessagePolicy: File resources:
volumeMounts: requests:
- mountPath: /data memory: "256Mi"
name: archivebox-data cpu: "100m"
dnsPolicy: ClusterFirst limits:
restartPolicy: Always memory: "2Gi"
schedulerName: default-scheduler cpu: "3000m"
securityContext: {}
terminationGracePeriodSeconds: 30
volumes: volumes:
- name: archivebox-data - name: archivebox-data
persistentVolumeClaim: persistentVolumeClaim:
claimName: archivebox-data claimName: archivebox-data
status: ---
availableReplicas: 1 apiVersion: v1
conditions: kind: Service
- lastTransitionTime: '2026-05-19T01:51:47Z' metadata:
lastUpdateTime: '2026-07-22T10:14:38Z' name: sonic-svc
message: ReplicaSet "archivebox-bb7f58db4" has successfully progressed. namespace: default
reason: NewReplicaSetAvailable spec:
status: 'True' selector:
type: Progressing app: sonic
- lastTransitionTime: '2026-08-28T06:04:13Z' ports:
lastUpdateTime: '2026-08-28T06:04:13Z' - protocol: TCP
message: Deployment has minimum availability. port: 1491
reason: MinimumReplicasAvailable targetPort: 1491
status: 'True'
type: Available
observedGeneration: 94
readyReplicas: 1
replicas: 1
terminatingReplicas: 0
updatedReplicas: 1
--- ---
apiVersion: v1 apiVersion: v1
kind: Service kind: Service
@@ -89,20 +114,30 @@ metadata:
name: archivebox-svc name: archivebox-svc
namespace: default namespace: default
spec: spec:
internalTrafficPolicy: Cluster
ipFamilies:
- IPv4
ipFamilyPolicy: SingleStack
ports:
- port: 8000
protocol: TCP
targetPort: 8000
selector: selector:
app: archivebox app: archivebox
sessionAffinity: None ports:
type: ClusterIP - protocol: TCP
status: port: 8000
loadBalancer: {} targetPort: 8000
---
# 3) PersistentVolumeClaim
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: archivebox-data
namespace: default
annotations:
nfs.io/storage-path: "archivebox-data"
spec:
storageClassName: "nfs-client"
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
limits:
storage: 30Gi
--- ---
apiVersion: networking.k8s.io/v1 apiVersion: networking.k8s.io/v1
kind: Ingress kind: Ingress
@@ -112,39 +147,13 @@ metadata:
spec: spec:
ingressClassName: nginx ingressClassName: nginx
rules: rules:
- host: archive.haven - host: "archive.haven"
http: http:
paths: paths:
- backend: - path: /
service: pathType: Prefix
name: archivebox-svc backend:
port: service:
number: 8000 name: archivebox-svc
path: / port:
pathType: Prefix number: 8000
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
+110 -145
View File
@@ -1,12 +1,13 @@
apiVersion: apps/v1 apiVersion: apps/v1
kind: Deployment kind: Deployment
metadata: metadata:
labels:
app.kubernetes.io/name: changedetection
name: changedetection name: changedetection
namespace: default namespace: default
labels:
app.kubernetes.io/name: changedetection
spec: spec:
replicas: 1 replicas: 1
revisionHistoryLimit: 10
selector: selector:
matchLabels: matchLabels:
app.kubernetes.io/name: changedetection app.kubernetes.io/name: changedetection
@@ -20,170 +21,134 @@ spec:
affinity: affinity:
nodeAffinity: nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution: preferredDuringSchedulingIgnoredDuringExecution:
- preference: - weight: 100
matchExpressions: preference:
- key: kubernetes.io/hostname matchExpressions:
operator: In - key: kubernetes.io/hostname
values: operator: In
- iris values:
weight: 100 - iris
containers: containers:
- env: - name: changedetection
- name: PUID image: lscr.io/linuxserver/changedetection.io:latest
value: '1000' imagePullPolicy: Always
- name: PGID env:
value: '1000' - name: PUID
- name: TZ value: "1000"
value: Etc/UTC - name: PGID
- name: BASE_URL value: "1000"
value: http://change.haven/ - name: TZ
- name: PLAYWRIGHT_DRIVER_URL value: "Etc/UTC"
value: ws://localhost:3000 - name: BASE_URL
image: lscr.io/linuxserver/changedetection.io:latest value: "http://change.haven/"
imagePullPolicy: Always - name: PLAYWRIGHT_DRIVER_URL
name: changedetection value: "ws://localhost:3000"
ports: ports:
- containerPort: 5000 - containerPort: 5000
name: http name: http
protocol: TCP protocol: TCP
resources: resources:
limits: requests:
cpu: '2' cpu: 100m
memory: 1Gi memory: 256Mi
requests: limits:
cpu: 100m cpu: 2000m
memory: 256Mi memory: 1Gi
securityContext: securityContext:
allowPrivilegeEscalation: false allowPrivilegeEscalation: false
runAsUser: 0 runAsUser: 0
terminationMessagePath: /dev/termination-log volumeMounts:
terminationMessagePolicy: File - name: config
volumeMounts: mountPath: /config
- mountPath: /config - name: browser-sockpuppet-chrome
name: config image: dgtlmoon/sockpuppetbrowser:latest
- env: imagePullPolicy: Always
- name: SCREEN_WIDTH env:
value: '1920' - name: SCREEN_WIDTH
- name: SCREEN_HEIGHT value: "1920"
value: '1024' - name: SCREEN_HEIGHT
- name: SCREEN_DEPTH value: "1024"
value: '16' - name: SCREEN_DEPTH
- name: MAX_CONCURRENT_CHROME_PROCESSES value: "16"
value: '10' - name: MAX_CONCURRENT_CHROME_PROCESSES
image: dgtlmoon/sockpuppetbrowser:latest value: "10"
imagePullPolicy: Always ports:
name: browser-sockpuppet-chrome - containerPort: 3000
ports: name: ws
- containerPort: 3000 protocol: TCP
name: ws resources:
protocol: TCP requests:
resources: {} cpu: 100m
securityContext: memory: 256Mi
allowPrivilegeEscalation: false limits:
capabilities: cpu: 2000m
add: memory: 4Gi
- SYS_ADMIN securityContext:
drop: allowPrivilegeEscalation: false
- ALL capabilities:
terminationMessagePath: /dev/termination-log add:
terminationMessagePolicy: File - SYS_ADMIN
drop:
- ALL
volumes:
- name: config
persistentVolumeClaim:
claimName: changedetection-config
dnsPolicy: ClusterFirst dnsPolicy: ClusterFirst
restartPolicy: Always restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30 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 apiVersion: v1
kind: Service kind: Service
metadata: metadata:
labels:
app.kubernetes.io/name: changedetection
name: changedetection name: changedetection
namespace: default namespace: default
labels:
app.kubernetes.io/name: changedetection
spec: spec:
internalTrafficPolicy: Cluster type: ClusterIP
ipFamilies:
- IPv4
ipFamilyPolicy: SingleStack
ports:
- name: http
port: 5000
protocol: TCP
targetPort: http
selector: selector:
app.kubernetes.io/name: changedetection app.kubernetes.io/name: changedetection
sessionAffinity: None ports:
type: ClusterIP - name: http
status: port: 5000
loadBalancer: {} protocol: TCP
--- targetPort: http
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 apiVersion: v1
kind: PersistentVolumeClaim kind: PersistentVolumeClaim
metadata: metadata:
name: changedetection-config name: changedetection-config
namespace: default namespace: default
annotations:
nfs.io/storage-path: "changedetection-config"
spec: spec:
storageClassName: "nfs-client"
accessModes: accessModes:
- ReadWriteOnce - ReadWriteOnce
resources: resources:
limits:
storage: 2Gi
requests: requests:
storage: 1Gi storage: 1Gi
storageClassName: nfs-client limits:
volumeMode: Filesystem storage: 2Gi
status: ---
accessModes: apiVersion: networking.k8s.io/v1
- ReadWriteOnce kind: Ingress
capacity: metadata:
storage: 1Gi name: changedetection
phase: Bound namespace: default
labels:
app.kubernetes.io/name: changedetection
spec:
ingressClassName: nginx
rules:
- host: change.haven
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: changedetection
port:
number: 5000
+83 -129
View File
@@ -1,12 +1,14 @@
---
apiVersion: apps/v1 apiVersion: apps/v1
kind: Deployment kind: Deployment
metadata: metadata:
labels:
app.kubernetes.io/name: havenllo
name: havenllo name: havenllo
namespace: default namespace: default
labels:
app.kubernetes.io/name: havenllo
spec: spec:
replicas: 1 replicas: 1
revisionHistoryLimit: 10
selector: selector:
matchLabels: matchLabels:
app.kubernetes.io/name: havenllo app.kubernetes.io/name: havenllo
@@ -18,154 +20,106 @@ spec:
app.kubernetes.io/name: havenllo app.kubernetes.io/name: havenllo
spec: spec:
containers: containers:
- env: - name: havenllo
- name: HAVENLLO_DATABASE_PATH image: git.ivanch.me/ivanch/havenllo:latest
value: /data/havenllo.db imagePullPolicy: Always
- name: HAVENLLO_LISTEN_ADDR env:
value: :8080 - name: HAVENLLO_DATABASE_PATH
image: git.ivanch.me/ivanch/havenllo:latest value: /data/havenllo.db
imagePullPolicy: Always - name: HAVENLLO_LISTEN_ADDR
livenessProbe: value: :8080
failureThreshold: 3 ports:
httpGet: - containerPort: 8080
path: /api/health name: http
port: http protocol: TCP
scheme: HTTP livenessProbe:
initialDelaySeconds: 10 httpGet:
periodSeconds: 10 path: /api/health
successThreshold: 1 port: http
timeoutSeconds: 2 scheme: HTTP
name: havenllo initialDelaySeconds: 10
ports: periodSeconds: 10
- containerPort: 8080 timeoutSeconds: 2
name: http failureThreshold: 3
protocol: TCP successThreshold: 1
readinessProbe: readinessProbe:
failureThreshold: 3 httpGet:
httpGet: path: /api/health
path: /api/health port: http
port: http scheme: HTTP
scheme: HTTP initialDelaySeconds: 2
initialDelaySeconds: 2 periodSeconds: 5
periodSeconds: 5 timeoutSeconds: 2
successThreshold: 1 failureThreshold: 3
timeoutSeconds: 2 successThreshold: 1
resources: resources:
limits: requests:
cpu: 500m cpu: 50m
memory: 256Mi memory: 64Mi
requests: limits:
cpu: 50m cpu: 500m
memory: 64Mi memory: 256Mi
securityContext: securityContext:
allowPrivilegeEscalation: false allowPrivilegeEscalation: false
capabilities: capabilities:
drop: drop:
- ALL - ALL
readOnlyRootFilesystem: true readOnlyRootFilesystem: true
runAsUser: 0 runAsUser: 0
terminationMessagePath: /dev/termination-log terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File terminationMessagePolicy: File
volumeMounts: volumeMounts:
- mountPath: /data - name: data
name: data mountPath: /data
volumes:
- name: data
persistentVolumeClaim:
claimName: havenllo-data
dnsPolicy: ClusterFirst dnsPolicy: ClusterFirst
restartPolicy: Always restartPolicy: Always
schedulerName: default-scheduler schedulerName: default-scheduler
securityContext: {} securityContext: {}
terminationGracePeriodSeconds: 30 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 apiVersion: v1
kind: Service kind: Service
metadata: metadata:
labels:
app.kubernetes.io/name: havenllo
name: havenllo name: havenllo
namespace: default namespace: default
labels:
app.kubernetes.io/name: havenllo
spec: spec:
internalTrafficPolicy: Cluster type: ClusterIP
ipFamilies: sessionAffinity: None
- IPv4
ipFamilyPolicy: SingleStack
ports: ports:
- name: http - name: http
port: 8080 port: 8080
protocol: TCP protocol: TCP
targetPort: 8080 targetPort: 8080
selector: selector:
app.kubernetes.io/name: havenllo app.kubernetes.io/name: havenllo
sessionAffinity: None ipFamilies:
type: ClusterIP - IPv4
status: ipFamilyPolicy: SingleStack
loadBalancer: {} internalTrafficPolicy: Cluster
--- ---
apiVersion: networking.k8s.io/v1 apiVersion: networking.k8s.io/v1
kind: Ingress kind: Ingress
metadata: metadata:
name: havenllo name: havenllo
namespace: default namespace: default
labels:
app.kubernetes.io/name: havenllo
spec: spec:
ingressClassName: nginx-https ingressClassName: nginx-https
rules: rules:
- host: havenllo.haven - host: havenllo.haven
http: http:
paths: paths:
- backend: - path: /
service: pathType: Prefix
name: havenllo backend:
port: service:
number: 8080 name: havenllo
path: / port:
pathType: Prefix number: 8080
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
+173 -193
View File
@@ -1,226 +1,206 @@
apiVersion: v1
kind: ServiceAccount
metadata:
name: homepage
namespace: default
labels:
app.kubernetes.io/name: homepage
secrets:
- name: homepage
---
apiVersion: v1
kind: Secret
type: kubernetes.io/service-account-token
metadata:
name: homepage
namespace: default
labels:
app.kubernetes.io/name: homepage
annotations:
kubernetes.io/service-account.name: homepage
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: homepage
labels:
app.kubernetes.io/name: homepage
rules:
- apiGroups:
- ""
resources:
- namespaces
- pods
- nodes
verbs:
- get
- list
- apiGroups:
- extensions
- networking.k8s.io
resources:
- ingresses
verbs:
- get
- list
- apiGroups:
- traefik.io
resources:
- ingressroutes
verbs:
- get
- list
- apiGroups:
- gateway.networking.k8s.io
resources:
- httproutes
- gateways
verbs:
- get
- list
- apiGroups:
- metrics.k8s.io
resources:
- nodes
- pods
verbs:
- get
- list
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: homepage
labels:
app.kubernetes.io/name: homepage
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: homepage
subjects:
- kind: ServiceAccount
name: homepage
namespace: default
---
apiVersion: apps/v1 apiVersion: apps/v1
kind: Deployment kind: Deployment
metadata: metadata:
labels:
app.kubernetes.io/name: homepage
name: homepage name: homepage
namespace: default namespace: default
labels:
app.kubernetes.io/name: homepage
spec: spec:
revisionHistoryLimit: 3
replicas: 1 replicas: 1
strategy:
type: RollingUpdate
selector: selector:
matchLabels: matchLabels:
app.kubernetes.io/name: homepage app.kubernetes.io/name: homepage
strategy:
type: Recreate
template: template:
metadata: metadata:
labels: labels:
app.kubernetes.io/name: homepage app.kubernetes.io/name: homepage
annotations:
configmap.reloader/checksum: '{{ include (print $.Template.BasePath "/app/config/services.yaml") . | sha256sum }}'
spec: 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 serviceAccountName: homepage
terminationGracePeriodSeconds: 30 automountServiceAccountToken: true
enableServiceLinks: true
containers:
- name: homepage
image: "ghcr.io/gethomepage/homepage:latest"
imagePullPolicy: Always
env:
- name: HOMEPAGE_ALLOWED_HOSTS
value: "*"
ports:
- name: http
containerPort: 3000
protocol: TCP
livenessProbe:
httpGet:
path: /
port: 3000
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /
port: 3000
initialDelaySeconds: 5
periodSeconds: 5
volumeMounts:
- name: logs
mountPath: /app/config/logs
- name: homepage-config
mountPath: /app/config
- name: homepage-config
mountPath: /app/public/images
subPath: images
resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "512Mi"
cpu: "500m"
volumes: volumes:
- name: homepage-config - name: homepage-config
persistentVolumeClaim: persistentVolumeClaim:
claimName: homepage-config claimName: homepage-config
- emptyDir: {} - name: logs
name: logs emptyDir: {}
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 apiVersion: v1
kind: PersistentVolumeClaim kind: PersistentVolumeClaim
metadata: metadata:
name: homepage-config name: homepage-config
namespace: default namespace: default
annotations:
nfs.io/storage-path: "homepage-config"
spec: spec:
storageClassName: "nfs-client"
accessModes: accessModes:
- ReadWriteMany - ReadWriteMany
resources: resources:
requests: requests:
storage: 1Gi storage: 1Gi
storageClassName: nfs-client
volumeMode: Filesystem
status:
accessModes:
- ReadWriteMany
capacity:
storage: 1Gi
phase: Bound
--- ---
apiVersion: v1 apiVersion: v1
data: kind: Service
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: metadata:
labels:
app.kubernetes.io/name: homepage
name: homepage name: homepage
namespace: default namespace: default
labels:
app.kubernetes.io/name: homepage
spec:
type: ClusterIP
ports:
- port: 3000
targetPort: http
protocol: TCP
name: http
selector:
app.kubernetes.io/name: homepage
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: homepage
namespace: default
labels:
app.kubernetes.io/name: homepage
spec:
ingressClassName: nginx
rules:
- host: "homepage.haven"
http:
paths:
- path: "/"
pathType: Prefix
backend:
service:
name: homepage
port:
number: 3000
+33 -72
View File
@@ -1,3 +1,4 @@
---
apiVersion: apps/v1 apiVersion: apps/v1
kind: Deployment kind: Deployment
metadata: metadata:
@@ -8,58 +9,30 @@ spec:
selector: selector:
matchLabels: matchLabels:
app: it-tools app: it-tools
strategy:
type: Recreate
template: template:
metadata: metadata:
labels: labels:
app: it-tools app: it-tools
spec: spec:
containers: containers:
- image: corentinth/it-tools:latest - name: it-tools
imagePullPolicy: Always image: corentinth/it-tools:latest
name: it-tools imagePullPolicy: Always
ports: ports:
- containerPort: 80 - containerPort: 80
protocol: TCP readinessProbe:
readinessProbe: httpGet:
failureThreshold: 3 path: /
httpGet: port: 80
path: / initialDelaySeconds: 5
port: 80 periodSeconds: 10
scheme: HTTP resources:
initialDelaySeconds: 5 requests:
periodSeconds: 10 memory: "64Mi"
successThreshold: 1 cpu: "50m"
timeoutSeconds: 1 limits:
resources: {} memory: "128Mi"
terminationMessagePath: /dev/termination-log cpu: "200m"
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 apiVersion: v1
kind: Service kind: Service
@@ -67,20 +40,12 @@ metadata:
name: it-tools-svc name: it-tools-svc
namespace: default namespace: default
spec: spec:
internalTrafficPolicy: Cluster
ipFamilies:
- IPv4
ipFamilyPolicy: SingleStack
ports:
- port: 80
protocol: TCP
targetPort: 80
selector: selector:
app: it-tools app: it-tools
sessionAffinity: None ports:
type: ClusterIP - protocol: TCP
status: port: 80
loadBalancer: {} targetPort: 80
--- ---
apiVersion: networking.k8s.io/v1 apiVersion: networking.k8s.io/v1
kind: Ingress kind: Ingress
@@ -90,17 +55,13 @@ metadata:
spec: spec:
ingressClassName: nginx ingressClassName: nginx
rules: rules:
- host: tools.haven - host: "tools.haven"
http: http:
paths: paths:
- backend: - path: /
service: pathType: Prefix
name: it-tools-svc backend:
port: service:
number: 80 name: it-tools-svc
path: / port:
pathType: Prefix number: 80
status:
loadBalancer:
ingress:
- ip: 192.168.20.204
+20 -24
View File
@@ -1,34 +1,14 @@
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: notepad-data
namespace: default
annotations:
nfs.io/storage-path: notepad-data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: nfs-client
--- ---
apiVersion: apps/v1 apiVersion: apps/v1
kind: Deployment kind: Deployment
metadata: metadata:
name: notepad name: notepad
namespace: default namespace: default
labels:
app: notepad
spec: spec:
replicas: 1 replicas: 1
selector: selector:
matchLabels: matchLabels:
app: notepad app: notepad
# RWO PVC + single replica: Recreate avoids the two-ReplicaSet PVC fight
# on rollout (see homelab-deploy skill: single-writer state).
strategy:
type: Recreate
template: template:
metadata: metadata:
labels: labels:
@@ -41,7 +21,10 @@ spec:
command: command:
- sh - sh
- -c - -c
- mkdir -p /var/www/html/_tmp && cp -n /var/www/html/notes.htaccess /var/www/html/_tmp/.htaccess 2>/dev/null; exec docker-php-entrypoint apache2-foreground - >-
mkdir -p /var/www/html/_tmp &&
cp -n /var/www/html/notes.htaccess /var/www/html/_tmp/.htaccess 2>/dev/null;
exec docker-php-entrypoint apache2-foreground
ports: ports:
- containerPort: 80 - containerPort: 80
resources: resources:
@@ -58,6 +41,7 @@ spec:
- name: notepad-data - name: notepad-data
persistentVolumeClaim: persistentVolumeClaim:
claimName: notepad-data claimName: notepad-data
--- ---
apiVersion: v1 apiVersion: v1
kind: Service kind: Service
@@ -72,6 +56,21 @@ spec:
- port: 80 - port: 80
targetPort: 80 targetPort: 80
--- ---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: notepad-data
namespace: default
annotations:
nfs.io/storage-path: "notepad-data"
spec:
storageClassName: "nfs-client"
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
---
apiVersion: networking.k8s.io/v1 apiVersion: networking.k8s.io/v1
kind: Ingress kind: Ingress
metadata: metadata:
@@ -90,6 +89,3 @@ spec:
name: notepad name: notepad
port: port:
number: 80 number: 80
# NOTE: the Argo Application manifest for notepad lives in apps/root/notepad.yaml
# (watched by the root app-of-apps). Do not add Application objects to this
# directory — this path is what the Application itself watches.
+70 -82
View File
@@ -8,8 +8,6 @@ spec:
selector: selector:
matchLabels: matchLabels:
app: openwebui app: openwebui
strategy:
type: Recreate
template: template:
metadata: metadata:
labels: labels:
@@ -18,103 +16,93 @@ spec:
affinity: affinity:
nodeAffinity: nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution: preferredDuringSchedulingIgnoredDuringExecution:
- preference: - weight: 100
matchExpressions: preference:
- key: kubernetes.io/hostname matchExpressions:
operator: In - key: kubernetes.io/hostname
values: operator: In
- iris values:
weight: 100 - iris
containers: containers:
- env: - name: openwebui
- name: PUID image: ghcr.io/open-webui/open-webui:main-slim
value: '1000' imagePullPolicy: Always
- name: PGID ports:
value: '1000' - containerPort: 8080
- name: TZ env:
value: America/Sao_Paulo - name: PUID
- name: DATABASE_URL value: "1000"
valueFrom: - name: PGID
secretKeyRef: value: "1000"
key: DATABASE_URL - name: TZ
name: openwebui-secret value: "America/Sao_Paulo"
- name: PLAYWRIGHT_WS_URL - name: DATABASE_URL
value: ws://browserless.default.svc.cluster.local:3000 valueFrom:
image: ghcr.io/open-webui/open-webui:main-slim secretKeyRef:
imagePullPolicy: Always name: openwebui-secret
name: openwebui key: DATABASE_URL
ports: resources:
- containerPort: 8080 requests:
protocol: TCP cpu: "250m"
resources: memory: "512Mi"
limits: limits:
cpu: '1' cpu: "1000m"
memory: 2Gi memory: "2Gi"
requests: volumeMounts:
cpu: 250m - name: openwebui-data
memory: 512Mi mountPath: /app/backend/data
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: volumes:
- name: openwebui-data - name: openwebui-data
persistentVolumeClaim: persistentVolumeClaim:
claimName: openwebui-data claimName: openwebui-data
---
apiVersion: v1 apiVersion: v1
kind: Service kind: Service
metadata: metadata:
name: openwebui name: openwebui
namespace: default namespace: default
spec: spec:
internalTrafficPolicy: Cluster type: ClusterIP
ipFamilies:
- IPv4
ipFamilyPolicy: SingleStack
ports:
- port: 8080
protocol: TCP
targetPort: 8080
selector: selector:
app: openwebui app: openwebui
sessionAffinity: None ports:
type: ClusterIP - port: 8080
apiVersion: networking.k8s.io/v1 targetPort: 8080
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 apiVersion: v1
kind: PersistentVolumeClaim kind: PersistentVolumeClaim
metadata: metadata:
name: openwebui-data name: openwebui-data
namespace: default namespace: default
annotations:
nfs.io/storage-path: "openwebui-data"
spec: spec:
storageClassName: "nfs-client"
accessModes: accessModes:
- ReadWriteOnce - ReadWriteOnce
resources: resources:
limits:
storage: 10Gi
requests: requests:
storage: 5Gi storage: 5Gi
storageClassName: nfs-client limits:
volumeMode: Filesystem storage: 10Gi
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: openwebui
namespace: default
annotations:
nginx.ingress.kubernetes.io/proxy-body-size: "50m"
spec:
ingressClassName: nginx
rules:
- host: openwebui.haven
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: openwebui
port:
number: 8080
+115 -122
View File
@@ -1,3 +1,5 @@
---
# 1) Deployment
apiVersion: apps/v1 apiVersion: apps/v1
kind: Deployment kind: Deployment
metadata: metadata:
@@ -8,8 +10,6 @@ spec:
selector: selector:
matchLabels: matchLabels:
app: paperless app: paperless
strategy:
type: Recreate
template: template:
metadata: metadata:
labels: labels:
@@ -18,111 +18,119 @@ spec:
affinity: affinity:
nodeAffinity: nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution: preferredDuringSchedulingIgnoredDuringExecution:
- preference: - weight: 100
matchExpressions: preference:
- key: kubernetes.io/hostname matchExpressions:
operator: In - key: kubernetes.io/hostname
values: operator: In
- iris values:
weight: 100 - iris
containers: containers:
- env: - name: paperless
- name: PUID image: ghcr.io/paperless-ngx/paperless-ngx:latest
value: '1000' imagePullPolicy: Always
- name: PGID env:
value: '1000' - name: PUID
- name: PAPERLESS_URL value: "1000"
value: http://paperless.haven - name: PGID
- name: PAPERLESS_TIME_ZONE value: "1000"
value: America/Sao_Paulo - name: PAPERLESS_URL
- name: PAPERLESS_OCR_LANGUAGE value: "http://paperless.haven"
value: por - name: PAPERLESS_TIME_ZONE
- name: PAPERLESS_OCR_LANGUAGES value: "America/Sao_Paulo"
value: por - name: PAPERLESS_OCR_LANGUAGE
- name: PAPERLESS_OCR_USER_ARGS value: "por"
value: '{"invalidate_digital_signatures": true}' - name: PAPERLESS_OCR_LANGUAGES
- name: PAPERLESS_DBHOST value: "por"
value: postgresql.haven - name: PAPERLESS_OCR_USER_ARGS
- name: PAPERLESS_DBNAME value: '{"invalidate_digital_signatures": true}'
valueFrom: - name: PAPERLESS_DBHOST
secretKeyRef: value: postgresql.haven
key: PAPERLESS_DBNAME - name: PAPERLESS_DBNAME
name: paperless-secret valueFrom:
- name: PAPERLESS_DBUSER secretKeyRef:
valueFrom: name: paperless-secret
secretKeyRef: key: PAPERLESS_DBNAME
key: PAPERLESS_DBUSER - name: PAPERLESS_DBUSER
name: paperless-secret valueFrom:
- name: PAPERLESS_DBPASSWORD secretKeyRef:
valueFrom: name: paperless-secret
secretKeyRef: key: PAPERLESS_DBUSER
key: PAPERLESS_DBPASSWORD - name: PAPERLESS_DBPASSWORD
name: paperless-secret valueFrom:
- name: PAPERLESS_REDIS secretKeyRef:
value: redis://redis.haven:6379 name: paperless-secret
- name: PAPERLESS_PORT key: PAPERLESS_DBPASSWORD
value: '8000' - name: PAPERLESS_REDIS
- name: PAPERLESS_SECRET_KEY value: "redis://redis.haven:6379"
valueFrom: - name: PAPERLESS_PORT
secretKeyRef: value: "8000"
key: PAPERLESS_SECRET_KEY - name: PAPERLESS_SECRET_KEY
name: paperless-secret valueFrom:
image: ghcr.io/paperless-ngx/paperless-ngx:latest secretKeyRef:
imagePullPolicy: Always name: paperless-secret
name: paperless key: PAPERLESS_SECRET_KEY
ports: ports:
- containerPort: 8000 - containerPort: 8000
name: paperless-port name: paperless-port
protocol: TCP resources:
resources: requests:
limits: cpu: "100m"
cpu: '4' memory: "256Mi"
memory: 1Gi limits:
requests: cpu: "4000m"
cpu: 100m memory: "1Gi"
memory: 256Mi volumeMounts:
terminationMessagePath: /dev/termination-log - name: paperless-data
terminationMessagePolicy: File subPath: data
volumeMounts: mountPath: /usr/src/paperless/data
- mountPath: /usr/src/paperless/data - name: paperless-data
name: paperless-data subPath: media
subPath: data mountPath: /usr/src/paperless/media
- mountPath: /usr/src/paperless/media - name: paperless-data
name: paperless-data subPath: export
subPath: media mountPath: /usr/src/paperless/export
- mountPath: /usr/src/paperless/export - name: paperless-data
name: paperless-data subPath: consume
subPath: export mountPath: /usr/src/paperless/consume
- mountPath: /usr/src/paperless/consume
name: paperless-data
subPath: consume
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
volumes: volumes:
- name: paperless-data - name: paperless-data
persistentVolumeClaim: persistentVolumeClaim:
claimName: paperless-data claimName: paperless-data
---
# 2) Service
apiVersion: v1 apiVersion: v1
kind: Service kind: Service
metadata: metadata:
name: paperless name: paperless
namespace: default namespace: default
spec: spec:
internalTrafficPolicy: Cluster type: ClusterIP
ipFamilies:
- IPv4
ipFamilyPolicy: SingleStack
ports:
- port: 8000
protocol: TCP
targetPort: paperless-port
selector: selector:
app: paperless app: paperless
sessionAffinity: None ports:
type: ClusterIP - port: 8000
targetPort: paperless-port
---
# 3) PersistentVolumeClaim
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: paperless-data
namespace: default
annotations:
nfs.io/storage-path: "paperless-data"
spec:
storageClassName: "nfs-client"
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
limits:
storage: 15Gi
---
# 4) Ingress
apiVersion: networking.k8s.io/v1 apiVersion: networking.k8s.io/v1
kind: Ingress kind: Ingress
metadata: metadata:
@@ -131,28 +139,13 @@ metadata:
spec: spec:
ingressClassName: nginx ingressClassName: nginx
rules: rules:
- host: paperless.haven - host: paperless.haven
http: http:
paths: paths:
- backend: - path: /
service: pathType: Prefix
name: paperless backend:
port: service:
number: 8000 name: paperless
path: / port:
pathType: Prefix number: 8000
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
+89 -133
View File
@@ -1,3 +1,5 @@
---
# 1) Deployment
apiVersion: apps/v1 apiVersion: apps/v1
kind: Deployment kind: Deployment
metadata: metadata:
@@ -8,8 +10,6 @@ spec:
selector: selector:
matchLabels: matchLabels:
app: qbittorrent app: qbittorrent
strategy:
type: Recreate
template: template:
metadata: metadata:
labels: labels:
@@ -18,159 +18,115 @@ spec:
affinity: affinity:
nodeAffinity: nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution: preferredDuringSchedulingIgnoredDuringExecution:
- preference: - weight: 100
preference:
matchExpressions: matchExpressions:
- key: kubernetes.io/hostname - key: kubernetes.io/hostname
operator: In operator: In
values: values:
- iris - iris
weight: 100
containers: containers:
- env: - name: qbittorrent
- name: PUID image: lscr.io/linuxserver/qbittorrent:5.0.4
value: '1000' imagePullPolicy: Always
- name: PGID resources:
value: '1000' requests:
- name: TZ cpu: 200m
value: Etc/UTC memory: 256Mi
- name: WEBUI_PORT limits:
value: '4300' cpu: 1000m
- name: TORRENTING_PORT memory: 512Mi
value: '6881' ports:
image: lscr.io/linuxserver/qbittorrent:5.0.4 - containerPort: 4300
imagePullPolicy: Always name: webui-port
name: qbittorrent - containerPort: 6881
ports: name: qbit-tcp
- containerPort: 4300 protocol: TCP
name: webui-port - containerPort: 6881
protocol: TCP name: qbit-udp
- containerPort: 6881 protocol: UDP
name: qbit-tcp env:
protocol: TCP - name: PUID
- containerPort: 6881 value: "1000"
name: qbit-udp - name: PGID
protocol: UDP value: "1000"
resources: - name: TZ
limits: value: "Etc/UTC"
cpu: '1' - name: WEBUI_PORT
memory: 512Mi value: "4300"
requests: - name: TORRENTING_PORT
cpu: 200m value: "6881"
memory: 256Mi volumeMounts:
terminationMessagePath: /dev/termination-log - name: qbittorrent-config
terminationMessagePolicy: File mountPath: /config
volumeMounts: - name: nas-storage
- mountPath: /config mountPath: /nas
name: qbittorrent-config
- mountPath: /nas
name: nas-storage
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
volumes: volumes:
- name: qbittorrent-config - name: qbittorrent-config
persistentVolumeClaim: persistentVolumeClaim:
claimName: qbittorrent-config claimName: qbittorrent-config
- name: nas-storage - name: nas-storage
nfs: nfs:
path: /export/Storage server: 192.168.15.99
server: 192.168.15.99 path: /export/Storage
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
--- ---
# PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: qbittorrent-config
namespace: default
annotations:
nfs.io/storage-path: "qbittorrent-config"
spec:
storageClassName: "nfs-client"
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
---
# 2) Service
apiVersion: v1 apiVersion: v1
kind: Service kind: Service
metadata: metadata:
name: qbittorrent name: qbittorrent
namespace: default namespace: default
spec: spec:
externalTrafficPolicy: Cluster type: NodePort
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: selector:
app: qbittorrent app: qbittorrent
sessionAffinity: None ports:
type: NodePort - port: 4300
status: targetPort: webui-port
loadBalancer: {} name: webui
- port: 6881
targetPort: qbit-tcp
name: torrent-tcp
protocol: TCP
- port: 6881
targetPort: qbit-udp
name: torrent-udp
protocol: UDP
--- ---
# 4) Ingress (Traefik)
apiVersion: networking.k8s.io/v1 apiVersion: networking.k8s.io/v1
kind: Ingress kind: Ingress
metadata: metadata:
name: qbittorrent name: qbittorrent
namespace: default namespace: default
annotations:
traefik.ingress.kubernetes.io/router.entrypoints: web
spec: spec:
ingressClassName: nginx ingressClassName: nginx
rules: rules:
- host: qbittorrent.haven - host: qbittorrent.haven
http: http:
paths: paths:
- backend: - path: /
service: pathType: Prefix
name: qbittorrent backend:
port: service:
number: 4300 name: qbittorrent
path: / port:
pathType: Prefix number: 4300
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
+59 -101
View File
@@ -1,3 +1,5 @@
---
# 1) Deployment
apiVersion: apps/v1 apiVersion: apps/v1
kind: Deployment kind: Deployment
metadata: metadata:
@@ -8,90 +10,70 @@ spec:
selector: selector:
matchLabels: matchLabels:
app: searxng app: searxng
strategy:
type: Recreate
template: template:
metadata: metadata:
labels: labels:
app: searxng app: searxng
spec: 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 enableServiceLinks: false
restartPolicy: Always containers:
schedulerName: default-scheduler - name: searxng
securityContext: {} image: searxng/searxng:latest
terminationGracePeriodSeconds: 30 imagePullPolicy: Always
env:
- name: PUID
value: "1000"
- name: PGID
value: "1000"
ports:
- containerPort: 8080
name: searxng-port
resources:
requests:
cpu: "100m"
memory: "256Mi"
limits:
cpu: "500m"
memory: "512Mi"
volumeMounts:
- name: searxng-config
mountPath: /etc/searxng
volumes: volumes:
- name: searxng-config - name: searxng-config
persistentVolumeClaim: persistentVolumeClaim:
claimName: searxng-config 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
--- ---
# 2) Service
apiVersion: v1 apiVersion: v1
kind: Service kind: Service
metadata: metadata:
name: searxng name: searxng
namespace: default namespace: default
spec: spec:
internalTrafficPolicy: Cluster type: ClusterIP
ipFamilies:
- IPv4
ipFamilyPolicy: SingleStack
ports:
- port: 8080
protocol: TCP
targetPort: searxng-port
selector: selector:
app: searxng app: searxng
sessionAffinity: None ports:
type: ClusterIP - port: 8080
status: targetPort: searxng-port
loadBalancer: {}
--- ---
# 3) PersistentVolumeClaim
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: searxng-config
namespace: default
annotations:
nfs.io/storage-path: "searxng-config"
spec:
storageClassName: "nfs-client"
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
---
# 4) Ingress
apiVersion: networking.k8s.io/v1 apiVersion: networking.k8s.io/v1
kind: Ingress kind: Ingress
metadata: metadata:
@@ -100,37 +82,13 @@ metadata:
spec: spec:
ingressClassName: nginx ingressClassName: nginx
rules: rules:
- host: search.haven - host: search.haven
http: http:
paths: paths:
- backend: - path: /
service: pathType: Prefix
name: searxng backend:
port: service:
number: 8080 name: searxng
path: / port:
pathType: Prefix number: 8080
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
@@ -1,79 +0,0 @@
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: {}
+76 -120
View File
@@ -1,157 +1,113 @@
---
# 1) Deployment - Stirling-PDF
apiVersion: apps/v1 apiVersion: apps/v1
kind: Deployment kind: Deployment
metadata: metadata:
labels:
app: stirlingpdf
name: stirlingpdf name: stirlingpdf
namespace: default namespace: default
labels:
app: stirlingpdf
spec: spec:
replicas: 1 replicas: 1
selector: selector:
matchLabels: matchLabels:
app: stirlingpdf app: stirlingpdf
strategy:
type: Recreate
template: template:
metadata: metadata:
labels: labels:
app: stirlingpdf app: stirlingpdf
spec: spec:
containers: containers:
- env: - name: stirlingpdf
- name: TZ image: stirlingtools/stirling-pdf:latest
value: America/Sao_Paulo imagePullPolicy: Always
- name: DOCKER_ENABLE_SECURITY env:
value: 'false' - name: TZ
- name: SECURITY_ENABLELOGIN value: "America/Sao_Paulo"
value: 'false' - name: DOCKER_ENABLE_SECURITY
image: stirlingtools/stirling-pdf:latest value: "false"
imagePullPolicy: Always - name: SECURITY_ENABLELOGIN
name: stirlingpdf value: "false"
ports: ports:
- containerPort: 8080 - containerPort: 8080
name: http name: http
protocol: TCP readinessProbe:
readinessProbe: httpGet:
failureThreshold: 3 path: /
httpGet: port: 8080
path: / initialDelaySeconds: 20
port: 8080 periodSeconds: 10
scheme: HTTP resources:
initialDelaySeconds: 20 requests:
periodSeconds: 10 cpu: 100m
successThreshold: 1 memory: 1Gi
timeoutSeconds: 1 limits:
resources: cpu: 2000m
limits: memory: 2Gi
cpu: '2' securityContext:
memory: 2Gi allowPrivilegeEscalation: false
requests: runAsUser: 0
cpu: 100m volumeMounts:
memory: 1Gi - name: config
securityContext: mountPath: /configs
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: volumes:
- name: config - name: config
persistentVolumeClaim: persistentVolumeClaim:
claimName: stirlingpdf-config claimName: stirlingpdf-config
status: terminationGracePeriodSeconds: 30
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
--- ---
# 2) Service
apiVersion: v1 apiVersion: v1
kind: Service kind: Service
metadata: metadata:
labels:
app: stirlingpdf
name: stirlingpdf name: stirlingpdf
namespace: default namespace: default
labels:
app: stirlingpdf
spec: spec:
internalTrafficPolicy: Cluster type: ClusterIP
ipFamilies:
- IPv4
ipFamilyPolicy: SingleStack
ports:
- name: http
port: 8080
protocol: TCP
targetPort: http
selector: selector:
app: stirlingpdf app: stirlingpdf
sessionAffinity: None ports:
type: ClusterIP - name: http
status: port: 8080
loadBalancer: {} protocol: TCP
--- targetPort: http
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
--- ---
# 3) PersistentVolumeClaim
apiVersion: v1 apiVersion: v1
kind: PersistentVolumeClaim kind: PersistentVolumeClaim
metadata: metadata:
name: stirlingpdf-config name: stirlingpdf-config
namespace: default namespace: default
annotations:
nfs.io/storage-path: "stirlingpdf-config"
spec: spec:
storageClassName: "nfs-client"
accessModes: accessModes:
- ReadWriteOnce - ReadWriteOnce
resources: resources:
requests: requests:
storage: 1Gi storage: 1Gi
storageClassName: nfs-client ---
volumeMode: Filesystem # 4) Ingress
status: apiVersion: networking.k8s.io/v1
accessModes: kind: Ingress
- ReadWriteOnce metadata:
capacity: name: stirlingpdf
storage: 1Gi namespace: default
phase: Bound labels:
app: stirlingpdf
spec:
ingressClassName: nginx
rules:
- host: stirling.haven
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: stirlingpdf
port:
number: 8080
+72 -120
View File
@@ -1,3 +1,5 @@
---
# 1) Deployment
apiVersion: apps/v1 apiVersion: apps/v1
kind: Deployment kind: Deployment
metadata: metadata:
@@ -5,112 +7,86 @@ metadata:
namespace: default namespace: default
spec: spec:
replicas: 1 replicas: 1
strategy:
type: Recreate
selector: selector:
matchLabels: matchLabels:
app: uptimekuma app: uptimekuma
strategy:
type: Recreate
template: template:
metadata: metadata:
labels: labels:
app: uptimekuma app: uptimekuma
spec: spec:
containers: containers:
- env: - name: uptimekuma
- name: PUID image: louislam/uptime-kuma:2
value: '1000' imagePullPolicy: Always
- name: PGID env:
value: '1000' - name: PUID
image: louislam/uptime-kuma:2 value: "1000"
imagePullPolicy: Always - name: PGID
livenessProbe: value: "1000"
failureThreshold: 3 ports:
httpGet: - containerPort: 3001
path: / name: uptimekuma-port
port: 3001 resources:
scheme: HTTP requests:
initialDelaySeconds: 30 memory: "128Mi"
periodSeconds: 60 cpu: "100m"
successThreshold: 1 limits:
timeoutSeconds: 1 memory: "256Mi"
name: uptimekuma cpu: "500m"
ports: livenessProbe:
- containerPort: 3001 httpGet:
name: uptimekuma-port path: /
protocol: TCP port: 3001
readinessProbe: initialDelaySeconds: 30
failureThreshold: 3 periodSeconds: 60
httpGet: readinessProbe:
path: / httpGet:
port: 3001 path: /
scheme: HTTP port: 3001
initialDelaySeconds: 5 initialDelaySeconds: 5
periodSeconds: 5 periodSeconds: 5
successThreshold: 1 volumeMounts:
timeoutSeconds: 1 - name: uptimekuma-config
resources: mountPath: /app/data
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: volumes:
- name: uptimekuma-config - name: uptimekuma-config
persistentVolumeClaim: persistentVolumeClaim:
claimName: uptimekuma-config 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
--- ---
# 2) Service
apiVersion: v1 apiVersion: v1
kind: Service kind: Service
metadata: metadata:
name: uptimekuma name: uptimekuma
namespace: default namespace: default
spec: spec:
internalTrafficPolicy: Cluster type: ClusterIP
ipFamilies:
- IPv4
ipFamilyPolicy: SingleStack
ports:
- port: 3001
protocol: TCP
targetPort: uptimekuma-port
selector: selector:
app: uptimekuma app: uptimekuma
sessionAffinity: None ports:
type: ClusterIP - port: 3001
status: targetPort: uptimekuma-port
loadBalancer: {}
--- ---
# 3) PersistentVolumeClaim
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: uptimekuma-config
namespace: default
annotations:
nfs.io/storage-path: "uptimekuma-config"
spec:
storageClassName: "nfs-client"
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
---
# 4) Ingress
apiVersion: networking.k8s.io/v1 apiVersion: networking.k8s.io/v1
kind: Ingress kind: Ingress
metadata: metadata:
@@ -119,37 +95,13 @@ metadata:
spec: spec:
ingressClassName: nginx ingressClassName: nginx
rules: rules:
- host: uptimekuma.haven - host: uptimekuma.haven
http: http:
paths: paths:
- backend: - path: /
service: pathType: Prefix
name: uptimekuma backend:
port: service:
number: 3001 name: uptimekuma
path: / port:
pathType: Prefix number: 3001
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
+107 -111
View File
@@ -1,3 +1,5 @@
---
# 1) Deployment
apiVersion: apps/v1 apiVersion: apps/v1
kind: Deployment kind: Deployment
metadata: metadata:
@@ -8,117 +10,124 @@ spec:
selector: selector:
matchLabels: matchLabels:
app: vaultwarden app: vaultwarden
strategy:
type: Recreate
template: template:
metadata: metadata:
labels: labels:
app: vaultwarden app: vaultwarden
spec: spec:
containers: containers:
- env: - name: vaultwarden
- name: DOMAIN image: vaultwarden/server:latest
value: https://vault.haven imagePullPolicy: Always
- name: ADMIN_TOKEN env:
valueFrom: - name: DOMAIN
secretKeyRef: value: "https://vault.haven"
key: ADMIN_TOKEN - name: ADMIN_TOKEN
name: vaultwarden-admin-token valueFrom:
image: vaultwarden/server:latest secretKeyRef:
imagePullPolicy: Always name: vaultwarden-admin-token
livenessProbe: key: ADMIN_TOKEN
failureThreshold: 6 ports:
httpGet: - containerPort: 80
path: /alive name: vault-port
port: vault-port # /alive requires no authentication and verifies the Vaultwarden process
scheme: HTTP startupProbe:
periodSeconds: 15 httpGet:
successThreshold: 1 path: /alive
timeoutSeconds: 3 port: vault-port
name: vaultwarden scheme: HTTP
ports: periodSeconds: 5
- containerPort: 80 timeoutSeconds: 3
name: vault-port failureThreshold: 30
protocol: TCP readinessProbe:
readinessProbe: httpGet:
failureThreshold: 3 path: /alive
httpGet: port: vault-port
path: /alive scheme: HTTP
port: vault-port periodSeconds: 10
scheme: HTTP timeoutSeconds: 3
periodSeconds: 10 failureThreshold: 3
successThreshold: 1 livenessProbe:
timeoutSeconds: 3 httpGet:
resources: path: /alive
limits: port: vault-port
cpu: 250m scheme: HTTP
memory: 256Mi periodSeconds: 15
requests: timeoutSeconds: 3
cpu: 250m failureThreshold: 6
memory: 64Mi volumeMounts:
startupProbe: - name: vaultwarden-data
failureThreshold: 30 mountPath: /data
httpGet: resources:
path: /alive requests:
port: vault-port cpu: 250m
scheme: HTTP memory: 64Mi
periodSeconds: 5 limits:
successThreshold: 1 cpu: 250m
timeoutSeconds: 3 memory: 256Mi
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /data
name: vaultwarden-data
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
volumes: volumes:
- name: vaultwarden-data - name: vaultwarden-data
persistentVolumeClaim: persistentVolumeClaim:
claimName: vaultwarden-data claimName: vaultwarden-data
---
# 2) Service
apiVersion: v1 apiVersion: v1
kind: Service kind: Service
metadata: metadata:
name: vaultwarden name: vaultwarden
namespace: default namespace: default
spec: spec:
internalTrafficPolicy: Cluster type: ClusterIP
ipFamilies:
- IPv4
ipFamilyPolicy: SingleStack
ports:
- port: 80
protocol: TCP
targetPort: vault-port
selector: selector:
app: vaultwarden app: vaultwarden
sessionAffinity: None ports:
type: ClusterIP - port: 80
targetPort: vault-port
---
# 3) PersistentVolumeClaim (for /data)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: vaultwarden-data
namespace: default
annotations:
nfs.io/storage-path: "vaultwarden-data"
spec:
storageClassName: "nfs-client"
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
---
# 4) Ingress
apiVersion: networking.k8s.io/v1 apiVersion: networking.k8s.io/v1
kind: Ingress kind: Ingress
metadata: metadata:
name: vaultwarden name: vaultwarden
namespace: default namespace: default
annotations:
cert-manager.io/cluster-issuer: internal-ca
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
spec: spec:
ingressClassName: nginx ingressClassName: nginx
rules:
- host: vault.haven
http:
paths:
- backend:
service:
name: vaultwarden
port:
number: 80
path: /
pathType: Prefix
tls: tls:
- hosts: - hosts:
- vault.haven - vault.haven
secretName: vaultwarden-tls secretName: vaultwarden-tls
rules:
- host: vault.haven
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: vaultwarden
port:
number: 80
---
# 4) Ingress
apiVersion: networking.k8s.io/v1 apiVersion: networking.k8s.io/v1
kind: Ingress kind: Ingress
metadata: metadata:
@@ -127,26 +136,13 @@ metadata:
spec: spec:
ingressClassName: nginx ingressClassName: nginx
rules: rules:
- host: vault.ivanch.me - host: vault.ivanch.me
http: http:
paths: paths:
- backend: - path: /
service: pathType: Prefix
name: vaultwarden backend:
port: service:
number: 80 name: vaultwarden
path: / port:
pathType: Prefix number: 80
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: vaultwarden-data
namespace: default
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
storageClassName: nfs-client
volumeMode: Filesystem