Wenn in Matrix-Räumen gar nichts mehr funktioniert – keine Nachrichten mehr ankommen, das Verlassen des Raumes nicht möglich ist und stattdessen eine Fehlermeldung wie MatrixError: [403] No create event in auth events
erscheint – dann ist meistens der lokale Raum-State beschädigt.
Der Synapse-Server erkennt das „m.room.create“-Event nicht mehr und verweigert dadurch sämtliche Aktionen. Hier zeige ich, wie man solche sogenannten Zombie-Räume loswird – egal ob mit Docker betrieben oder auf einem klassischen Server installiert. Genau das ist mir mit dem Support-Raum von matrix-docker-ansible-deploy passiert. Da meine Installation in Docker-Containern läuft, können die Befehle bei anderen Setups eventuell abweichen.
In Clients wie Element werden diese Räume weiterhin als aktiv angezeigt, es kommen aber keine Nachrichten mehr an, und auch das Verlassen schlägt fehl. In den Logs findet sich dann eine Zeile wie:
MatrixError: [403] No create event in auth events
Das Problem liegt folglich nicht im Client, sondern im Synapse-Backend. Dem Server fehlt das m.room.create-Event, daher weiß er nicht mehr, dass der Raum existiert.
Um die Raum-ID zu ermitteln, gibt es verschiedene Wege – abhängig davon, ob du Server-Zugang oder nur den Client verwendest.
https://deinserver/_synapse/
) den entsprechenden Raum. Die Raum-ID findest du in der Adresszeile der URL – sie beginnt immer mit einem Ausrufezeichen, etwa !cNSQwPqhHKkIZdBnvt:devture.com
.docker exec -i matrix-synapse \ curl -sS "http://localhost:8008/_synapse/admin/v1/rooms?search_term=raumname" \ -H "Authorization: Bearer " | jq
Damit findest du die vollständige Room-ID auch ohne Client.
Die Raum-ID benötigst du für alle Befehle der Admin-API, da Synapse im Hintergrund nicht mit Aliasen (wie #meinraum:matrixbox.de
), sondern ausschließlich mit der eindeutigen Room-ID arbeitet.
Dies tritt typischerweise auf bei:
Auswirkung: Der Raum ist teilweise funktionslos. Sichtbar, aber nicht mehr nutzbar.
Am einfachsten ist die Bereinigung über die Admin-API, nicht über das Webinterface. Den erforderlichen Admin-Token findet ihr im Element-Client unter Einstellungen » Hilfe und Info (Access Token des Administrators).
Synapse läuft normalerweise im Container mit dem Namen matrix-synapse. Steigt in den Container ein und führt den Löschbefehl aus:
docker exec -i matrix-synapse \ curl -sS -X DELETE "http://localhost:8008/_synapse/admin/v2/rooms/%21cNSQwPqhHKkIZdBnvt%3Adevture.com" \ -H "Authorization: Bearer " \ -H "Content-Type: application/json" \ -d '{"purge":true,"block":true,"force_purge":true}'
Dadurch wird der Raum endgültig aus der Datenbank entfernt und gleichzeitig gesperrt, sodass kein erneuter Beitritt möglich ist. Die API gibt eine delete_id
zurück, mit der sich der Löschstatus prüfen lässt:
docker exec -i matrix-synapse \ curl -sS "http://localhost:8008/_synapse/admin/v2/rooms/delete_status/" \ -H "Authorization: Bearer "
Warte, bis der Status auf complete steht.
Im Element-Client: Einstellungen → Hilfe → Cache leeren und neu laden
Der Raum wird daraufhin aus der Übersicht entfernt.
Wenn du beim Löschen block:true gewählt hast (empfohlen), musst du die Sperre bei Bedarf manuell aufheben, bevor ein erneuter Beitritt möglich ist.
docker exec -i matrix-synapse \ curl -sS -X PUT "http://localhost:8008/_synapse/admin/v1/rooms/%21cNSQwPqhHKkIZdBnvt%3Adevture.com/block" \ -H "Authorization: Bearer " \ -H "Content-Type: application/json" \ -d '{"block": false}'
Anschließend kann der Raum wie gewohnt wieder beigetreten werden, beispielsweise so:
curl -sS -X POST \ "https://matrix.matrixbox.de/_matrix/client/v3/rooms/%21cNSQwPqhHKkIZdBnvt%3Adevture.com/join?server_name=devture.com" \ -H "Authorization: Bearer " \ -d '{}'
Damit die Admin-APIs künftig auch außerhalb des Containers erreichbar sind, sollte nginx sowohl /_matrix
als auch /_synapse
an Synapse weiterleiten:
location ~ ^/(_matrix|_synapse/client) { proxy_pass http://synapse:8008; proxy_read_timeout 600s; proxy_send_timeout 600s; proxy_request_buffering off; }
Danach einfach nginx -t && systemctl reload nginx ausführen.
Wenn Räume bei Matrix hängen bleiben, liegt das fast immer an einem fehlerhaften Raum-State auf dem Homeserver und selten am Client. Mittels Admin-API lässt sich das zuverlässig beheben – mit neueren Synapse-Versionen (ab 1.110) treten solche Probleme zudem wesentlich seltener auf.
Um einen von Cloud Native PostgreSQL (CNPG) Operator verwalteten PostgreSQL-Cluster vollständig in den Wartungsmodus zu versetzen, gibt es keine einzelne, allumfassende Funktion. Stattdessen können je nach Wartungsanforderung zwei Hauptmethoden angewendet werden: die Aktivierung eines Wartungsfensters für Knoten oder das „Fencing“ des gesamten Clusters.
Diese Methode ist ideal für geplante Wartungsarbeiten an den Kubernetes-Knoten, auf denen die PostgreSQL-Instanzen laufen. Sie informiert den Operator darüber, dass ein Knoten absichtlich außer Betrieb genommen wird, sodass der Operator keine automatischen Failover-Prozesse einleitet.
Anwendungsfall: Sie planen, die Kubernetes-Knoten zu aktualisieren oder andere Wartungsarbeiten auf der Infrastrukturebene durchzuführen.
Schritte:
kubectl patch cluster <cluster-name> -n <namespace> --type='merge' -p '{"spec":{"nodeMaintenanceWindow":{"inProgress":true,"reusePVC":true}}}'
YAML Beispiel:
apiVersion: postgresql.cnpg.io/v1 kind: Cluster metadata: name: <cluster-name> namespace: <namespace> spec: # ... andere Cluster-Spezifikationen nodeMaintenanceWindow: inProgress: true reusePVC: true # Empfohlen, um Datenverlust zu vermeiden
kubectl drain <node-name>
). Der CNPG-Operator wird die Pods auf dem Knoten geordnet herunterfahren.kubectl patch
: kubectl patch cluster <cluster-name> -n <namespace> --type='merge' -p '{"spec":{"nodeMaintenanceWindow":{"inProgress":false}}}'
„Fencing“ ist eine drastischere Maßnahme, die den PostgreSQL-Prozess auf einer oder allen Instanzen stoppt, ohne die Pods selbst zu löschen. Dies versetzt die Datenbank effektiv in einen Offline-Zustand und ist nützlich, um den gesamten Cluster für Untersuchungen oder andere kritische Eingriffe anzuhalten.
Anwendungsfall: Sie müssen den gesamten Datenbankbetrieb sofort unterbrechen, um beispielsweise ein Problem zu diagnostizieren, ohne dass der Operator versucht, den Cluster zu „reparieren“.
Schritte:
kubectl annotate
: kubectl annotate cluster <cluster-name> -n <namespace> cnpg.io/fencedInstances='["*"]'
Das ["*"]
ist ein Wildcard-Zeichen, das alle Instanzen des Clusters betrifft.
kubectl annotate cluster <cluster-name> -n <namespace> cnpg.io/fencedInstances-
Das -
am Ende des Befehls entfernt die Annotation.
kubectl cnpg
Plugin: Der CNPG-Operator verfügt über ein kubectl
-Plugin, das einige dieser Operationen vereinfachen kann. Zum Beispiel kann der Befehl kubectl cnpg maintenance
verwendet werden, um das nodeMaintenanceWindow
zu setzen.
Zusammenfassend lässt sich sagen, dass das nodeMaintenanceWindow
für geplante Infrastrukturwartungen gedacht ist, während das Fencing des gesamten Clusters die beste Methode ist, um den Datenbankbetrieb vollständig und sofort zu stoppen.
Das Erstellen aussagekräftiger und prägnanter Commit-Nachrichten ist ein wesentlicher Bestandteil eines guten Entwicklungsworkflows. Diese Nachrichten helfen dabei, Änderungen zu verfolgen, den Projektverlauf zu verstehen und mit Teammitgliedern zusammenzuarbeiten. Zugegeben: Das Schreiben von Commit-Nachrichten kann manchmal eine banale Aufgabe sein. In diesem Artikel zeigen ich Dir, wie Du mit ChatGPT von OpenAI automatisch Git-Commit-Nachrichten generieren lassen kannst.
#!/bin/bash check_git_repo() { if ! git rev-parse --is-inside-work-tree >/dev/null 2>&1; then exit 1 fi } check_changes() { if [ -z "$(git status --porcelain)" ]; then exit 0 fi } generate_commit_message() { local diff_content=$(git diff --cached) local files_changed=$(git status --porcelain) echo -e "Files changed:\n$files_changed\n\nChanges:\n$diff_content" | \ llm -m anthropic/claude-3-5-sonnet-latest \ "Generate a git commit message for these changes. The message must have: 1. TITLE LINE: A specific, concise summary (max 50 chars) begin without special characters that clearly describes the primary change or feature. This should not be generic like 'Update files' but rather describe the actual change like 'Add user authentication to API endpoints' 2. BLANK LINE 3. DETAILED DESCRIPTION: A thorough explanation including: - What changes were made - Why they were necessary - Any important technical details - Breaking changes or important notes Wrap this at 72 chars. IMPORTANT: - Output ONLY the commit message - Make sure the title is specific to these changes - Focus on the what and why, not just the how" } # Main execution main() { check_git_repo check_changes git add --all commit_message=$(generate_commit_message) git commit -m "$commit_message" } main "$@"
check_git_repo() { if ! git rev-parse --is-inside-work-tree >/dev/null 2>&1; then exit 1 fi }
Diese Funktion stellt sicher, dass wir in einem Git-Repository arbeiten.
check_changes() { if [ -z "$(git status --porcelain)" ]; then exit 0 fi }
Überprüft, ob tatsächlich Änderungen zum Festschreiben vorhanden sind.
generate_commit_message() { local diff_content=$(git diff --cached) local files_changed=$(git status --porcelain) echo -e "Files changed:\n$files_changed\n\nChanges:\n$diff_content" | \ llm -m anthropic/claude-3-5-sonnet-latest \ "Generate a git commit message for these changes. The message must have: 1. TITLE LINE: A specific, concise summary (max 50 chars) that clearly describes the primary change or feature. This should not be generic like 'Update files' but rather describe the actual change like 'Add user authentication to API endpoints' 2. BLANK LINE 3. DETAILED DESCRIPTION: A thorough explanation including: - What changes were made - Why they were necessary - Any important technical details - Breaking changes or important notes Wrap this at 72 chars. IMPORTANT: - Output ONLY the commit message - Make sure the title is specific to these changes - Focus on the what and why, not just the how" }
Hier geschieht die Magie – das Skript analysiert Deine Änderungen und verwendet KI, um eine aussagekräftige Commit-Nachricht zu generieren.
Das Skript verwendet Simon Willisons Kommandozeilentool llm , ein äußerst nützliches Dienstprogramm für die Interaktion mit verschiedenen KI-Modellen direkt von Deinem Terminal aus. Weitere Informationen dazu, wie Du es einrichtest und tatsächlich verwendest, findest Du in seiner Dokumentation.
Bitte beachte, dass ich in diesem Skript das Modell von Anthropic verwende. Das bedeutet, dass Du das Plugin „llm-anthropic“ einrichten musst.
Um das Skript am Ende auch auszuführen zu können, erstellst Du einfach eine ausführbare Commit-Datei und fügst diese in Dein Bin-Verzeichnis hinzu, sodass sie in Deinem PATH landet.
Vergiss nicht:
chmod +x ~/.local/bin/commit
um das Skript ausführbar zu machen. Ändere einfach den Pfad zum Skript, je nachdem, wo Du es speichern möchtest.
Nachdem Du hart an Deinem Code gearbeitet hast, musst Du ihn nur noch `commit` ausführen und erhälst eine von der KI generierte Commit-Nachricht.
This page has been accessed for: Today: 1 / Yesterday: 1 Until now: 408