Mein Weg zum eigenen Matrix-Server mit WhatsApp-Bridge – Teil 1

Matrix: grüne senkrechte Zahlenreihen auf schwarzem Hintergrund

Mein Weg in die Matrix. (Bild von Chihiro23, Pixabay.com)

Ich habe nach der Anleitung von Pi-Hosted auf meinem Raspberry Pi 4 Docker und Portainer installiert. Darauf laufen nun einige Dienste, wie z.B. auch dieser Blog.

Schon seit längerem wollte ich auf dem Raspi auch einen Synapse-Server mit einer Mautrix WhatsApp Bridge installieren. Ich hatte es sogar schon einmal versucht, aber bin dann unter anderem an der Bridge gescheitert.

Diese Woche habe ich top motiviert, nochmals einen neuen Anlauf genommen und es tatsächlich geschafft. Damit ich meinen Lösungsweg selber nicht wieder vergesse und vielleicht auch als Hilfe für andere, die das gleiche Unterfangen wagen wollen, schreibe ich in einer kleinen Serie möglichst detailliert Schritt für Schritt alles auf.

Solltest du lieber Leser irgendwo einen Fehler entdecken oder einen besseren Weg kennen, schreib mir doch einen Kommentar.

Teil 1 – Synapse-Server installieren

Vorbereitung

In meiner Anleitung gehe ich davon aus, dass bei dir Docker mit Compose und Portainer installiert sind und funktionieren. Ebenfalls gehe ich in meiner Anleitung davon aus, dass wir statt mit einem Reverse Proxy mit einem Cloudflare Tunel arbeiten. Sprich, du hast ein Cloudflare Konto und dort deine Domain schon eingerichtet.

Cloudflare Tunel einrichten

Fangen wir deshalb mit dem Portainer Stack für den Cloudflare Container an.

services:
  cloudflared-tunnel:
    container_name: cloudflared-tunnel
    image: cloudflare/cloudflared:latest
    restart: unless-stopped
    command: tunnel run
    environment:
      - TUNNEL_TOKEN=[YourSecretToken]
    networks:
      - cloudflare-tunnel

networks:
  cloudflare-tunnel:
    name: cloudflare-tunnel

Bei Cloudflare kannst du unter > Zero Trust > Networks > Tunnels einen neuen Tunnel erstellen. Da wird dann auch der benötigte Token generiert.

Lass uns auch gleich noch die drei öffentlichen Tunnel einrichten, die wir für das Projekt brauchen:

  1. matrix.[deineAdresse.ch] zu http://matrix-synapse:8008
  2. element.[deineAdresse.ch] zu http://matrix-element:80
  3. whatsappbridge.[deineAdresse.ch] zu http://matrix-whatsappbridge:29318

Synapse Server installieren

Wir fangen damit an, dass wir den entsprechenden Ordner erstellen:

mkdir /portainer/Files/AppData/Config/Matrix/synapse

Und als Nächstes erstellen wir gleich noch die Config-Datei:

sudo docker run -it --rm \
-v /portainer/Files/AppData/Config/Matrix/synapse:/data \
-e SYNAPSE_SERVER_NAME=matrix.[deineAdresse.ch] \
-e SYNAPSE_REPORT_STATS=no \
matrixdotorg/synapse:latest generate

homeserver.yaml bearbeiten

Jetzt müssen wir die frisch erstellte Config-Datei noch bearbeiten. Dazu öffnen wir sie in einem Editor:

cd /portainer/Files/AppData/Config/Matrix/synapse
nano homeserver.yaml

Und editieren den Datenbankteil. Denn wir wollen keine sqlite Datenbank, sondern eine Postgres-Datenbank.

Wichtig: Ersetzte [SuperGeheimesPasswort] mit deinem super geheimen Passwort.

Bei mir sieht die homeserver.yaml im Auszug so aus

listeners:
  - port: 8008
    tls: false
    type: http
    x_forwarded: true
    resources:
      - names: [client, federation]
        compress: false

# Auskommentiert
# database: 
#   name: sqlite3 
#   args:
#     database: /data/homeserver.db 

# Neu eingefügt
database: 
    name: psycopg2
    args: 
        user: "synapse-user" 
        password: "[SuperGeheimesPasswort]"
        host: postgresql 
        database: "synapse-db"
        cp_min: 5 
        cp_max: 10 
# allow registrations 
enable_registration: false 
enable_registration_without_verification: true
# allow federation public rooms 
allow_public_rooms_over_federation: true

Optionaler Schritt:

Wenn du möchtest, dass sich Benutzer selbständig bei deinem Synapse-Server registrieren können, dann müssen wir diese Zeile in der Config-Datei abändern:

enable_registration: true

Portainer Stack

Jetzt richten wir in Portainer einen Stack namens "matrix" mit folgendem Inhalt ein:

