DecaTec

Home-Server | Linux | Nextcloud | Raspberry Pi | Programmierung | Fotografie

Matrix Synapse: Backups erstellen und wiederherstellen – manuell oder per Skript

Matrix Logo

In einem der letzten Artikel ging es um die Installation eines Matrix Synapse Servers auf Ubuntu Server 20.04. Wer hier einen eigenen Server betreibt, sollte sich natürlich auch um das Thema Backups kümmern.

Hier im Blog gab es ja bereits einige Artikel, wie man verschiedene System auf einfache Art und Weise per Bash-Skript sichern und wiederherstellen kann (z.B. Nextcloud oder auch WordPress). Dieser Artikel soll daher nun eine passende Lösung für Matrix Synapse zeigen. Wer die eingangs erwähnten Backup-/Restore-Lösungen kennt, wird sich hier auf Anhieb zurecht finden. Ziel ist es diesmal, eine komplette Matrix Synapse Instanz mit geringem Aufwand sichern und auch wiederherstellen zu können.

Voraussetzungen

Als Grundlage dient ein Matrix Synapse Instanz, die auf einem Ubuntu Server 20.04 LTS installiert ist. Als Webserver dient hier nginx, als Datenbank kommt PostgreSQL zum Einsatz.
Eine beispielhafte Konfiguration wurde bereits im Artikel Matrix Synapse auf Ubuntu Server 20.04 LTS mit nginx, PostgreSQL und Let’s Encrypt gezeigt.

Allerdings lassen sich die gezeigten Schritte auch auf andere Umgebungen (andere Distributionen, andere Webserver, etc.) anwenden.

Grundsätzliches Vorgehen

Ein Backup von Matrix Synapse besteht immer aus folgenden Teilen:

  • Das Installationsverzeichnis von Matrix Synapse (normalerweise /etc/matrix-synapse). Hier ist u.a. die Konfigurations-Datei homeserver.yaml wichtig.
  • Das Lib-Verzeichnis von Matrix Synapse (normalerweise /var/lib/matrix-synapse); hier werden die Chat-Medien gespeichert.
  • Die Datenbank für Matrix Synapse; in diesem Artikel PostgreSQL, alternativ SQLite.

Sollen Backups der Instanz angefertigt werden, müssen immer diese drei Teile berücksichtigt werden.

Wichtig ist hier auch das Ziel des Backups: Dies kann z.B. ein NFS- oder Samba-Share, oder auch eine externe Festplatte sein.
Wichtig ist in diesem Zusammenhang nur, dass das Backup selbst vom Produktivsystem getrennt ist und nicht auf der gleichen Maschine gespeichert wird. Ansonsten sind im Worst-Case sowohl die Matrix Instanz, als auch die Backups von einem System-Crash betroffen.

Ich gehe in diesem Artikel von einem NFS-Share aus, welches auf dem lokalen Server unter /mnt/MatrixBackup gemountet ist.

Backup erstellen

Zum Erstellen des Backups wird der Service für Matrix Synapse zunächst einmal gestoppt, damit am Server keine Aktivitäten mehr stattfinden:

service matrix-synapse stop

Anschließend wird das Installations-Verzeichnis gesichert (Wichtig: den Punkt am Ende des Befehls beachten):

tar -cpzf /mnt/MatrixBackup/matrix-installdir_`date +"%Y%m%d"`.tar.gz -C /etc/matrix-synapse .

Ähnlich wird nun mit dem Lib-Verzeichnis vorgegangen:

tar -cpzf /mnt/MatrixBackup/matrix-libdir_`date +"%Y%m%d"`.tar.gz  -C /var/lib/matrix-synapse .

Nun fehlt nur noch die Datenbank. Hier ist zu unterscheiden, ob PostgreSQL oder SQLite zum Einsatz kommt.

Für die empfohlene Datenbank PostgreSQL sieht der Befehl zum Backup folgendermaßen aus:

PGPASSWORD="dbpassword" pg_dump "matrix_db_name" -h localhost -U "matrix_db_user" -f /mnt/MatrixBackup/matrix_db_`date +"%Y%m%d"`.sql

Die Werte für dbpassword (Passwort des Matrix Datenbank-Users), matrix_db_name (Name der Matrix-Datenbank) und matrix_db_user (Benutzername des Matrix Datenbank-Users) sind hier natürlich auf die jeweilige Instanz anzupassen.

