Compare commits

...
39 Commits
Author SHA1 Message Date
Jeffrey f53e8f5b00 jellyfin: upgrade to 12.0
All five installed plugins have 12.0.0.0 targetAbi builds available. The
archived 9p4 SSO Authentication plugin has been removed, since it has no
v12 build and is being replaced by an OIDC plugin later.

Plugins must be updated from the Jellyfin dashboard after the rollout;
the container upgrade does not touch /config/plugins.
2026-09-13 12:56:38 +02:00
Jeffrey 30f9c63c9b authentik: spell out API-defaulted fields on the LDAP route and listeners
The API server defaults group on allowedRoutes.kinds and certificateRefs,
and group, kind and weight on the TCPRoute backendRefs. Omitting them left
both ArgoCD apps permanently OutOfSync against the live objects. Matches
what authentik-httproute.yaml already does.
2026-09-13 11:39:35 +02:00
Jeffrey c1287fa343 authentik: serve LDAP via an outpost behind the internal gateway
Adds the LDAP outpost deployment and routes ports 389 and 636 on
gateway-internal to it. 636 is a TLS listener in Terminate mode so
cert-manager renews the LDAPS certificate automatically, and both
listeners forward to the outpost's plaintext 3389.

allowedRoutes.kinds is set explicitly on both listeners: a TCP listener
permits no route kinds by default and a TLS listener defaults to
TLSRoute, so the TCPRoute would not attach otherwise.
2026-09-13 11:24:23 +02:00
Jeffrey 7ee7db2346 minio-aistor: restore the backend traffic policy to its pre-4207459 state
Swept into d5e0731 by the same stray `git add -u`. Unlike argocd-install
this one is synced, so it went live; reverting here rolls the cluster back
to connectionIdleTimeout 3600s with no retry block.

The content is still reachable at d5e0731 if it is wanted back.
2026-08-29 19:08:17 +02:00
Jeffrey 1593166803 argocd: restore argocd-install.yaml to its pre-4207459 state
It was swept into d5e0731 by a stray `git add -u` while amending an
unrelated commit. Nothing syncs infra/argocd, so the cluster was never
affected, but the file did not belong in that change.

The content is still reachable at d5e0731 if it is wanted back.
2026-08-29 19:07:16 +02:00
Jeffrey 42074599e9 gitea-runner: add the missing Application manifest
The Application was created with kubectl and never committed, so its chart
version, release config and values path lived only on the cluster. That made
the values-path fix a live patch: recreating the app would have restored the
old $values/gitea/runner/values.yaml and broken helm template again.

Both sources are public, so this sits alongside the other Helm-based apps
here rather than in the private repo.
2026-08-29 18:56:36 +02:00
Jeffrey a775c8b837 victoria-metrics: pin back to chart 0.77.0 after a failed 0.91.2 upgrade
The 0.91.2 bump had been sitting in Git unapplied because the app could not
generate manifests. Once the values path was fixed it applied, and Grafana
crash-looped on "Datasource provisioning error: data source not found".
Rolled back; Grafana and all 35 VMRules are healthy again on 0.77.0.

0.91.2 also moves the default dashboards and rules out of the Helm render
into a runtime sync-job, so upgrading needs a values migration and a
verified datasource config rather than a version bump.
2026-08-29 18:39:49 +02:00
Jeffrey 02c43d8b85 victoria-metrics: point the values ref at applications/
$values resolves to the repo root, so $values/victoria-metrics/values.yaml
never existed once the manifests moved under applications/. helm template
failed on every reconcile, leaving the app permanently sync status Unknown.

gitea-runner had the same broken path but has no manifest in this repo, so
it was patched on the cluster only.
2026-08-29 18:18:27 +02:00
Jeffrey d5e073131d infisical: ignore every volumeClaimTemplate field the api server injects
The earlier rule covered creationTimestamp, volumeMode and status but missed
apiVersion and kind, which the API server also injects into
volumeClaimTemplates. Those two alone kept both StatefulSets permanently
OutOfSync: a sync would apply successfully and report Synced, then the very
next comparison flagged them again.
2026-08-29 18:16:25 +02:00
Jeffrey 8fa2cb558e infisical: ignore the volumeClaimTemplate fields argocd cannot reconcile
A StatefulSet's volumeClaimTemplates are immutable, and the API server
injects creationTimestamp, volumeMode and a status block that are not in
the manifest. ArgoCD diffed those and reported OutOfSync permanently,
since no sync could ever resolve them.

infisical-postgres and infisical-valkey are the only StatefulSets here
using volumeClaimTemplates, which is why this app alone was affected.
2026-08-29 18:00:35 +02:00
Jeffrey 7a937dae07 gitea: drop the orphaned runner pvc that could never bind
gitea-runner-pvc referenced volumeName gitea-runner-data, but neither that
PV nor a Longhorn volume of that name exists, so it sat Pending since May.
ArgoCD treats a Pending PVC as Progressing and rolled that up to the whole
app, which is why gitea never reported Healthy.

Nothing mounted it. The runner uses the PVC the gitea/actions chart
generates from its own volumeClaimTemplate.
2026-08-29 18:00:28 +02:00
Jeffrey f67cbf4465 netbox: send a Host header on the probes
The kubelet probes the pod IP, which Django rejects with a 400 because
ALLOWED_HOSTS is netbox.jsme.be. Setting the Host header keeps
ALLOWED_HOSTS tight instead of widening it to '*'.
2026-08-27 20:56:16 +02:00
Jeffrey cfd9317086 netbox: add NetBox 4.6.8 with postgres, valkey and rqworker
Five components under applications/netbox: the web pod, an rqworker,
a daily housekeeping CronJob, postgres 18 and two valkey instances.
The task queue runs appendonly on its own PVC so queued jobs survive a
restart, while the cache instance is disposable.

Worker and cronjob override args rather than command, which replaces
CMD while keeping tini as the entrypoint, so only the web pod runs
migrations. Media, reports and scripts share one RWX PVC via subPaths
because both the web pod and the worker mount them.

Exposed on the internal gateway only.
2026-08-27 20:46:34 +02:00
Jeffrey 2d078e10c0 pelican: expose wings-mc and wings-ark on the public gateway
The console will not work from outside without this. WebsocketController hands
the browser wss://<node fqdn>:443/api/servers/<uuid>/ws built from
Node::getConnectionAddress(), so the browser talks to wings directly and never
through the panel. Same for file upload and download, which FileUploadController
builds from the same address. Everything else (login, server list, file
browsing, power actions, sending console commands) already worked publicly,
because those go through the panel API.

Adds public listeners for both nodes reusing the existing wings-mc-tls and
wings-ark-tls certificates, and a gateway-public parentRef on each route.

Extends the wings ClientTrafficPolicy to the two new listeners. Without it the
public listeners would negotiate h2 and long-lived consoles would drop: wings
only speaks HTTP/1.1, and the idle timeout needs to be 3600s rather than the
default.

CrowdSec ext_authz already covers every listener on gateway-public, so both
nodes are behind the WAF and community blocklist from the moment they are live.
Wings itself is JWT-gated and returns 401 unauthenticated.
2026-08-26 21:54:49 +02:00
Jeffrey 1849703886 pelican: expose the panel on the public gateway
Adds a pelican listener to gateway-public and a gateway-public parentRef to
pelican-route. Reuses the existing pelican-tls certificate, which both
listeners reference.

Wings deliberately stays internal-only. That is a real functional limit, not
an oversight: the browser talks to wings directly for the console websocket
and for file upload/download, using the address from Node::getConnectionAddress.
From outside the LAN those calls will fail. Panel login, server list, file
browsing and editing, and power actions all go through the panel API and keep
working, because the panel reaches wings server-side over the internal gateway.

CrowdSec ext_authz already covers every listener on gateway-public, so the
panel is behind the WAF and community blocklist from the moment it is live.

Prerequisites completed first: TRUSTED_PROXIES=10.42.0.0/16 and
APP_2FA_REQUIRED=1 set in Infisical and verified live in the panel config.

pelican.jsme.be has no public DNS record yet, so this makes the panel reachable
through 10.8.11.105 but not from the internet. The Azure DNS CNAME in the
OpenTofu repo is the actual cutover.
2026-08-26 20:41:28 +02:00
Jeffrey 193b9db359 envoy-gateway: comment out netbox entries so the kustomization builds
My previous commit staged the whole kustomization file and swept in the
in-flight netbox lines, which I had said I would keep out. Those reference
infra/envoy-gateway/netbox/, which is untracked, so ArgoCD could not render
the app at all:

  kustomize build failed: accumulating resources from
  'netbox/netbox-certificate.yaml': no such file or directory

That left envoy-gateway-config unable to load target state, so the orphaned
listener cleanup never applied. The running gateways were unaffected.

Commenting the two entries keeps the work visible in place and makes it a
two line uncomment once infra/envoy-gateway/netbox/ is committed.
2026-08-26 20:18:44 +02:00
Jeffrey 304c8e71db envoy-gateway: comment out orphaned listeners and certificates
Ten Gateway listeners had zero attached routes. Eight of them are in this repo
and are removed here by commenting them out of the kustomization, which prunes
the listener and its cert-manager Certificate.

Deprecated, workloads already live in deprecated/:
  vaultwarden (vault.jsme.be), affine (affine.jsme.be)

Superseded by minio-aistor:
  resume-minio (resume-minio.jsme.be), resume-minioweb (resume-minioweb.jsme.be)

Written but never deployed, no namespace in the cluster:
  n8n (n8n.jsme.be), wikijs (wiki.jsme.be), ollama (ollama.jsme.be),
  openwebui (forge.jsme.be)

wiki.jsme.be was one of these on the PUBLIC gateway: a listener with a valid
certificate, no backend, and an allowedRoutes selector that would attach the
first HTTPRoute appearing in a matching namespace. Deploying Wiki.js later
expecting it to be internal would have published it.

Commented rather than deleted so redeploying an app is a two line uncomment.
The certificate and the gateway patch must be uncommented together.

Verified with kubectl kustomize: 45 listeners render, down from 53, with all
eight orphan hostnames gone and every live service still present.
2026-08-26 20:10:20 +02:00
Jeffrey 3451b755d4 envoy-gateway: enable CrowdSec ext_authz on the public gateway
Wires crowdsec/gateway-public-securitypolicy.yaml into the kustomization now
that LAPI, AppSec and the bouncer are all healthy and the envoy bouncer is
registered with LAPI.

Covers every listener on gateway-public rather than just one app, since EG
v1.3.2 rejects targetRefs.sectionName on SecurityPolicy. gateway-internal is a
separate Gateway and is untouched, so LAN access is unaffected. failOpen is
true, so a bouncer outage lets traffic through instead of denying it.
2026-08-26 17:31:19 +02:00
Jeffrey 16e265239b crowdsec: cut lapi and appsec cpu requests so they schedule
Chart defaults set requests == limits == 500m for both. The node is at 95% of
allocatable CPU in requests while actually using about 10%, so lapi sat Pending
with Insufficient cpu. Requests dropped to 50m/100m with the limits left
generous, since appsec runs inline on every public request.
2026-08-26 17:05:56 +02:00
Jeffrey dcb127e9e8 crowdsec: add LAPI + AppSec and the Envoy ext_authz bouncer
Detection is CAPI community blocklists plus AppSec inline WAF, not Envoy
access-log parsing. Enforcement is gRPC ext_authz from Envoy Gateway.

Changes from the draft that was held:

