Self-Hosted Real Time Push Notification Server für Android und LineageOS (Open Source)

Wie in anderen Beiträgen im Blog bereits beschrieben ist es möglich, mobile Endgräte unter Android oder LineageOS sehr Datensparsam einzurichten. Durch den Verzicht auf die offiziellen, bzw. FOSS Google Apps (gapps) gibt es dadurch eine Einschränkung im Bereich der Push Benachrichtigungen.

Dazu muss man wissen, dass mobile Endgeräte die Push-Benachrichtigungen von Apps durch die Server von Google oder Apple senden. Damit ergeben sich, auch wenn gute Apps darüber nur „Aufwecknachrichten” senden, massive Meta Daten bei den großen Datensilos.

Um keine Daten an Dritte weiterzugeben wurden in den anderen Artikel bereits umfangreiche Vorkehrungen getroffen ( https://kmj.at/Am%20Android%20Tablet%20oder%20Smartphone%20mit%20LineageOS%20f%C3%BCr%20Sicherheit%20und%20Privatsph%C3%A4re%20sorgen%20%28Teil%206%29/ ) .

Nun fehlte noch eine selbst gehosteter Push-Notification Server und nach langer Suche fiel die Entscheidung auf Gotify. Durch den mit Plugins erweiterbaren Push-Server können Matrix Push Benachrichtigungen genauso gesendet werden, wie Push-Benachrichtigungen per wget, PHP, und anderen Tools und Programmiersprachen. Damit ist es auch möglich das Nagios Real Time Monitoring auf einen neuen Level zu heben.

Viele Muster zum Senden von Nachrichten finden sich hier: https://gotify.net/docs/more-pushmsg .

Der Gotify Server ist in Go Programmiert und läuft damit auf vielen Betriebssystemen. Das Project stellt auch ein Docker Image. Ich selbst bevorzuge Bare-Install und virtualisiere mit Proxmox.

Zusätzlich war eine Voraussetzung, dass der Push-Server nicht als Root und ohne Reversed-Proxy, in Verbindung mit SQLite läuft. Damit kann mit einem statischen Binary und der Datenbank im Unterordner der gesamte Server als non-privileged Benutzer betrieben werden.

Das Setup

  • Installieren von Go wie üblich
  • Go muss im PATH sein

Als root, bzw. sudo

  • pkg install yarn

um Yarn und Node zu installieren. Danach

  • git clone https://github.com/gotify/server.git && cd server
  • export GO111MODULE=on
  • make download-tools
  • go get -d
  • cd ui
  • yarn
  • cd ..
  • (cd ui && yarn build)
  • go run hack/packr/packr.go
  • export LD_FLAGS=“-w -s -X main.Version=\$(git describe –tags | cut -c 2-) -X main.BuildDate=\$(date „+%F-%T”) -X main.Commit=\$(git rev-parse –verify HEAD) -X main.Mode=prod”;
  • go build -ldflags=”\$LD_FLAGS” -o gotify-server

Das Binary in das Home Verzeichnis des ausführenden Benutzers kopieren.

Erstelle ./config.yaml

Speziell

In unserem Fall wurden die Standard Ports auf High-Ports gelegt, damit kann der Gotify Server ohne root Berechtigungen gestartet werden. Ich habe eine eigene lokale CA und damit die Zertifikate erstellt.

Viele Details zur eigenen CA finden sich hier: https://digitalbooks24.com/de/product/my-own-certificate-authority-epub/

Kurzinfo zum Hinzufügen der eigenen CA als vertrauenswürdige Ausstellerinstanz

openssl x509 -noout -hash -in ca.crt > ca.crt.hash
ln -s ca.crt `cat ca.crt.hash`.0
echo „copy ca.crt and `cat ca.crt.hash`.0 to /etc/ssl/certs"

Testen:

openssl s\_client -connect gotify.server.tld:PORTNUMBER \| grep -i -e verify

Start- und Prüfscript

Dieses Script am besten in der Crontab mit dem jeweiligen Benutzer, alle 5 Minuten laufen lassen. Benötigt etc/Runs/nagios/plugins/check_tcp , welches sich in den Nagios-Plugins findet.

!/bin/sh
RUNAS=gotify
MAILTO=root
MAIL=/usr/bin/mail
GETUSERNAME=`/usr/bin/whoami`

if [ "${GETUSERNAME}" != "${RUNAS}" ]; then
echo "####################################################"
echo "ERROR: This script must be run as ${RUNAS}, exiting"
echo "TIP : use su -m ${RUNAS} -c command"
echo "####################################################"
echo "ERROR: This script must be run as ${RUNAS}, exiting" | \
${MAIL} -s "ERROR: MATRIXBOT start exited with error on `hostname`" ${MAILTO}
exit 1
fi

if (! /etc/Runs/nagios/plugins/check_tcp -p 4080 -H 127.0.0.1 2>&1 >/dev/null); then
echo "Service MATRIXGOTIFY not running"
echo "Service MATRIXGOTIFY not running" | mail -s "`hostname` Service MATRIXGOTIFY not running RESTARTET" root
cd /home/gotify && \
/home/gotify/gotify-server &
fi

 

 Testen Gotify Server

Dazu meldet man sich am Web Interface an, bzw, installiert am besten auch die App am mobilen Gerät. Das Token ersetzen!

#!/bin/sh
token="ACepUABC5Vornq."
subject="wget"
message="Test Message to Mobile via WGET"
priority=5
PORTNUMBER=443 # Set your non standard port here, if used!
wget --no-check-certificate "https://localhost:$PORTNUMBER/message?token=$token" --post-data "title=$subject&message=$message&priority=$priority" -O /dev/null

Danach sollten im Web und in der App die Nachricht auftauchen.

Nun kann das Matrix Plugin für Gotify kompiliert werden

  • git clone https://gitlab.com/Sorunome/matrix-gotify
  • cd matrix-gotify
  • make download-tools
  • go build -mod=readonly -a -installsuffix cgo -ldflags „\$LD_FLAGS” -buildmode=plugin -o build/matrix-gotify.so
  • Das build/matrix-gotify.so in den Plugin Ordner beim Gotify Server kopieren.

Betrieb

Zum Betrieb von Matrix-Push Benachrichtigungen müssen wir am Matrix Synapse Server noch einen Pusher für den Benutzer einrichten.

Muster

Registrieren Pusher

/usr/local/bin/curl -H ‚Authorization: Bearer ACCESS_TOKEN’ -H ‚Content-Type: application/json’ -X POST -d ‚{„lang”: „en”,“kind”: „http”,“app_display_name”: „Gotify”,“device_display_name”: „Gotify”,“pushkey”: „SECRET-SET-IN-WEB-IF-PLUGIN”,“app_id”: „de.sorunome.gotify”,“data”: {„url”: „https://SERVER.TLD:PORTNUMBER/plugin/2/custom/FROM_LINK_IN_PLUGIN/hook","format": „full_event”}}’ https://MATRIX_SERVER_TLD/_matrix/client/r0/pushers/set

Löschen Pusher

/usr/local/bin/curl -H ‚Authorization: Bearer ACCESS_TOKEN’ -H ‚Content-Type: application/json’ -X POST -d ‚{„lang”: „en”,“kind”: „null”,“app_display_name”: „Gotify”,“device_display_name”: „Gotify”,“pushkey”: „SECRET-SET-IN-WEB-IF-PLUGIN”,“app_id”: „de.sorunome.gotify”,“data”: {„url”: „https://SERVER.TLD:PORTNUMBER/plugin/2/custom/FROM_LINK_IN_PLUGIN/hook","format": „full_event”}}’ https://MATRIX_SERVER_TLD/_matrix/client/r0/pushers/set

Pushers auflisten

/usr/local/bin/curl -H ‚Authorization: Bearer ACCESS_TOKEN’ -X GET https://MATRIX_SERVER_TLD/_matrix/client/r0/pushers

Bei eigener CA muss jeder Beteiligte Server, Gotify und Matrix die eigene CA im OpenSSL eingerichtet haben.

Mit der Installation ist nun ein selbst gehosteter Push Server verfügbar, der verschlüsselt, ohne Daten an Dritte zu senden, Push Benachrichtigungen unter Android und LineageOS ermöglicht. Apple verbietet Web-Socket Verbindungen, dadurch gibt es auch keine APP für IOS. Mit Android und LineageOS ist aber einen großflächige Marktabdeckung, speziell bei smarten Benutzern mit hohem Interesse an Privatsphäre gegeben.

Join my public room in the Matrix

If you like this blog entry feel free to join my public room by entering

/join #kmj:matrix.ctseuro.com

anywhere in the Element Messenger (https://element.io) box to send a message!

Help or answering questions ONLY in this room!

Enterprise Support and Setup

Links zum Artikel

Go Programmiersprache

Matrix Doc

Sample Payload

Weitere Artikel

E-Books

Einträge auf CPV.Agency

Posts in Deutsch:

Post in English: