Eigener Push-Notification-Service

Selbstgehostete Push-Benachrichtigungen mit ntfy.

Eigener Push-Notification-Service

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:

  1. Datenschutz: Alle Benachrichtigungen bleiben in meiner Kontrolle, ohne dass Drittanbieter Zugriff auf sensible Informationen erhalten.
  2. Anpassbarkeit: Ich kann den Dienst genau nach meinen Bedürfnissen konfigurieren.
  3. Integration: ntfy lässt sich nahtlos in bestehende Infrastrukturen einbinden, wie ich es selbst mit dem Nginx Proxy Manager (NPM) umgesetzt habe.
  4. 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.

Eigener Webserver mit offiziellen Zertifikaten
Der Basis-Artikel für alle folgenden Services, die ich hier demonstrieren werde…
Selfhostet Analytics
Eine selbst gehostete Alternative zu Google-Analytics

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.

Telegram kooperiert mit Behörden: Kein sicherer Hafen mehr für Kriminelle
Telegram arbeitet mit Strafverfolgungsbehörden zusammen. Pavel Durov reagiert auf den Missbrauch des Messengers für kriminelle Aktivitäten.

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.

Realtime Monitoring
Nicht nur für Sicherheitsvorfälle. Realtime ist auch bei Störungen im Haus nützlich.

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:

Sending messages - ntfy
Send push notifications to your phone via PUT/POST

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?