Matrix Synapse auf einem ROCK64 installieren

Mit dieser Anleitung kann man auf einem ROCK64 den Server Synapse von Matrix installieren

Ich übernehme keine Verantwortung für die Richtigkeit dieser Anleitung, sie ist nur eine Mitschrift der Installation meines eigenen Matrix Servers. Die Verwendung dieser Anleitung ist deshalb auf eigene Gefahr.

Hardware
PC mit Linux (in diesem Beispiel Linux Mint)
ROCK64 (4 GB)
64 GB SD Karte
Adapter von SD Micro auf SD

** ACHTUNG: Diese Anleitung funktioniert nur für die Version V2 des Rock64, weil nur für diese Version ein ARCH Linux Distribution zur Verfügung steht. Für die Version 3 gibt es aktuell nur ein Debian 9, mit dem sollte Matrix Synapse zwar auch funktionieren, dann muss man Matrix aber von Hand installieren und aktualisieren.**

Diese Konstellation sollt bis zu 20 Accounts verkraften können.

Was braucht man sonst noch
Eine Domain bei einem Anbieter der DynDNS kann.
Einen Router der DynDNS kann.
Was ist Dynamic DNS? Wofür brauche ich DynDNS?
Alternativer Link ohne Tracker

Definitionen
User: username (durch den eigenen Linux User ersetzen)
Domain: meinedomain.de (durch die eigene Domain ersetzen)

Folgende Ports müssen für die interne IP des Rock64 offen sein
HTTPS-Server: 8448
HTTPS-Server: 443

FRITZBox Portfreigaben. Was sind Portweiterleitungen?
Alternativer Link ohne Tracker

Mit dieser Anleitung kann man auf einem ROCK64 den Server Synapse von Matrix installieren.

Aktuell gibt es noch ein Problem mit großen Räumen, deshalb solltet ihr euren Usern mitteilen, dass sie mit ihrem Account erst mal nicht versuchen Mitglied in großen öffentlichen Räumen zu werden.

Warum ArchLinux?
Ihr solltet Synapse unbedingt mit einem Paketmanager unter Linux installieren, da nur so sichergestellt ist, dass zukünftig alle Updates auch sicher und sauber installiert werden. Nach meinem Wissen, bietet aktuell nur ArchLinux so ein Pakete für ARM Computer an.

Diese Version von ArchLinux werden wir installieren:
https://archlinuxarm.org/platforms/armv8/rockchip/rock64

Hier stehen die offiziellen Anleitungen von Matrix zu Synapse https://matrix.org/docs/guides/installing-synapse

Ich empfehle direkt eine 64 GB Karte zu verwenden, da man mit Synapse aktuell keine alten Daten löschen kann, der Server wird also über kurz oder lang stark anwachsen.

So heißt die SD Karte unter Ubuntu bzw. Linux Mind
mmcblk0: Das ist der Name der Karte selbst
mmcblk0p1: p1 ist de Name der ersten Partition

Im ersten Schritt muss die SD Karte vorbereitet werden (im Beispiel eine 64 GB Karte). Hierzu öffnen wir in Linux das Terminal [STR]-[ALT]-[T] und geben folgende Befehle ein
sudo -s (danach muss man das Passwort vom root User eingeben)\

Die ersten 32 MByte müssen mit dem Wert 0 befüllt werden
dd if=/dev/zero of=/dev/mmcblk0 bs=1M count=32

Starten von fidsk zum partitionieren der SD Karte
fdisk /dev/mmcblk0

At the fdisk prompt, create the new partition:

  1. Type o. This will clear out any partitions on the drive.
  2. Type p to list partitions. There should be no partitions left.
  3. Type n, then p for primary, 1 for the first partition on the drive, 32768 for the first sector, and then press ENTER to accept the default last sector.
  4. Write the partition table and exit by typing w.

Create the ext4 filesystem:
mkfs.ext4 /dev/mmcblk0p1

Verzeichnis eingeben, wo die Daten hin kopiert werden sollen
cd /home/username
pwd (ums zu sehen, ob es funktioniert hat)
ls (zum ansehen der Dateien die da jetzt liegen)\

Mount the filesystem:
mkdir root
mount /dev/mmcblk0p1 root

Jetzt laden wir das Filesystem von root herunter und entpacken es (als root-User)
wget http://os.archlinuxarm.org/os/ArchLinuxARM-aarch64-latest.tar.gz
apt install libarchive-tools (falls bsdtar nicht gefunden wird)
sudo bsdtar -xpf ArchLinuxARM-aarch64-latest.tar.gz -C root

