From 1c6ffc6fad09b8abe1711a52c6ba1d35fbf6e08d Mon Sep 17 00:00:00 2001 From: Jose Henrique Date: Fri, 3 Jul 2026 13:38:16 -0300 Subject: [PATCH] adding new applications --- README.md | 7 +- cloud/cloudreve.yaml | 178 +++++++++++++++++++++++++++++++++++++++++ cloud/slink.yaml | 136 +++++++++++++++++++++++++++++++ default/paperless.yaml | 131 ++++++++++++++++++++++++++++++ 4 files changed, 450 insertions(+), 2 deletions(-) create mode 100644 cloud/cloudreve.yaml create mode 100644 cloud/slink.yaml create mode 100644 default/paperless.yaml diff --git a/README.md b/README.md index 32f708a..3058957 100644 --- a/README.md +++ b/README.md @@ -23,10 +23,13 @@ The repository name references my local TLD, `.haven` ;) - Uptimekuma - Vaultwarden - OpenWebUI + - Paperless +- cloud + - Cloudreve + - Slink - dns - AdGuardHome - - AdGuardHome-2 (2nd instance) - - AdGuard-Sync + - AdGuardSync - infra - [Haven Notify](https://git.ivanch.me/ivanch/server-scripts/src/branch/main/haven-notify) - Beszel diff --git a/cloud/cloudreve.yaml b/cloud/cloudreve.yaml new file mode 100644 index 0000000..f28de4e --- /dev/null +++ b/cloud/cloudreve.yaml @@ -0,0 +1,178 @@ +# 2) Deployment +apiVersion: apps/v1 +kind: Deployment +metadata: + name: cloudreve + namespace: cloud +spec: + replicas: 1 + selector: + matchLabels: + app: cloudreve + template: + metadata: + labels: + app: cloudreve + spec: + containers: + - name: cloudreve + image: cloudreve/cloudreve:v4 + imagePullPolicy: Always + ports: + - containerPort: 5212 + name: http + - containerPort: 6888 + name: slave-tcp + protocol: TCP + - containerPort: 6888 + name: slave-udp + protocol: UDP + env: + - name: CR_CONF_Database.Type + value: "postgres" + - name: CR_CONF_Database.Host + value: "postgresql.haven" + - name: CR_CONF_Database.Port + value: "5432" + - name: CR_CONF_Database.User + valueFrom: + secretKeyRef: + name: cloudreve-secret + key: DB_USER + - name: CR_CONF_Database.Name + valueFrom: + secretKeyRef: + name: cloudreve-secret + key: DB_NAME + - name: CR_CONF_Database.Password + valueFrom: + secretKeyRef: + name: cloudreve-secret + key: DB_PASSWORD + - name: CR_CONF_Database.SSLMode + value: "disable" + - name: CR_CONF_Redis.Server + value: "" + - name: CR_CONF_Redis.Password + valueFrom: + secretKeyRef: + name: cloudreve-secret + key: REDIS_PASSWORD + volumeMounts: + - name: cloudreve-data + mountPath: /cloudreve/data + resources: + requests: + cpu: "250m" + memory: "256Mi" + limits: + cpu: "1000m" + memory: "1Gi" + volumes: + - name: cloudreve-data + nfs: + server: 192.168.15.99 + path: /export/Storage/Cloud +--- +# 3) Service (HTTP) +apiVersion: v1 +kind: Service +metadata: + name: cloudreve + namespace: cloud +spec: + type: ClusterIP + selector: + app: cloudreve + ports: + - port: 5212 + targetPort: 5212 + name: http + +--- +# 4) Service (Slave node / WebDAV — optional) +apiVersion: v1 +kind: Service +metadata: + name: cloudreve-slave + namespace: cloud +spec: + type: ClusterIP + selector: + app: cloudreve + ports: + - port: 6888 + targetPort: 6888 + name: slave-tcp + protocol: TCP + - port: 6888 + targetPort: 6888 + name: slave-udp + protocol: UDP + +--- +# 5) PersistentVolumeClaim +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: cloudreve-data + namespace: cloud + annotations: + nfs.io/storage-path: "cloudreve-data" +spec: + storageClassName: "nfs-client" + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi + limits: + storage: 50Gi +--- +# 6) Ingress +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: cloudreve + namespace: cloud + annotations: + nginx.ingress.kubernetes.io/proxy-body-size: "0" + nginx.ingress.kubernetes.io/proxy-read-timeout: "600" + nginx.ingress.kubernetes.io/proxy-send-timeout: "600" +spec: + ingressClassName: nginx + rules: + - host: cloud.haven + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: cloudreve + port: + number: 5212 +--- +# 7) Ingress Public +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: cloudreve-public + namespace: cloud + annotations: + nginx.ingress.kubernetes.io/proxy-body-size: "0" + nginx.ingress.kubernetes.io/proxy-read-timeout: "600" + nginx.ingress.kubernetes.io/proxy-send-timeout: "600" +spec: + ingressClassName: nginx + rules: + - host: cloud.ivanch.me + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: cloudreve + port: + number: 5212 diff --git a/cloud/slink.yaml b/cloud/slink.yaml new file mode 100644 index 0000000..a38973e --- /dev/null +++ b/cloud/slink.yaml @@ -0,0 +1,136 @@ +# 1) Deployment +apiVersion: apps/v1 +kind: Deployment +metadata: + name: slink + namespace: cloud +spec: + replicas: 1 + selector: + matchLabels: + app: slink + template: + metadata: + labels: + app: slink + spec: + containers: + - name: slink + image: anirdev/slink:latest + imagePullPolicy: Always + securityContext: + runAsUser: 1000 + runAsGroup: 1000 + env: + - name: PUID + value: "1000" + - name: PGID + value: "1000" + - name: ORIGIN + value: "http://slink.haven" + - name: TZ + value: "America/Sao_Paulo" + - name: USER_APPROVAL_REQUIRED + value: "true" + - name: USER_PASSWORD_MIN_LENGTH + value: "8" + - name: USER_PASSWORD_REQUIREMENTS + value: "15" + - name: ADMIN_USERNAME + valueFrom: + secretKeyRef: + name: slink-secret + key: ADMIN_USERNAME + - name: ADMIN_EMAIL + valueFrom: + secretKeyRef: + name: slink-secret + key: ADMIN_EMAIL + - name: ADMIN_PASSWORD + valueFrom: + secretKeyRef: + name: slink-secret + key: ADMIN_PASSWORD + - name: IMAGE_MAX_SIZE + value: "50M" + - name: IMAGE_STRIP_EXIF_METADATA + value: "true" + - name: IMAGE_COMPRESSION_QUALITY + value: "90" + - name: STORAGE_PROVIDER + value: "local" + ports: + - containerPort: 3000 + name: slink-port + resources: + requests: + cpu: "100m" + memory: "64Mi" + limits: + cpu: "500m" + memory: "512Mi" + volumeMounts: + - name: slink-data + mountPath: /app/var/data + - name: slink-data + mountPath: /app/slink/images + volumes: + - name: slink-data + persistentVolumeClaim: + claimName: slink-data +--- +# 2) Service +apiVersion: v1 +kind: Service +metadata: + name: slink + namespace: cloud +spec: + type: ClusterIP + selector: + app: slink + ports: + - port: 3000 + targetPort: slink-port +--- +# 3) PersistentVolumeClaim +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: slink-data + namespace: cloud + annotations: + nfs.io/storage-path: "slink-data" +spec: + storageClassName: "nfs-client" + accessModes: + - ReadWriteMany + resources: + requests: + storage: 5Gi + limits: + storage: 15Gi +--- +# 4) Ingress +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: slink + namespace: cloud + annotations: + nginx.ingress.kubernetes.io/proxy-body-size: "0" + nginx.ingress.kubernetes.io/proxy-read-timeout: "600" + nginx.ingress.kubernetes.io/proxy-send-timeout: "600" +spec: + ingressClassName: nginx + rules: + - host: slink.haven + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: slink + port: + number: 3000 diff --git a/default/paperless.yaml b/default/paperless.yaml new file mode 100644 index 0000000..947c92f --- /dev/null +++ b/default/paperless.yaml @@ -0,0 +1,131 @@ +--- +# 1) Deployment +apiVersion: apps/v1 +kind: Deployment +metadata: + name: paperless + namespace: default +spec: + replicas: 1 + selector: + matchLabels: + app: paperless + template: + metadata: + labels: + app: paperless + spec: + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - weight: 100 + preference: + matchExpressions: + - key: kubernetes.io/hostname + operator: In + values: + - iris + containers: + - name: paperless + image: ghcr.io/paperless-ngx/paperless-ngx:latest + imagePullPolicy: Always + 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_REDIS + value: "redis://redis.haven:6379" + - name: PAPERLESS_PORT + value: "8000" + ports: + - containerPort: 8000 + name: paperless-port + resources: + requests: + cpu: "100m" + memory: "256Mi" + limits: + cpu: "4000m" + memory: "1Gi" + volumeMounts: + - name: paperless-data + subPath: data + mountPath: /usr/src/paperless/data + - name: paperless-data + subPath: media + mountPath: /usr/src/paperless/media + - name: paperless-data + subPath: export + mountPath: /usr/src/paperless/export + - name: paperless-data + subPath: consume + mountPath: /usr/src/paperless/consume + volumes: + - name: paperless-data + persistentVolumeClaim: + claimName: paperless-data +--- +# 2) Service +apiVersion: v1 +kind: Service +metadata: + name: paperless + namespace: default +spec: + type: ClusterIP + selector: + app: paperless + ports: + - 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 +kind: Ingress +metadata: + name: paperless + namespace: default +spec: + ingressClassName: nginx + rules: + - host: paperless.haven + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: paperless + port: + number: 8000