Hybrid cloud cluster monorepo with Ansible, K8s, NixOS, and Terraform. cute.haus
ansible terraform nix k8s
1

Configure Feed

Select the types of activity you want to include in your feed.

k8s: add nextcloud and collabora

Aly Raffauf (Jun 8, 2026, 12:43 PM EDT) a5bc11a8 d5ed5a6b

+674 -2
+8
ansible/playbooks/tasks/integrations/nextcloud.yml
··· 1 + --- 2 + - ansible.builtin.include_tasks: _write-secret-and-restart.yml 3 + vars: 4 + secret_name: nextcloud-sso-env 5 + secret_data: 6 + OIDC_CLIENT_ID: "{{ client_credentials_by_slug[client_spec.slug].client_id }}" 7 + OIDC_CLIENT_SECRET: "{{ client_credentials_by_slug[client_spec.slug].client_secret }}" 8 + deployment_name: nextcloud
+11
ansible/playbooks/vars/oidc-clients.yml
··· 67 67 isPublic: false 68 68 pkceEnabled: true 69 69 integration: paperless 70 + 71 + - slug: nextcloud 72 + name: Nextcloud 73 + logoUrl: https://cdn.jsdelivr.net/gh/selfhst/icons@main/png/nextcloud.png 74 + launchURL: https://nextcloud.cute.haus/ 75 + callbackURLs: 76 + - https://nextcloud.cute.haus/apps/user_oidc/code 77 + logoutCallbackURLs: [] 78 + isPublic: false 79 + pkceEnabled: true 80 + integration: nextcloud
+6
k8s/charts/collabora/Chart.yaml
··· 1 + apiVersion: v2 2 + name: collabora 3 + description: Collabora Online (CODE) document server for Nextcloud Office 4 + type: application 5 + version: 0.1.0 6 + appVersion: "26.04"
+75
k8s/charts/collabora/templates/deployment.yaml
··· 1 + apiVersion: apps/v1 2 + kind: Deployment 3 + metadata: 4 + name: {{ .Chart.Name }} 5 + labels: 6 + app: {{ .Chart.Name }} 7 + spec: 8 + replicas: 1 9 + strategy: 10 + type: Recreate 11 + selector: 12 + matchLabels: 13 + app: {{ .Chart.Name }} 14 + template: 15 + metadata: 16 + labels: 17 + app: {{ .Chart.Name }} 18 + spec: 19 + terminationGracePeriodSeconds: 30 20 + tolerations: 21 + - key: node.kubernetes.io/not-ready 22 + operator: Exists 23 + effect: NoExecute 24 + tolerationSeconds: 60 25 + - key: node.kubernetes.io/unreachable 26 + operator: Exists 27 + effect: NoExecute 28 + tolerationSeconds: 60 29 + containers: 30 + - name: {{ .Chart.Name }} 31 + image: docker.io/collabora/code:26.04@sha256:75859dc9f9084d1877ce36cf96ec86600f495bade33289c9cbc27e0a0ee23b81 32 + imagePullPolicy: IfNotPresent 33 + # MKNOD is required for Collabora's per-document chroot jails. 34 + securityContext: 35 + capabilities: 36 + add: ["MKNOD"] 37 + env: 38 + - name: aliasgroup1 39 + value: 'https://nextcloud\.cute\.haus' 40 + - name: server_name 41 + value: "collabora.cute.haus" 42 + - name: extra_params 43 + value: "--o:ssl.enable=false --o:ssl.termination=true" 44 + - name: DONT_GEN_SSL_CERT 45 + value: "true" 46 + ports: 47 + - name: http 48 + containerPort: 9980 49 + resources: 50 + requests: 51 + cpu: "2" 52 + memory: 2Gi 53 + limits: 54 + cpu: "4" 55 + memory: 4Gi 56 + startupProbe: 57 + httpGet: 58 + path: / 59 + port: http 60 + periodSeconds: 5 61 + failureThreshold: 30 62 + timeoutSeconds: 5 63 + livenessProbe: 64 + httpGet: 65 + path: / 66 + port: http 67 + periodSeconds: 60 68 + timeoutSeconds: 15 69 + readinessProbe: 70 + httpGet: 71 + path: / 72 + port: http 73 + periodSeconds: 10 74 + timeoutSeconds: 10 75 + failureThreshold: 3
+23
k8s/charts/collabora/templates/ingress.yaml
··· 1 + apiVersion: networking.k8s.io/v1 2 + kind: Ingress 3 + metadata: 4 + name: {{ .Chart.Name }} 5 + labels: 6 + app: {{ .Chart.Name }} 7 + spec: 8 + ingressClassName: traefik 9 + tls: 10 + - hosts: 11 + - "collabora.cute.haus" 12 + secretName: cute-haus-tls 13 + rules: 14 + - host: "collabora.cute.haus" 15 + http: 16 + paths: 17 + - path: / 18 + pathType: Prefix 19 + backend: 20 + service: 21 + name: {{ .Chart.Name }} 22 + port: 23 + number: 9980
+14
k8s/charts/collabora/templates/service.yaml
··· 1 + apiVersion: v1 2 + kind: Service 3 + metadata: 4 + name: {{ .Chart.Name }} 5 + labels: 6 + app: {{ .Chart.Name }} 7 + spec: 8 + type: ClusterIP 9 + selector: 10 + app: {{ .Chart.Name }} 11 + ports: 12 + - name: http 13 + port: 9980 14 + targetPort: http
+6
k8s/charts/nextcloud/Chart.yaml
··· 1 + apiVersion: v2 2 + name: nextcloud 3 + description: Nextcloud 4 + type: application 5 + version: 0.1.0 6 + appVersion: "33"
+51
k8s/charts/nextcloud/templates/configmap-hooks.yaml
··· 1 + apiVersion: v1 2 + kind: ConfigMap 3 + metadata: 4 + name: {{ .Chart.Name }}-hooks 5 + labels: 6 + app: {{ .Chart.Name }} 7 + data: 8 + oidc.sh: | 9 + #!/bin/sh 10 + set -eu 11 + 12 + occ() { 13 + if [ "$(id -u)" = 0 ]; then 14 + su -p www-data -s /bin/sh -c "php /var/www/html/occ $*" 15 + else 16 + php /var/www/html/occ "$@" 17 + fi 18 + } 19 + 20 + echo "[office-hook] configuring richdocuments -> Collabora" 21 + if occ app:install richdocuments 2>/dev/null || occ app:enable richdocuments; then 22 + occ config:app:set richdocuments wopi_url --value="http://collabora.default.svc:9980" || true 23 + occ config:app:set richdocuments public_wopi_url --value="https://collabora.cute.haus" || true 24 + occ config:app:delete richdocuments wopi_allowlist || true 25 + occ richdocuments:activate-config --callback-url=https://nextcloud.cute.haus || true 26 + else 27 + echo "[office-hook] WARNING: richdocuments install/enable failed (non-fatal)" 28 + fi 29 + 30 + if [ -z "${OIDC_CLIENT_ID:-}" ] || [ -z "${OIDC_CLIENT_SECRET:-}" ]; then 31 + echo "[oidc-hook] nextcloud-sso-env not present yet; skipping Pocket ID setup" 32 + exit 0 33 + fi 34 + 35 + echo "[oidc-hook] installing/enabling user_oidc" 36 + occ app:install user_oidc || true 37 + occ app:enable user_oidc 38 + 39 + echo "[oidc-hook] reconciling Pocket ID provider" 40 + occ user_oidc:provider cute.haus \ 41 + --clientid="$OIDC_CLIENT_ID" \ 42 + --clientsecret="$OIDC_CLIENT_SECRET" \ 43 + --discoveryuri="https://id.cute.haus/.well-known/openid-configuration" \ 44 + --scope="openid email profile" \ 45 + --mapping-uid=preferred_username \ 46 + --mapping-email=email \ 47 + --mapping-display-name=name \ 48 + --unique-uid=0 \ 49 + || echo "[oidc-hook] WARNING: provider registration failed (non-fatal); SSO may be unconfigured" 50 + 51 + echo "[oidc-hook] done"
+39
k8s/charts/nextcloud/templates/configmap.yaml
··· 1 + apiVersion: v1 2 + kind: ConfigMap 3 + metadata: 4 + name: {{ .Chart.Name }}-config 5 + labels: 6 + app: {{ .Chart.Name }} 7 + data: 8 + NEXTCLOUD_ADMIN_USER: "alyraffauf" 9 + NEXTCLOUD_TRUSTED_DOMAINS: "nextcloud.cute.haus" 10 + OVERWRITEPROTOCOL: "https" 11 + OVERWRITEHOST: "nextcloud.cute.haus" 12 + OVERWRITECLIURL: "https://nextcloud.cute.haus" 13 + TRUSTED_PROXIES: "10.42.0.0/16" 14 + APACHE_DISABLE_REWRITE_IP: "1" 15 + PHP_MEMORY_LIMIT: "512M" 16 + PHP_UPLOAD_LIMIT: "10G" 17 + 18 + POSTGRES_HOST: "pg-shared-rw.cnpg-system.svc" 19 + POSTGRES_DB: "nextcloud" 20 + POSTGRES_USER: "nextcloud" 21 + 22 + REDIS_HOST: "valkey.default.svc" 23 + REDIS_HOST_PORT: "6379" 24 + 25 + OBJECTSTORE_S3_BUCKET: "aly-nextcloud" 26 + OBJECTSTORE_S3_REGION: "us-east-005" 27 + OBJECTSTORE_S3_HOST: "s3.us-east-005.backblazeb2.com" 28 + OBJECTSTORE_S3_PORT: "443" 29 + OBJECTSTORE_S3_SSL: "true" 30 + OBJECTSTORE_S3_USEPATH_STYLE: "true" 31 + OBJECTSTORE_S3_AUTOCREATE: "false" 32 + 33 + SMTP_HOST: "smtp.resend.com" 34 + SMTP_SECURE: "ssl" 35 + SMTP_PORT: "465" 36 + SMTP_AUTHTYPE: "LOGIN" 37 + SMTP_NAME: "resend" 38 + MAIL_FROM_ADDRESS: "admin" 39 + MAIL_DOMAIN: "aly.social"
+115
k8s/charts/nextcloud/templates/deployment.yaml
··· 1 + apiVersion: apps/v1 2 + kind: Deployment 3 + metadata: 4 + name: {{ .Chart.Name }} 5 + labels: 6 + app: {{ .Chart.Name }} 7 + spec: 8 + replicas: 1 9 + strategy: 10 + type: Recreate 11 + selector: 12 + matchLabels: 13 + app: {{ .Chart.Name }} 14 + template: 15 + metadata: 16 + labels: 17 + app: {{ .Chart.Name }} 18 + spec: 19 + terminationGracePeriodSeconds: 30 20 + enableServiceLinks: false 21 + securityContext: 22 + fsGroup: 33 23 + tolerations: 24 + - key: node.kubernetes.io/not-ready 25 + operator: Exists 26 + effect: NoExecute 27 + tolerationSeconds: 60 28 + - key: node.kubernetes.io/unreachable 29 + operator: Exists 30 + effect: NoExecute 31 + tolerationSeconds: 60 32 + containers: 33 + - name: {{ .Chart.Name }} 34 + image: docker.io/library/nextcloud:33-apache@sha256:56bdc45109067500fd0832fa64832b7c77a167d9394cbf5f0f4b59740b94194d 35 + imagePullPolicy: IfNotPresent 36 + envFrom: 37 + - configMapRef: 38 + name: {{ .Chart.Name }}-config 39 + - secretRef: 40 + name: {{ .Chart.Name }}-env 41 + - secretRef: 42 + name: {{ .Chart.Name }}-sso-env 43 + optional: true 44 + ports: 45 + - name: http 46 + containerPort: 80 47 + resources: 48 + requests: 49 + cpu: 500m 50 + memory: 1Gi 51 + limits: 52 + cpu: "4" 53 + memory: 4Gi 54 + volumeMounts: 55 + - name: html 56 + mountPath: /var/www/html 57 + - name: hooks 58 + mountPath: /docker-entrypoint-hooks.d/before-starting 59 + startupProbe: 60 + httpGet: 61 + path: /status.php 62 + port: http 63 + periodSeconds: 10 64 + failureThreshold: 90 65 + timeoutSeconds: 5 66 + livenessProbe: 67 + httpGet: 68 + path: /status.php 69 + port: http 70 + periodSeconds: 60 71 + timeoutSeconds: 15 72 + readinessProbe: 73 + httpGet: 74 + path: /status.php 75 + port: http 76 + periodSeconds: 10 77 + timeoutSeconds: 10 78 + failureThreshold: 3 79 + - name: cron 80 + image: docker.io/library/nextcloud:33-apache@sha256:56bdc45109067500fd0832fa64832b7c77a167d9394cbf5f0f4b59740b94194d 81 + imagePullPolicy: IfNotPresent 82 + command: 83 + - /bin/sh 84 + - -c 85 + - | 86 + while true; do 87 + php -f /var/www/html/cron.php || true 88 + sleep 300 89 + done 90 + securityContext: 91 + runAsUser: 33 92 + runAsGroup: 33 93 + envFrom: 94 + - configMapRef: 95 + name: {{ .Chart.Name }}-config 96 + - secretRef: 97 + name: {{ .Chart.Name }}-env 98 + resources: 99 + requests: 100 + cpu: 50m 101 + memory: 128Mi 102 + limits: 103 + cpu: "1" 104 + memory: 512Mi 105 + volumeMounts: 106 + - name: html 107 + mountPath: /var/www/html 108 + volumes: 109 + - name: html 110 + persistentVolumeClaim: 111 + claimName: {{ .Chart.Name }}-data 112 + - name: hooks 113 + configMap: 114 + name: {{ .Chart.Name }}-hooks 115 + defaultMode: 0755
+23
k8s/charts/nextcloud/templates/ingress.yaml
··· 1 + apiVersion: networking.k8s.io/v1 2 + kind: Ingress 3 + metadata: 4 + name: {{ .Chart.Name }} 5 + labels: 6 + app: {{ .Chart.Name }} 7 + spec: 8 + ingressClassName: traefik 9 + tls: 10 + - hosts: 11 + - "nextcloud.cute.haus" 12 + secretName: cute-haus-tls 13 + rules: 14 + - host: "nextcloud.cute.haus" 15 + http: 16 + paths: 17 + - path: / 18 + pathType: Prefix 19 + backend: 20 + service: 21 + name: {{ .Chart.Name }} 22 + port: 23 + number: 80
+15
k8s/charts/nextcloud/templates/pvc.yaml
··· 1 + apiVersion: v1 2 + kind: PersistentVolumeClaim 3 + metadata: 4 + name: {{ .Chart.Name }}-data 5 + labels: 6 + app: {{ .Chart.Name }} 7 + annotations: 8 + helm.sh/resource-policy: keep 9 + spec: 10 + accessModes: 11 + - ReadWriteOnce 12 + storageClassName: longhorn 13 + resources: 14 + requests: 15 + storage: 8Gi
+15
k8s/charts/nextcloud/templates/secret.yaml
··· 1 + {{- if .Values.secret }} 2 + apiVersion: v1 3 + kind: Secret 4 + metadata: 5 + name: {{ .Chart.Name }}-env 6 + labels: 7 + app: {{ .Chart.Name }} 8 + type: Opaque 9 + stringData: 10 + NEXTCLOUD_ADMIN_PASSWORD: {{ .Values.secret.NEXTCLOUD_ADMIN_PASSWORD | quote }} 11 + POSTGRES_PASSWORD: {{ .Values.secret.POSTGRES_PASSWORD | quote }} 12 + OBJECTSTORE_S3_KEY: {{ .Values.secret.OBJECTSTORE_S3_KEY | quote }} 13 + OBJECTSTORE_S3_SECRET: {{ .Values.secret.OBJECTSTORE_S3_SECRET | quote }} 14 + SMTP_PASSWORD: {{ .Values.secret.SMTP_PASSWORD | quote }} 15 + {{- end }}
+14
k8s/charts/nextcloud/templates/service.yaml
··· 1 + apiVersion: v1 2 + kind: Service 3 + metadata: 4 + name: {{ .Chart.Name }} 5 + labels: 6 + app: {{ .Chart.Name }} 7 + spec: 8 + type: ClusterIP 9 + selector: 10 + app: {{ .Chart.Name }} 11 + ports: 12 + - name: http 13 + port: 80 14 + targetPort: http
+16
k8s/helmfile.yaml
··· 254 254 values: 255 255 - values/secrets/paperless.yaml 256 256 257 + - name: nextcloud 258 + namespace: default 259 + chart: ./charts/nextcloud 260 + needs: 261 + - default/cluster-tls 262 + - cnpg-system/pg-shared 263 + - default/valkey 264 + values: 265 + - values/secrets/nextcloud.yaml 266 + 267 + - name: collabora 268 + namespace: default 269 + chart: ./charts/collabora 270 + needs: 271 + - default/cluster-tls 272 + 257 273 - name: uptime-kuma 258 274 namespace: default 259 275 chart: ./charts/uptime-kuma
+6
k8s/values/secrets/nextcloud.yaml
··· 1 + secret: 2 + NEXTCLOUD_ADMIN_PASSWORD: ref+sops://../secrets/nextcloud.yaml#/admin_password 3 + POSTGRES_PASSWORD: ref+sops://../secrets/pg-roles.yaml#/roles/nextcloud/password 4 + OBJECTSTORE_S3_KEY: ref+sops://../secrets/b2.yaml#/B2_KEY_ID 5 + OBJECTSTORE_S3_SECRET: ref+sops://../secrets/b2.yaml#/B2_APP_KEY 6 + SMTP_PASSWORD: ref+sops://../secrets/tranquil-pds.yaml#/secret/MAIL_SMARTHOST_PASSWORD
+3
k8s/values/secrets/pg-shared.yaml
··· 17 17 paperless: 18 18 database: paperless 19 19 password: ref+sops://../secrets/pg-roles.yaml#/roles/paperless/password 20 + nextcloud: 21 + database: nextcloud 22 + password: ref+sops://../secrets/pg-roles.yaml#/roles/nextcloud/password
+214
secrets/nextcloud.yaml
··· 1 + admin_password: ENC[AES256_GCM,data:Bc4YXilbVCqlCSf8br4DvZgdusBu+Ke6ufaajluxGffIc8tZWeSOyg+xZgMRLKE7,iv:tmp/SLCbzsJR0S34wnx8vNIMoVN5LcIVq8oabjyqD84=,tag:1wvqrukxCM+wg35f9B96vw==,type:str] 2 + sops: 3 + age: 4 + - enc: | 5 + -----BEGIN AGE ENCRYPTED FILE----- 6 + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAwUEtUWGxsMGQ4SEdSSThv 7 + UURBT0hXQ25KdzQ0Z0Nwd1Q1THZ6N1FwVHhZCllINjdMamJDOXdEYWp6OUpDalV6 8 + akFlL3ZFUnpXa0s5OEtoN3lOMTFaT2MKLS0tIHFUbDBTTlQvQkEvTUpjdXZxNVVK 9 + K2xhRmdwWVMyZUpya3JDRlI5VmNZTGsKgnZnEXOpwuvd37vlvRdfHygElEknl70w 10 + XxAzm+2F44HkeLRjHCO3u0+qU+Pm2UJkqXBb+5zff0EKfXapqWiDjA== 11 + -----END AGE ENCRYPTED FILE----- 12 + recipient: age1g79dfm0p44q5yxzhwd9syg965lupdu3n5lgyltdannmul5v5v5aszzz3gs 13 + - enc: | 14 + -----BEGIN AGE ENCRYPTED FILE----- 15 + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBGaEV2eUFDNytiaXdRb0Rr 16 + MzRSQ1QyTzQ0MGQ2Q3B3TzVKUFE0YnJka2h3CnR4N1hzMlM1RTVhb3BYY0Z3c2NY 17 + MGljbCt5bmRNVXFRYzhDRklJcDUzYUEKLS0tIHVCeVNHTHFCdHhCRy9GcTlPTEE5 18 + Z3Vtdy9DSnV6YWtnbmE1T1Vka2ZWckEKpWUEd2rKCNrvUGEHE0qPlpSVEJraAQUS 19 + z7/Gb0G25xJpyYPOPtO6kpP6YBiszn+65fOYioqRrhAJmI8AO1X3jA== 20 + -----END AGE ENCRYPTED FILE----- 21 + recipient: age1cpcg5t420nf72k0c9rrx7amg0szch98uzqu273exj7lw3yu0j99q6vcckn 22 + - enc: | 23 + -----BEGIN AGE ENCRYPTED FILE----- 24 + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBWSlhVRHpiOG1Vc1dadmh1 25 + dFJjVWpER0FZQVB6Y0gyUHhoTjdob3VQS3pjCi8vVXNBSzE3YWxPQk1oZEYvSFNF 26 + aE5PNUxMQ3c5eXQ2MFRsK1k4aCt3dEEKLS0tIFV2L00xTm5WT3ovdGlROFlsYkRz 27 + UE84djlpNXdJM2pKQzd3eEYyaVI4bW8K+81WQNLnsqjba5rBQg5TFQwDEztVKWfM 28 + V2i23wUb6bFyRqfPzENNjIxUmNp9zl2jEPRSFS1PDKx4DlS4sHMBrA== 29 + -----END AGE ENCRYPTED FILE----- 30 + recipient: age1w4mzwe89aqgs56mn8zg7dd2l623kwmw80k90wr2sa6dnlcdmhcnsp4kt54 31 + - enc: | 32 + -----BEGIN AGE ENCRYPTED FILE----- 33 + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSArMGN4WWV1enJ4SFVoeUow 34 + b0RaYnRBQ0pzY3dQWU1YQ25hL3YvYlgxbkdJCkZHcmZqb1Zkay8zUndoaWE1MDVp 35 + OWU4T2JXZW9HUzNtd1k0b1B3N0tpRFUKLS0tIE9udkorSFAzakpKbmhlMkdmOUhn 36 + dWNWWlRVSlBRTjhWTzBhOHlWSnlrYncKOilUIM5JCk0EEFW/CI3w7RnukQY9fuVN 37 + dbF9mZ5VNjWwKwMSIBCVHCkqbyr3vqEVX2C8fL2h8Xzz3jVlZlRFYw== 38 + -----END AGE ENCRYPTED FILE----- 39 + recipient: age1e5a0aaueyk34klry2qk094zrwfsvga0uft93mwweye30xhqhvfzs3jgqku 40 + - enc: | 41 + -----BEGIN AGE ENCRYPTED FILE----- 42 + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB2U3JyMnlTMkhFTmZ5WWNn 43 + SStiRWNMMm8yS1hZMkcrc2owczdhQ0xtVGdzClNWZFc4bGxPYW5SRDVCdDBmbm8v 44 + R2pIZEEvcHpUK21UUHpKOENqRSs3Z1UKLS0tIElCMWRxVWhyRXN0SFJ2Myt1MjZr 45 + RzF2eDNxMzUvUDV6bUFOb3o1Tkl5NEEKqhfv4P4AwDpM4aISe0Hg5z5fLi58oRrQ 46 + CYxWzDta6yTGx3hlI0IY8brJ2yJL7TFaeQEYgKRREbd+jaUrixdP9A== 47 + -----END AGE ENCRYPTED FILE----- 48 + recipient: age1j9jju3whwj72udhge7v4c77gk6v6w2cq8zjngzyppwtptfsz499qyywu9a 49 + - enc: | 50 + -----BEGIN AGE ENCRYPTED FILE----- 51 + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBXclIySG5TZFpNYzB2aDlx 52 + MUFBWm1uVStIeGdNYTB2cFpiN1J3VFNjaVdVCnBDQVBuT2xnelkxNC9PM0p5TWJV 53 + UnhLeHFZd3lVcEFBOThSS2VOcWx6elEKLS0tIGZCQVkxWFR5YkRiT3JwRmdOdnJ0 54 + OGZhR2NPeTJuekU4Snl2K3I5dGxzbWsKuyclabTBlzenFFPslLFBdzkTQMLJDKJ0 55 + qihHnA1uuk+JVsvwATU5LpD4NQ1T1zzBpRCKiIuSn+PbEtJbbraWDA== 56 + -----END AGE ENCRYPTED FILE----- 57 + recipient: age162sx8kppp90mjxw88eqs78hgnpkddf8k9kgtksmmexzvcdxknpkspmkgaf 58 + - enc: | 59 + -----BEGIN AGE ENCRYPTED FILE----- 60 + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBPd1BLeHJQNzhDUEZsb0FK 61 + NDlLRk9VK2JIVnpVWUh5VXQvOGxlTzYxWG5RCk5aQTdSeFlNbW5vTytWdVBDajM4 62 + U1RVVDdRWlZjNmtqcVVCb3BTMXF5bmMKLS0tIHduWkdYVWRreXVYYnlqekFBNzdB 63 + ckRQSUNYdiszblU1azNyOEtUbU0vRm8KA17+BiGItlBjEXuPZhoZLoUoqgJPXi1d 64 + j/K0bv/6ckBQDT683O9xvkG6uIVtGHZZLcRjGZLo9lhfK9hRoREgFA== 65 + -----END AGE ENCRYPTED FILE----- 66 + recipient: age1n90usl6sl9tvl64lrxt66gmxyw3u8lkqmv5zxga3pmqmsyjr2c6sadnttd 67 + - enc: | 68 + -----BEGIN AGE ENCRYPTED FILE----- 69 + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBiU3F6V1pXRW1BRlNuZUp1 70 + TElhK3NmdUdqVVVPdHJiZ2JpL2IwNEdxZkQ0CmEwQzlQMU1sK29MRy8wZTkvd2o5 71 + Zkk5ZE13TUJsYmpDcEVOSzE3anBMcTAKLS0tIGJSU25RWXNYdU1sQWZyLzR1S1Jv 72 + akpVY1pxRWw2WmZRMERGT0g4TkZkWUkKF8y0mohU/bZXtz2hfIDvyjp5d3tnYiCl 73 + iOeskm7Vzg3KXSj5zc63K5uVAnzveosHbpBY9A62M19SPJVatbyiQw== 74 + -----END AGE ENCRYPTED FILE----- 75 + recipient: age1mpcyeqjcl8j0dd4sj6f0vufs2vpus3xn4dvxe3cr8g8rgcm0nfxq03ds4y 76 + - enc: | 77 + -----BEGIN AGE ENCRYPTED FILE----- 78 + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBOTnh3R2U3OVd6Qi95UTJL 79 + MlJZOFJYQmtBYXNPRzRkdDFoSG4yOFlWdWlrCjZENjIxblVKZUh5anFpRzc2SlBx 80 + VlNHWGlMcFFIUWttc2t5ZlNCTlA1OEUKLS0tIHBRbVZaSjNGV01tVWc3U25ibzI0 81 + UXJPUkM2dmp2VDNhWG5xQU5FVDIrOWcK1Zmm/ww0Px2pVCB98VL2zHWLkdO1Nqpv 82 + ipPEsmzXSIqXT7pchl5j8Z3fKh5RiLswdNQfSVgDsG8w4QvC843ztQ== 83 + -----END AGE ENCRYPTED FILE----- 84 + recipient: age1zj2aq2a2v3ngcer7s3jz6pufhh8ula8pw56etmy28dy25wrkk3vq59hu2s 85 + - enc: | 86 + -----BEGIN AGE ENCRYPTED FILE----- 87 + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAxaFFZVDRKRDRKeEhoWWtD 88 + K05IbTJXbW8ycTF0YjZGd1V3cktGcXJ1NlZ3Ck4rbVZZOUVsVlJwWXZyMThOb1Zv 89 + bkYwa3ZnTitEdHRWLy81NGJTRk82eEEKLS0tIFVqRGhHV1VuaHVtUkNHWTMrc2xp 90 + TVNST3N0d2FpTXBxNlcvdTY1a3I4TE0KbGMHTUfXNYIPAUEmQQlJvHltiTInsCIf 91 + CI1HcAGfYRmDvoOAEWLNt5wukHSPvxOpK13acgb6KVINVFsPzDO62A== 92 + -----END AGE ENCRYPTED FILE----- 93 + recipient: age15td0jk5e2qeq2pexvxguhuuaxuaa7nhql7mhx9jr79caska6t4pqdv5spl 94 + - enc: | 95 + -----BEGIN AGE ENCRYPTED FILE----- 96 + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBaN1Bla2lRMjRJNWJ1SUhx 97 + c01zdGdZd3VnTllZbS8wSXBuUXArL1pMWnc0CkJmUjdUM0kzZzN2dDZpbXIxM04y 98 + NnlYaHBIMzF1Tms4V2RtMC9UdHV4cWsKLS0tIHVtRXltanpPcDdZbFpuSFhBUjhy 99 + ZTJTa084K3lhM1Z4M05BL0VndHdjTWsKfBMQD2z3S56Uo2oa+PTpwWmREJBGbV8U 100 + 5xu1n34Y3426QnFoZbr6OsS7H3eXFGi1sfncRxuWIoq2TXvO21nMeQ== 101 + -----END AGE ENCRYPTED FILE----- 102 + recipient: age15mhrzghrmprq387xqsln6996yx3ja2e2zpamh9mtuu9zqmxahunqg9qugw 103 + - enc: | 104 + -----BEGIN AGE ENCRYPTED FILE----- 105 + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBod1BhcnR1d3BEUzVpVGls 106 + cEFxUmhTMFJFS1NGV1hoQTRoY1piVXdldFJ3CmY0SUVsYXE0bVRSRktaVk44VHZP 107 + SEd4VWswSUhwWlFQZmNKV0V5Qkg2NkkKLS0tIG8ySDROWkovemxiZ3gzUTEyOEpB 108 + UW4zOU1meWxGd0IvTnlhcVZ0d05oRlEKMWlVkVCy8fKIwpltsXH3PSK47dEj+bZw 109 + wyERwJmRv7sA8dxfjahNlAzpmnvlvIFqmN1VoZpQsvlxbEvXGvKGTw== 110 + -----END AGE ENCRYPTED FILE----- 111 + recipient: age1su5lre6favcv6gdc50yh7ecv33qgfp0tm6klunpuasa3q79kmqtsykaq0d 112 + - enc: | 113 + -----BEGIN AGE ENCRYPTED FILE----- 114 + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBKUU95TnRjUXdDM3BManpN 115 + RnBvMzdOVS9ValVXQ2JjRFU3UTZRd1N5UFRjClg5aWMrbWFzaWxBMmZINzRQTlYw 116 + TFFra2loNkZRVWtwbXlZVWpPYTdTUEUKLS0tIGJnZ2dlZlUzUjk1VlVQbGh6ZVdC 117 + b1FXdlZKc2xMY1J1ZkxtZmlaNmQzcmcKTnju/b96VVM6WEQnl+abFRfpR1m5oBt1 118 + 3oJolfyBfkfoPPnBSrM43LaiO83ShP9/WJcG182/YPFSMCarpDpazA== 119 + -----END AGE ENCRYPTED FILE----- 120 + recipient: age1v4x5alkmvxsx5jsrwpecx0tne0ch2rwfkk0rq5w8x578j2pf5urssg5gx2 121 + - enc: | 122 + -----BEGIN AGE ENCRYPTED FILE----- 123 + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBxVWp0bEZmWFdtWklYSGNj 124 + RUdhS1pmYnA5NjZ6VmpXWW15U1FGQW9CVVZZCkFkNlRja0IzcEp5SC9uTzFlcG5H 125 + VHA1RlM0cDRWb05OV1NHeU0zRk5zck0KLS0tIDloV3FmSXNqbWppbE5UcGg0N2ZF 126 + ZXM4cE9JWmlVTW1YMHlvVVZJUjk0UjgKiNFZDggRYMgus65s5JCtnojtABGCX73E 127 + 6me40Ch/gm9uFoQSL2Yt5DKg3dIZAc79APlf1bwId0NqURDAJES4xA== 128 + -----END AGE ENCRYPTED FILE----- 129 + recipient: age1f9hd8fu0694rc3tr6hwxz3ldfpepref937rmvqdxvvsr0kfcjdxswyzvw3 130 + - enc: | 131 + -----BEGIN AGE ENCRYPTED FILE----- 132 + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSArdGxnMDFHWVJxUS9oU0xV 133 + ZnJQWHgzN2piRllCN0h4NlNuSnRYYWpqMUFVCmZrZGdoSk9aR3dlZTc0bmZaQ0lr 134 + bW9ESWYvWmlEaXJ5KzZTcEgwdnBSekUKLS0tIFFKZ0VGVnc0TXppTkdQKytsaldN 135 + T1Z4RXdudkI0eXFzbE9ZcVEyTUZWMGcKWUm37xi5Ly60znxndgcXe3oJXz1PSZO3 136 + tsIMQX7SJKJzFq0AUIPAf7j/3i3R6Osw8HY/HDyHdXoYkcpg2X8j3g== 137 + -----END AGE ENCRYPTED FILE----- 138 + recipient: age157en2pt286a22pxzyugt84ak6rn2at89tpma88juqfgj84lme5csq4999g 139 + - enc: | 140 + -----BEGIN AGE ENCRYPTED FILE----- 141 + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBHQTVxSTlYQ3FiWk9vRlJ6 142 + RG9FS1FyeW8xdkx2SWxqVDhrNmR5TjdrOXlRCmRmSE5jY1l4Q2xUeTJnbzB2V3dZ 143 + V09xbk04Z1c5eThLUG44bm5ac0x1cDAKLS0tIEY3aE1EVDVSb2gyWERwRVZRbmN2 144 + c1NoMjJuMUVUUWo1Q3Bib1E2aThHeVUKiAFTltGSFDsio23Qkr0a/roRDB1ZNKNW 145 + 9FO4JvTKGjPq7nMPAcCvfpXvSNpGmCWRFGA00xiWvKATjvb9S9QUxg== 146 + -----END AGE ENCRYPTED FILE----- 147 + recipient: age1axn36h9356ena7rq6y2xa4rcm250w9h0m9pz6x0677gla0v4f4dsj92yfm 148 + - enc: | 149 + -----BEGIN AGE ENCRYPTED FILE----- 150 + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBOcUNxSWVnMTlBbWttSk1r 151 + aFgyTXREUXVoS21pWlArSUt3M1RIVXFNdEJrClNPOVVRMVFMRGFyUHV1RG5jNmpO 152 + WXNSNVBpQWxNeWJHYUQ2ZjI5a21JSk0KLS0tIEhaYmNTSGdENlNBbHFteEtaYTRC 153 + OGVBU2NFRkU2czkwYjBlc25pdzJucU0KOAyM2tdCRjpSpzO7xBfUqOKmn9k2Vyfd 154 + 1p1nmNtIPBKyVPSRvEhZ1uBzKT0HruD+Vd7QGpKbhlJUYFDnjwY+eg== 155 + -----END AGE ENCRYPTED FILE----- 156 + recipient: age1xwlrtfu3du4jxg2l6eemzqeed8tflhdkjn0q5j9pzpecshtp3cpsh60l4j 157 + - enc: | 158 + -----BEGIN AGE ENCRYPTED FILE----- 159 + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAwQi80dlBtcjV1Y1ZyUFdJ 160 + ZjhqSW1vS0hoVTREQWd0QnZBalFvNGJLYlVBCnNzbStiZmJqYmlyQVVEVnhOTzls 161 + Mk4vTFhJbWMvb2x0bGpsRU1wZ2ZBZUkKLS0tIGFvNm01Y1J4UFFrUm1wS0pWS0ZZ 162 + Uk5JbUxQUjJla1N5cmJhMzYrQ3Z0SVEKJDZdYz3oB9aegALdjp0b7LTFu3Qn3hww 163 + tXZ9c2Dd9Yx7vBmVpSvLRkavGR55e8WWXd6BCyVxb5fiunuqppGuLA== 164 + -----END AGE ENCRYPTED FILE----- 165 + recipient: age1kgp3x48wn0dmzwqp0vdpfsdw42rej0ypkj0qavs7c2t2tgdud5zqcmhl40 166 + - enc: | 167 + -----BEGIN AGE ENCRYPTED FILE----- 168 + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBJTmdpRUlmREhWWThmZVM3 169 + a1dTbkxTMytuMEpmbHp3d0VZK1RhdjlUVERjCm5yUkoyaUFqTkJqWGZQODdmN1NI 170 + Z3cveVRsTTVrTGc5Z09CVFhUSHJ2S2sKLS0tIFVYQnQ3M0dsSHdHREpBOFpCT3Fk 171 + OFcwTVBTYXpselFaNFRLOERkWXFjK1EKkMKBtvJOg0VwQnRgJlTYr5UNtU04CzxE 172 + H8o+XVqiCB9/vPBg7MAMTgAUn6oszHG311tWWmz0UeSqaJ5dReIhtA== 173 + -----END AGE ENCRYPTED FILE----- 174 + recipient: age1sukfru07msq8fm5ddgym23yal9lfm99090p999p09mxgrrwh9aqs6zp4fy 175 + - enc: | 176 + -----BEGIN AGE ENCRYPTED FILE----- 177 + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBQUkNJWktJWHNYUW9wWVVW 178 + VmhGaU14cVdSNldkNUl6NTVvT1JPMlM4NzBnCjVVWGNWWG90aUoreERiMmEreUhS 179 + U2p2b29TdkMySisrdDEyYVZDcmxMVzQKLS0tIFRnZ1V6T3F1Z01nMVZHM0cxc1dz 180 + MjBwc0wyK2NpS0oweFl4eE5nYm0xakkKI5z+g2O2uhvpJqFPsSAu4nMo44fSEjU+ 181 + wVqNgQL+mx1TEH8xTYiLnFCTmLgfLE8c0rQ+j0QCye0p3Nvka4kqtQ== 182 + -----END AGE ENCRYPTED FILE----- 183 + recipient: age1ephzrpgftmvq4cul9766q2r3mss38xu6un74ryfmw0729afysghsh0a3qg 184 + - enc: | 185 + -----BEGIN AGE ENCRYPTED FILE----- 186 + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBaODEwVTFJa3M3UHJLTU1Z 187 + djNpbHM5eU05TzZwN3dFTGtCazJWNDZhNVdRCnNWNUJOUGNzWTN4dXAyOEdqS1dk 188 + T2g4R213MGJidFhoVTJyRlFVRGtHRmMKLS0tIHN0dzZKQlVEbGhHRnpvMnVha3Rx 189 + ODJBVW9xM01Mcyt3NklmcDRvaEVFOHMKRSJvsPqyV+vnreU041rkzEXOzMNNS8Cf 190 + RwuFYgitVfSFa+7+a6scFA7PdkxHrE/DeatvhZFawnN57joobcyj7g== 191 + -----END AGE ENCRYPTED FILE----- 192 + recipient: age1stsuakfyj3gkee4sm328ky2crmymyuzwjjmxrpvnm754sdt2zvnshf68jx 193 + - enc: | 194 + -----BEGIN AGE ENCRYPTED FILE----- 195 + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAzNEFVVzQ3N2F5NVowQVly 196 + YzQwVHQ5R2pwZzlpUnpzbk15UEdtakVlSkRjClVubm9PNzNvYnNIb08xOGt4eFVJ 197 + U2tZZDRBRmNuekFzV1oxdWlEdnZtRTgKLS0tIHVMdXRLbGxkM1MrKzNod2pBZ2pi 198 + Z1VaQ3RmeFpuVUlSU1JNYzNSUXY2WGsKEzDVr0SPAjO+JpHSCVzfsZq7RXuIx2sQ 199 + 2c3+Ne5QlhVpACj34uUAJ7/M97efHUteFWZJpBvbu3MN1ahofRTJ8w== 200 + -----END AGE ENCRYPTED FILE----- 201 + recipient: age1n66v74s70rma853sdhf7q9tn2wj85v25hh6qvyvxrf42hca284esqr26wa 202 + - enc: | 203 + -----BEGIN AGE ENCRYPTED FILE----- 204 + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBPQXMwU2dqNzhhZnVhc09V 205 + K2wydHRrMmxBMTJJZXROcFUvNStuZEZzYUV3CmFuMW9LY0dlUHZ4b2VXdjhIK1NF 206 + eEZQZHJRWXNnbG1BQWZxb0M0TzNNbVUKLS0tIHZrK2RLZk90RHlUZU43eVIxazBB 207 + alplTUs0WWkrZnRzdDAwR0dnc0RMYlEKLc2adhWSK1cRQ+yHwRkPFXOv9u/Gj6k0 208 + yg/SQIf9HGHm7ODxxe3NkPHpp5e3YXtwSTga8uxcLpiYUVqlVPnsdg== 209 + -----END AGE ENCRYPTED FILE----- 210 + recipient: age1s7ecrfntus8rvyprzhffjpqk2tmrc259knf9xqajlrqvewfp8d6svwp9pp 211 + lastmodified: "2026-06-08T14:35:17Z" 212 + mac: ENC[AES256_GCM,data:hLveXdlI7RiWtcuGuvs+FRPuVcjXse9Jrk9VzXVUdb8pAZ5O0UiHJHcrin9/8+GhTb9ZbYnvd8+dkEw8eLN5u7ksPdoPxGfOoIOGQM1qX79Qfol722bKmmfPvU3Jengtqch7xj6d5xeiYHTILmDEOVxhTFl6tT/EB5o0Ql8CwXA=,iv:WUMo5XnyOf7WCrFIky2M7GXcU1URgE3AMCjpFzCl3zA=,tag:gwNnmrueJW8pWlMvA3LuqQ==,type:str] 213 + unencrypted_suffix: _unencrypted 214 + version: 3.13.1
+5 -2
secrets/pg-roles.yaml
··· 11 11 paperless: 12 12 password: ENC[AES256_GCM,data:m2QI5QmqheJ3MZ1hnntzkwLCxBOS2jW8q61MQyz7Jw78Ko56+34P2q6usX/cQSzopym12rPXTYSf+RMYX4IusQ==,iv:BYqeBwJ1sGN791QmU7aebxsXWQihA6mGKPd60xg5DfM=,tag:h3625djRxyKd7BiTXM5KKA==,type:str] 13 13 url: ENC[AES256_GCM,data:7DckTrO2EWy4eKQOhLavV7p44XcZuWqUXFKPKMqJbqcaMju6Pu1bqqeMEI6+NijWa2VxNV1D5qxz7Afq9Z0q9813hZF4F+nevpRmBrjmxMj5OP+KiaU072lytrF37G8VuKZVhmaJzlUPZnF2v3YOKbziW6wAHcEjUgRHqZE=,iv:hj4hw//iPj0Y/DaGqbJSM5lQrmkU9kLtBffgqS35NwU=,tag:SYvZyfTzXfkxndVizgOmpw==,type:str] 14 + nextcloud: 15 + password: ENC[AES256_GCM,data:GxI1aqDwB5uWgmOKREHJkPLLYyuhTu2owk+7sEQWKuWBW7wtmbAXQkGYM03i5iOZBMuJa1xmvQmFyY9PiU4eQw==,iv:On0PrWjKkFZj580VTr5N6j43gCRlPT9x7YEQ2SZ+0v4=,tag:eSi1MnzLCV8IazOwu3KsSA==,type:str] 16 + url: ENC[AES256_GCM,data:AcbYsz+6jNl9rJLk8fnU+4MXIqoToPV+Ox/+ve2duv+noYJTf4BIFYRMYMNz5rNAtcPcnoFFArdK6Wbxu2YbO+RUdtfdheQ28R0wg/a6I1uf8Wo3M4OvvYINB1whwf1zSGcKX53Vm4FacHbl0MzeAaAz9uIduA4cuN8Li5Y=,iv:UCbMpUQxRLFvX3oj5/w4EHpZrYRmgeX/DgGRb/RYdQc=,tag:qRxiY6SyWCSKtMlslxgblg==,type:str] 14 17 sops: 15 18 age: 16 19 - enc: | ··· 220 223 znT8ibF54y7Y3ksc/f88PnivW0JNy/Mx3dQ7C4MZqStXRa8JR4a7PA== 221 224 -----END AGE ENCRYPTED FILE----- 222 225 recipient: age1s7ecrfntus8rvyprzhffjpqk2tmrc259knf9xqajlrqvewfp8d6svwp9pp 223 - lastmodified: "2026-05-14T04:18:43Z" 224 - mac: ENC[AES256_GCM,data:jCBLOeQFW0N1LIeZLxX8OFCnRwEHkzAG7cUsK1AYiJX7zTTRPvoRi6GTzc69AY3My2GDmJs7UDslhuXhZd3LQUSHbTkaEHtfnTA/0/h1+pZArCOiLynVJxRKtsWAsCgEL6c2XXkRs2LafTRXgvfzdNh+qFqXHBlPvqpG9nvmfG0=,iv:rSspDzib23zZJZzslb0Q9pt1ahrp0EoF2FvL+hc2UzU=,tag:RRGe9KLxfNAR8HYkfaqXMw==,type:str] 226 + lastmodified: "2026-06-08T14:35:02Z" 227 + mac: ENC[AES256_GCM,data:cvn2dqAsbgKnPQZycMpsnpLflIMUYn/dmBPesiy6Y4mqIs877gaE2o/DDwDPsM9ALV+6WdSLYcD1vmkHVoucvDO9F5CC5NzsRzI4H0ufOG7ijny2vtauu4Q1n6CQmTxtVagSCkUWa0pR23B0AvQKTpV0fenZ+yblpYpaf2V7QEk=,iv:CY7M+yV0QmJfyqQDth35H4w1fWnxyrryNQ2ZC/2MvMc=,tag:dwZLkKJfezfihrwWY/7CXA==,type:str] 225 228 unencrypted_suffix: _unencrypted 226 229 version: 3.12.1
+13
terraform/b2_buckets.tf
··· 128 128 } 129 129 } 130 130 131 + resource "b2_bucket" "aly_nextcloud" { 132 + bucket_name = "aly-nextcloud" 133 + bucket_type = "allPrivate" 134 + default_server_side_encryption { 135 + mode = "SSE-B2" 136 + algorithm = "AES256" 137 + } 138 + lifecycle_rules { 139 + days_from_hiding_to_deleting = 7 140 + file_name_prefix = "" 141 + } 142 + } 143 + 131 144 resource "b2_bucket" "aly_outline" { 132 145 bucket_name = "aly-outline" 133 146 bucket_type = "allPrivate"
+2
terraform/cute_haus.tf
··· 2 2 cute_haus_ingress = { 3 3 "audiobookshelf.cute.haus" = true 4 4 "auth-navidrome.cute.haus" = true 5 + "collabora.cute.haus" = false 5 6 "cute.haus" = true 6 7 "id.cute.haus" = true 7 8 "immich.cute.haus" = false 8 9 "jellyfin.cute.haus" = false 9 10 "kuma.cute.haus" = true 10 11 "navidrome.cute.haus" = true 12 + "nextcloud.cute.haus" = false 11 13 "ombi.cute.haus" = true 12 14 "paperless.cute.haus" = false 13 15 "pds.cute.haus" = false