Es wird folgendes angezeigt
bsdtar: Ignoring malformed pax extended attribute
bsdtar: Ignoring malformed pax extended attribute
bsdtar: Ignoring malformed pax extended attribute
bsdtar: Ignoring malformed pax extended attribute
bsdtar: Error exit delayed from previous errors

Danach noch folgendes eingeben
sync

Download the boot.scr script for U-Boot and place it in the /boot directory:
wget http://os.archlinuxarm.org/os/rockchip/boot/rock64/boot.scr -O root/boot/boot.scr
sync
umount root

Download and install the U-Boot bootloader:
wget http://os.archlinuxarm.org/os/rockchip/boot/rock64/idbloader.img
wget http://os.archlinuxarm.org/os/rockchip/boot/rock64/uboot.img
wget http://os.archlinuxarm.org/os/rockchip/boot/rock64/trust.img
dd if=idbloader.img of=/dev/mmcblk0 seek=64 conv=notrunc
dd if=uboot.img of=/dev/mmcblk0 seek=16384 conv=notrunc
dd if=trust.img of=/dev/mmcblk0 seek=24576 conv=notrunc

Jetzt die SD Karte in den Rock64 stecken und den Rock64 starten.


AB HIER WEITERMACHEN, WENN MAN EINEN RASPBERRY 3B+ AUFGESETZT HAT

Dann meldet ihr euch im Terminal von Linux mit dem alarm User bei dem ROCK64 / Raspberry an. Hierzu müsst ihr euch über euren Router die IP Adresse heraussuchen, die dem ROCK64 zugewiesen wurde. Falls euer Router die Möglichkeit hat, die IP für immer fest zuzuordnen, dann solltet ihr das dabei gleich mit machen.
ssh alarm@IP-des-Raspi

Erst mal erstellen wir ein neues Passwort, der Default ist alarm.
passwd (danach das neue Passwort von alarm eingeben)

Jetzt machen wir uns zum Admin (User root) und erstellen wieder ein neues Passwort (Default ist root).
su
passwd (danach das neue Passwort von root eingeben)

Jetzt müsste euer User [root@alarmpi alarm] heißen.

Danach muss der Paketdienst von Archlinux initialisiert werden, mit dem man Programme installieren kann. Das machen wir, damit wir erst mal alles auf den neuesten Stand bringen können.
pacman-key --init
pacman-key --populate archlinuxarm
rm /boot/boot.scr
pacman -Sy uboot-rock64

Das System aktualisieren
pacman -Syu

Jetzt das Ergebnis auf die Festplatte sichern
dd if=/dev/mmcblk0 of=Rock64.img

So kann man das Image wieder auf eine SD Karte kopieren
dd if=Rock64.img of=/dev/mmcblk0

Als erstes besorgen wir uns Zertifikate bei Let’s Encrypt, Hierzu müssen wir Certbot installieren.
pacman -S certbot

Jetzt müsst ihr für den ROCK64 die beiden Ports 80 und 443 öffnen. Wenn die beiden Ports offen sind, könnt ihr mit dem nachfolgenden Befehl ein Zertifikat erstellen.
certbot certonly --rsa-key-size 2048 --standalone --agree-tos --no-eff-email --email deine.mail@domain.de -d meinedomain.de

In dem Verzeichnis /etc/letsencrypt/live/meinedomain.de wurden folgende Dateien erstellt
@cert.pem
@chain.pem
@fullchain.pem
@privkey.pem

Danach kann der Port 80 wieder geschlossen werden.

Jetzt installieren wir den Webserver niginx
pacman -S nginx

Folgende Konfiguration in die Datei /etc/nginx/nginx.conf einfügen
nano /etc/nginx/nginx.conf

worker_processes  1;
events {worker_connections  1024;}
 
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name meinedomain.de;
    client_max_body_size 50m;

ssl_certificate      /etc/letsencrypt/live/meinedomain.de/fullchain.pem;
ssl_certificate_key  /etc/letsencrypt/live/meinedomain.de/privkey.pem;
 
ssl_session_cache    shared:SSL:1m;
ssl_session_timeout  5m;
 
ssl_ciphers  HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers  on;
 
    location /_matrix {
        proxy_pass http://localhost:8008;
        proxy_set_header X-Forwarded-For $remote_addr;
    }
}
 