Wenn SQLite als Datenbank verwendet wird, reicht es hier die entsprechende Datei zu kopieren. Im Normalfall ist diese Datei innerhalb des Lib-Verzeichnisses von Matrix Synapse zu finden. Da dieses Verzeichnis bereits Teil des Backups ist, ist hier nichts weiter zu tun. Nur wenn die SQLite-Datenbank an einem anderen Ort gespeichert wurde, muss diese noch zum Backup kopiert werden, z.B.:

cp /var/matrix-db/homeserver.db /mnt/MatrixBackup/homeserver_`date +"%Y%m%d"`.db

Damit ist das Backup bereits abgeschlossen und die Instanz kann wieder gestartet werden:

service matrix-synapse start

Backup wiederherstellen

Aus einem so erstellten Backup lässt sich Matrix Synapse auch recht einfach wiederherstellen.

Dazu wird zunächst einmal wieder die Instanz gestoppt:

service matrix-synapse stop

Anschließend wird das Installations-Verzeichnis und das Lib-Verzeichnis entfernt und gleich wieder neu angelegt

rm -r /etc/matrix-synapse
rm -r /var/lib/matrix-synapse
mkdir -p /etc/matrix-synapse
mkdir -p /var/lib/matrix-synapse

Die Inhalte der Verzeichnisse werden dann aus dem Backup wieder hergestellt (abhängig vom Backup-Datum):

tar -xpzf /mnt/MatrixBackup/matrix-installdir_20210404.tar.gz -C /etc/matrix-synapse
tar -xpzf /mnt/MatrixBackup/matrix-libdir_20210404.tar.gz -C /var/lib/matrix-synapse

Nun werden noch Berechtigungen gesetzt. matrix-synapse ist hier der User, unter dem Matrix Synapse läuft:

chown -R matrix-synapse /etc/matrix-synapse/homeserver.signing.key
chown -R matrix-synapse /var/lib/matrix-synapse

Nun fehlt nur noch die Wiederherstellung der Datenbank. Hier muss wieder zwischen PostgreSQL und SQLite unterschieden werden.

Für PostgreSQL wird die alte Datenbank zunächst entfernt und anschließend der Datenbank-Dump aus dem Backup wieder eingespielt:

sudo -u postgres psql -c "DROP DATABASE synapse_db;"
sudo -u postgres psql -c "CREATE DATABASE synapse_db ENCODING 'UTF8' LC_COLLATE='C' LC_CTYPE='C' template=template0 OWNER synapse_db_user;"
sudo -u postgres psql synapse_db < /mnt/MatrixBackup/matrix_db_20210404.sql

Hier müssen natürlich die Daten entsprechend angepasst werden (Datenbank-Name, Datenbank-User, etc.). Wichtig ist hier nur, dass sich diese Daten nicht von der ursprünglichen Installation unterscheiden.

Bei SQLite reicht es aus, die Datenbank-Datei wiederherzustellen. Wie schon beim Backup erwähnt, ist die SQLite-Datei normalerweise im Lib-Verzeichnis vom Matrix Synapse gespeichert, so dass die Datei bereits beim Wiederherstellen des Lib-Verzeichnisses wiederhergestellt wurde.
Folgender Befehl ist daher nur beispielhaft für ein abweichendes Verzeichnis für die SQLite-DB aufgeführt:

cp /mnt/MatrixBackup/homeserver_20210404.db /var/matrix-db/homeserver.db

Hier müssen dann lediglich die Rechte angepasst werden:

chown -R matrix-synapse:nogroup /var/lib/matrix-synapse/homeserver.db

Am Ende wird Matrix Synapse wieder gestartet:

service matrix-synapse start

Damit ist das Wiederherstellen des Backups bereits abgeschlossen.

Backup/Restore mit Bash-Skript

Ein Backup oder Restore kann jederzeit durch die o.g. Befehle manuell angelegt/wiederhergestellt werden.
Um den Komfort zu erhöhen und solche Backups auch automatisiert angelegen zu können, empfiehlt es sich allerdings, diese Schritte in einem Bash-Skript zusammen zu fassen.

Zu diesem Zweck habe ich auf Codeberg entsprechende Skripte bereit gestellt:

Matrix-Synapse-Backup-Restore@Codeberg

Hinweis: Diese Skripte werden als Open Source (MIT Lizenz) bereit gestellt. Somit sind diese frei verfügbar und können auch von jedermann angepasst und verbessert werden. Ich übernehme allerdings keinerlei Haftung für den Einsatz dieser Skripte. Diese sollen lediglich als Basis für die Erstellung eigener Backup-Skripte für eure Matrix Synapse Instanz dienen.

