Inhaltsverzeichnis dieser Serie:
- Teil 1 – Synapse Server installieren
- Teil 2 – Element-Web installieren
- Teil 3– Mautrix-WhatsApp-Bridge installieren
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:
- matrix.[deineAdresse.ch] zu http://matrix-synapse:8008
- element.[deineAdresse.ch] zu http://matrix-element:80
- 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.
- Wir verbinden uns per SSH mit dem Rapsberry Pi
- Wir verschaffen uns Zugang zu Docker Shell:
sudo docker exec -it matrix-synapse bash
- Mit dieser Eingab registieren wir nun den neuen User:
register_new_matrix_user -c /data/homeserver.yaml http://localhost:8008
- Beantworte die Fragen, die dir gestellt werden
- 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