server {
    listen 8448 ssl default_server;
    listen [::]:8448 ssl default_server;
    server_name meinedomain.de;
    client_max_body_size 50m;
 
ssl_certificate      /etc/letsencrypt/live/meinedomain.de/fullchain.pem;
ssl_certificate_key  /etc/letsencrypt/live/meinedomain.de/privkey.pem;
 
ssl_session_cache    shared:SSL:1m;
ssl_session_timeout  5m;
 
ssl_ciphers  HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers  on;
 
    location / {
        proxy_pass http://localhost:8008;
        proxy_set_header X-Forwarded-For $remote_addr;
    }
}
}

systemctl start nginx.service
systemctl enable nginx.service

Nachschauen ob der Server geht
systemctl status nginx

PS: Mit STR-C kommt man wieder raus.

Jetzt installieren wir den Server von Matrix

pacman -S matrix-synapse

pacman -S sudo

cd /var/lib/synapse

sudo -u synapse python /usr/lib/python3.7/site-packages/synapse/app/homeserver.py --server-name meinedomain.de --config-path /etc/synapse/homeserver.yaml --generate-config --report-stats=yes

Eine Kopie der erzeugten Datei /etc/synapse/homeserver.yaml erstellen. Folgende Konfiguration in die Datei /etc/synapse/homeserver.yaml einfügen

Danach an den Stellen wo ~~~~~~~~~~~~~~~ steht, die Werte aus eurer Originaldatei einsetzen.
nano /etc/synapse/homeserver.yaml

server_name: "meinedomain.de"
pid_file: /var/lib/synapse/homeserver.pid
soft_file_limit: 0
use_presence: true

listeners:
  - port: 8008
    tls: false
    bind_addresses: ['::1', '127.0.0.1']
    type: http
    x_forwarded: true

    resources:
      - names: [client, federation]
        compress: false

acme: tls_fingerprints: []
   
database:
    name: "sqlite3"
    args: database: "/var/lib/synapse/homeserver.db"

event_cache_size: "10K"
log_config: "/etc/synapse/meinedomain.de.log.config"
rc_messages_per_second: 0.2
rc_message_burst_count: 10.0
federation_rc_window_size: 1000
federation_rc_sleep_limit: 10
federation_rc_sleep_delay: 500
federation_rc_reject_limit: 50
federation_rc_concurrent: 3
media_store_path: "/var/lib/synapse/media_store"

uploads_path: "/var/lib/synapse/uploads"
max_upload_size: "10M"
max_image_pixels: "32M"

dynamic_thumbnails: false

thumbnail_sizes:
-   width: 32
    height: 32
    method: crop
-   width: 96
    height: 96
    method: crop
-   width: 320
    height: 240
    method: scale
-   width: 640
    height: 480
    method: scale
-   width: 800
    height: 600
    method: scale

url_preview_enabled: False

max_spider_size: "10M"

recaptcha_public_key: "YOUR_PUBLIC_KEY"
recaptcha_private_key: "YOUR_PRIVATE_KEY"
enable_registration_captcha: False

recaptcha_siteverify_api: "https://www.google.com/recaptcha/api/siteverify"

turn_user_lifetime: "1h"
turn_allow_guests: True

enable_registration: False

# If set, allows registration by anyone who also has the shared
# secret, even if registration is otherwise disabled.
registration_shared_secret: "~~~~~~~~~~~~~~~"

# Set the number of bcrypt rounds used to generate password hash.
bcrypt_rounds: 12

# Allows users to register as guests without a password/email/etc, and
allow_guest_access: False

# The identity server which we suggest that clients should use when users log
trusted_third_party_id_servers:
- matrix.org
- vector.im

autocreate_auto_join_rooms: true

# Enable collection and rendering of performance metrics
enable_metrics: False
report_stats: true

# A list of event types that will be included in the room_invite_state
room_invite_state_types:
- "m.room.join_rules"
- "m.room.canonical_alias"
- "m.room.avatar"
- "m.room.encryption"
- "m.room.name"

# A list of application service config file to use
app_service_config_files: []

# Whether or not to track application service IP addresses. Implicitly
track_appservice_user_ips: False

# a secret which is used to sign access tokens. If none is specified,
macaroon_secret_key: "~~~~~~~~~~~~~~~"

# Used to enable access token expiration.
expire_access_token: False