Die Skripte sollten zunächst einmal herunter geladen werden. Dazu bemühen wir einfach git. Dies sollte mit Root-Rechten erfolgen, da die Skripte ebenfalls mit Root-Rechten ausgeführt werden müssen.

sudo -s
git clone https://codeberg.org/DecaTec/Matrix-Synapse-Backup-Restore.git
cd Matrix-Synapse-Backup-Restore

Wichtig: Bitte führt diese Skripte niemals ohne vorherige Bearbeitung/Kontrolle auf eurem System aus. Diese müssen auf jeden Fall vor der ersten Ausführung angepasst werden! In den Skripten sind alle Stellen, die individuell an eure Instanz angepasst werden müssen, mit „TODO“ gekennzeichnet.

Wenn ihr die Skripte also angepasst habt, müssen diese vor der Ausführung noch als ausführbar markiert werden:

chmod +x MatrixSynapseBackup.sh
chmod +x MatrixSynapseRestore.sh

Die Ausführung gestaltet sich nun sehr einfach:

./MatrixSynapseBackup.sh

Das Backup wird automatisch im entsprechenden Verzeichnis, welches im Backup-Skript angegeben wurde, gespeichert (z.B. /media/hdd/matrix_backup/20210323_083952).

Wiederhergestellt werden kann ein Backup durch das Restore-Skript. Dieses erwartet den Zeitstempel eines vorhandenen Backups als Parameter:

./MatrixSynapseRestore.sh 20210323_083952

Da die Skripte keine Benutzereingaben erfordern, kann das Backup-Skript auch einfach per Cron regelmäßig aufgerufen werden (z.B. jede Nacht).

Für weitere Informationen zu den Skripten bitte auch die Readme aus dem Projekt beachten.

Fazit

Der Artikel hat gezeigt, wie ihr einfach Backup eurer Matrix Synapse Instanz anfertigen und auch wiederherstellen könnt. Durch die Bash-Skripte kann diese Aufgabe auch einfach automatisiert werden.

Noch ein wichtiger Tipp zum Schluss: Backups anfertigen ist schon mal eine gute Sache. Wichtiger ist in diesem Zusammenhang allerdings, dass vorhandene Backups auch zuverlässig wiederhergestellt werden können. Daher ist es auf jeden Fall empfehlenswert, dass vor dem produktiven Einsatz auch die Wiederherstellung aus einem Backup getestet wird.

Weiterführende Artikel

Links

, , , , , ,

Kommentare: 6

  • Tom sagt:

    Hallo Jan,

    ja, damit wird die Sache rund ;)

    Ich frage mich noch, was deine Motivation war, auf Matrix und Selfhosting umzusteigen da ich auch davor stehe.
    Warst du mit Conversations/XMPP nicht zufrieden oder benutzest du das noch parallel ?

    LG

    • Jan sagt:

      Hi Tom,

      self-hosted, damit ich damit einfach mal Erfahrungen sammeln kann – ansonsten könnte man sich ja auf einer der öffentlichen Instanzen registrieren.
      XMPP habe ich noch nie genutzt. Von der Administration scheint dies aber etwas aufwändiger zu sein bzw. etwas komplexer zu sein.
      Der Dritte im Bunde ist dann natürlich noch RocketChat. Bei direkten Vergleich von Matrix ggü. RocketChat hat sich (für mich persönlich!) dann Matrix irgendwie durchgesetzt.

      Gruß,
      Jan

  • Marc sagt:

    Wunderbar! Hast du bereits die Spaces in Element ausprobiert? Ich kann zwar welche erstellen, aber wenn ich da auf Räume erkunden klicke steht da ‚Dein Homeserver unterstützt hierarchische Spaces nicht.‘ Hängt das mit matrix-synapse zusammen oder sollte man einfach nur auf Element updates warten?

    • Marc sagt:

      Habs schon, einfach in der homeserver.yaml
      „`
      experimental_features:
      spaces_enabled: true
      „`
      hinzufügen

      • Jan sagt:

        Hi Marc,

        nein, Spaces habe ich noch nicht ausprobiert.
        Danke für den Tipp. Ich glaube aber gelesen zu haben, dass dieses Feature dann auch noch in der App (Element) aktiviert werden muss.

        Gruß,
        Jan

        • Marc sagt:

          Ja, auf Android muss man einfach auf die neueste Version updaten, bei Element-Desktop und Web sollte ein blauer Punkt links oben sein, wo man die Beta freischalten kann. Einladungen von Spaces an Leute, die die Beta noch nicht haben scheinen zwar zu funktionieren, aber die sehen es dann nur als normalen Raum.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.