todo-tree stopped triggering on docs/TASKS.md because the file was restructured (2026-07-28 backlog migration) to use plain markdown checkboxes with no literal TODO/FIXME/etc. keywords, which is all todo-tree's default config matches on. Added the documented todo-tree.regex.regex + [ ]/[x] tags configuration (see Gruntfuggly/todo-tree wiki) so it actually detects checkbox items, plus red/green highlighting for open vs done. Also cleaned up 19 stale open checkbox items left behind by that same migration - they duplicated content already tracked as individual Gitea issues (in old pre-migration detail, not the established "-> Issue #N" pointer format the rest of the file already uses), including two (Database Backup Strategy, Synapse Media PVC Backups) for issues that are actually already closed. Converted all to pointer format or removed where closed. Replaced the stale M1-M7 milestone table (contradicted its own file header - said M4 "In Progress" while the summary line above already said 0 in progress) with a pointer to the new SemVer Releases. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
24 KiB
aXion1337.Chat – Task List & Meilensteine
Last Updated: 2026-07-28
Statusübersicht: [✅ 13 Abgeschlossen] [🔄 0 In Progress] [📋 8+ Pending] [🔒 10 Security]
📊 Status Summary (Quick View)
| Kategorie | Count | Status | Details |
|---|---|---|---|
| Completed | 13 | ✅ Done | K3S, Flux, ESS, Themes, Desktop, Monitoring, TURN, Authentik (Deploy+Enrollment/Recovery/2FA), Firewall, SSH, coturn Fix, Element Call Fork, NetworkPolicies |
| In Progress | 0 | 🔄 — | — |
| Backlog | 8+ | 📋 Pending | DB Backups, PostgreSQL Migration, MAS-Template-Link, VP9-Retry |
| Security Tasks | 5 | 🔒 Pending | auditd, Kernel hardening, CrowdSec, Falco, WAF |
Priority Distribution
| Priority | Count | Timeline |
|---|---|---|
| 🔴 CRITICAL | 3 | This week |
| 🟠 HIGH | 4 | 1–2 weeks |
| 🟡 MEDIUM | 8 | ~1 month |
| 🟢 LOW | 4+ | Nice-to-have |
🗓️ Session-Zusammenfassung 2026-07-27/28 (fortlaufend aktualisiert)
Nach längerer Pause wiederaufgenommen — Mac war neu aufgesetzt, Zugriff (SSH, Kubeconfig,
age-Key, Homebrew/flux/helm/sops/age) komplett wiederhergestellt und dauerhaft in ~/.zshrc
verankert. Was in dieser Session erledigt wurde:
- Authentik Enrollment/Recovery/2FA (Issue #7 ✅ geschlossen) — siehe Phase 8 unten und
docs/troubleshooting/README.md.matrix-invitation- undmatrix-recovery-Flows waren kaputt bzw. leer, jetzt als Authentik Blueprint (apps/authentik/authentik-blueprints.yaml) deklarativ repariert. E2E mit echten Test-Usern (clark,lucky) verifiziert. - coturn-Crash behoben — Liveness-Probe nutzte
netstat(existiert nicht im Image), Server killte einen gesunden Prozess seit 88 Tagen, 36.000+ Restarts. AuftcpSocket-Probe umgestellt, läuft seitdem stabil. - Element Call Fork (Issue #8 ✅ geschlossen, Release
m6-element-call-fork-complete) — 1440p/60fps-Defaults, siehe Kapitel 4 indocs/deployment-guides/04-element-customization.md. Wichtig: erzwungenesvideo_codec: vp9hat Calls kurzzeitig live komplett kaputt gemacht (kein Bild/Ton) — sofort zurückgerollt, ohne Codec-Zwang läuft's. Root Cause dafür nicht abschließend isoliert, nur umgangen. - Identitäts-Aufräumarbeiten:
sorB's Authentik-E-Mail korrigiert (thorec@hotmail.de), MAS OIDC-Link (upstream_oauth_links) vonsorBzeigte fest auf den alten MAS-Userakadmin/@akadmin:axion1337.chat(Sub-Hash ist stabil über Username-Renames, daher blieb die Verknüpfung nach dem Rename "akadmin"→"sorB" bestehen) — umgehängt aufsorb/@sorb:axion1337.chat. Neue Identitätelbojolocoangelegt (E-Mailcfx@riot.8shield.net), verknüpft mit dem altenakadmin-MAS-User. Übrig: ein leeres, unverknüpftes@bojeledoggo:axion1337.chat-Konto (Tippfehler-Artefakt) — User räumt das selbst auf. - NetworkPolicies (Issue #10 ✅ geschlossen) — siehe "Network Security" Abschnitt unten.
Zwei Live-Incidents beim Rollout (Port-Verwechslungen), beide binnen Minuten live gepatcht
und danach committed. Nebenbei:
matrixRTC-Authorisation-Service OOM-Fix (20Mi→128Mi). - Element Call Qualität nachgeschärft — 720p-Zwischen-Simulcast-Layer ergänzt (sonst
harter Sprung von 1440p auf blockiges 360p bei kleinsten Netzwerkschwankungen), und
video_codec: h264statt VP8 (klassisches Simulcast wie VP8, kein SVC-Risiko wie bei VP9, oft hardwarebeschleunigt v.a. auf iOS). Live verifiziert: 7/8 Tracks nativ H.264, 1 sauberer VP8-Fallback. Deployed alsv0.2.3-elementcall-h264. - Backlog nach Gitea migriert — restlicher offener Backlog (VP9-Retry, ThreadNet-Web-Bug, MAS-Template-Link, WAF und 17 weitere Security-/Infra-Punkte) als Issues #11–#31 angelegt, veraltete erledigte Punkte (Authentik Stage 2/E2E-Test/Invite-Links, Hetzner-Firewall, SSH-Hardening) aus dieser Datei entfernt bzw. als done markiert.
Offene Punkte
- VP9-Retry: vermutete Ursache jetzt bekannt (LiveKit nutzt SVC für vp9/av1, Fork-Code
setzt aber immer Simulcast-Layer) — braucht einen Code-Fix in
buildPublishOptions()(src/livekit/options.ts) bevor erneut versucht wird. Stattdessen H.264 probiert (siehe unten) — läuft gut, kein SVC-Risiko, hardwarebeschleunigt auf mehr Geräten. ThreadNet-WebBuild-Bug:scripts/docker-link-repos.sh/docker-package.shnicht ausführbar committet + veraltetermatrix-js-sdk#develop-Pin im Lockfile blockiert vollständigen Neu-Build des Web-Forks. Noch nicht gefixt, User hat noch nicht final entschieden ob gewünscht.- Verwaistes
@bojeledoggo:axion1337.chat: leeres Matrix-Konto ohne OIDC-Link, User räumt das selbst auf (braucht dafür seinen eigenen Access-Token für die Admin-API). - MAS-Template-Link: 2FA/Passkey-Setup-Links direkt auf
account.axion1337.chat/account/statt nur überdocs/setup/security.html— braucht MAS Custom-Template-Override (templates.path), größerer separater Task. - Nächste Kandidaten aus den offenen Issues: #6 (DB-Backup, CRITICAL), #9 (PostgreSQL-Migration), #10 (NetworkPolicies).
🎯 Next Steps (Priorisiert)
🔴 THIS WEEK – CRITICAL
-
✅ Authentik Stage 2 abschließen
- ✅ Manual: OIDC Provider + Application in Authentik UI erstellt
- ✅ Code:
upstream_oauth2_configinmas-secret.yamleingefügt - ✅ Code:
passwords: enabled: falseaktiviert - ✅ Commit:
cdfbf7d- Enable Authentik OIDC integration in MAS - ✅ Verified: Login mit Authentik funktioniert (2026-05-15)
- Status: COMPLETE
-
✅ Hetzner Cloud Firewall – Optimierte Konfiguration
- ✅ Ingress: 80/443 + TURN/STUN + RTC Services
- ✅ SSH: Spezifische IPs (port 2248, nicht 22)
- ✅ Default-Deny für nicht-definierte Traffic
- Status: COMPLETE (optimiert über Plan)
-
✅ SSH Hardening
- ✅ PasswordAuthentication: no (key-only)
- ✅ PermitRootLogin: no (root disabled)
- ✅ MaxAuthTries: 3 (verified 2026-05-15)
- Status: COMPLETE
-
Database Backup Strategy – Decision & First Backup
- ⏳ Decision: CloudNativePG (on K3S) or Hetzner Postgres (managed)?
- ⏳ Setup: Daily automated backups
- ⏳ Setup: Off-site storage (S3 / Storage Box)
- ⏳ Setup: Monthly verified restores
- Est. Time: 2–3 days
- Priority: CRITICAL (disaster recovery)
- Status: NEXT
🟠 NEXT 1–2 WEEKS – HIGH
-
Authentik End-to-End Test
- Test: Login flow Element → MAS → Authentik → Matrix User
- Test: Password reset
- Create: Test invite links
- Est. Time: 2 hours
-
Element Call Fork
- Fork: element-hq/element-call
- Feature: Video/audio constraints parameters
- Integration: Synapse well-known config
- Est. Time: 2–3 days
-
External PostgreSQL Migration
- Decision: CloudNativePG vs. Hetzner Postgres
- Setup: HA + Replication
- Migration: Move data from ESS embedded Postgres
- Testing: Verify all services work
- Est. Time: 1–2 days
-
NetworkPolicies Deployment
- Create: Default-Deny for
matrixnamespace - Create: Allow rules (Synapse↔Postgres, MAS↔Postgres, Ingress→Web, etc.)
- Test: Ensure no service breakage
- Est. Time: 1 day
- Create: Default-Deny for
✅ Abgeschlossene Aufgaben (Chronologisch)
Phase 1: Basis-Setup
-
K3S Cluster aufsetzen – Single-Node auf Hetzner Cloud (49.13.132.245)
- Commit:
initial-setup(vor Projekt) - Status: ✅ Läuft
- Commit:
-
Flux CD Installation
- SOPS + age Encryption
- GitOps Repository konfigurieren
- Commit:
setup-flux(vor Projekt) - Status: ✅ Läuft
-
Element Server Suite v26.4.0 Deployment
- Synapse Homeserver (
matrix.axion1337.chat) - Matrix Authentication Service (
account.axion1337.chat) - Element Web (
axion1337.chat) - Element Admin (
admin.axion1337.chat) - MatrixRTC/Element Call (
mrtc.axion1337.chat) - Commit:
deploy-ess-matrix-stack - Status: ✅ Running
- Synapse Homeserver (
Phase 2: Core Features
-
7 Custom Element Web Themes
- aXion1337 Dark, Deep Purple, Discord Dark, Electric Blue, Everforest, Gruvbox, Wal
- Alphabetisch sortiert
- Commit:
add-custom-element-themes - Status: ✅ Deployed
-
Element Desktop Setup Scripts (Windows/macOS/Linux)
- Auto-Download + Install + Config
- Hosted auf
axion1337.chat/docs/setup/ - Commits:
add-element-desktop-setup-scripts,fix-element-setup-script-hosting - Status: ✅ Deployed
-
Room Policies
- Message Retention (1d–1y lifecycle)
- Room Publication Rules (allow all)
- Auto-Join Rooms für Onboarding
- Commit:
add-synapse-retention-publication-autojoin - Status: ✅ Deployed
Phase 3: WebRTC & Medienübertragung
- TURN Server (coturn) für Video-Calls
- Domain:
turn.axion1337.chat - HMAC-Auth mit Shared Secret
- Ports: 3478/udp, 3478/tcp, 5349/tcp, 49152-65535/udp
- Commit:
implement-turn-server-coturn-for-webrtc-video-calls - Status: ✅ Deployed
- Manual: DNS A-Record + Firewall-Ports öffnen (noch erforderlich)
- Domain:
Phase 4: Monitoring & Observability
- Monitoring Stack Integration
- Alloy (Grafana Agent) als Collector
- Remote Write zu Selendis (10.0.0.3:9090 Prometheus, :3100 Loki)
- kube-state-metrics, node-exporter DaemonSet
- Commits:
integrate-monitoring-alloy-prometheus-loki,fix-prometheus-remote-write-docker - Status: ✅ Deployed
Phase 5: Identity Provider (Authentik)
-
Authentik Stage 1 Deployment
- HelmRelease v2026.x in
authentiknamespace - Embedded PostgreSQL + Alloy-compatible
- Cert-Manager für TLS
- Commit:
deploy-authentik-as-identity-provider-for-matrix-stage-1 - Status: ✅ Deployed
- Manual: Admin-Passwort + OIDC Provider + Application + Enrollment Flow erstellt ✅
- HelmRelease v2026.x in
-
Authentik Stage 2 – MAS Integration
- ✅ Authentik Admin UI: OIDC Provider erstellt (Authentik)
- ✅ Authentik Admin UI: Application mit Slug
matrixerstellt - ✅ Authentik Admin UI: Enrollment Flow mit Invitation Stage konfiguriert
- ✅ Client ID + Secret kopiert
- ✅ MAS
upstream_oauth2_configmit Client Credentials aktualisiert - ✅
passwords: enabled: falseaktiviert - ✅ Commit:
cdfbf7d- Enable Authentik OIDC integration in MAS - ✅ Verified: Login mit Authentik funktioniert (2026-05-15)
- Status: ✅ Deployed & Verified
Phase 6: Dokumentation
-
Deployment Guides erstellen
- 5 Markdown-Dateien in
docs/deployment-guides/ - Chronologisch geordnet
- Troubleshooting + Best Practices
- Commit:
add-comprehensive-deployment-configuration-documentation - Status: ✅ Deployed
- 5 Markdown-Dateien in
-
Gitea Wiki erstellen
- Home.md mit Navigation
- Alle Deployment Guides in Root
- Operations + Archive Dokumentation
- Wiki Branch gepusht zu rohana.axion1337.de
- Status: ✅ Live
-
Gitea Issues & Project Board
- 8 Issues erstellt (#3-#10): 4 CRITICAL + 4 HIGH
- Priority Labels: critical, high
- Area Labels: authentik, security, database, infrastructure, element
- Status: ✅ Tracking
Phase 7: Infrastructure Security (Critical)
-
Hetzner Cloud Firewall Configuration
- SSH: Spezifische IPs (port 2248)
- HTTP/HTTPS: Any IPv4/IPv6
- TURN/STUN: WebRTC Ports
- RTC Services: SFU + Auth Ports
- Status: ✅ Optimiert & Deployed
-
SSH Hardening
- PasswordAuthentication: no (key-only)
- PermitRootLogin: no
- MaxAuthTries: 3
- Verified: 2026-05-15
- Status: ✅ Complete
🔄 In Progress / Blocked
None – Alle CRITICAL Tasks erledigt! Nächster Focus: Database Backups
Phase 8: Authentik Enrollment/Recovery/MFA Fix (2026-07-27)
- matrix-invitation Flow repariert – fehlende Write/Password/Login-Stages ergänzt, Reihenfolge korrigiert, als Authentik Blueprint (
apps/authentik/authentik-blueprints.yaml) reproduzierbar gemacht - matrix-invitation-prompt – 16 fehlerhafte
validation_policiesentfernt (crashten mitAnonymousUser/NoneType-Fehlern) - Redirect-Stage – Flow endet jetzt auf
axion1337.chatstatt in der/if/user/-Sackgasse (blockiert fürtype=external) - matrix-recovery Flow gebaut – war komplett leer (0 Stages); Passwort-Reset funktioniert jetzt, verlinkt von der echten Login-Seite
- Brand.default_application gesetzt – behebt mehrere Dead-Ends, wenn eingeloggte User
/ohne Ziel aufrufen - 2FA/Passkey Selbst-Einrichtung – Links zu
default-authenticator-totp-setup/-webauthn-setup(2FA bleibt optional,not_configured_action=skip), dokumentiert unteraxion1337.chat/docs/setup/security.html - Backlog: → Issue #13 (MAS Custom-Template-Override für 2FA/Passkey-Link auf
account.axion1337.chat/account/)
📋 Backlog (Weitere Aufgaben)
Ab 2026-07-28 in Gitea-Issues gepflegt statt hier (eine Quelle der Wahrheit) — offene Issues: #6 DB-Backup-Strategie, #9 Externe PostgreSQL-Migration, #11–#31 (VP9-Retry, ThreadNet-Web-Build-Bug, MAS-Template-Link, WAF, Media-PVC-Backups, Pod Security Admission, Federation-Allowlist, Mjolnir/Draupnir, Content-Scanner, External-Secrets, Renovate/Trivy, Security-Advisory-Monitoring, automountServiceAccountToken, unattended-upgrades, K3s-API-Security, auditd, Kernel-Hardening, Lynis, CrowdSec, Falco). Die detaillierten Beschreibungen unten sind das historische Original, aus dem die Issues entstanden sind — nicht mehr getrennt pflegen, stattdessen die Issues aktuell halten.
Element Call Enhancement
- Element Call Fork für Custom Constraints (2026-07-28, Closes #8)
- Fork:
rohana.axion1337.de/sorb/threadnet-call(basiert aufemmick4/element-call:livekit, das den noch nicht gemergten Upstream-PR element-hq/element-call#3736 enthält — config-drivenmedia_quality, keine Custom-Logik nötig) - Defaults angehoben: Video bis 1440p/60fps (~8 Mbps), Screen-Share 1440p/30fps (~6 Mbps). Das sind Startwerte, keine harten Limits — Nutzer können in den Settings weiter hochdrehen.
- Incident (2026-07-28): Erster Deploy (
v0.2.0, mitvideo_codec: vp9erzwungen) hat Calls komplett kaputt gemacht (kein Bild/Ton), obwohl LiveKit-Server-Logs den Codec-Regression-Fallback auf VP8 als erfolgreich zeigten — Root Cause nicht abschließend isoliert. Sofort aufv0.1.0zurückgerollt, dannv0.2.1ohne erzwungenen Codec (Standard VP8) mit denselben 1440p/60fps-Werten deployed und vom Nutzer live bestätigt: funktioniert. VP9-Präferenz vorerst fallengelassen, siehe Backlog. - Rauschunterdrückung: nur clientseitige WebRTC-Standardtoggles (echoCancellation/ noiseSuppression/autoGainControl), kommt kostenlos mit derselben PR. Bewusst kein server-seitiges ML-Noise-Cancellation (LiveKit Agents + DTLN/RNNoise) — laut LiveKits eigener Doku ist das für Mensch-zu-Mensch-Calls der falsche Ansatz (nur für AI-Voice-Agents gedacht, kein Standard-Pfad um bereinigtes Audio an andere Teilnehmer zurückzugeben).
- Well-Known/
org.matrix.msc4143.rtc_foci-Delegation war schon vom ESS-Chart korrekt automatisch konfiguriert — kein Handlungsbedarf trotz anderslautendem Issue-Text. - Deployment-Ansatz geändert:
sorb/ThreadNet-Web(der Element-Web-Fork) hat einen vorbestehenden, unabhängigen Build-Bug (siehe unten) und ließ sich nicht komplett neu bauen. Stattdessen: nur der/app/widgets/element-call/-Ordner im bereits laufendenthreadnet-web:v0.1.0-Image ausgetauscht → neues Imagerohana.axion1337.de/sorb/threadnet-web:v0.2.0-elementcall-mediaquality. - Verifiziert:
media_qualitylive aufaxion1337.chat/widgets/element-call/config.json. - Gefunden, nicht gefixt:
ThreadNet-Weblässt sich aktuell nicht komplett neu bauen —scripts/docker-link-repos.sh/docker-package.shsind im Repo nicht ausführbar committet (Mode 644 statt 755), UND der gepinntematrix-js-sdk#develop-Commit im Lockfile ist zu alt (fehltsrc/oidc/authorize.ts, dasapps/webimportiert). Beides unabhängig von diesem Fix, blockiert aber jeden zukünftigen vollständigen Rebuild. - Backlog: MAL-basierte Noise-Cancellation (LiveKit Agents + self-hosted DTLN/RNNoise) als experimentelle Idee, falls später gewünscht — kein etablierter Pfad für Conferencing.
- Backlog: VP9-Codec-Präferenz erneut versuchen, sobald PR #3736 upstream gemerged/gereift ist oder Root Cause des Ausfalls isoliert wurde (Browser-Konsolen-Repro nötig).
- Fork:
Database Hardening
- External/Dedizierte PostgreSQL-Migration → Issue #9
(Database Backup Strategy und Synapse Media PVC Backups waren hier ursprünglich als eigene Punkte gelistet - beide erledigt und geschlossen, siehe #6 und #15, Details in 00-TASKS Wiki bzw. Release v0.16.0.)
Network Security
-
NetworkPolicies – K8s-Layer Segmentation (2026-07-28, Closes #10)
- Default-Deny Ingress (egress left untouched) für
matrixUNDauthentiknamespaces, per-Komponente Allow-Regeln inapps/authentik/networkpolicy.yamlundapps/production/networkpolicy.yaml. Rollout: authentik zuerst als Pilot, dann matrix. - Empirisch verifiziert, dass K3s' eingebauter NetworkPolicy-Controller tatsächlich durchsetzt (Testnamespace, Timeout- statt Refused-Verhalten unter Deny-Policy).
- Zwei Live-Incidents beim Rollout, beide binnen Minuten behoben:
authentik-server: Regel erlaubte Service-Port 80/443, aber NetworkPolicy filtert auf dem tatsächlichen Container-Port (9000/9443 nach kube-proxy-DNAT) — 502 aufauth.axion1337.chat, sofort korrigiert.matrix-authentication-service: Regel erlaubte Synapse nur auf Port 8081, aber Synapse ruft/oauth2/introspecttatsächlich auf Port 8080 — jede authentifizierte Anfrage (inkl./sync) scheiterte mit 503, alle Clients zeigten "Verbindung unterbrochen". Live gepatcht, dann committed.
- Lehre für zukünftige NetworkPolicies in diesem Repo: wo immer ein Service benannte
Ports (
targetPort: <name>) nutzt, diese direkt in der Policy referenzieren statt Portnummern zu raten — schließt genau diese Fehlerklasse aus. - Nebenbefund (unabhängig von NetworkPolicies):
matrixRTC-Authorisation-Service hatte ein 20Mi-Memory-Limit (Chart-Default), OOM-gekillt nach ~74 Tagen Uptime während der Verifikations-Calls — auf 64Mi/128Mi angehoben. coturn(hostNetwork) bewusst ausgenommen — NetworkPolicy greift dort nicht.authentik-postgresql's Bitnami-Chart-Policy (Port 5432, quelloffen) bewusst nicht angefasst/dupliziert, da Helm-verwaltet.
- Default-Deny Ingress (egress left untouched) für
-
Pod Security Admission (Restricted) → Issue #16
Federation & Access Control
- Federation-Allowlist oder Closed Federation → Issue #17
Moderation & Anti-Abuse
Secrets Management
- External-Secrets Operator vs. SOPS-Setup → Issue #20
Image & Dependency Management
- Renovate/Dependabot Setup → Issue #21
- Trivy Image Scanning → Issue #31
- Security Advisory Monitoring (ESS/Element) → Issue #22
Container Security
- automountServiceAccountToken deaktivieren wo nicht benötigt → Issue #23
🔒 Security Hardening (Host & Cluster Level)
Host OS Layer (Ubuntu/Debian)
-
Hetzner Cloud Firewall – Default-Deny inbound, siehe "Phase 7" oben. Done.
-
SSH Hardening – Key-only, Root-Login disabled, Port 2248, siehe "Phase 7" oben. Done.
-
unattended-upgrades → Issue #24
-
K3s API Security Hardening → Issue #25
-
auditd (File Integrity & Syscall Audit) → Issue #26
-
Kernel Hardening (sysctl) → Issue #27
-
Lynis Security Baseline → Issue #28
Cluster Layer (K3S / Kubernetes)
🎯 Versionierung
Seit 2026-07-28 SemVer statt der alten m1-m7-Meilensteine - siehe Releases für die volle, detaillierte Historie (aktuell bis v0.17.0) und 00-TASKS im Wiki für die Konvention (MINOR = neue Fähigkeit, PATCH = Fix/Tuning/Doku).
📊 Prioritäts-Kategorien
🔴 CRITICAL (do immediately)
- Hetzner Cloud Firewall setup
- Database backup strategy
- SSH hardening
🟠 HIGH (do within 1–2 weeks)
- Authentik Stage 2 completion
- External PostgreSQL migration
- NetworkPolicies
- Element Call fork
🟡 MEDIUM (do within 1 month)
- CrowdSec + Falco
- Mjolnir bot
- Renovate/Trivy
- PSA restricted mode
- Kernel hardening
🟢 LOW (nice-to-have, do if time allows)
- Content scanner (ClamAV)
- External-Secrets upgrade
- SSH port relocation
- Advanced federation rules
📝 Notes & Decision Points
Authentik Stage 2 Blocker
⏳ Waiting for: User to manually configure Authentik OIDC Provider in Authentik Admin UI.
- Once done, provide Client ID + Secret
- Then: Commit Stage 2 MAS config
Database: CloudNativePG vs. Hetzner Postgres
- CloudNativePG: Open-source, runs on K3S, full control
- Hetzner Postgres: Managed, backups included, less ops overhead
- Decision: Recommend CloudNativePG for now (cost-effective), migrate to Hetzner later if operational overhead too high
Federation: Allowlist vs. Closed?
- Allowlist: Default federation with all public servers, can be attacked
- Closed: Only federate with trusted servers (higher security, lower interop)
- Decision: Depends on user intent. For now: allow all, add Mjolnir for abuse protection
Security Framework
- Layers: Perimeter (Firewall) → Host (SSH, auditd, hardening) → Cluster (NetworkPolicies, PSA, Falco) → App (Rate-limits, Mjolnir)
- Approach: Implement incrementally, test after each layer
🔗 Related Documentation
docs/deployment-guides/README.md– Overviewdocs/deployment-guides/01-turn-server-setup.md– TURNdocs/deployment-guides/02-authentik-identity-provider.md– Authentik (Stage 1 + Stage 2 plan)docs/deployment-guides/03-monitoring-integration.md– Monitoringdocs/deployment-guides/04-element-customization.md– Themes, Desktopdocs/deployment-guides/05-room-policies.md– Policies
Last Updated: 2026-05-14
Next Review: 2026-05-21