Agent disabled rather than given an empty acquisition list. Chart 0.24.0
refuses to render the DaemonSet with acquisition: [] ("No acquisition or
additionalAcquisition configured"), and with no log tailing the agent has
nothing to do. The WAF collections moved to appsec.env, where they belong,
and base-http-scenarios was dropped since it only feeds log parsing. AppSec
registers with LAPI on its own, so it works without the agent.

Bouncer values updated for chart 0.8.0 (the app already pinned 0.8.0 while the
values were written against 0.6.3). Added waf.failOpen: true, whose chart
default is false and would deny every request if AppSec were unreachable.

SecurityPolicy now targets the whole gateway-public rather than the it-tools
listener. EG v1.3.2 rejects targetRefs.sectionName on SecurityPolicy, and
targeting the HTTPRoute instead would gate LAN traffic too since public routes
also parent gateway-internal. Blanket coverage of the public gateway is what we
want anyway, and failOpen keeps a bouncer outage from taking public apps down.

envoyproxy-public.yaml is kept as documentation but not applied. EG v1.3.2
already defaults envoyService.externalTrafficPolicy to Local, verified live on
all three gateway LB services, so the real client IP already reaches Envoy.

Not wired into the envoy-gateway kustomization yet. That lands once the
bouncer is up and healthy.
2026-08-26 17:00:34 +02:00
Jeffrey 63056b313a pelican: move panel image to ghcr.io/pelican/panel and pin beta38
The ghcr.io/pelican-dev/panel package is no longer anonymously pullable
(token endpoint returns DENIED for every tag, package page 404s). Upstream
renamed the org to "pelican" in beta38 and compose.yml now points at
ghcr.io/pelican/panel. Verified a real pull of v1.0.0-beta38 from the new
location succeeds.

Pinning the tag also replaces :latest, which combined with IfNotPresent meant
the running version depended on whatever the node happened to have cached.
beta36 was clean against all six published advisories, but four of them landed
in the last five months, so a deliberate patch path matters here.

beta37/38 carry no breaking changes or manual migration steps. beta37 fixes
Passkeys origin validation, which is wanted before enrolling 2FA.
2026-08-26 16:59:06 +02:00
Jeffrey 023f233f99 Revert reactive-resume to v5.0
v5.2.8 aborts startup when OIDC discovery fails. Discovery URL points at
authentik.jsme.be, which pods cannot reach due to hairpin NAT.
2026-08-24 23:18:47 +02:00
Jeffrey a57860a576 Update application and chart versions to latest
Bumps every outdated image and chart except databases, which are
deliberately left on their current versions.

Applications:
  authentik       2026.5.2 -> 2026.8.0 (server and worker)
  immich          v2.7.5 -> v3.1.0
  gitea           1.25 -> 1.27.2
  gotify          2.9.1 -> 3.0.0
  uptime-kuma     2.2.1 -> 2.5.3
  zipline         4.5.3 -> 4.7.0
  outline         1.8.1 -> 1.9.2
  reactive-resume v5.0 -> v5.2.8
  netbootxyz      nbxyz18 -> nbxyz24
  bentopdf        v2.8.2 -> v2.8.7
  jellyfin        10.11.9 -> 10.11.11
  gitea runner init busybox 1.37.0 -> 1.38.0

Infra:
  kube-vip                    v0.9.1 -> v1.2.3
  victoria-metrics-k8s-stack  0.77.0 -> 0.91.2
  intel-device-plugins        v0.35.0 -> v0.36.0
  crowdsec-envoy-bouncer      0.6.3 -> 0.8.0

Immich v3 drops pgvecto.rs support. Verified the live database already
runs vchord 0.4.3 and pgvector 0.8.1 with no pgvecto.rs extension, both
inside the ranges v3 accepts, so no database change is required.

The victoria-metrics chart renamed defaultRules.create to
defaultRules.enabled at both the top level and per group. Migrated those
keys so the etcd, kubeScheduler, kubernetesSystemControllerManager and
kubernetesSystemScheduler exclusions keep applying. Without the rename
those groups revert to enabled and alert on control-plane components
that k3s runs embedded.

That chart also moved default rules and dashboards to a runtime sync job
instead of templating them, so ArgoCD will prune the VMRules and
dashboard ConfigMaps it currently owns and the job will recreate them.

kube-vip is not managed by ArgoCD. The manifest change is inert until
applied by hand.
2026-08-24 23:12:22 +02:00
Jeffrey 38a03bb131 infisical: add resource requests and limits to postgres and valkey
Both ran as BestEffort QoS, making them first in line for eviction under node memory pressure. Requests also give the scheduler real numbers to place them with.
2026-08-24 00:46:31 +02:00
Jeffrey c505924d27 longhorn: track the longhorn-static StorageClass in Git
Longhorn auto-creates this class when missing and it is not backed by the longhorn-storageclass ConfigMap, so it had no source of truth. Set to Retain.
2026-08-24 00:43:26 +02:00
Jeffrey a7f4618d4f argocd: enable directory recurse on the remaining Directory apps
Without it, moving manifests into component directories makes ArgoCD stop seeing them and prune the workload.
2026-08-24 00:35:31 +02:00
Jeffrey 0177c73fa9 gitea: migrate to envFrom with per-container InfisicalSecrets
Flat CR narrowed to recursive: false; it still serves the SMB mount credentials and the Actions runner token, which the runner Helm chart reads via existingSecret.
2026-08-24 00:20:29 +02:00
Jeffrey 079830a8ff authentik: migrate to envFrom with per-container InfisicalSecrets
Server and worker share one Secret since their env is byte-identical. Database and SMTP values are Infisical references rather than copies.
2026-08-24 00:16:26 +02:00
Jeffrey 3e13b76c6a react-resume: migrate to envFrom with per-container InfisicalSecrets
Stores PRINTER_ENDPOINT pre-assembled instead of building it from CHROME_TOKEN via $() interpolation.
2026-08-23 23:47:13 +02:00
Jeffrey 3c24cd4b9d gotify: migrate to envFrom with per-container InfisicalSecrets
Stores the fully assembled database DSN in Infisical instead of building it from three helper vars with $() interpolation, which envFrom cannot feed.
2026-08-23 23:38:16 +02:00
Jeffrey f382c87f58 pelican: migrate to envFrom with per-container InfisicalSecrets
Folds the pelican-config ConfigMap into Infisical so the container has a single envFrom. Pins imagePullPolicy to IfNotPresent because ghcr.io/pelican-dev/panel no longer allows anonymous pulls.
2026-08-23 23:16:37 +02:00
Jeffrey 647d82fe0f argocd: enable recurse on the ddns application
azure-ddns now uses a component directory like the other apps, and without recurse ArgoCD stopped seeing its StatefulSet and InfisicalSecret.
2026-08-23 22:51:15 +02:00
Jeffrey 0329546d87 azure-ddns: migrate to envFrom with a per-container InfisicalSecret
Also moves the manifests into a component directory, matching the other migrated apps.
2026-08-23 22:42:09 +02:00
Jeffrey c408522988 immich: migrate to envFrom with per-container InfisicalSecrets
Flat CR narrowed to recursive: false so it keeps serving the SMB credentials that immich-data-smb references by name.
2026-08-23 22:15:10 +02:00
Jeffrey 77b8bd4475 passbolt: migrate to envFrom with per-container InfisicalSecrets
Also removes the now-stale flat CR files for searxng, outline and passbolt, which ArgoCD would otherwise recreate pointing at emptied folders.
2026-08-23 21:54:06 +02:00
Jeffrey fccf9074d2 outline: migrate to envFrom with per-container InfisicalSecrets
All 31 env entries, secrets and literals alike, now live in Infisical under /outline/outline and /outline/postgres. Manifest rationale carried across as Infisical secret comments.
2026-08-23 20:55:21 +02:00
Jeffrey 10545c03be searxng: migrate to envFrom; move remaining literals into Infisical
Non-secret config now lives in Infisical alongside the secrets, so containers carry envFrom only and no loose env entries.
2026-08-23 20:34:38 +02:00
Jeffrey 14ef1c6e91 zipline: migrate to envFrom with per-container InfisicalSecrets
Flat CR narrowed to recursive: false so it keeps serving the SMB mount credentials that zipline-uploads-pv references by name.
2026-08-23 20:08:43 +02:00
Jeffrey 3bec829396 infisical: repoint secret CRs at the rebuilt machine identity
Also tracks the auth ServiceAccounts and RBAC in Git so a namespace rebuild restores Kubernetes auth on its own.
2026-08-23 20:08:28 +02:00
139 changed files with 1892 additions and 943 deletions
+2
View File
@@ -35,6 +35,7 @@ The repository is split into three top-level areas. Within each, there is one di
│ ├── minio-aistor/ # S3-compatible object storage │ ├── minio-aistor/ # S3-compatible object storage
│ ├── n8n/ # Workflow automation │ ├── n8n/ # Workflow automation
│ ├── netbootxyz/ # Network boot service │ ├── netbootxyz/ # Network boot service
│ ├── netbox/ # IPAM and DCIM source of truth
│ ├── ollama/ # Local LLM runner │ ├── ollama/ # Local LLM runner
│ ├── openwebui/ # Web UI for AI models │ ├── openwebui/ # Web UI for AI models
│ ├── outline/ # Knowledge base / wiki │ ├── outline/ # Knowledge base / wiki
@@ -105,6 +106,7 @@ The repository is split into three top-level areas. Within each, there is one di
- **Technitium**: DNS server with web interface - **Technitium**: DNS server with web interface
- **Azure DDNS Python**: Dynamic DNS updater for Azure DNS - **Azure DDNS Python**: Dynamic DNS updater for Azure DNS
- **NetbootXYZ**: Network boot service for OS installation - **NetbootXYZ**: Network boot service for OS installation
- **NetBox**: IPAM and DCIM source of truth for the network
- **VictoriaMetrics**: Metrics collection and monitoring stack - **VictoriaMetrics**: Metrics collection and monitoring stack
### External Service Integration ### External Service Integration
@@ -0,0 +1,46 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: authentik-ldap
namespace: authentik
spec:
replicas: 1
selector:
matchLabels:
app: authentik-ldap
template:
metadata:
labels:
app: authentik-ldap
spec:
containers:
- name: ldap
image: ghcr.io/goauthentik/ldap:2026.8.0
ports:
- containerPort: 3389
name: ldap
- containerPort: 6636
name: ldaps
- containerPort: 9300
name: metrics
envFrom:
- secretRef:
name: authentik-ldap-secrets
livenessProbe:
httpGet:
path: /outpost.goauthentik.io/ping
port: 9300
initialDelaySeconds: 10
periodSeconds: 30
readinessProbe:
httpGet:
path: /outpost.goauthentik.io/ping
port: 9300
initialDelaySeconds: 5
periodSeconds: 10
resources:
requests:
cpu: 50m
memory: 128Mi
limits:
memory: 256Mi
@@ -1,14 +1,14 @@
apiVersion: secrets.infisical.com/v1alpha1 apiVersion: secrets.infisical.com/v1alpha1
kind: InfisicalSecret kind: InfisicalSecret
metadata: metadata:
name: authentik-secrets name: authentik-ldap-secrets
namespace: infisical namespace: infisical
spec: spec:
hostAPI: https://infisical.jsme.be hostAPI: https://infisical.jsme.be
resyncInterval: 30 resyncInterval: 30
authentication: authentication:
kubernetesAuth: kubernetesAuth:
identityId: "9f65814e-bf4c-42fc-b382-26be15b11416" identityId: "5458def7-7c63-40d2-95da-41c614d0933a"
serviceAccountRef: serviceAccountRef:
name: infisical-auth name: infisical-auth
namespace: infisical namespace: infisical
@@ -16,9 +16,9 @@ spec:
secretsScope: secretsScope:
projectSlug: "kubernetes" projectSlug: "kubernetes"
envSlug: "prod" envSlug: "prod"
secretsPath: "/authentik" secretsPath: "/authentik/authentik-ldap"
recursive: true recursive: false
managedSecretReference: managedSecretReference:
secretName: authentik-secrets secretName: authentik-ldap-secrets
secretNamespace: authentik secretNamespace: authentik
secretType: Opaque secretType: Opaque
+15
View File
@@ -0,0 +1,15 @@
apiVersion: v1
kind: Service
metadata:
name: authentik-ldap
namespace: authentik
spec:
selector:
app: authentik-ldap
ports:
- name: ldap
port: 3389
targetPort: 3389
- name: metrics
port: 9300
targetPort: 9300
+25
View File
@@ -0,0 +1,25 @@
apiVersion: gateway.networking.k8s.io/v1alpha2
kind: TCPRoute
metadata:
name: authentik-ldap
namespace: authentik
spec:
parentRefs:
- group: gateway.networking.k8s.io
kind: Gateway
name: gateway-internal
namespace: envoy-gateway
sectionName: authentik-ldap
- group: gateway.networking.k8s.io
kind: Gateway
name: gateway-internal
namespace: envoy-gateway
sectionName: authentik-ldaps
rules:
# The gateway terminates TLS on 636, so both listeners hit the plaintext port
- backendRefs:
- name: authentik-ldap
port: 3389
kind: Service
group: ""
weight: 1
@@ -19,24 +19,9 @@ spec:
image: postgres:16-alpine image: postgres:16-alpine
ports: ports:
- containerPort: 5432 - containerPort: 5432
env: envFrom:
- name: POSTGRES_DB - secretRef:
valueFrom: name: authentik-postgres-secrets
secretKeyRef:
name: authentik-secrets
key: db_name
- name: POSTGRES_USER
valueFrom:
secretKeyRef:
name: authentik-secrets
key: db_user
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
name: authentik-secrets
key: db_password
- name: PGDATA
value: /var/lib/postgresql/data/pgdata
volumeMounts: volumeMounts:
- name: data - name: data
mountPath: /var/lib/postgresql/data mountPath: /var/lib/postgresql/data
@@ -0,0 +1,25 @@
apiVersion: secrets.infisical.com/v1alpha1
kind: InfisicalSecret
metadata:
name: authentik-postgres-secrets
namespace: infisical
spec:
hostAPI: https://infisical.jsme.be
resyncInterval: 30
authentication:
kubernetesAuth:
identityId: "5458def7-7c63-40d2-95da-41c614d0933a"
serviceAccountRef:
name: infisical-auth
namespace: infisical
autoCreateServiceAccountToken: true
secretsScope:
projectSlug: "kubernetes"
envSlug: "prod"
secretsPath: "/authentik/postgres"
# Non-recursive: keys are already named as the container expects.
recursive: false
managedSecretReference:
secretName: authentik-postgres-secrets
secretNamespace: authentik
secretType: Opaque
@@ -17,7 +17,7 @@ spec:
spec: spec:
containers: containers:
- name: authentik - name: authentik
image: ghcr.io/goauthentik/server:2026.5.2 image: ghcr.io/goauthentik/server:2026.8.0
command: ["ak"] command: ["ak"]
args: ["server"] args: ["server"]
ports: ports:
@@ -25,62 +25,9 @@ spec:
name: http name: http
- containerPort: 9443 - containerPort: 9443
name: https name: https
env: envFrom:
- name: AUTHENTIK_POSTGRESQL__HOST - secretRef:
valueFrom: name: authentik-app-secrets
secretKeyRef:
name: authentik-secrets
key: db_host
- name: AUTHENTIK_POSTGRESQL__NAME
valueFrom:
secretKeyRef:
name: authentik-secrets
key: db_name
- name: AUTHENTIK_POSTGRESQL__USER
valueFrom:
secretKeyRef:
name: authentik-secrets
key: db_user
- name: AUTHENTIK_POSTGRESQL__PASSWORD
valueFrom:
secretKeyRef:
name: authentik-secrets
key: db_password
- name: AUTHENTIK_SECRET_KEY
valueFrom:
secretKeyRef:
name: authentik-secrets
key: AUTHENTIK_SECRET_KEY
- name: AUTHENTIK_EMAIL__HOST
valueFrom:
secretKeyRef:
name: authentik-secrets
key: email_host
- name: AUTHENTIK_EMAIL__PORT
valueFrom:
secretKeyRef:
name: authentik-secrets
key: email_port
- name: AUTHENTIK_EMAIL__USERNAME
valueFrom:
secretKeyRef:
name: authentik-secrets
key: email_username
- name: AUTHENTIK_EMAIL__PASSWORD
valueFrom:
secretKeyRef:
name: authentik-secrets
key: email_password
- name: AUTHENTIK_EMAIL__FROM
valueFrom:
secretKeyRef:
name: authentik-secrets
key: email_from
- name: AUTHENTIK_EMAIL__USE_TLS
valueFrom:
secretKeyRef:
name: authentik-secrets
key: email_use_tls
volumeMounts: volumeMounts:
- name: data - name: data
mountPath: /data mountPath: /data
@@ -0,0 +1,25 @@
apiVersion: secrets.infisical.com/v1alpha1
kind: InfisicalSecret
metadata:
name: authentik-app-secrets
namespace: infisical
spec:
hostAPI: https://infisical.jsme.be
resyncInterval: 30
authentication:
kubernetesAuth:
identityId: "5458def7-7c63-40d2-95da-41c614d0933a"
serviceAccountRef:
name: infisical-auth
namespace: infisical
autoCreateServiceAccountToken: true
secretsScope:
projectSlug: "kubernetes"
envSlug: "prod"
secretsPath: "/authentik/authentik"
# Non-recursive: keys are already named as the container expects.
recursive: false
managedSecretReference:
secretName: authentik-app-secrets
secretNamespace: authentik
secretType: Opaque
@@ -19,65 +19,12 @@ spec:
runAsUser: 0 runAsUser: 0
containers: containers:
- name: authentik - name: authentik
image: ghcr.io/goauthentik/server:2026.5.2 image: ghcr.io/goauthentik/server:2026.8.0
command: ["ak"] command: ["ak"]
args: ["worker"] args: ["worker"]
env: envFrom:
- name: AUTHENTIK_POSTGRESQL__HOST - secretRef:
valueFrom: name: authentik-app-secrets
secretKeyRef:
name: authentik-secrets
key: db_host
- name: AUTHENTIK_POSTGRESQL__NAME
valueFrom:
secretKeyRef:
name: authentik-secrets
key: db_name
- name: AUTHENTIK_POSTGRESQL__USER
valueFrom:
secretKeyRef:
name: authentik-secrets
key: db_user
- name: AUTHENTIK_POSTGRESQL__PASSWORD
valueFrom:
secretKeyRef:
name: authentik-secrets
key: db_password
- name: AUTHENTIK_SECRET_KEY
valueFrom:
secretKeyRef:
name: authentik-secrets
key: AUTHENTIK_SECRET_KEY
- name: AUTHENTIK_EMAIL__HOST
valueFrom:
secretKeyRef:
name: authentik-secrets
key: email_host
- name: AUTHENTIK_EMAIL__PORT
valueFrom:
secretKeyRef:
name: authentik-secrets
key: email_port
- name: AUTHENTIK_EMAIL__USERNAME
valueFrom:
secretKeyRef:
name: authentik-secrets
key: email_username
- name: AUTHENTIK_EMAIL__PASSWORD
valueFrom:
secretKeyRef:
name: authentik-secrets
key: email_password
- name: AUTHENTIK_EMAIL__FROM
valueFrom:
secretKeyRef:
name: authentik-secrets
key: email_from
- name: AUTHENTIK_EMAIL__USE_TLS
valueFrom:
secretKeyRef:
name: authentik-secrets
key: email_use_tls
volumeMounts: volumeMounts:
- name: data - name: data
mountPath: /data mountPath: /data
@@ -1,69 +0,0 @@
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: azure-ddns
namespace: azure-ddns
spec:
replicas: 1
selector:
matchLabels:
app: azure-ddns
serviceName: azure-ddns
template:
metadata:
labels:
app: azure-ddns
spec:
terminationGracePeriodSeconds: 60
containers:
- name: azure-ddns
image: gitea.jsme.be/jeffrey/azure-ddns-python:1.1
resources:
requests:
cpu: 50m
memory: 128Mi
limits:
cpu: 200m
memory: 256Mi
env:
- name: AZURE_TENANT_ID
valueFrom:
secretKeyRef:
name: azure-ddns-secrets
key: TENANT_ID
- name: AZURE_CLIENT_ID
valueFrom:
secretKeyRef:
name: azure-ddns-secrets
key: CLIENT_ID
- name: AZURE_CLIENT_SECRET
valueFrom:
secretKeyRef:
name: azure-ddns-secrets
key: CLIENT_SECRET
- name: AZURE_SUBSCRIPTION_ID
valueFrom:
secretKeyRef:
name: azure-ddns-secrets
key: SUBSCRIPTION_ID
- name: AZURE_RESOURCE_GROUP
valueFrom:
secretKeyRef:
name: azure-ddns-secrets
key: RESOURCE_GROUP
- name: AZURE_ZONE_NAME
valueFrom:
secretKeyRef:
name: azure-ddns-secrets
key: AZURE_ZONE_NAME
- name: GOTIFY_URL
valueFrom:
secretKeyRef:
name: azure-ddns-secrets
key: GOTIFY_URL
- name: GOTIFY_TOKEN
valueFrom:
secretKeyRef:
name: azure-ddns-secrets
key: GOTIFY_TOKEN
restartPolicy: Always
@@ -1,14 +1,14 @@
apiVersion: secrets.infisical.com/v1alpha1 apiVersion: secrets.infisical.com/v1alpha1
kind: InfisicalSecret kind: InfisicalSecret
metadata: metadata:
name: azure-ddns-secrets name: azure-ddns-app-secrets
namespace: infisical namespace: infisical
spec: spec:
hostAPI: https://infisical.jsme.be hostAPI: https://infisical.jsme.be
resyncInterval: 30 resyncInterval: 30
authentication: authentication:
kubernetesAuth: kubernetesAuth:
identityId: "9f65814e-bf4c-42fc-b382-26be15b11416" identityId: "5458def7-7c63-40d2-95da-41c614d0933a"
serviceAccountRef: serviceAccountRef:
name: infisical-auth name: infisical-auth
namespace: infisical namespace: infisical
@@ -16,9 +16,10 @@ spec:
secretsScope: secretsScope:
projectSlug: "kubernetes" projectSlug: "kubernetes"
envSlug: "prod" envSlug: "prod"
secretsPath: "/azure-ddns" secretsPath: "/azure-ddns/azure-ddns"
recursive: true # Non-recursive: keys are already named as the container expects.
recursive: false
managedSecretReference: managedSecretReference:
secretName: azure-ddns-secrets secretName: azure-ddns-app-secrets
secretNamespace: azure-ddns secretNamespace: azure-ddns
secretType: Opaque secretType: Opaque
+31
View File
@@ -0,0 +1,31 @@
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: azure-ddns
namespace: azure-ddns
spec:
replicas: 1
selector:
matchLabels:
app: azure-ddns
serviceName: azure-ddns
template:
metadata:
labels:
app: azure-ddns
spec:
terminationGracePeriodSeconds: 60
containers:
- name: azure-ddns
image: gitea.jsme.be/jeffrey/azure-ddns-python:1.1
resources:
requests:
cpu: 50m
memory: 128Mi
limits:
cpu: 200m
memory: 256Mi
envFrom:
- secretRef:
name: azure-ddns-app-secrets
restartPolicy: Always
@@ -17,7 +17,7 @@ spec:
terminationGracePeriodSeconds: 10 terminationGracePeriodSeconds: 10
containers: containers:
- name: bentopdf - name: bentopdf
image: ghcr.io/alam00000/bentopdf:v2.8.2-amd64 image: ghcr.io/alam00000/bentopdf:v2.8.7-amd64
resources: resources:
requests: requests:
cpu: 50m cpu: 50m
@@ -17,7 +17,7 @@ spec:
terminationGracePeriodSeconds: 60 terminationGracePeriodSeconds: 60
containers: containers:
- name: gitea - name: gitea
image: docker.gitea.com/gitea:1.25 image: docker.gitea.com/gitea:1.27.2
resources: resources:
requests: requests:
cpu: 200m cpu: 200m
@@ -31,37 +31,9 @@ spec:
- name: data - name: data
mountPath: /data mountPath: /data
subPath: Gitea subPath: Gitea
env: envFrom:
- name: GITEA__database__HOST - secretRef:
valueFrom: name: gitea-app-secrets
secretKeyRef:
name: gitea-secrets
key: db_host
- name: GITEA__database__DB_TYPE
valueFrom:
secretKeyRef:
name: gitea-secrets
key: db_type
- name: GITEA__database__NAME
valueFrom:
secretKeyRef:
name: gitea-secrets
key: db_name
- name: GITEA__database__USER
valueFrom:
secretKeyRef:
name: gitea-secrets
key: db_user
- name: GITEA__database__PASSWD
valueFrom:
secretKeyRef:
name: gitea-secrets
key: db_password
- name: USER
valueFrom:
secretKeyRef:
name: gitea-secrets
key: gitea_user
restartPolicy: Always restartPolicy: Always
volumes: volumes:
- name: data - name: data
@@ -0,0 +1,25 @@
apiVersion: secrets.infisical.com/v1alpha1
kind: InfisicalSecret
metadata:
name: gitea-app-secrets
namespace: infisical
spec:
hostAPI: https://infisical.jsme.be
resyncInterval: 30
authentication:
kubernetesAuth:
identityId: "5458def7-7c63-40d2-95da-41c614d0933a"
serviceAccountRef:
name: infisical-auth
namespace: infisical
autoCreateServiceAccountToken: true
secretsScope:
projectSlug: "kubernetes"
envSlug: "prod"
secretsPath: "/gitea/gitea"
# Non-recursive: keys are already named as the container expects.
recursive: false
managedSecretReference:
secretName: gitea-app-secrets
secretNamespace: gitea
secretType: Opaque
@@ -31,24 +31,9 @@ spec:
volumeMounts: volumeMounts:
- name: gitea-postgresql-database - name: gitea-postgresql-database
mountPath: /var/lib/postgresql/volumes/pgdata mountPath: /var/lib/postgresql/volumes/pgdata
env: envFrom:
- name: POSTGRES_PASSWORD - secretRef:
valueFrom: name: gitea-postgres-secrets
secretKeyRef:
name: gitea-secrets
key: db_password
- name: POSTGRES_USER
valueFrom:
secretKeyRef:
name: gitea-secrets
key: db_user
- name: POSTGRES_DB
valueFrom:
secretKeyRef:
name: gitea-secrets
key: db_name
- name: PGDATA
value: /var/lib/postgresql/volumes/pgdata/data
volumes: volumes:
- name: gitea-postgresql-database - name: gitea-postgresql-database
persistentVolumeClaim: persistentVolumeClaim:
@@ -0,0 +1,25 @@
apiVersion: secrets.infisical.com/v1alpha1
kind: InfisicalSecret
metadata:
name: gitea-postgres-secrets
namespace: infisical
spec:
hostAPI: https://infisical.jsme.be
resyncInterval: 30
authentication:
kubernetesAuth:
identityId: "5458def7-7c63-40d2-95da-41c614d0933a"
serviceAccountRef:
name: infisical-auth
namespace: infisical
autoCreateServiceAccountToken: true
secretsScope:
projectSlug: "kubernetes"
envSlug: "prod"
secretsPath: "/gitea/postgres"
# Non-recursive: keys are already named as the container expects.
recursive: false
managedSecretReference:
secretName: gitea-postgres-secrets
secretNamespace: gitea
secretType: Opaque
+1 -1
View File
@@ -144,7 +144,7 @@ init:
image: image:
repository: busybox repository: busybox
# Overrides the image tag whose default is the chart appVersion. # Overrides the image tag whose default is the chart appVersion.
tag: "1.37.0" tag: "1.38.0"
## Specify an existing token secret ## Specify an existing token secret
## ##
@@ -1,63 +0,0 @@
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: gotify
namespace: gotify
spec:
replicas: 1
selector:
matchLabels:
app: gotify
serviceName: gotify
template:
metadata:
labels:
app: gotify
spec:
restartPolicy: Always
terminationGracePeriodSeconds: 10
containers:
- name: gotify
image: gotify/server:2.9.1
resources:
requests:
cpu: 50m
memory: 128Mi
limits:
cpu: 200m
memory: 256Mi
ports:
- containerPort: 80
name: http
env:
- name: GOTIFY_DEFAULTUSER_PASS
valueFrom:
secretKeyRef:
name: gotify-secrets
key: default_user_pass
- name: GOTIFY_DATABASE_DIALECT
value: postgres
- name: DB_USER
valueFrom:
secretKeyRef:
name: gotify-secrets
key: db_user
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: gotify-secrets
key: db_password
- name: DB_NAME
valueFrom:
secretKeyRef:
name: gotify-secrets
key: db_name
- name: GOTIFY_DATABASE_CONNECTION
value: "host=gotify-postgresql port=5432 user=$(DB_USER) dbname=$(DB_NAME) password=$(DB_PASSWORD) sslmode=disable"
volumeMounts:
- name: data
mountPath: /app/data
volumes:
- name: data
persistentVolumeClaim:
claimName: gotify-data-pvc
@@ -1,14 +1,14 @@
apiVersion: secrets.infisical.com/v1alpha1 apiVersion: secrets.infisical.com/v1alpha1
kind: InfisicalSecret kind: InfisicalSecret
metadata: metadata:
name: gotify-secrets name: gotify-app-secrets
namespace: infisical namespace: infisical
spec: spec:
hostAPI: https://infisical.jsme.be hostAPI: https://infisical.jsme.be
resyncInterval: 30 resyncInterval: 30
authentication: authentication:
kubernetesAuth: kubernetesAuth:
identityId: "9f65814e-bf4c-42fc-b382-26be15b11416" identityId: "5458def7-7c63-40d2-95da-41c614d0933a"
serviceAccountRef: serviceAccountRef:
name: infisical-auth name: infisical-auth
namespace: infisical namespace: infisical
@@ -16,9 +16,10 @@ spec:
secretsScope: secretsScope:
projectSlug: "kubernetes" projectSlug: "kubernetes"
envSlug: "prod" envSlug: "prod"
secretsPath: "/gotify" secretsPath: "/gotify/gotify"
recursive: true # Non-recursive: keys are already named as the container expects.
recursive: false
managedSecretReference: managedSecretReference:
secretName: gotify-secrets secretName: gotify-app-secrets
secretNamespace: gotify secretNamespace: gotify
secretType: Opaque secretType: Opaque
@@ -0,0 +1,41 @@
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: gotify
namespace: gotify
spec:
replicas: 1
selector:
matchLabels:
app: gotify
serviceName: gotify
template:
metadata:
labels:
app: gotify
spec:
restartPolicy: Always
terminationGracePeriodSeconds: 10
containers:
- name: gotify
image: gotify/server:3.0.0
resources:
requests:
cpu: 50m
memory: 128Mi
limits:
cpu: 200m
memory: 256Mi
ports:
- containerPort: 80
name: http
envFrom:
- secretRef:
name: gotify-app-secrets
volumeMounts:
- name: data
mountPath: /app/data
volumes:
- name: data
persistentVolumeClaim:
claimName: gotify-data-pvc
@@ -31,24 +31,9 @@ spec:
volumeMounts: volumeMounts:
- name: gotify-postgresql-database - name: gotify-postgresql-database
mountPath: /var/lib/postgresql/pgdata mountPath: /var/lib/postgresql/pgdata
env: envFrom:
- name: PGDATA - secretRef:
value: /var/lib/postgresql/pgdata/data name: gotify-postgres-secrets
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
name: gotify-secrets
key: db_password
- name: POSTGRES_USER
valueFrom:
secretKeyRef:
name: gotify-secrets
key: db_user
- name: POSTGRES_DB
valueFrom:
secretKeyRef:
name: gotify-secrets
key: db_name
volumes: volumes:
- name: gotify-postgresql-database - name: gotify-postgresql-database
persistentVolumeClaim: persistentVolumeClaim:
@@ -0,0 +1,25 @@
apiVersion: secrets.infisical.com/v1alpha1
kind: InfisicalSecret
metadata:
name: gotify-postgres-secrets
namespace: infisical
spec:
hostAPI: https://infisical.jsme.be
resyncInterval: 30
authentication:
kubernetesAuth:
identityId: "5458def7-7c63-40d2-95da-41c614d0933a"
serviceAccountRef:
name: infisical-auth
namespace: infisical
autoCreateServiceAccountToken: true
secretsScope:
projectSlug: "kubernetes"
envSlug: "prod"
secretsPath: "/gotify/postgres"
# Non-recursive: keys are already named as the container expects.
recursive: false
managedSecretReference:
secretName: gotify-postgres-secrets
secretNamespace: gotify
secretType: Opaque
@@ -18,7 +18,7 @@ spec:
terminationGracePeriodSeconds: 60 terminationGracePeriodSeconds: 60
containers: containers:
- name: immich - name: immich
image: ghcr.io/immich-app/immich-server:v2.7.5 image: ghcr.io/immich-app/immich-server:v3.1.0
resources: resources:
requests: requests:
memory: "256Mi" memory: "256Mi"
@@ -28,30 +28,9 @@ spec:
cpu: "2000m" cpu: "2000m"
ports: ports:
- containerPort: 2283 - containerPort: 2283
env: envFrom:
- name: TZ - secretRef:
value: "Europe/Brussels" name: immich-app-secrets
- name: DB_HOSTNAME
value: "immich-postgresql.immich.svc.cluster.local"
- name: DB_DATABASE_NAME
valueFrom:
secretKeyRef:
name: immich-secrets
key: db_name
- name: DB_USERNAME
valueFrom:
secretKeyRef:
name: immich-secrets
key: db_user
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: immich-secrets
key: db_password
- name: REDIS_HOSTNAME
value: "valkey.immich.svc.cluster.local"
- name: IMMICH_PORT
value: "2283"
volumeMounts: volumeMounts:
- name: photos - name: photos
mountPath: /data mountPath: /data
@@ -0,0 +1,25 @@
apiVersion: secrets.infisical.com/v1alpha1
kind: InfisicalSecret
metadata:
name: immich-app-secrets
namespace: infisical
spec:
hostAPI: https://infisical.jsme.be
resyncInterval: 30
authentication:
kubernetesAuth:
identityId: "5458def7-7c63-40d2-95da-41c614d0933a"
serviceAccountRef:
name: infisical-auth
namespace: infisical
autoCreateServiceAccountToken: true
secretsScope:
projectSlug: "kubernetes"
envSlug: "prod"
secretsPath: "/immich/immich"
# Non-recursive: keys are already named as the container expects.
recursive: false
managedSecretReference:
secretName: immich-app-secrets
secretNamespace: immich
secretType: Opaque
@@ -31,24 +31,9 @@ spec:
volumeMounts: volumeMounts:
- name: immich-postgresql-immich - name: immich-postgresql-immich
mountPath: /var/lib/postgres mountPath: /var/lib/postgres
env: envFrom:
- name: POSTGRES_PASSWORD - secretRef:
valueFrom: name: immich-postgres-secrets
secretKeyRef:
name: immich-secrets
key: db_password
- name: POSTGRES_USER
valueFrom:
secretKeyRef:
name: immich-secrets
key: db_user
- name: POSTGRES_DB
valueFrom:
secretKeyRef:
name: immich-secrets
key: db_name
- name: PGDATA
value: /var/lib/postgres/data
volumes: volumes:
- name: immich-postgresql-immich - name: immich-postgresql-immich
persistentVolumeClaim: persistentVolumeClaim:
@@ -0,0 +1,25 @@
apiVersion: secrets.infisical.com/v1alpha1
kind: InfisicalSecret
metadata:
name: immich-postgres-secrets
namespace: infisical
spec:
hostAPI: https://infisical.jsme.be
resyncInterval: 30
authentication:
kubernetesAuth:
identityId: "5458def7-7c63-40d2-95da-41c614d0933a"
serviceAccountRef:
name: infisical-auth
namespace: infisical
autoCreateServiceAccountToken: true
secretsScope:
projectSlug: "kubernetes"
envSlug: "prod"
secretsPath: "/immich/postgres"
# Non-recursive: keys are already named as the container expects.
recursive: false
managedSecretReference:
secretName: immich-postgres-secrets
secretNamespace: immich
secretType: Opaque
@@ -8,7 +8,7 @@ spec:
resyncInterval: 30 resyncInterval: 30
authentication: authentication:
kubernetesAuth: kubernetesAuth:
identityId: "9f65814e-bf4c-42fc-b382-26be15b11416" identityId: "5458def7-7c63-40d2-95da-41c614d0933a"
serviceAccountRef: serviceAccountRef:
name: infisical-auth name: infisical-auth
namespace: infisical namespace: infisical
@@ -8,7 +8,7 @@ spec:
resyncInterval: 30 resyncInterval: 30
authentication: authentication:
kubernetesAuth: kubernetesAuth:
identityId: "9f65814e-bf4c-42fc-b382-26be15b11416" identityId: "5458def7-7c63-40d2-95da-41c614d0933a"
serviceAccountRef: serviceAccountRef:
name: infisical-auth name: infisical-auth
namespace: infisical namespace: infisical
@@ -8,7 +8,7 @@ spec:
resyncInterval: 30 resyncInterval: 30
authentication: authentication:
kubernetesAuth: kubernetesAuth:
identityId: "9f65814e-bf4c-42fc-b382-26be15b11416" identityId: "5458def7-7c63-40d2-95da-41c614d0933a"
serviceAccountRef: serviceAccountRef:
name: infisical-auth name: infisical-auth
namespace: infisical namespace: infisical
@@ -17,7 +17,9 @@ spec:
projectSlug: "kubernetes" projectSlug: "kubernetes"
envSlug: "prod" envSlug: "prod"
secretsPath: "/gitea" secretsPath: "/gitea"
recursive: true # Root only: /gitea holds the SMB mount credentials and the Actions runner token.
# Per-container env lives in subfolders.
recursive: false
managedSecretReference: managedSecretReference:
secretName: gitea-secrets secretName: gitea-secrets
secretNamespace: gitea secretNamespace: gitea
@@ -8,7 +8,7 @@ spec:
resyncInterval: 30 resyncInterval: 30
authentication: authentication:
kubernetesAuth: kubernetesAuth:
identityId: "9f65814e-bf4c-42fc-b382-26be15b11416" identityId: "5458def7-7c63-40d2-95da-41c614d0933a"
serviceAccountRef: serviceAccountRef:
name: infisical-auth name: infisical-auth
namespace: infisical namespace: infisical
@@ -17,7 +17,9 @@ spec:
projectSlug: "kubernetes" projectSlug: "kubernetes"
envSlug: "prod" envSlug: "prod"
secretsPath: "/immich" secretsPath: "/immich"
recursive: true # Root only: /immich holds the SMB mount credentials (username, password)
# consumed by immich-data-smb. Per-container env lives in subfolders.
recursive: false
managedSecretReference: managedSecretReference:
secretName: immich-secrets secretName: immich-secrets
secretNamespace: immich secretNamespace: immich
@@ -8,7 +8,7 @@ spec:
resyncInterval: 30 resyncInterval: 30
authentication: authentication:
kubernetesAuth: kubernetesAuth:
identityId: "9f65814e-bf4c-42fc-b382-26be15b11416" identityId: "5458def7-7c63-40d2-95da-41c614d0933a"
serviceAccountRef: serviceAccountRef:
name: infisical-auth name: infisical-auth
namespace: infisical namespace: infisical
@@ -8,7 +8,7 @@ spec:
resyncInterval: 30 resyncInterval: 30
authentication: authentication:
kubernetesAuth: kubernetesAuth:
identityId: "9f65814e-bf4c-42fc-b382-26be15b11416" identityId: "5458def7-7c63-40d2-95da-41c614d0933a"
serviceAccountRef: serviceAccountRef:
name: infisical-auth name: infisical-auth
namespace: infisical namespace: infisical
@@ -8,7 +8,7 @@ spec:
resyncInterval: 30 resyncInterval: 30
authentication: authentication:
kubernetesAuth: kubernetesAuth:
identityId: "9f65814e-bf4c-42fc-b382-26be15b11416" identityId: "5458def7-7c63-40d2-95da-41c614d0933a"
serviceAccountRef: serviceAccountRef:
name: infisical-auth name: infisical-auth
namespace: infisical namespace: infisical
@@ -8,7 +8,7 @@ spec:
resyncInterval: 30 resyncInterval: 30
authentication: authentication:
kubernetesAuth: kubernetesAuth:
identityId: "9f65814e-bf4c-42fc-b382-26be15b11416" identityId: "5458def7-7c63-40d2-95da-41c614d0933a"
serviceAccountRef: serviceAccountRef:
name: infisical-auth name: infisical-auth
namespace: infisical namespace: infisical
@@ -8,7 +8,7 @@ spec:
resyncInterval: 30 resyncInterval: 30
authentication: authentication:
kubernetesAuth: kubernetesAuth:
identityId: "9f65814e-bf4c-42fc-b382-26be15b11416" identityId: "5458def7-7c63-40d2-95da-41c614d0933a"
serviceAccountRef: serviceAccountRef:
name: infisical-auth name: infisical-auth
namespace: infisical namespace: infisical
@@ -8,7 +8,7 @@ spec:
resyncInterval: 30 resyncInterval: 30
authentication: authentication:
kubernetesAuth: kubernetesAuth:
identityId: "9f65814e-bf4c-42fc-b382-26be15b11416" identityId: "5458def7-7c63-40d2-95da-41c614d0933a"
serviceAccountRef: serviceAccountRef:
name: infisical-auth name: infisical-auth
namespace: infisical namespace: infisical
@@ -8,7 +8,7 @@ spec:
resyncInterval: 30 resyncInterval: 30
authentication: authentication:
kubernetesAuth: kubernetesAuth:
identityId: "9f65814e-bf4c-42fc-b382-26be15b11416" identityId: "5458def7-7c63-40d2-95da-41c614d0933a"
serviceAccountRef: serviceAccountRef:
name: infisical-auth name: infisical-auth
namespace: infisical namespace: infisical
@@ -8,7 +8,7 @@ spec:
resyncInterval: 30 resyncInterval: 30
authentication: authentication:
kubernetesAuth: kubernetesAuth:
identityId: "9f65814e-bf4c-42fc-b382-26be15b11416" identityId: "5458def7-7c63-40d2-95da-41c614d0933a"
serviceAccountRef: serviceAccountRef:
name: infisical-auth name: infisical-auth
namespace: infisical namespace: infisical
@@ -8,7 +8,7 @@ spec:
resyncInterval: 30 resyncInterval: 30
authentication: authentication:
kubernetesAuth: kubernetesAuth:
identityId: "9f65814e-bf4c-42fc-b382-26be15b11416" identityId: "5458def7-7c63-40d2-95da-41c614d0933a"
serviceAccountRef: serviceAccountRef:
name: infisical-auth name: infisical-auth
namespace: infisical namespace: infisical
@@ -17,7 +17,9 @@ spec:
projectSlug: "kubernetes" projectSlug: "kubernetes"
envSlug: "prod" envSlug: "prod"
secretsPath: "/zipline" secretsPath: "/zipline"
recursive: true # Root only: /zipline holds the SMB mount credentials (username, password)
# consumed by zipline-uploads-pv. Per-container env lives in subfolders.
recursive: false
managedSecretReference: managedSecretReference:
secretName: zipline-secrets secretName: zipline-secrets
secretNamespace: zipline secretNamespace: zipline
@@ -53,6 +53,12 @@ spec:
command: ["sh", "-c", "pg_isready -U $POSTGRES_USER -d $POSTGRES_DB"] command: ["sh", "-c", "pg_isready -U $POSTGRES_USER -d $POSTGRES_DB"]
initialDelaySeconds: 30 initialDelaySeconds: 30
periodSeconds: 15 periodSeconds: 15
resources:
requests:
cpu: 100m
memory: 256Mi
limits:
memory: 512Mi
volumeClaimTemplates: volumeClaimTemplates:
- metadata: - metadata:
name: data name: data
@@ -0,0 +1,63 @@
# Kubernetes-native auth for the InfisicalSecret operator.
# infisical-auth: the identity the CRDs mint short-lived tokens for.
# infisical-token-reviewer: its JWT is pasted into Infisical's Kubernetes Auth
# config so Infisical can call TokenReview. Bound to system:auth-delegator below.
apiVersion: v1
kind: ServiceAccount
metadata:
name: infisical-auth
namespace: infisical
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: infisical-token-reviewer
namespace: infisical
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: infisical-token-reviewer
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:auth-delegator
subjects:
- kind: ServiceAccount
name: infisical-token-reviewer
namespace: infisical
---
# The operator needs to mint tokens for infisical-auth; without this it falls
# back to the legacy SA .secrets[] lookup and never gets a token.
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: infisical-operator-token-creator
rules:
- apiGroups: [""]
resources: ["serviceaccounts/token"]
verbs: ["create"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: infisical-operator-token-creator
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: infisical-operator-token-creator
subjects:
- kind: ServiceAccount
name: infisical-opera-controller-manager
namespace: infisical-operator
---
# Long-lived token for the reviewer SA. `kubectl create token` expires; the
# value pasted into Infisical's Kubernetes Auth config must not.
apiVersion: v1
kind: Secret
metadata:
name: infisical-token-reviewer
namespace: infisical
annotations:
kubernetes.io/service-account.name: infisical-token-reviewer
type: kubernetes.io/service-account-token
@@ -29,6 +29,12 @@ spec:
command: ["valkey-cli", "ping"] command: ["valkey-cli", "ping"]
initialDelaySeconds: 5 initialDelaySeconds: 5
periodSeconds: 10 periodSeconds: 10
resources:
requests:
cpu: 50m
memory: 64Mi
limits:
memory: 256Mi
volumeClaimTemplates: volumeClaimTemplates:
- metadata: - metadata:
name: data name: data
@@ -20,7 +20,7 @@ spec:
gpu: "true" gpu: "true"
containers: containers:
- name: jellyfin - name: jellyfin
image: jellyfin/jellyfin:10.11.9 image: jellyfin/jellyfin:12.0
ports: ports:
- containerPort: 8096 - containerPort: 8096
resources: resources:
@@ -18,7 +18,7 @@ spec:
terminationGracePeriodSeconds: 10 terminationGracePeriodSeconds: 10
containers: containers:
- name: netbootxyz - name: netbootxyz
image: netbootxyz/netbootxyz:0.7.6-nbxyz18 image: netbootxyz/netbootxyz:0.7.6-nbxyz24
resources: resources:
requests: requests:
cpu: 100m cpu: 100m
@@ -0,0 +1,37 @@
apiVersion: batch/v1
kind: CronJob
metadata:
namespace: netbox
name: netbox-housekeeping
spec:
schedule: "15 3 * * *"
concurrencyPolicy: Forbid
successfulJobsHistoryLimit: 3
failedJobsHistoryLimit: 3
jobTemplate:
spec:
backoffLimit: 2
template:
spec:
restartPolicy: OnFailure
securityContext:
runAsUser: 999
runAsGroup: 0
fsGroup: 0
containers:
- name: netbox-housekeeping
image: netboxcommunity/netbox:v4.6.8-5.0.2
args:
- /opt/netbox/venv/bin/python
- /opt/netbox/netbox/manage.py
- housekeeping
resources:
requests:
memory: "128Mi"
cpu: "50m"
limits:
memory: "512Mi"
cpu: "500m"
envFrom:
- secretRef:
name: netbox-app-secrets
+46
View File
@@ -0,0 +1,46 @@
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: netbox-route
namespace: netbox
spec:
parentRefs:
- group: gateway.networking.k8s.io
kind: Gateway
name: gateway-internal
namespace: envoy-gateway
sectionName: netbox
hostnames:
- "netbox.jsme.be"
rules:
- matches:
- path:
type: PathPrefix
value: /
filters:
- type: RequestHeaderModifier
requestHeaderModifier:
set:
- name: X-Forwarded-Host
value: "netbox.jsme.be"
- name: X-Forwarded-Proto
value: https
- type: ResponseHeaderModifier
responseHeaderModifier:
set:
- name: Strict-Transport-Security
value: "max-age=31536000; includeSubDomains"
- name: X-Content-Type-Options
value: nosniff
- name: X-Frame-Options
value: SAMEORIGIN
- name: Referrer-Policy
value: strict-origin-when-cross-origin
- name: Permissions-Policy
value: "camera=(), microphone=(), geolocation=(), payment=()"
backendRefs:
- name: netbox
port: 8080
kind: Service
group: ""
weight: 1
@@ -0,0 +1,4 @@
apiVersion: v1
kind: Namespace
metadata:
name: netbox
@@ -0,0 +1,82 @@
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: netbox
name: netbox
spec:
replicas: 1
strategy:
type: Recreate
selector:
matchLabels:
app: netbox
template:
metadata:
labels:
app: netbox
spec:
restartPolicy: Always
terminationGracePeriodSeconds: 60
securityContext:
runAsUser: 999
runAsGroup: 0
fsGroup: 0
containers:
- name: netbox
image: netboxcommunity/netbox:v4.6.8-5.0.2
resources:
requests:
memory: "512Mi"
cpu: "250m"
limits:
memory: "2Gi"
cpu: "2000m"
ports:
- containerPort: 8080
envFrom:
- secretRef:
name: netbox-app-secrets
volumeMounts:
- name: netbox-data
mountPath: /opt/netbox/netbox/media
subPath: media
- name: netbox-data
mountPath: /opt/netbox/netbox/reports
subPath: reports
- name: netbox-data
mountPath: /opt/netbox/netbox/scripts
subPath: scripts
startupProbe:
httpGet:
path: /login/
port: 8080
# Django rejects the pod IP as a Host header (ALLOWED_HOSTS).
httpHeaders:
- name: Host
value: netbox.jsme.be
periodSeconds: 10
# Generous: the entrypoint runs migrations before granian binds.
failureThreshold: 60
readinessProbe:
httpGet:
path: /login/
port: 8080
# Django rejects the pod IP as a Host header (ALLOWED_HOSTS).
httpHeaders:
- name: Host
value: netbox.jsme.be
periodSeconds: 15
livenessProbe:
httpGet:
path: /login/
port: 8080
# Django rejects the pod IP as a Host header (ALLOWED_HOSTS).
httpHeaders:
- name: Host
value: netbox.jsme.be
periodSeconds: 30
failureThreshold: 5
volumes:
- name: netbox-data
persistentVolumeClaim:
claimName: netbox-data-pvc
@@ -0,0 +1,25 @@
apiVersion: secrets.infisical.com/v1alpha1
kind: InfisicalSecret
metadata:
name: netbox-app-secrets
namespace: infisical
spec:
hostAPI: https://infisical.jsme.be
resyncInterval: 30
authentication:
kubernetesAuth:
identityId: "5458def7-7c63-40d2-95da-41c614d0933a"
serviceAccountRef:
name: infisical-auth
namespace: infisical
autoCreateServiceAccountToken: true
secretsScope:
projectSlug: "kubernetes"
envSlug: "prod"
secretsPath: "/netbox/netbox"
# Non-recursive: keys are already named as the container expects.
recursive: false
managedSecretReference:
secretName: netbox-app-secrets
secretNamespace: netbox
secretType: Opaque
@@ -0,0 +1,13 @@
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
namespace: netbox
name: netbox-data-pvc
spec:
# RWX: shared by the web pod and the rqworker pod.
accessModes:
- ReadWriteMany
storageClassName: longhorn-static
resources:
requests:
storage: 5Gi
+13
View File
@@ -0,0 +1,13 @@
apiVersion: v1
kind: Service
metadata:
namespace: netbox
name: netbox
spec:
selector:
app: netbox
ports:
- protocol: TCP
port: 8080
targetPort: 8080
type: ClusterIP
@@ -0,0 +1,25 @@
apiVersion: secrets.infisical.com/v1alpha1
kind: InfisicalSecret
metadata:
name: netbox-postgres-secrets
namespace: infisical
spec:
hostAPI: https://infisical.jsme.be
resyncInterval: 30
authentication:
kubernetesAuth:
identityId: "5458def7-7c63-40d2-95da-41c614d0933a"
serviceAccountRef:
name: infisical-auth
namespace: infisical
autoCreateServiceAccountToken: true
secretsScope:
projectSlug: "kubernetes"
envSlug: "prod"
secretsPath: "/netbox/postgres"
# Non-recursive: keys are already named as the container expects.
recursive: false
managedSecretReference:
secretName: netbox-postgres-secrets
secretNamespace: netbox
secretType: Opaque
@@ -1,13 +1,12 @@
apiVersion: v1 apiVersion: v1
kind: PersistentVolumeClaim kind: PersistentVolumeClaim
metadata: metadata:
name: gitea-runner-pvc namespace: netbox
namespace: gitea name: netbox-postgres-pvc
spec: spec:
accessModes: accessModes:
- ReadWriteOnce - ReadWriteOnce
storageClassName: longhorn-static storageClassName: longhorn-static
volumeName: gitea-runner-data
resources: resources:
requests: requests:
storage: 20Gi storage: 10Gi
+14
View File
@@ -0,0 +1,14 @@
apiVersion: v1
kind: Service
metadata:
name: netbox-postgres
namespace: netbox
spec:
selector:
app: netbox-postgres
type: ClusterIP
ports:
- name: netbox-postgres-port
protocol: TCP
port: 5432
targetPort: 5432
@@ -0,0 +1,45 @@
apiVersion: apps/v1
kind: StatefulSet
metadata:
namespace: netbox
name: netbox-postgres
spec:
replicas: 1
serviceName: netbox-postgres
selector:
matchLabels:
app: netbox-postgres
template:
metadata:
labels:
app: netbox-postgres
spec:
restartPolicy: Always
terminationGracePeriodSeconds: 60
containers:
- name: netbox-postgres
image: postgres:18
resources:
requests:
memory: "256Mi"
cpu: "100m"
limits:
memory: "1Gi"
cpu: "1000m"
ports:
- containerPort: 5432
volumeMounts:
- name: netbox-postgres-data
mountPath: /var/lib/postgresql/data
envFrom:
- secretRef:
name: netbox-postgres-secrets
readinessProbe:
exec:
command: ["sh", "-c", "pg_isready -q -U \"$POSTGRES_USER\" -d \"$POSTGRES_DB\""]
initialDelaySeconds: 10
periodSeconds: 10
volumes:
- name: netbox-postgres-data
persistentVolumeClaim:
claimName: netbox-postgres-pvc
@@ -0,0 +1,38 @@
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: netbox
name: netbox-redis-cache
spec:
replicas: 1
selector:
matchLabels:
app: netbox-redis-cache
template:
metadata:
labels:
app: netbox-redis-cache
spec:
restartPolicy: Always
containers:
- name: netbox-redis-cache
image: valkey/valkey:9.1-alpine
# Cache only: no persistence, contents are disposable.
command: ["sh", "-c", "exec valkey-server --requirepass \"$REDIS_PASSWORD\""]
resources:
requests:
memory: "64Mi"
cpu: "50m"
limits:
memory: "256Mi"
cpu: "200m"
ports:
- containerPort: 6379
envFrom:
- secretRef:
name: netbox-redis-cache-secrets
readinessProbe:
exec:
command: ["sh", "-c", "valkey-cli --pass \"$REDIS_PASSWORD\" ping | grep -q PONG"]
initialDelaySeconds: 5
periodSeconds: 10
@@ -0,0 +1,25 @@
apiVersion: secrets.infisical.com/v1alpha1
kind: InfisicalSecret
metadata:
name: netbox-redis-cache-secrets
namespace: infisical
spec:
hostAPI: https://infisical.jsme.be
resyncInterval: 30
authentication:
kubernetesAuth:
identityId: "5458def7-7c63-40d2-95da-41c614d0933a"
serviceAccountRef:
name: infisical-auth
namespace: infisical
autoCreateServiceAccountToken: true
secretsScope:
projectSlug: "kubernetes"
envSlug: "prod"
secretsPath: "/netbox/redis-cache"
# Non-recursive: keys are already named as the container expects.
recursive: false
managedSecretReference:
secretName: netbox-redis-cache-secrets
secretNamespace: netbox
secretType: Opaque
@@ -0,0 +1,14 @@
apiVersion: v1
kind: Service
metadata:
name: netbox-redis-cache
namespace: netbox
spec:
selector:
app: netbox-redis-cache
type: ClusterIP
ports:
- name: netbox-redis-cache-port
protocol: TCP
port: 6379
targetPort: 6379
@@ -0,0 +1,25 @@
apiVersion: secrets.infisical.com/v1alpha1
kind: InfisicalSecret
metadata:
name: netbox-redis-secrets
namespace: infisical
spec:
hostAPI: https://infisical.jsme.be
resyncInterval: 30
authentication:
kubernetesAuth:
identityId: "5458def7-7c63-40d2-95da-41c614d0933a"
serviceAccountRef:
name: infisical-auth
namespace: infisical
autoCreateServiceAccountToken: true
secretsScope:
projectSlug: "kubernetes"
envSlug: "prod"
secretsPath: "/netbox/redis"
# Non-recursive: keys are already named as the container expects.
recursive: false
managedSecretReference:
secretName: netbox-redis-secrets
secretNamespace: netbox
secretType: Opaque
@@ -0,0 +1,12 @@
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
namespace: netbox
name: netbox-redis-pvc
spec:
accessModes:
- ReadWriteOnce
storageClassName: longhorn-static
resources:
requests:
storage: 1Gi
+14
View File
@@ -0,0 +1,14 @@
apiVersion: v1
kind: Service
metadata:
name: netbox-redis
namespace: netbox
spec:
selector:
app: netbox-redis
type: ClusterIP
ports:
- name: netbox-redis-port
protocol: TCP
port: 6379
targetPort: 6379
@@ -0,0 +1,46 @@
apiVersion: apps/v1
kind: StatefulSet
metadata:
namespace: netbox
name: netbox-redis
spec:
replicas: 1
serviceName: netbox-redis
selector:
matchLabels:
app: netbox-redis
template:
metadata:
labels:
app: netbox-redis
spec:
restartPolicy: Always
containers:
- name: netbox-redis
image: valkey/valkey:9.1-alpine
# Task queue: appendonly so queued background jobs survive a restart.
command: ["sh", "-c", "exec valkey-server --appendonly yes --requirepass \"$REDIS_PASSWORD\""]
resources:
requests:
memory: "64Mi"
cpu: "50m"
limits:
memory: "256Mi"
cpu: "200m"
ports:
- containerPort: 6379
envFrom:
- secretRef:
name: netbox-redis-secrets
volumeMounts:
- name: netbox-redis-data
mountPath: /data
readinessProbe:
exec:
command: ["sh", "-c", "valkey-cli --pass \"$REDIS_PASSWORD\" ping | grep -q PONG"]
initialDelaySeconds: 5
periodSeconds: 10
volumes:
- name: netbox-redis-data
persistentVolumeClaim:
claimName: netbox-redis-pvc
@@ -0,0 +1,54 @@
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: netbox
name: netbox-worker
spec:
replicas: 1
selector:
matchLabels:
app: netbox-worker
template:
metadata:
labels:
app: netbox-worker
spec:
restartPolicy: Always
terminationGracePeriodSeconds: 60
securityContext:
runAsUser: 999
runAsGroup: 0
fsGroup: 0
containers:
- name: netbox-worker
image: netboxcommunity/netbox:v4.6.8-5.0.2
# Overrides CMD only, so tini stays the entrypoint and migrations
# are left to the web pod.
args:
- /opt/netbox/venv/bin/python
- /opt/netbox/netbox/manage.py
- rqworker
resources:
requests:
memory: "256Mi"
cpu: "100m"
limits:
memory: "1Gi"
cpu: "1000m"
envFrom:
- secretRef:
name: netbox-app-secrets
volumeMounts:
- name: netbox-data
mountPath: /opt/netbox/netbox/media
subPath: media
- name: netbox-data
mountPath: /opt/netbox/netbox/reports
subPath: reports
- name: netbox-data
mountPath: /opt/netbox/netbox/scripts
subPath: scripts
volumes:
- name: netbox-data
persistentVolumeClaim:
claimName: netbox-data-pvc
@@ -1,14 +1,14 @@
apiVersion: secrets.infisical.com/v1alpha1 apiVersion: secrets.infisical.com/v1alpha1
kind: InfisicalSecret kind: InfisicalSecret
metadata: metadata:
name: outline-secrets name: outline-app-secrets
namespace: infisical namespace: infisical
spec: spec:
hostAPI: https://infisical.jsme.be hostAPI: https://infisical.jsme.be
resyncInterval: 30 resyncInterval: 30
authentication: authentication:
kubernetesAuth: kubernetesAuth:
identityId: "9f65814e-bf4c-42fc-b382-26be15b11416" identityId: "5458def7-7c63-40d2-95da-41c614d0933a"
serviceAccountRef: serviceAccountRef:
name: infisical-auth name: infisical-auth
namespace: infisical namespace: infisical
@@ -16,9 +16,10 @@ spec:
secretsScope: secretsScope:
projectSlug: "kubernetes" projectSlug: "kubernetes"
envSlug: "prod" envSlug: "prod"
secretsPath: "/outline" secretsPath: "/outline/outline"
recursive: true # Non-recursive: keys are already named as the container expects.
recursive: false
managedSecretReference: managedSecretReference:
secretName: outline-secrets secretName: outline-app-secrets
secretNamespace: outline secretNamespace: outline
secretType: Opaque secretType: Opaque
@@ -17,7 +17,7 @@ spec:
terminationGracePeriodSeconds: 60 terminationGracePeriodSeconds: 60
containers: containers:
- name: outline - name: outline
image: docker.getoutline.com/outlinewiki/outline:1.8.1 image: docker.getoutline.com/outlinewiki/outline:1.9.2
resources: resources:
requests: requests:
memory: "512Mi" memory: "512Mi"
@@ -27,92 +27,6 @@ spec:
cpu: "2000m" cpu: "2000m"
ports: ports:
- containerPort: 3000 - containerPort: 3000
env: envFrom:
- name: TZ - secretRef:
value: "Europe/Brussels" name: outline-app-secrets
- name: NODE_ENV
value: "production"
- name: URL
value: "https://outline.jsme.be"
- name: PORT
value: "3000"
# TLS is terminated at the gateway and X-Forwarded-Proto is set to
# https on the HTTPRoute, so Outline must not force an https redirect.
- name: FORCE_HTTPS
value: "false"
# --- Database (PostgreSQL) ---
- name: DATABASE_URL
valueFrom:
secretKeyRef:
name: outline-secrets
key: database_url
# In-cluster Postgres has no TLS; disable SSL on the connection.
- name: PGSSLMODE
value: "disable"
# --- Cache / queue (Redis-compatible Valkey) ---
- name: REDIS_URL
value: "redis://outline-redis.outline.svc.cluster.local:6379"
# --- Secrets ---
- name: SECRET_KEY
valueFrom:
secretKeyRef:
name: outline-secrets
key: secret_key
- name: UTILS_SECRET
valueFrom:
secretKeyRef:
name: outline-secrets
key: utils_secret
# --- File storage (MinIO / S3) ---
- name: FILE_STORAGE
value: "s3"
- name: AWS_REGION
value: "us-east-1"
- name: AWS_S3_UPLOAD_BUCKET_URL
value: "https://s3.jsme.be"
- name: AWS_S3_UPLOAD_BUCKET_NAME
value: "outline"
- name: AWS_S3_FORCE_PATH_STYLE
value: "true"
- name: AWS_S3_ACL
value: "private"
- name: AWS_ACCESS_KEY_ID
valueFrom:
secretKeyRef:
name: outline-secrets
key: s3_access_key
- name: AWS_SECRET_ACCESS_KEY
valueFrom:
secretKeyRef:
name: outline-secrets
key: s3_secret_key
# --- Authentication (Authentik OIDC) ---
- name: OIDC_DISPLAY_NAME
value: "Authentik"
- name: OIDC_AUTH_URI
value: "https://auth.jsme.be/application/o/authorize/"
- name: OIDC_TOKEN_URI
value: "https://auth.jsme.be/application/o/token/"
- name: OIDC_USERINFO_URI
value: "https://auth.jsme.be/application/o/userinfo/"
- name: OIDC_LOGOUT_URI
value: "https://auth.jsme.be/application/o/outline/end-session/"
- name: OIDC_USERNAME_CLAIM
value: "preferred_username"
- name: OIDC_SCOPES
value: "openid profile email"
- name: OIDC_CLIENT_ID
valueFrom:
secretKeyRef:
name: outline-secrets
key: oidc_client_id
- name: OIDC_CLIENT_SECRET
valueFrom:
secretKeyRef:
name: outline-secrets
key: oidc_client_secret
@@ -0,0 +1,25 @@
apiVersion: secrets.infisical.com/v1alpha1
kind: InfisicalSecret
metadata:
name: outline-postgres-secrets
namespace: infisical
spec:
hostAPI: https://infisical.jsme.be
resyncInterval: 30
authentication:
kubernetesAuth:
identityId: "5458def7-7c63-40d2-95da-41c614d0933a"
serviceAccountRef:
name: infisical-auth
namespace: infisical
autoCreateServiceAccountToken: true
secretsScope:
projectSlug: "kubernetes"
envSlug: "prod"
secretsPath: "/outline/postgres"
# Non-recursive: keys are already named as the container expects.
recursive: false
managedSecretReference:
secretName: outline-postgres-secrets
secretNamespace: outline
secretType: Opaque
@@ -31,24 +31,9 @@ spec:
volumeMounts: volumeMounts:
- name: outline-postgres-data - name: outline-postgres-data
mountPath: /var/lib/postgresql/data mountPath: /var/lib/postgresql/data
env: envFrom:
- name: PGDATA - secretRef:
value: "/var/lib/postgresql/data/pgdata" name: outline-postgres-secrets
- name: POSTGRES_USER
valueFrom:
secretKeyRef:
name: outline-secrets
key: db_user
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
name: outline-secrets
key: db_password
- name: POSTGRES_DB
valueFrom:
secretKeyRef:
name: outline-secrets
key: db_name
volumes: volumes:
- name: outline-postgres-data - name: outline-postgres-data
persistentVolumeClaim: persistentVolumeClaim:
@@ -0,0 +1,25 @@
apiVersion: secrets.infisical.com/v1alpha1
kind: InfisicalSecret
metadata:
name: passbolt-mariadb-secrets
namespace: infisical
spec:
hostAPI: https://infisical.jsme.be
resyncInterval: 30
authentication:
kubernetesAuth:
identityId: "5458def7-7c63-40d2-95da-41c614d0933a"
serviceAccountRef:
name: infisical-auth
namespace: infisical
autoCreateServiceAccountToken: true
secretsScope:
projectSlug: "kubernetes"
envSlug: "prod"
secretsPath: "/passbolt/mariadb"
# Non-recursive: keys are already named as the container expects.
recursive: false
managedSecretReference:
secretName: passbolt-mariadb-secrets
secretNamespace: passbolt
secretType: Opaque
@@ -31,24 +31,9 @@ spec:
mountPath: /var/lib/mysql mountPath: /var/lib/mysql
ports: ports:
- containerPort: 3306 - containerPort: 3306
env: envFrom:
- name: MYSQL_RANDOM_ROOT_PASSWORD - secretRef:
value: "true" name: passbolt-mariadb-secrets
- name: MYSQL_DATABASE
valueFrom:
secretKeyRef:
name: passbolt-secrets
key: db_name
- name: MYSQL_USER
valueFrom:
secretKeyRef:
name: passbolt-secrets
key: db_user
- name: MYSQL_PASSWORD
valueFrom:
secretKeyRef:
name: passbolt-secrets
key: db_password
volumes: volumes:
- name: passbolt-mariadb-volume - name: passbolt-mariadb-volume
persistentVolumeClaim: persistentVolumeClaim:
@@ -1,14 +1,14 @@
apiVersion: secrets.infisical.com/v1alpha1 apiVersion: secrets.infisical.com/v1alpha1
kind: InfisicalSecret kind: InfisicalSecret
metadata: metadata:
name: passbolt-secrets name: passbolt-app-secrets
namespace: infisical namespace: infisical
spec: spec:
hostAPI: https://infisical.jsme.be hostAPI: https://infisical.jsme.be
resyncInterval: 30 resyncInterval: 30
authentication: authentication:
kubernetesAuth: kubernetesAuth:
identityId: "9f65814e-bf4c-42fc-b382-26be15b11416" identityId: "5458def7-7c63-40d2-95da-41c614d0933a"
serviceAccountRef: serviceAccountRef:
name: infisical-auth name: infisical-auth
namespace: infisical namespace: infisical
@@ -16,9 +16,10 @@ spec:
secretsScope: secretsScope:
projectSlug: "kubernetes" projectSlug: "kubernetes"
envSlug: "prod" envSlug: "prod"
secretsPath: "/passbolt" secretsPath: "/passbolt/passbolt"
recursive: true # Non-recursive: keys are already named as the container expects.
recursive: false
managedSecretReference: managedSecretReference:
secretName: passbolt-secrets secretName: passbolt-app-secrets
secretNamespace: passbolt secretNamespace: passbolt
secretType: Opaque secretType: Opaque
@@ -36,60 +36,9 @@ spec:
subPath: passbolt-ssl.conf subPath: passbolt-ssl.conf
ports: ports:
- containerPort: 80 - containerPort: 80
env: envFrom:
- name: APP_FULL_BASE_URL - secretRef:
value: https://passbolt.jsme.be name: passbolt-app-secrets
- name: APP_DEFAULT_TIMEZONE
value: Europe/Brussels
- name: PASSBOLT_SECURITY_CSP
value: "default-src 'self'; script-src 'self' chrome-extension: moz-extension:; style-src 'self' 'unsafe-inline'; img-src 'self'; frame-src 'self' chrome-extension: moz-extension: https://*.duosecurity.com; connect-src 'self' chrome-extension: moz-extension:; worker-src 'self' chrome-extension: moz-extension:; frame-ancestors 'none'; form-action 'self' https://*.duosecurity.com"
- name: DATASOURCES_DEFAULT_PORT
valueFrom:
secretKeyRef:
name: passbolt-secrets
key: db_port
- name: DATASOURCES_DEFAULT_HOST
valueFrom:
secretKeyRef:
name: passbolt-secrets
key: db_host
- name: DATASOURCES_DEFAULT_USERNAME
valueFrom:
secretKeyRef:
name: passbolt-secrets
key: db_user
- name: DATASOURCES_DEFAULT_PASSWORD
valueFrom:
secretKeyRef:
name: passbolt-secrets
key: db_password
- name: DATASOURCES_DEFAULT_DATABASE
valueFrom:
secretKeyRef:
name: passbolt-secrets
key: db_name
- name: EMAIL_DEFAULT_FROM
value: passbolt@jsme.be
- name: EMAIL_TRANSPORT_DEFAULT_HOST
value: smtp.office365.com
- name: EMAIL_TRANSPORT_DEFAULT_PORT
value: "587"
- name: EMAIL_TRANSPORT_DEFAULT_USERNAME
valueFrom:
secretKeyRef:
name: passbolt-secrets
key: smtp_username
- name: EMAIL_TRANSPORT_DEFAULT_PASSWORD
valueFrom:
secretKeyRef:
name: passbolt-secrets
key: smtp_password
- name: EMAIL_TRANSPORT_DEFAULT_TLS
value: "true"
- name: PASSBOLT_KEY_EMAIL
value: passbolt@jsme.be
- name: PASSBOLT_GPG_SERVER_KEY_FINGERPRINT_FORCE
value: "true"
volumes: volumes:
- name: gpg-volume - name: gpg-volume
persistentVolumeClaim: persistentVolumeClaim:
@@ -1,20 +0,0 @@
apiVersion: v1
kind: ConfigMap
metadata:
name: pelican-config
namespace: pelican
data:
APP_NAME: Pelican
APP_URL: https://pelican.jsme.be
BEHIND_PROXY: "true"
ADMIN_EMAIL: jeffreysmeets@jsme.be
DB_CONNECTION: pgsql
DB_HOST: pelican-postgres
DB_PORT: "5432"
CACHE_STORE: redis
QUEUE_CONNECTION: redis
SESSION_DRIVER: redis
REDIS_HOST: pelican-redis
REDIS_PORT: "6379"
XDG_DATA_HOME: /pelican-data
AWS_USE_PATH_STYLE_ENDPOINT: "true"
@@ -10,6 +10,11 @@ spec:
name: gateway-internal name: gateway-internal
namespace: envoy-gateway namespace: envoy-gateway
sectionName: pelican sectionName: pelican
- group: gateway.networking.k8s.io
kind: Gateway
name: gateway-public
namespace: envoy-gateway
sectionName: pelican
hostnames: hostnames:
- "pelican.jsme.be" - "pelican.jsme.be"
rules: rules:
@@ -10,6 +10,11 @@ spec:
name: gateway-internal name: gateway-internal
namespace: envoy-gateway namespace: envoy-gateway
sectionName: wings-ark sectionName: wings-ark
- group: gateway.networking.k8s.io
kind: Gateway
name: gateway-public
namespace: envoy-gateway
sectionName: wings-ark
hostnames: hostnames:
- "wings-ark.jsme.be" - "wings-ark.jsme.be"
rules: rules:
@@ -10,6 +10,11 @@ spec:
name: gateway-internal name: gateway-internal
namespace: envoy-gateway namespace: envoy-gateway
sectionName: wings-mc sectionName: wings-mc
- group: gateway.networking.k8s.io
kind: Gateway
name: gateway-public
namespace: envoy-gateway
sectionName: wings-mc
hostnames: hostnames:
- "wings-mc.jsme.be" - "wings-mc.jsme.be"
rules: rules:
@@ -19,7 +19,8 @@ spec:
fsGroup: 82 fsGroup: 82
containers: containers:
- name: pelican - name: pelican
image: ghcr.io/pelican-dev/panel:latest image: ghcr.io/pelican/panel:v1.0.0-beta38
imagePullPolicy: IfNotPresent
ports: ports:
- containerPort: 80 - containerPort: 80
resources: resources:
@@ -30,24 +31,8 @@ spec:
cpu: 1000m cpu: 1000m
memory: 1Gi memory: 1Gi
envFrom: envFrom:
- configMapRef: - secretRef:
name: pelican-config name: pelican-app-secrets
env:
- name: DB_USERNAME
valueFrom:
secretKeyRef:
name: pelican-secrets
key: DB_USERNAME
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: pelican-secrets
key: DB_PASSWORD
- name: DB_DATABASE
valueFrom:
secretKeyRef:
name: pelican-secrets
key: DB_DATABASE
volumeMounts: volumeMounts:
- name: pelican-data - name: pelican-data
mountPath: /pelican-data mountPath: /pelican-data
@@ -1,14 +1,14 @@
apiVersion: secrets.infisical.com/v1alpha1 apiVersion: secrets.infisical.com/v1alpha1
kind: InfisicalSecret kind: InfisicalSecret
metadata: metadata:
name: pelican-secrets name: pelican-app-secrets
namespace: infisical namespace: infisical
spec: spec:
hostAPI: https://infisical.jsme.be hostAPI: https://infisical.jsme.be
resyncInterval: 30 resyncInterval: 30
authentication: authentication:
kubernetesAuth: kubernetesAuth:
identityId: "9f65814e-bf4c-42fc-b382-26be15b11416" identityId: "5458def7-7c63-40d2-95da-41c614d0933a"
serviceAccountRef: serviceAccountRef:
name: infisical-auth name: infisical-auth
namespace: infisical namespace: infisical
@@ -16,9 +16,10 @@ spec:
secretsScope: secretsScope:
projectSlug: "kubernetes" projectSlug: "kubernetes"
envSlug: "prod" envSlug: "prod"
secretsPath: "/pelican" secretsPath: "/pelican/pelican"
recursive: true # Non-recursive: keys are already named as the container expects.
recursive: false
managedSecretReference: managedSecretReference:
secretName: pelican-secrets secretName: pelican-app-secrets
secretNamespace: pelican secretNamespace: pelican
secretType: Opaque secretType: Opaque
@@ -0,0 +1,25 @@
apiVersion: secrets.infisical.com/v1alpha1
kind: InfisicalSecret
metadata:
name: pelican-postgres-secrets
namespace: infisical
spec:
hostAPI: https://infisical.jsme.be
resyncInterval: 30
authentication:
kubernetesAuth:
identityId: "5458def7-7c63-40d2-95da-41c614d0933a"
serviceAccountRef:
name: infisical-auth
namespace: infisical
autoCreateServiceAccountToken: true
secretsScope:
projectSlug: "kubernetes"
envSlug: "prod"
secretsPath: "/pelican/postgres"
# Non-recursive: keys are already named as the container expects.
recursive: false
managedSecretReference:
secretName: pelican-postgres-secrets
secretNamespace: pelican
secretType: Opaque
@@ -31,24 +31,9 @@ spec:
volumeMounts: volumeMounts:
- name: pelican-postgres-data - name: pelican-postgres-data
mountPath: /var/lib/postgresql/data mountPath: /var/lib/postgresql/data
env: envFrom:
- name: PGDATA - secretRef:
value: /var/lib/postgresql/data/pgdata name: pelican-postgres-secrets
- name: POSTGRES_USER
valueFrom:
secretKeyRef:
name: pelican-secrets
key: DB_USERNAME
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
name: pelican-secrets
key: DB_PASSWORD
- name: POSTGRES_DB
valueFrom:
secretKeyRef:
name: pelican-secrets
key: DB_DATABASE
volumes: volumes:
- name: pelican-postgres-data - name: pelican-postgres-data
persistentVolumeClaim: persistentVolumeClaim:
@@ -0,0 +1,25 @@
apiVersion: secrets.infisical.com/v1alpha1
kind: InfisicalSecret
metadata:
name: resume-chrome-secrets
namespace: infisical
spec:
hostAPI: https://infisical.jsme.be
resyncInterval: 30
authentication:
kubernetesAuth:
identityId: "5458def7-7c63-40d2-95da-41c614d0933a"
serviceAccountRef:
name: infisical-auth
namespace: infisical
autoCreateServiceAccountToken: true
secretsScope:
projectSlug: "kubernetes"
envSlug: "prod"
secretsPath: "/reactive_resume/chrome"
# Non-recursive: keys are already named as the container expects.
recursive: false
managedSecretReference:
secretName: resume-chrome-secrets
secretNamespace: resume
secretType: Opaque
@@ -20,24 +20,6 @@ spec:
image: ghcr.io/browserless/chromium:latest image: ghcr.io/browserless/chromium:latest
ports: ports:
- containerPort: 3000 - containerPort: 3000
env: envFrom:
- name: TIMEOUT - secretRef:
value: "10000" name: resume-chrome-secrets
- name: CONCURRENT
value: "10"
- name: TOKEN
valueFrom:
secretKeyRef:
name: resume-secrets
key: chrome_token
- name: EXIT_ON_HEALTH_FAILURE
value: "true"
- name: PRE_REQUEST_HEALTH_CHECK
value: "true"
resources:
limits:
memory: "1Gi"
cpu: "500m"
requests:
memory: "512Mi"
cpu: "250m"
@@ -0,0 +1,25 @@
apiVersion: secrets.infisical.com/v1alpha1
kind: InfisicalSecret
metadata:
name: resume-postgres-secrets
namespace: infisical
spec:
hostAPI: https://infisical.jsme.be
resyncInterval: 30
authentication:
kubernetesAuth:
identityId: "5458def7-7c63-40d2-95da-41c614d0933a"
serviceAccountRef:
name: infisical-auth
namespace: infisical
autoCreateServiceAccountToken: true
secretsScope:
projectSlug: "kubernetes"
envSlug: "prod"
secretsPath: "/reactive_resume/postgres"
# Non-recursive: keys are already named as the container expects.
recursive: false
managedSecretReference:
secretName: resume-postgres-secrets
secretNamespace: resume
secretType: Opaque
@@ -30,22 +30,9 @@ spec:
volumeMounts: volumeMounts:
- name: resume-postgresql-database - name: resume-postgresql-database
mountPath: /var/lib/postgresql mountPath: /var/lib/postgresql
env: envFrom:
- name: POSTGRES_PASSWORD - secretRef:
valueFrom: name: resume-postgres-secrets
secretKeyRef:
name: resume-secrets
key: db_password
- name: POSTGRES_USER
valueFrom:
secretKeyRef:
name: resume-secrets
key: db_user
- name: POSTGRES_DB
valueFrom:
secretKeyRef:
name: resume-secrets
key: db_name
volumes: volumes:
- name: resume-postgresql-database - name: resume-postgresql-database
persistentVolumeClaim: persistentVolumeClaim:
@@ -1,14 +1,14 @@
apiVersion: secrets.infisical.com/v1alpha1 apiVersion: secrets.infisical.com/v1alpha1
kind: InfisicalSecret kind: InfisicalSecret
metadata: metadata:
name: resume-secrets name: resume-app-secrets
namespace: infisical namespace: infisical
spec: spec:
hostAPI: https://infisical.jsme.be hostAPI: https://infisical.jsme.be
resyncInterval: 30 resyncInterval: 30
authentication: authentication:
kubernetesAuth: kubernetesAuth:
identityId: "9f65814e-bf4c-42fc-b382-26be15b11416" identityId: "5458def7-7c63-40d2-95da-41c614d0933a"
serviceAccountRef: serviceAccountRef:
name: infisical-auth name: infisical-auth
namespace: infisical namespace: infisical
@@ -16,9 +16,10 @@ spec:
secretsScope: secretsScope:
projectSlug: "kubernetes" projectSlug: "kubernetes"
envSlug: "prod" envSlug: "prod"
secretsPath: "/reactive_resume" secretsPath: "/reactive_resume/resume"
recursive: true # Non-recursive: keys are already named as the container expects.
recursive: false
managedSecretReference: managedSecretReference:
secretName: resume-secrets secretName: resume-app-secrets
secretNamespace: resume secretNamespace: resume
secretType: Opaque secretType: Opaque
@@ -27,108 +27,6 @@ spec:
requests: requests:
cpu: "500m" cpu: "500m"
memory: "1Gi" memory: "1Gi"
env: envFrom:
- name: TZ - secretRef:
value: Europe/Brussels name: resume-app-secrets
- name: NODE_ENV
value: production
- name: PORT
value: "3000"
- name: APP_URL
value: https://resume.jsme.be
- name: STORAGE_URL
value: https://s3.jsme.be/resume
- name: CHROME_TOKEN
valueFrom:
secretKeyRef:
name: resume-secrets
key: chrome_token
- name: PRINTER_ENDPOINT
value: ws://chrome.resume.svc.cluster.local:3000?token=$(CHROME_TOKEN)
- name: DATABASE_URL
valueFrom:
secretKeyRef:
name: resume-secrets
key: db_url
- name: AUTH_SECRET
valueFrom:
secretKeyRef:
name: resume-secrets
key: auth_secret
- name: OAUTH_PROVIDER_NAME
valueFrom:
secretKeyRef:
name: resume-secrets
key: oauth_provider_name
- name: OAUTH_CLIENT_ID
valueFrom:
secretKeyRef:
name: resume-secrets
key: oauth_client_id
- name: OAUTH_CLIENT_SECRET
valueFrom:
secretKeyRef:
name: resume-secrets
key: oauth_client_secret
- name: OAUTH_DISCOVERY_URL
valueFrom:
secretKeyRef:
name: resume-secrets
key: oauth_discovery_url
- name: SMTP_HOST
valueFrom:
secretKeyRef:
name: resume-secrets
key: smtp_host
- name: SMTP_PORT
valueFrom:
secretKeyRef:
name: resume-secrets
key: smtp_port
- name: SMTP_USER
valueFrom:
secretKeyRef:
name: resume-secrets
key: smtp_user
- name: SMTP_PASS
valueFrom:
secretKeyRef:
name: resume-secrets
key: smtp_pass
- name: SMTP_FROM
valueFrom:
secretKeyRef:
name: resume-secrets
key: smtp_from
- name: SMTP_SECURE
valueFrom:
secretKeyRef:
name: resume-secrets
key: smtp_secure
- name: S3_ACCESS_KEY_ID
valueFrom:
secretKeyRef:
name: resume-secrets
key: s3_access_key_id
- name: S3_SECRET_ACCESS_KEY
valueFrom:
secretKeyRef:
name: resume-secrets
key: s3_secret_access_key
- name: S3_REGION
valueFrom:
secretKeyRef:
name: resume-secrets
key: s3_region
- name: S3_ENDPOINT
valueFrom:
secretKeyRef:
name: resume-secrets
key: s3_endpoint
- name: S3_BUCKET
valueFrom:
secretKeyRef:
name: resume-secrets
key: s3_bucket
- name: S3_FORCE_PATH_STYLE
value: "true"
@@ -21,14 +21,9 @@ spec:
image: searxng/searxng:latest image: searxng/searxng:latest
ports: ports:
- containerPort: 8080 - containerPort: 8080
env: envFrom:
- name: SEARXNG_BASE_URL - secretRef:
value: "https://search.jsme.be" name: searxng-app-secrets
- name: SEARXNG_SECRET
valueFrom:
secretKeyRef:
name: searxng-secrets
key: SEARXNG_SECRET_KEY
resources: resources:
requests: requests:
cpu: 50m cpu: 50m
@@ -1,14 +1,14 @@
apiVersion: secrets.infisical.com/v1alpha1 apiVersion: secrets.infisical.com/v1alpha1
kind: InfisicalSecret kind: InfisicalSecret
metadata: metadata:
name: searxng-secrets name: searxng-app-secrets
namespace: infisical namespace: infisical
spec: spec:
hostAPI: https://infisical.jsme.be hostAPI: https://infisical.jsme.be
resyncInterval: 30 resyncInterval: 30
authentication: authentication:
kubernetesAuth: kubernetesAuth:
identityId: "9f65814e-bf4c-42fc-b382-26be15b11416" identityId: "5458def7-7c63-40d2-95da-41c614d0933a"
serviceAccountRef: serviceAccountRef:
name: infisical-auth name: infisical-auth
namespace: infisical namespace: infisical
@@ -16,9 +16,10 @@ spec:
secretsScope: secretsScope:
projectSlug: "kubernetes" projectSlug: "kubernetes"
envSlug: "prod" envSlug: "prod"
secretsPath: "/searxng" secretsPath: "/searxng/searxng"
recursive: true # Non-recursive: keys are already named as the container expects.
recursive: false
managedSecretReference: managedSecretReference:
secretName: searxng-secrets secretName: searxng-app-secrets
secretNamespace: searxng secretNamespace: searxng
secretType: Opaque secretType: Opaque

Some files were not shown because too many files have changed in this diff Show More