Eigener Push-Notification-Service
Selbstgehostete Push-Benachrichtigungen mit ntfy.
In der heutigen vernetzten Welt sind Push-Benachrichtigungen zu einem unverzichtbaren Werkzeug für zeitnahe Kommunikation geworden. Viele Nutzer greifen dabei auf Dienste wie Telegram-Bots zurück. Jedoch wächst das Bedürfnis nach mehr Kontrolle über die eigenen Daten und die zugrunde liegende Infrastruktur. Hier kommt ntfy ins Spiel – eine leichtgewichtige, selbst gehostete Lösung für Push-Benachrichtigungen.
Was ist ntfy?
ntfy ist ein einfacher HTTP-basierter Pub-Sub (Publish-Subscribe) Dienst, der es ermöglicht, Benachrichtigungen an verschiedene Geräte zu senden. Ich finde, dass ntfy besonders durch seine Einfachheit und Flexibilität besticht. Es unterstützt eine Vielzahl von Clients, darunter Webbrowser, die ntfy-App für Android und iOS, sowie CLI-Tools.
Vorteile eines eigenen Push-Servers
Die Entscheidung, von einem Telegram-Bot zu einer selbst gehosteten Lösung wie ntfy zu wechseln, bringt mehrere Vorteile mit sich:
- Datenschutz: Alle Benachrichtigungen bleiben in meiner Kontrolle, ohne dass Drittanbieter Zugriff auf sensible Informationen erhalten.
- Anpassbarkeit: Ich kann den Dienst genau nach meinen Bedürfnissen konfigurieren.
- Integration: ntfy lässt sich nahtlos in bestehende Infrastrukturen einbinden, wie ich es selbst mit dem Nginx Proxy Manager (NPM) umgesetzt habe.
- Skalierbarkeit: Je nach Bedarf können die Ressourcen angepasst werden, ohne von den Limitierungen externer Dienste abhängig zu sein.
Integration in die eigene Umgebung
Seit der Anbindung meines Webservers hinter einen Reverse Proxy habe ich viele weitere Dienste integriert.
Der Nginx Proxy Manager (NPM) hat sich in meinen Tests als ausgezeichnete Wahl für das Management von Web-Services erwiesen. Er bietet eine benutzerfreundliche Oberfläche zur Verwaltung von Nginx-Konfigurationen und vereinfacht die Einrichtung von SSL-Zertifikaten erheblich. Durch die Verwendung von NPM konnte ich ntfy problemlos in meine bestehende Container-Infrastruktur integrieren.
Natürlich wandern die ersten User auf Zoraxy ab. Doch für mich passt NPM, zusammen mit goaccess und wazuh, einfach optimal.
In meiner Konfiguration habe ich ntfy wie folgt in das Docker Compose-File eingebunden
ntfy:
image: binwiederhier/ntfy:latest
container_name: ntfy
restart: unless-stopped
expose:
- 80
volumes:
- ./ntfy/data:/var/cache/ntfy
- ./ntfy/config:/etc/ntfy
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Berlin
command: serve
labels:
- "com.centurylinklabs.watchtower.enable=true"
networks:
- web
Diese Konfiguration ermöglicht es, ntfy sicher hinter dem NPM zu betreiben und nahtlos in die bestehende Container-Umgebung zu integrieren.
Die obige Beschreibung des Docker-Containers habe ich wie immer meinem docker-compose.yml
-File hinzugefügt. In Betrieb geht das ganze dann wie gewohnt mit:
docker-compose up -d ntfy
Jetzt läuft schoneinmal der Container. Er muss noch aus dem Internet erreichbar werden, was ich im Nginx-Proxy-Manager konfiguriert habe.
Es ist wichtig Websocket Support
zu enablen, da dies später den Energieverbrauch auf dem Smartphone verringern wird.
Privacy
Ich möchte später nicht, dass jeder meinen Server nutzen kann. Daher lege ich Nutzer an und gebe diesen entsprechende Berechtigungen. Dies macht man am einfachsten direkt im Container. Betreten kann man diesen mit dem Kommando docker exec -it ntfy /bin/sh
. Im Container tippen wir einfach mal ntfy
:
/ # ntfy
NAME:
ntfy - Simple pub-sub notification service
USAGE:
ntfy [OPTION..]
COMMANDS:
help, h Shows a list of commands or help for one command
Client commands:
publish, pub, send, trigger Send message via a ntfy server
subscribe, sub Subscribe to one or more topics on a ntfy server
Server commands:
access Grant/revoke access to a topic, or show access
serve Run the ntfy server
tier Manage/show tiers
token Create, list or delete user tokens
user Manage/show users
webpush Generate keys, in the future manage web push subscriptions
GLOBAL OPTIONS:
--debug, -d enable debug logging (default: false) [$NTFY_DEBUG]
--trace enable tracing (very verbose, be careful) (default: false) [$NTFY_TRACE]
--no-log-dates, --no_log_dates disable the date/time prefix (default: false) [$NTFY_NO_LOG_DATES]
--log-level value, --log_level value set log level (default: "INFO") [$NTFY_LOG_LEVEL]
--log-level-overrides value, --log_level_overrides value [ --log-level-overrides value, --log_level_overrides value ] set log level overrides [$NTFY_LOG_LEVEL_OVERRIDES]
--log-format value, --log_format value set log format (default: "text") [$NTFY_LOG_FORMAT]
--log-file value, --log_file value set log file, default is STDOUT [$NTFY_LOG_FILE]
--help, -h show help
Try 'ntfy COMMAND --help' or https://ntfy.sh/docs/ for more information.
To report a bug, open an issue on GitHub: https://github.com/binwiederhier/ntfy/issues.
If you want to chat, simply join the Discord server (https://discord.gg/cT7ECsZj9w), or
the Matrix room (https://matrix.to/#/#ntfy:matrix.org).
ntfy 2.11.0 (d11b100), runtime go1.22.2, built at 2024-05-13T20:16:12Z
Copyright (C) 2022 Philipp C. Heckel, licensed under Apache License 2.0 & GPLv2
OK. Wir sehen, welche Möglichkeiten wir haben. Sperren wir zunächst alle Fremden aus:
ntfy access --reset everyone
ntfy access everyone "*" deny
Jetzt brauchen wir einen Admin und einen normalen User. Zumindest möchte ich diese Hierarchie bei mir so anlegen:
ntfy user add --role=admin Mein_Admin
ntfy user change-pass Mein_Admin
ntfy user add mein-user
ntfy user change-pass mein-user
ntfy access mein-user "*" rw
Testen der Benachrichtigungen
Um sicherzustellen, dass ntfy korrekt läuft, habe ich folgende Schritte durchgeführt:
Webseite aufrufen
Unter der konfigurierten URL kann man nun die Webseite von nfty öffnen. Durch einen Klick auf Thema abonnieren
habe ich ein neues Thema iobroker
für meine Hausautomation hinzugefügt. Dabei muss ich dann auch die Zugangsdaten hinterlegen:
Test einer einfachen Benachrichtigung:
curl -u "mein-user":"mein-super-geheimes-passwort" -d "Goude?" https://push.meine-domain.de/iobroker
Und wie man bereits im oberen Screenshot sehen konnte, hatte die Nachricht funktioniert.
Unter Android und IOS sind ebenfalls Clients erhältlich. Auch hier trage ich meinen Server ein:
Damit mein Telefon mit meinem Server kommunizieren darf, muss ich auch den Benutzer konfigurieren:
Und wie ich bei der Konfiguration des NPM bereits erwähnt, beschleunigen WebSockets die Benachrichtigungen und sind darüber hinaus auch noch Energiesparsamer:
Auf der Startseite der App habe ich letztlich das Thema iobroker
hinzugefügt:
Und auch diese Nachricht kam in Echtzeit an:
Praktische Anwendung
Ich habe bereits über mein Realtime-Monitoring berichtet. Doch dies hatte ich damals über einen Telegram-Bot realisiert.
Die Umstellung in Uptime-Kuma auf ntfy war extrem einfach:
Mit Apply to all existing monitors
werden auch gleich alle überwachten Services auf die neue Benachrichtigung umgestellt. Fertig.
Integration in Python-Skripte
Das Versenden per curl
haben wir ja bereits gesehen. Doch wie man mit der API interagiert ist letztlich der eigenen Fantasie überlassen. Hier ein Beispiel zur Überwachung des Festplattenspeichers in Python:
import shutil
import requests
def check_disk_usage(path, threshold=90):
total, used, free = shutil.disk_usage(path)
percent_used = (used / total) * 100
if percent_used > threshold:
message = f"Warnung: Festplatte zu {percent_used:.2f}% voll"
requests.post(
"https://push.meine-domain.de/alerts",
headers={"Title": "Festplattenwarnung", "Priority": "high"},
data=message,
auth=("mein-ntfy-username", "password-auf-ntfy")
)
check_disk_usage("/")
Entsprechende Beispiele findet man auf der Webseite von ntfy:
Fazit
Die Einrichtung eines eigenen Push-Benachrichtigungsdienstes mit ntfy bietet mir zahlreiche Vorteile in Bezug auf Datenschutz, Kontrolle und Anpassungsfähigkeit. Gerade im Bereich der IT-Security möchte ich mit Benachrichtigungen über IT-Probleme nicht russische oder amerikanische Dienstleister in Kenntnis setzen, welche meiner Systeme gerade geschwächt sind. Für mich bedeutet das Auslagern von Intelligence immer ein weiteres Risiko, das vermeidbar ist.
Diesen Gedanken sollten vielleicht auch manche Behörden beherzigen, die immer mehr Daten in die Hände von Azure, AWS und Google geben und darauf spekulieren, dass deren Gesinnung immer die gleiche bleibt. Denn was passiert, wenn Regierungen wechseln?