services:

  postgresql:
    container_name: "matrix-postgres"
    image: postgres:15-alpine
    environment:
      POSTGRES_PASSWORD: "[SupergeheimesPasswort]"
      POSTGRES_USER: "synapse-user"
      POSTGRES_DB: "synapse-db"
      POSTGRES_INITDB_ARGS: "--encoding='UTF8' --lc-collate='C' --lc-ctype='C'"
    volumes:
      - type: bind
        source: /portainer/Files/AppData/Config/Matrix/postgresdata/
        target: /var/lib/postgresql/data/
    restart: unless-stopped
    networks: ["cloudflare-tunnel"] 

  synapse:
    container_name: "matrix-synapse"
    image: "matrixdotorg/synapse:latest"
    volumes:
      - type: bind
        source: /portainer/Files/AppData/Config/Matrix/synapse/
        target: /data
    ports:
      - 7090:8008
    environment:
      SYNAPSE_SERVER_NAME: "matrix.[deineAdresse.ch]"
      SYNAPSE_REPORT_STATS: "no"
    restart: unless-stopped
    networks: ["cloudflare-tunnel"] 

networks:
    cloudflare-tunnel:
      external: true

Nach einem kurzen Moment müssten wir in Portainer sehen, dass der Container namens "matrix-synapse" läuft (wird grün als "healthy" angezeigt).

Jetzt können wir einen Admin-User erstellen. Das geht eigentlich gleich, wie wir sonst auch einen User erstellen können, nur müssen wir die Frage, ob der User Admin sein soll, dann halt mit "yes" beantworten.

  1. Wir verbinden uns per SSH mit dem Rapsberry Pi
  2. Wir verschaffen uns Zugang zu Docker Shell: sudo docker exec -it matrix-synapse bash
  3. Mit dieser Eingab registieren wir nun den neuen User: register_new_matrix_user -c /data/homeserver.yaml http://localhost:8008
  4. Beantworte die Fragen, die dir gestellt werden
  5. Mit exit kannst du das Docker Shell wieder verlassen.

Gratulation: Du hast jetzt einen laufenden Synapse-Server am Laufen. Damit hast du den 1. Teil fast geschafft. Aktuell föderiert dein Synapse-Server aber noch nicht. Damit das klappt, müssen wir bei Cloudflare noch ein paar Anpassungen machen.

Cloudflare Anpassungen

DNS Einträge

Erstelle folgende DNS-Einträge zu deiner Domain:

Typ Name Priorität Gewichtung TTL Port Ziel
SRV _matrix-fed._tcp.matrix 10 100 Auto 443 matrix.[deineAdresse.ch]
SRV _matrix._tcp.matrix 10 100 Auto 443 matrix.[deineAdresse.ch]

Workers-Routen

Erstelle folgenden Worker und Route:

Unter dem Menüpunkt "Workers-Routen" klicke auf "Workers Verwalten" und auf der neuen Seite dann auf "Erstellen".

Wähle "Starten Sie mit Hello World!" aus und ändere den Namen zu "matrix-wellknown-worker" und klicke auf "Bereitstellen". Nun klickst du auf "Code bearbeiten" und fügst unter worker.js folgenden Code ein:

const HOMESERVER_URL = "https://matrix.[deineAdresse.ch]";
const IDENTITY_SERVER_URL = "https://vector.im";
const FEDERATION_SERVER = "matrix.[deineAdresse.ch]:443";

export default {
  async fetch(request, env) {
    const path = new URL(request.url).pathname;
    switch (path) {
      case "/.well-known/matrix/client":
        return new Response(
            `{"m.homeserver": {"base_url": "${HOMESERVER_URL}"},"m.identity_server": {"base_url": "${IDENTITY_SERVER_URL}"}}`
        );
      case "/.well-known/matrix/server":
        return new Response(`{"m.server": "${FEDERATION_SERVER}"}`);
      default:
        return new Response("Invalid request");
      }
    },
};

Zum Schluss kannst du unter "Einstellungen" (immer noch bei deinem Worker) unter "Domains und Routen" eine Route hinzufügen. Klicke auf "Hinzufügen", wähle im nächsten Schritt "Route" aus. Nun kannst du unter Zone deine Domain auswählen und unter Route diesen Code einfügen:

matrix.[deineAdresse.ch]/.well-known/matrix/*

Bei Fehlermodus wählst du "Schließen bei Fehler (Blockieren)" aus und klickst auf "Route hinzufügen". Geschafft!

Du kannst übrigens hier testen, ob dein Synapse-Server auch wirklich sauber föderiert.

Ausblick

Unser Synapse-Server läuft und föderiert. Als Nächstes wollen wir Element-Web installieren und dann eben die WhatsApp Bridge einrichten. Also atme mal tief durch, hol dir einen Kaffee, höre ein paar Minuten dem Vogelgezwitscher zu und dann gehts hier mit Teil 2 weiter.

Kommentare: 0

Interesse an einer Diskussion? Schreibe einen Kommentar.

Image




0 / 5000

Die E-Mail-Adresse wird nicht veröffentlicht noch an Dritte weitergegeben. In deinem Text kannst du *Kursivschrift*, **Fettschrift** und [Links](http://example.org) verwenden. Der Kommentar wird moderiert und so bald wie möglich freigeschaltet.