# a secret which is used to calculate HMACs for form values, to stop
form_secret: "~~~~~~~~~~~~~~~"

# Path to the signing key to sign messages with
signing_key_path: "/etc/synapse/meinedomain.de.signing.key"

# The keys that the server used to sign messages with but won't use
old_signing_keys: {}

# How long key response published by this server is valid for.
key_refresh_interval: "1d" # 1 Day.

# The trusted servers to download signing keys from.
perspectives:
servers:
"matrix.org":
    verify_keys:
    "ed25519:auto":
    key: "~~~~~~~~~~~~~~~"

# Enable password for login.
password_config:
enabled: true
# Uncomment and change to a secret random string for extra security.
# DO NOT CHANGE THIS AFTER INITIAL SETUP!

# Whether to allow non server admins to create groups on this server
enable_group_creation: false

alias_creation_rules:
-   user_id: "*"
    alias: "*"
    action: allow
    
resources:
-   names: [client, federation]
    compress: false

systemctl start synapse

Prüfen ob der Server läuft
systemctl status synapse

Für den späteren Autostart noch folgendes eingeben
systemctl enable synapse

Um zu sehen, ob alles geht, legt ihr jetzt den ersten User an und meldet auch damit an.
Am besten gleich den ADMIN User anlegen, den braucht man später immer mal wieder.
register_new_matrix_user -c /etc/matrix-synapse/homeserver.yaml http://localhost:8008

Jetzt müsst ihr auch nur noch den Riot.im Client installiern (geht auch direkt im Browser) um auch damit mit dem neuen User anmelden zu können.

Ich habe noch die Größe der Logdatei auf 10 MByte begrenzt, so kann man später besser die einzelnen Dateien löschen und hat nicht ein riesiges Logfile.
sudo nano /etc/synapse/meinedomain.de.log.config

maxBytes: 10000000

Backup erstellen

Einmal pro Monat
Ein komplettes Image von der SD Karte erstellen und das dann auf eine andere SD Karte zurückspielen, Dann mit der kopierten Karte den Server neu starten.
Als root anmelden
systemctl stop synapse
systemctl stop nginx
shutdown

Die SD Karte auf die Festplatte kopieren (nicht auf dem Rock64, sondern unter Linux im Terminal)
dd if=/dev/mmcblk0 of=Rock64.img

Das Image auf die neue Karte übertrageb
dd if=Rock64.img of=/dev/mmcblk0

Jetzt die neu SD Karte in der Rock64 stecken und starten.

Einmal pro Woche
Als root anmelden
systemctl stop synapse
systemctl stop nginx
sqlite3 /var/lib/synapse/homeserver.db .dump > /var/lib/synapse/homeserver_DATUM.sql
rsync --numeric-ids -avp --stats /var/lib/ rsync@IP-vom-NAS:22:/ArchLinuxRock64lib
pacman -Syu
systemctl start nginx
systemctl start synapse

Prüfen ob alles noch geht
systemctl status nginx
systemctl status synapse

Historie Medien löschen die älter als einen Monat ist
curl -k -v -d '' "https://meinedomain.de/_matrix/client/r0/admin/purge_media_cache?before_ts=$(date -d-1month +%s000)&access_token="

Ein paar Befehle für später
chown -R synapse /var/lib/synapse
chown -R synapse /etc/synapse
pacman -S wget
pacman -S netdata
systemctl start netdata
systemctl enable netdata
systemctl restart nginx.service
journalctl -feu synapse

Datenbankverzeichnisses /var/lib/synapse/
Konfigurationsverzeichnisses /etc/synapse

Hier noch eine paar Links zu andern Anleitungen und Artikeln (allerdings nicht für einen Minirechner)
Eigener verschluesselter Chat-Server mit Matrix-Synapse
Erkenntnisse und Erfahrungen rund um Matrix
Eigener Matrix Server
Wie man Matrix-Synapse auf Ubuntu installiert
Matrix – Das XMPP für Hobby-Admins?
Leichte Installation, einfache Bedienung

Rückmeldungen könnt ihr mir unter folgenden Adressen zukommen lassen:
Mastodon: @favstarmafia@social.anoxinon.de
Matrix: @favstarmafia:bau-ha.us
XMPP: favstarmafia@anoxinon.me

Außerdem empfehle ich euch noch den Matrix Raum:
#synapse-admins:bau-ha.us
Da sind ganz viele nette Admins unterwegs, die einem mal bei einem Problem helfen können.