docs(adr): ADR-0021 - federation closed, and why the tighter option was wrong
sorb chose C, fully disabling federation at the edge. Building it showed that would have killed group calls: lk-jwt-service verifies OpenID tokens through /_matrix/federation/v1/openid/userinfo and reaches it over the public name, so a path block on /_matrix/federation is the mrtc outage again with a different cause. C was dropped and B implemented. The ADR records the measurement the decision rests on - zero destinations, zero remote users, zero rooms with outside participation in four months - and the trap, so nobody completes C later as a quick follow-up. Doing that safely means binding the auth service to Synapse in-cluster first, which is its own undertaking with a call acceptance. Also recorded because it nearly slipped through: Flux applied the ConfigMap while Synapse kept running its old config from 2026-08-01. The config is rendered at pod start, so the change was inert until a restart - the same class as #0044. Verified afterwards inside the running process rather than in the ConfigMap, with the client API and the OpenID endpoint still answering.
This commit is contained in:
@@ -79,3 +79,53 @@ nur, ob das Raumverzeichnis über Föderation sichtbar ist, und ist unabhängig
|
||||
Grundsatzfrage.
|
||||
|
||||
**Entscheidung sorb steht aus.**
|
||||
|
||||
## Entscheidung und Umsetzung 2026-08-19
|
||||
|
||||
**sorb: erst C, dann C verworfen — B umgesetzt.** Beim Bauen von C zeigte sich, dass
|
||||
ein Pfad-Block die Gruppen-Calls zerstört hätte: `lk-jwt-service` prüft OpenID-Tokens
|
||||
über `/_matrix/federation/v1/openid/userinfo` und ruft ihn über den **öffentlichen**
|
||||
Namen auf (keine `hostAliases`, `dnsPolicy: ClusterFirst`), also über Traefik. Ein
|
||||
Block auf `/_matrix/federation/` hätte denselben Ausfall erzeugt wie der gelöschte
|
||||
`mrtc`-Record. Festgehalten als [ADR-0021](../adr/0021-foederation-geschlossen.md),
|
||||
inklusive der Begründung, warum C nicht nachträglich „noch schnell" nachgeholt werden
|
||||
sollte.
|
||||
|
||||
`federation_domain_whitelist: []` steht in
|
||||
`gitops:apps/production/custom-configs/synapse-values.yaml` (Commit `3935f35`).
|
||||
|
||||
**Zwei Fallen beim Umsetzen, beide vor dem Ausrollen bemerkt:**
|
||||
|
||||
1. Der erste Einschub **zerschnitt den `auto_join`-Block** — `auto_join_rooms_for_guests`
|
||||
landete unter `federation`. Nach dem Zusammenführen der Fragmente funktional
|
||||
identisch, zu lesen falsch; korrigiert, der Diff ist jetzt 20 Zeilen Zugewinn und
|
||||
nichts Verschobenes.
|
||||
2. **Flux hat angewandt, Synapse lief weiter mit der alten Konfiguration.** Die
|
||||
ConfigMap trug die Zeile, der laufende Pod nicht — er stammte vom 2026-08-01. Die
|
||||
Konfiguration wird beim Pod-Start gerendert; ohne Neustart ist die Änderung
|
||||
wirkungslos. Dieselbe Klasse wie #0044. Neustart per
|
||||
`rollout restart statefulset/matrix-stack-synapse-main` angestoßen.
|
||||
|
||||
**Zur Hetzner-Port-Sperre:** Sie kann diese Trennung nicht leisten. 8448 ist bereits zu,
|
||||
und die Delegation führt die Föderation über **443** — denselben Port wie alle Clients.
|
||||
Die Synapse-Konfiguration ist die einzige Stelle, an der Föderation und Client-Verkehr
|
||||
überhaupt trennbar sind.
|
||||
|
||||
### Abnahme nach dem Neustart (2026-08-19, Synapse-Start 11:13 UTC)
|
||||
|
||||
| Prüfung | Ergebnis |
|
||||
|---|---|
|
||||
| `federation_domain_whitelist: []` **im laufenden Prozess** (nicht nur in der ConfigMap) | ✅ vorhanden |
|
||||
| `/_matrix/federation/v1/openid/userinfo` — die Element-Call-Abhängigkeit | ✅ HTTP 401 (bedient, verlangt Token) |
|
||||
| `/_matrix/client/versions` — Client-Verkehr | ✅ HTTP 200 |
|
||||
| `/_matrix/federation/v1/version` | HTTP 200 — **erwartet** |
|
||||
|
||||
Der letzte Punkt ist kein Mangel, sondern die bewusste Grenze von Option B: Die
|
||||
Endpunkte antworten weiterhin, der Server ist **unbeteiligt, nicht unsichtbar**. Was
|
||||
sich geändert hat, ist nicht die Sichtbarkeit, sondern dass Synapse mit keinem fremden
|
||||
Server mehr Ereignisse austauscht.
|
||||
|
||||
**Noch offen: die Abnahme im echten Gruppen-Call.** `curl` belegt, dass der
|
||||
OpenID-Endpunkt antwortet — nicht, dass die vollständige Token-Prüfung durchläuft. Für
|
||||
Änderungen im Call-Pfad gilt hier die Regel aus #0054: Abnahme im echten Call ist
|
||||
Rollout-Voraussetzung, nicht Nacharbeit.
|
||||
|
||||
Reference in New Issue
Block a user