Files
homelab/kubernetes/apps/authentik/helmrelease.yaml
T
claude-botandClaude Fable 5 ca61ff493c feat(dns): label-driven registration replaces the excludeDomains list
The dns.renner.uno/public=true label on an Ingress marks it as publicly
registered (Cloudflare wildcard -> NetBird proxy); external-dns-unifi
now runs with labelFilter dns.renner.uno/public!=true and skips those
resources entirely. Visibility is a property of the app resource itself
— there is no central name list to keep in sync with the proxy.

Also removes the dead .k.renner.uno hosts from the public apps'
Ingresses (their TLS certs reissue without those SANs) and splits
photos.renner.uno onto its own unlabeled Ingress: the label filter is
per-resource and that name stays LAN-registered. Remaining .k. names on
LAN-only apps (loki, ical-proxy, syslog) are untouched here.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014S5CLfizEtzHS51kxJFQgc
2026-07-23 08:38:17 +02:00

180 lines
5.8 KiB
YAML

apiVersion: source.toolkit.fluxcd.io/v1
kind: HelmRepository
metadata:
name: authentik
namespace: authentik
spec:
interval: 24h
url: https://charts.goauthentik.io
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: authentik
namespace: authentik
spec:
interval: 30m
chart:
spec:
chart: authentik
# Pinned to match the samba-bridge fork's app image (server.Dockerfile
# AUTHENTIK_VERSION). Bump in lockstep with the bridge rebuild — a
# floating range drifts the chart ahead of the pinned app image.
version: "2026.5.3"
sourceRef:
kind: HelmRepository
name: authentik
namespace: authentik
install:
disableWait: true
remediation:
retries: 3
upgrade:
disableWait: true
remediation:
retries: 3
values:
global:
# Reloader restarts BOTH the authentik server and worker Deployments when
# authentik-secrets changes (e.g. after a SECRET_KEY rotation); global
# podAnnotations propagate to every component pod. See
# kubernetes/infrastructure/openbao/rotation/authentik.yaml.
podAnnotations:
secret.reloader.stakater.com/reload: authentik-secrets
# Custom Authentik server image with the samba-bridge baked in.
# The bridge synthesises sambaNTPassword (and the rest of the
# Samba schema) on every User.set_password() call for any user
# in the configured Synology Users group, so the LDAP outpost
# then emits NT-hash-bearing user entries that DSM's smbd
# accepts for NTLMv2 SMB authentication. See
# https://gitea.renner.uno/k.renner/authentik-samba-bridge .
image:
repository: gitea.renner.uno/k.renner/authentik-samba-bridge-server
# Pinned to a specific build for two reasons:
# 1. K8s does not pull on every reschedule when tag=latest, so
# a floating tag means we don't actually pick up rebuilds
# without a manual rollout-restart (which is forbidden per
# "no pod invasion" rule).
# 2. Pinning means the deployed binary is traceable to a
# specific repo commit. Bump the tag whenever a new build
# is published from gitea.renner.uno/k.renner/authentik-samba-bridge .
tag: "2026.5.3-f02b945"
envFrom:
# SAMBA_BRIDGE_DOMAIN_SID / _ENABLED_GROUP / _UID_OFFSET
# consumed by the bridge module at Django app startup. Missing
# SAMBA_BRIDGE_DOMAIN_SID fails the pod fast. See
# samba-bridge-secret.sops.yaml.
- secretRef:
name: authentik-samba-bridge-config
env:
- name: AUTHENTIK_SECRET_KEY
valueFrom:
secretKeyRef:
name: authentik-secrets
key: secret-key
- name: AUTHENTIK_POSTGRESQL__PASSWORD
valueFrom:
secretKeyRef:
name: ak-pg-app
key: password
- name: AUTHENTIK_EMAIL__PASSWORD
valueFrom:
secretKeyRef:
name: authentik-secrets
key: smtp-password
# Stable TLS material for the LDAP outpost. Both server (UI/API)
# and worker (blueprint applier) read these via `!Env` in the
# ldap-outpost-cert blueprint entry, which materialises an
# authentik_crypto.certificatekeypair the LDAP providers attach
# via attrs.certificate. Issued by cert-manager — see
# ldap-outpost-cert.yaml. Both pods get it because the chart's
# global.env propagates to server AND worker; if only the worker
# had it, blueprint apply would crash on startup with KeyError.
- name: LDAP_OUTPOST_TLS_CRT
valueFrom:
secretKeyRef:
name: ldap-outpost-tls
key: tls.crt
- name: LDAP_OUTPOST_TLS_KEY
valueFrom:
secretKeyRef:
name: ldap-outpost-tls
key: tls.key
authentik:
log_level: info
error_reporting:
enabled: true
postgresql:
host: "ak-pg-rw.authentik.svc.cluster.local"
name: "authentik"
user: "authentik"
email:
host: "smtp.protonmail.ch"
port: 587
username: "olymp@renner.uno"
password: ""
use_tls: true
from: "olymp@renner.uno"
server:
resources:
requests:
cpu: 200m
memory: 1Gi
limits:
memory: 2Gi
autoscaling:
enabled: true
minReplicas: 2
maxReplicas: 4
targetCPUUtilizationPercentage: 70
metrics:
enabled: true
serviceMonitor:
enabled: true
labels:
release: kube-prometheus-stack
ingress:
enabled: true
ingressClassName: traefik
labels:
# Registered publicly (Cloudflare wildcard -> NetBird proxy); the
# UDM external-dns instance skips it, LAN uses the hairpin NAT.
dns.renner.uno/public: "true"
annotations:
cert-manager.io/cluster-issuer: letsencrypt-cluster
hosts:
- auth.renner.uno
tls:
- secretName: authentik-tls
hosts:
- auth.renner.uno
worker:
resources:
requests:
cpu: 200m
memory: 1Gi
limits:
memory: 2Gi
autoscaling:
enabled: true
minReplicas: 2
maxReplicas: 4
targetCPUUtilizationPercentage: 70
postgresql:
enabled: false
redis:
enabled: false
# Mount the homelab blueprints (K8s outpost integration, passkey
# step-up authorization) — every key of the ConfigMap is applied by
# the worker on boot and on each apply cycle. See
# blueprints-configmap.yaml.
blueprints:
configMaps:
- authentik-blueprints-k8s-outposts