cluster

Infrastructure files for Nordgedanken and Midnightthoughts.
git clone git://archive.git.mtrnord.blog/MTRNord/cluster.git
Log | Files | Refs | README

commit 77ca74b911da93f244b7d8c3202f5ceb77e04a2f
parent 5dc3747d2d1fa9f2b1ce16505144443c8590be8a
Author: MTRNord <MTRNord@users.noreply.github.com>
Date:   Sat, 11 Apr 2026 20:05:03 +0200

install wanderer

Signed-off-by: MTRNord <MTRNord@users.noreply.github.com>

Diffstat:
Mapps/talos_cluster/envoy-gateway/gateway_settings.yaml | 12++++++++++++
Mapps/talos_cluster/kustomization.yaml | 1+
Mapps/talos_cluster/namespaces/kustomization.yaml | 1+
Aapps/talos_cluster/namespaces/wanderer.yaml | 4++++
Aapps/talos_cluster/wanderer/kustomization.yaml | 10++++++++++
Aapps/talos_cluster/wanderer/meilisearch.yaml | 63+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aapps/talos_cluster/wanderer/pocketbase.yaml | 102+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aapps/talos_cluster/wanderer/pvc.yaml | 38++++++++++++++++++++++++++++++++++++++
Aapps/talos_cluster/wanderer/route.yaml | 49+++++++++++++++++++++++++++++++++++++++++++++++++
Aapps/talos_cluster/wanderer/secret.yaml | 37+++++++++++++++++++++++++++++++++++++
Aapps/talos_cluster/wanderer/web.yaml | 73+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
11 files changed, 390 insertions(+), 0 deletions(-)

