wiki: taegliche Pruefung auf Nutzer ohne Gruppe (#0103)

Letztes offenes Abnahmekriterium des Issues: Der Fall 'angemeldet, aber ohne
Gruppe' muss erkennbar sein. Bei @apo fiel er erst auf, weil er sich beschwerte -
Wiki.js meldet diesen Zustand nirgends.

Taegliche Stichprobe auf der Datenbank statt Instrumentierung des Logins: Ein
Patch am Anmeldeweg waere dafuer unverhaeltnismaessig, und ein Tag Verzug ist
hinnehmbar - vorher lag der Fall tagelang unbemerkt. Ausgabe geht ueber Alloy
nach Loki, Suchbegriff 'Wiki-Nutzer ohne Gruppe'.

Der Pod bekommt eine eigene NetworkPolicy-Regel. Ohne sie kaeme er nicht an die
Datenbank, und zwar lautlos - die Datenbank laesst nur wikijs und wikijs-backup
zu (AGENTS.md: jeder neue Pod braucht seine eigene Regel).

Das Skript prueft zuerst, ob die Datenbank ueberhaupt antwortet. Ohne diese
Gegenprobe saehe 'keine Nutzer ohne Gruppe' bei unerreichbarer DB genauso aus wie
ein sauberes Ergebnis - stiller Erfolg ist hier das groessere Risiko als ein Fund.

Beide Zweige gegen die laufende Datenbank getestet, lesend: der gute Fall meldet
'OK (4 geprueft)', der Warn-Zweig nennt die Betroffenen und den Behebungsweg.
This commit is contained in:
Thore Cimbal
2026-08-20 12:00:00 +00:00
parent 803c444885
commit 0f24fe8a54
3 changed files with 101 additions and 0 deletions
+1
View File
@@ -65,6 +65,7 @@ resources:
- wiki-ingress.yaml
- wikijs-config.yaml # Konfig-Job (headless Setup + OIDC + Rollen)
- wikijs-postgres-backup.yaml # Nächtliches Borg-Backup der Wiki-DB (#0048)
- wikijs-gruppenpruefung.yaml # Tägliche Prüfung auf Nutzer ohne Gruppe (#0103)
# Synapse-Modul als eigene Datei gepflegt (lintbar/testbar), aber als ConfigMap gemounted -
# disableNameSuffixHash, da der Name in synapse-values.yaml's eingebettetem values.yaml
+4
View File
@@ -405,6 +405,10 @@ spec:
- podSelector:
matchLabels:
app.kubernetes.io/name: wikijs-backup
# Tägliche Gruppenprüfung (wikijs-gruppenpruefung.yaml, #0103) liest nur.
- podSelector:
matchLabels:
app.kubernetes.io/name: wikijs-gruppenpruefung
ports:
- protocol: TCP
port: postgres
@@ -0,0 +1,96 @@
# Taegliche Pruefung: Gibt es Wiki-Nutzer ohne Gruppe? (management #0103)
#
# Der Fall, den dieses Issue ausgeloest hat: @apo meldete sich erfolgreich an, landete in
# keiner Gruppe und sah deshalb nichts - ohne Fehlermeldung, ohne Logzeile, ohne Zaehler.
# Aufgefallen ist es erst, weil er sich beschwerte. Das Auto-Enrollment verhindert den Fall
# jetzt; diese Pruefung stellt sicher, dass ein erneutes Versagen NICHT wieder auf eine
# Beschwerde angewiesen ist (Abnahmekriterium des Issues).
#
# Bewusst eine taegliche Stichprobe auf der Datenbank statt einer Instrumentierung des
# Logins: Wiki.js meldet den Zustand "angemeldet, aber ohne Gruppe" nirgends, und ein
# Patch am Anmeldeweg waere fuer diesen Zweck unverhaeltnismaessig. Ein Tag Verzug ist
# hinnehmbar - der Fall lag vorher Tage unbemerkt.
#
# Die Ausgabe geht nach stdout und damit ueber Alloy nach Loki. Suchbegriff fuer eine
# Abfrage oder ein Panel: "Wiki-Nutzer ohne Gruppe".
apiVersion: batch/v1
kind: CronJob
metadata:
name: wikijs-gruppenpruefung
namespace: matrix
spec:
schedule: "15 6 * * *"
concurrencyPolicy: Forbid
successfulJobsHistoryLimit: 3
failedJobsHistoryLimit: 3
jobTemplate:
spec:
backoffLimit: 1
template:
metadata:
labels:
# Diese Marke steht auch in networkpolicy.yaml - ohne sie kaeme der Pod nicht
# an die Datenbank, und zwar lautlos.
app.kubernetes.io/name: wikijs-gruppenpruefung
app.kubernetes.io/component: pruefung
spec:
restartPolicy: Never
containers:
- name: pruefung
image: postgres:15-alpine
env:
- name: PGHOST
value: wikijs-postgres
- name: PGDATABASE
value: wiki
- name: PGUSER
valueFrom:
secretKeyRef:
name: wikijs-postgres-secret
key: username
- name: PGPASSWORD
valueFrom:
secretKeyRef:
name: wikijs-postgres-secret
key: password
command:
- /bin/sh
- -c
- |
set -eu
# Gegenprobe zuerst: Antwortet die Datenbank ueberhaupt? Ohne diese
# Zeile sieht "0 Nutzer ohne Gruppe" bei unerreichbarer DB genauso aus
# wie ein sauberes Ergebnis - stiller Erfolg ist hier das eigentliche
# Risiko, nicht der Fund.
gesamt="$(psql -Atc 'select count(*) from users;')"
if [ -z "$gesamt" ] || [ "$gesamt" -eq 0 ]; then
echo "FEHLER: keine Nutzer gelesen - Datenbank nicht erreichbar oder leer."
exit 1
fi
ohne="$(psql -Atc '
select count(*) from users u
left join "userGroups" ug on ug."userId" = u.id
where ug."userId" is null;')"
if [ "$ohne" -gt 0 ]; then
echo "WARNUNG: $ohne von $gesamt Wiki-Nutzer ohne Gruppe - sie sehen nach der Anmeldung nichts (management #0103)"
# -At mit Vorgabe-Trenner "|" statt eines eingebetteten E'\t':
# Die Anfuehrungszeichen-Verschachtelung waere die wahrscheinlichste
# Fehlerquelle in dieser Datei und traegt nichts zur Aussage bei.
psql -Atc '
select u.id, u.email from users u
left join "userGroups" ug on ug."userId" = u.id
where ug."userId" is null order by u.id;' \
| while IFS= read -r z; do echo " betroffen: $z"; done
echo "Behebung: Auto-Enrollment der OIDC-Strategy pruefen (wikijs-config.py, Gruppe wiki-anwender)."
else
echo "OK: kein Wiki-Nutzer ohne Gruppe ($gesamt geprueft)"
fi
resources:
requests:
memory: 32Mi
cpu: 10m
limits:
memory: 96Mi