diff --git a/apps/talos_cluster/envoy-gateway/gateway_settings.yaml b/apps/talos_cluster/envoy-gateway/gateway_settings.yaml @@ -845,6 +845,18 @@ spec: certificateRefs: - kind: Secret name: jenkins.midnightthoughts.space-tls + - name: https-mtrnord-blog-wanderer + protocol: HTTPS + hostname: "wanderer.mtrnord.blog" + port: 443 + allowedRoutes: + namespaces: + from: "All" + tls: + mode: Terminate + certificateRefs: + - kind: Secret + name: wanderer.mtrnord.blog-tls - name: http protocol: HTTP port: 80 diff --git a/apps/talos_cluster/kustomization.yaml b/apps/talos_cluster/kustomization.yaml @@ -45,3 +45,4 @@ resources: - ./matrix-backup #- ./proxmox-ccm - ./jenkins + - ./wanderer diff --git a/apps/talos_cluster/namespaces/kustomization.yaml b/apps/talos_cluster/namespaces/kustomization.yaml @@ -31,3 +31,4 @@ resources: - persephone.yaml - codeberg.yaml - opencost.yaml + - wanderer.yaml diff --git a/apps/talos_cluster/namespaces/wanderer.yaml b/apps/talos_cluster/namespaces/wanderer.yaml @@ -0,0 +1,4 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: wanderer diff --git a/apps/talos_cluster/wanderer/kustomization.yaml b/apps/talos_cluster/wanderer/kustomization.yaml @@ -0,0 +1,10 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +namespace: wanderer +resources: + - secret.yaml + - pvc.yaml + - meilisearch.yaml + - pocketbase.yaml + - web.yaml + - route.yaml diff --git a/apps/talos_cluster/wanderer/meilisearch.yaml b/apps/talos_cluster/wanderer/meilisearch.yaml @@ -0,0 +1,63 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: wanderer-search + namespace: wanderer +spec: + replicas: 1 + selector: + matchLabels: + app: wanderer-search + strategy: + type: Recreate + template: + metadata: + labels: + app: wanderer-search + spec: + containers: + - name: meilisearch + image: getmeili/meilisearch:v1.11.3 + ports: + - containerPort: 7700 + env: + - name: MEILI_MASTER_KEY + valueFrom: + secretKeyRef: + name: wanderer-secrets + key: MEILI_MASTER_KEY + - name: MEILI_NO_ANALYTICS + value: "true" + volumeMounts: + - name: data + mountPath: /meili_data + livenessProbe: + httpGet: + path: /health + port: 7700 + initialDelaySeconds: 15 + periodSeconds: 15 + failureThreshold: 10 + readinessProbe: + httpGet: + path: /health + port: 7700 + initialDelaySeconds: 5 + periodSeconds: 10 + failureThreshold: 10 + volumes: + - name: data + persistentVolumeClaim: + claimName: wanderer-meilisearch-data +--- +apiVersion: v1 +kind: Service +metadata: + name: wanderer-search + namespace: wanderer +spec: + selector: + app: wanderer-search + ports: + - port: 7700 + targetPort: 7700 diff --git a/apps/talos_cluster/wanderer/pocketbase.yaml b/apps/talos_cluster/wanderer/pocketbase.yaml @@ -0,0 +1,102 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: wanderer-db + namespace: wanderer +spec: + replicas: 1 + selector: + matchLabels: + app: wanderer-db + strategy: + type: Recreate + template: + metadata: + labels: + app: wanderer-db + spec: + containers: + - name: pocketbase + image: flomp/wanderer-db:latest + ports: + - containerPort: 8090 + env: + - name: MEILI_URL + value: "http://wanderer-search:7700" + - name: MEILI_MASTER_KEY + valueFrom: + secretKeyRef: + name: wanderer-secrets + key: MEILI_MASTER_KEY + - name: POCKETBASE_ENCRYPTION_KEY + valueFrom: + secretKeyRef: + name: wanderer-secrets + key: POCKETBASE_ENCRYPTION_KEY + - name: ORIGIN + value: "https://wanderer.mtrnord.blog" + - name: POCKETBASE_SMTP_ENABLED + value: "true" + - name: POCKETBASE_SMTP_HOST + valueFrom: + secretKeyRef: + name: wanderer-secrets + key: POCKETBASE_SMTP_HOST + - name: POCKETBASE_SMTP_PORT + valueFrom: + secretKeyRef: + name: wanderer-secrets + key: POCKETBASE_SMTP_PORT + - name: POCKETBASE_SMTP_USERNAME + valueFrom: + secretKeyRef: + name: wanderer-secrets + key: POCKETBASE_SMTP_USERNAME + - name: POCKETBASE_SMTP_PASSWORD + valueFrom: + secretKeyRef: + name: wanderer-secrets + key: POCKETBASE_SMTP_PASSWORD + - name: POCKETBASE_SMTP_SENDER_ADDRESS + valueFrom: + secretKeyRef: + name: wanderer-secrets + key: POCKETBASE_SMTP_SENDER_ADDRESS + - name: POCKETBASE_SMTP_SENDER_NAME + valueFrom: + secretKeyRef: + name: wanderer-secrets + key: POCKETBASE_SMTP_SENDER_NAME + volumeMounts: + - name: data + mountPath: /pb_data + livenessProbe: + httpGet: + path: /api/health + port: 8090 + initialDelaySeconds: 15 + periodSeconds: 15 + failureThreshold: 10 + readinessProbe: + httpGet: + path: /api/health + port: 8090 + initialDelaySeconds: 5 + periodSeconds: 10 + failureThreshold: 10 + volumes: + - name: data + persistentVolumeClaim: + claimName: wanderer-pocketbase-data +--- +apiVersion: v1 +kind: Service +metadata: + name: wanderer-db + namespace: wanderer +spec: + selector: + app: wanderer-db + ports: + - port: 8090 + targetPort: 8090 diff --git a/apps/talos_cluster/wanderer/pvc.yaml b/apps/talos_cluster/wanderer/pvc.yaml @@ -0,0 +1,38 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: wanderer-meilisearch-data + namespace: wanderer +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + storageClassName: longhorn +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: wanderer-pocketbase-data + namespace: wanderer +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 1Gi + storageClassName: longhorn +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: wanderer-uploads + namespace: wanderer +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 2Gi + storageClassName: longhorn diff --git a/apps/talos_cluster/wanderer/route.yaml b/apps/talos_cluster/wanderer/route.yaml @@ -0,0 +1,49 @@ +apiVersion: gateway.networking.k8s.io/v1 +kind: HTTPRoute +metadata: + name: wanderer + namespace: wanderer +spec: + parentRefs: + - name: envoy-gateway + namespace: envoy-gateway + hostnames: + - wanderer.mtrnord.blog + rules: + - matches: + - path: + type: PathPrefix + value: /api + - path: + type: PathPrefix + value: /_ + backendRefs: + - name: wanderer-db + port: 8090 + timeouts: + request: 120s + backendRequest: 0s + - matches: + - path: + type: PathPrefix + value: / + backendRefs: + - name: wanderer-web + port: 3000 + timeouts: + request: 240s + backendRequest: 0s +--- +apiVersion: gateway.envoyproxy.io/v1alpha1 +kind: BackendTrafficPolicy +metadata: + name: wanderer-compression + namespace: wanderer +spec: + targetRef: + group: gateway.networking.k8s.io + kind: HTTPRoute + name: wanderer + compression: + - type: Gzip + - type: Brotli diff --git a/apps/talos_cluster/wanderer/secret.yaml b/apps/talos_cluster/wanderer/secret.yaml @@ -0,0 +1,37 @@ +apiVersion: v1 +kind: Secret +metadata: + name: wanderer-secrets + namespace: wanderer +type: Opaque +stringData: + #ENC[AES256_GCM,data:vG/HRSM/LPQZ7xjLHx8JVy/VT+EHYAnu/XvZ8Cl8Hv0mdGTG,iv:Up8aVwvw5MLQDOnXnKLF3/FKePls2QQDRW9/+9NKIYg=,tag:LzA7OBij7SErnl0aK/SI1A==,type:comment] + POCKETBASE_ENCRYPTION_KEY: ENC[AES256_GCM,data:NMGVPX+uTqf5bsY1ZcoPe710oik4id6MzLiHGrnMPPw=,iv:N6Gn2G2XlrB3eVpQwEwtU1QCXnMh+gjaq9C/CPitgWk=,tag:YUO4HcmbycZGVeqM+9i9xg==,type:str] + #ENC[AES256_GCM,data:bTRYkId+LN90Dh/W+e/5I0JEDnehxnfpDOJrrRmppd6Es80OKV9I,iv:obOg48tY6XDpDd/TtSS6KNe4ea7CmN/LuAGEnxBWB9w=,tag:JDJFCgUfXq2+aSe5B7n7lQ==,type:comment] + MEILI_MASTER_KEY: ENC[AES256_GCM,data:5JPrsuEYMD0jI4xI1j7wxw0epSSzCcClFf94I5fnYRBUxyrV1D5cWc5xq6E5DsxztxRXdCuGd7KB7tjHCHwO,iv:E+UFLAUFRJFim3+eC6RcGM6QhSIAI+7EegLzeXCvcZA=,tag:ihK04pltp9eYswYmDTcFAA==,type:str] + POCKETBASE_SMTP_HOST: ENC[AES256_GCM,data:qmplnWDMg08LX7EThKw2f9CdiM3MojE+oT1/,iv:VCWlnFdvXOXZq+IfDq6x+uij8x9UFqN9IEcHOnXgP/k=,tag:dq5Tb7PZs9OY50rGUIRawg==,type:str] + POCKETBASE_SMTP_PORT: ENC[AES256_GCM,data:GVUp,iv:Q1bfpsyDXqXxahW098IGglOLkq37TuD0ETlESoiEvrI=,tag:5Y7lcEJqo899il08QpMX/w==,type:str] + POCKETBASE_SMTP_USERNAME: ENC[AES256_GCM,data:YWBBBsiBZ3FI6H3pNaa02uOPfUVzc2pS+HOTo7ZDCQ==,iv:032lCs7oDd5UGbCHwtOTXwcjGAoDC1eF7UYsSgr6+PI=,tag:08NDXNa3Kn0ak8x2CjN2Kw==,type:str] + POCKETBASE_SMTP_PASSWORD: ENC[AES256_GCM,data:OGxbLar9TQUiFH9iKCnF3KCciXumlRUqCioNTj5bWLproOyBUhGOmC3o5E/WvrZjud7bhu+2O2hFl5i4i7xM,iv:vxjpZuZRJT+Z88P2tonPyZAZl8jXa60QfHCvdbYQfJU=,tag:YRYt6+jmh/YKucH4nJTAdw==,type:str] + POCKETBASE_SMTP_SENDER_ADDRESS: ENC[AES256_GCM,data:3mb/4q89G9jo/Ea8HH1PhmcpY3lW,iv:sQaG078KUKcxa9qcQ/gx4gGelIyhjskhAk22lzV6wPg=,tag:xiTLI7b4qyPl6pT9mDaldw==,type:str] + POCKETBASE_SMTP_SENDER_NAME: ENC[AES256_GCM,data:4IjSH2YZfrc=,iv:v3rQGo6CNsDwy/kgdvQXfSvx+9IYFwT5iNi+2D/6r68=,tag:Nr/B1AZW7stNMcMxyqYNtg==,type:str] +sops: + kms: [] + gcp_kms: [] + azure_kv: [] + hc_vault: [] + age: + - recipient: age1esjyg2qfy49awv0ptkzvpk425adczjr38m37w2mmcahzc4p8n54sll2nzh + enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBpdElkeUVtTHRjQldBeFpE + MjRicVhsVUxDbThmY2RTQkVUNzU5Y0IwOGc4CnNHU3RnWmZ4RnZQSUlsNjB5K29I + Z1Qya3ZQemZOQnBLaXFxZjVKK0UzSUEKLS0tIFNxZFhnVWhjSWMwcnN6RVRjc2V0 + WFhBK09EU2t5ZmxLV21JUUJpWktqMmsKgDniMoiwHu0zyc1v636qNuJuL34+ifyD + EyR1VPWEfOPYrMRUuM/E8DKK6Z+YsV1iGUQH6fpW0GeE7yIqNmPldQ== + -----END AGE ENCRYPTED FILE----- + lastmodified: "2026-04-11T18:04:51Z" + mac: ENC[AES256_GCM,data:mnhHk9oWRML/K7tomayhgpb+cCyKsmvY6/ZlPba5JmvbCGGMfSJUzHvBMd3PmtN9kdkQDJWiET/T9jTd8v53WUt4fQdZ9Tunkh6J1TVRpbulExC/A6tIii+ghwrZl744QHdeZhUO9Tolav641B/stiU+ntAvt8jKS1qp1l1+ty8=,iv:ZAuGd2NbqfdUVsO1uxMFzRIy19SzhuJbVL+mTvolfjY=,tag:S6DwaNfEC6b7nBD93Gc3eQ==,type:str] + pgp: [] + encrypted_regex: ^(apiKey|appUserPassword|otelUserPassword|harborAdminPassword|totpVaultKey|kimaiAppSecret|kimaiAdminPassword|GITHUB_CLIENT_ID|GITHUB_CLIENT_SECRET|GITHUB_PRIVATE_KEY|woosh|root_password|rspamd_password|pgdb_password|matrix_access_token|pgdb_remote_url|hmac_secret_key|adminPassword|adminEmail|jenkinsAdminEmail|securityRealm|gerrit.config|routing_key|DATABASE_URL|SMTP_PASSWORD|SECRET_KEY_BASE|admin_password|extraCommands|key|clickhouseDatabaseURL|databaseURL|client_id|client_secret|secret_key_base|otp_secret|private_key|public_key|primaryKey|deterministicKey|keyDerivationSalt|token|clientId|secretKey|installationId|installationKey|uriOverride|adminToken.value|password.value|sql_password|erlangCookie|AUTHENTICATION_PASSWORD|ROOM_API_SECRET_KEY|adminPassword|configPassword|adminUser|configUser|MAIL_PASSWORD|APP_KEY|api_key|api_secret|keys|livekit_key|livekit_secret|secret_key|admin_pass|admin_email|mariadbPassword|mariadbRootPassword|privateKey|data|stringData|PASSWD|password|pass|postgresPassword|smtp_auth_password|addresses|smtp_auth_username|authorization_credentials|postgresqlPassword|redminePassword|smtpPassword|registration_shared_secret|shared_secret|secret|admin_token|integrationKey|integration_key|rootPassword|adminPassword|adminUser|adminEmail|emailPassword|secretKey|appId|clientSecret|webhookSecret|content)$ + version: 3.9.1 diff --git a/apps/talos_cluster/wanderer/web.yaml b/apps/talos_cluster/wanderer/web.yaml @@ -0,0 +1,73 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: wanderer-web + namespace: wanderer +spec: + replicas: 1 + selector: + matchLabels: + app: wanderer-web + strategy: + type: Recreate + template: + metadata: + labels: + app: wanderer-web + spec: + containers: + - name: web + image: flomp/wanderer-web:latest + ports: + - containerPort: 3000 + env: + - name: ORIGIN + value: "https://wanderer.mtrnord.blog" + - name: PUBLIC_POCKETBASE_URL + value: "https://wanderer.mtrnord.blog" + - name: MEILI_URL + value: "http://wanderer-search:7700" + - name: MEILI_MASTER_KEY + valueFrom: + secretKeyRef: + name: wanderer-secrets + key: MEILI_MASTER_KEY + - name: PUBLIC_DISABLE_SIGNUP + value: "true" + - name: PUBLIC_PRIVATE_INSTANCE + value: "true" + - name: BODY_SIZE_LIMIT + value: "Infinity" + volumeMounts: + - name: uploads + mountPath: /app/uploads + livenessProbe: + httpGet: + path: / + port: 3000 + initialDelaySeconds: 15 + periodSeconds: 15 + failureThreshold: 10 + readinessProbe: + httpGet: + path: / + port: 3000 + initialDelaySeconds: 5 + periodSeconds: 10 + failureThreshold: 10 + volumes: + - name: uploads + persistentVolumeClaim: + claimName: wanderer-uploads +--- +apiVersion: v1 +kind: Service +metadata: + name: wanderer-web + namespace: wanderer +spec: + selector: + app: wanderer-web + ports: + - port: 3000 + targetPort: 3000