Zum Inhalt

Gotify per Docker installieren: Private Push-Benachrichtigungen für Server und Smart Home

Veröffentlicht am 16. Oktober 2026 · Geschätzte Lesezeit: 7 Minuten

Gotify ist ein schlanker Open-Source-Push-Server, der Nachrichten von Skripten, Cronjobs, Backups oder Smart-Home-Diensten per REST-API entgegennimmt und über WebSocket an Browser oder die offizielle Android-App weiterleitet.[1] Jede Nachrichtenquelle bekommt einen eigenen Application Token. Clients (Web-UI, Android-App) empfangen die Meldungen in Echtzeit – kein Drittanbieter, keine Cloud. Die Installation mit Docker Compose dauert etwa 25 Minuten. Im Anschluss sendest du die erste Testnachricht per curl.[4]

Voraussetzungen

  • Ein Linux-Server mit Docker und Docker Compose (Plugin)
  • Terminal-Zugriff mit sudo-Rechten
  • Port 8080 im Heimnetz frei
  • Die feste LAN-IP deines Docker-Hosts (für den späteren Zugriff)
  • Ein Android-Gerät (optional, für die offizielle App)

1. Projektverzeichnis und Passwort-Datei anlegen

Lege einen geschützten Ordner für Gotify an. Das Admin-Passwort wird in einer separaten Datei gespeichert und nie in die Compose-Datei geschrieben:

mkdir -p ~/docker/gotify/secrets
cd ~/docker/gotify

Erzeuge ein sicheres Zufallspasswort und schütze die Datei vor unbefugtem Lesen. umask 077 stellt sicher, dass die Datei nur für den eigenen Benutzer lesbar ist:

umask 077
openssl rand -base64 20 > secrets/admin_password.txt
chmod 600 secrets/admin_password.txt

Die Datei secrets/admin_password.txt enthält jetzt genau eine Zeile mit dem Initialpasswort. Notiere es nicht zusätzlich – du liest es beim ersten Login aus dieser Datei aus.

2. docker-compose.yml anlegen

Erstelle die Datei docker-compose.yml im Verzeichnis ~/docker/gotify. Gotify hat keine externen Abhängigkeiten – kein separater Datenbankserver, kein Cache. Ein Container, ein Volume:[1]

services:
  gotify:
    image: gotify/server:3.1.1
    container_name: gotify
    restart: unless-stopped
    ports:
      - "${BIND_IP}:8080:80"
    environment:
      TZ: "${TZ}"
      GOTIFY_DEFAULTUSER_PASS_FILE: /run/secrets/admin_password
    volumes:
      - gotify_data:/app/data
    security_opt:
      - no-new-privileges:true

secrets:
  admin_password:
    file: ./secrets/admin_password.txt

volumes:
  gotify_data:

Die wichtigsten Details:

  • image: gotify/server:3.1.1 – Gepinnte Version statt latest, damit ein Update nicht unerwartet die Konfiguration ändert. Version 3.1.1 war bei Veröffentlichung dieser Anleitung die aktuelle stabile Version.[6] Prüfe vor dem ersten Start, ob eine neuere Version auf GitHub Releases verfügbar ist.
  • ports: "${BIND_IP}:8080:80" – Der Host-Port 8080 wird nur auf einer bestimmten LAN-IP veröffentlicht (konfiguriert in der .env-Datei). Kein 0.0.0.0, kein Zugriff von außerhalb des Heimnetzes.
  • GOTIFY_DEFAULTUSER_PASS_FILE: /run/secrets/admin_password – Das _FILE-Suffix teilt Gotify mit, das Passwort aus einer Datei zu lesen.[2] So bleibt das Geheimnis aus der Compose-Datei und aus Umgebungsvariablen in docker compose ps heraus.
  • no-new-privileges:true – Verhindert, dass Prozesse im Container höhere Rechte anfordern können.[5]
  • volumes: gotify_data:/app/data – Ein benannter Volume statt eines Host-Ordners für die persistente SQLite-Datenbank. Das ist die einfachste Variante, die Daten später zu sichern.

3. .env-Datei anlegen

Damit die IP-Adresse und Zeitzone nicht fest in der Compose-Datei stehen, legst du eine .env-Datei an:[1]

cat > .env << 'EOF'
BIND_IP=192.168.178.20
TZ=Europe/Berlin
EOF

Ersetze 192.168.178.20 durch die tatsächliche feste LAN-IP deines Docker-Hosts. Ist noch keine DHCP-Reservierung eingerichtet, vergib eine statische IP im Router oder stelle den Dienst mit 127.0.0.1 nur lokal bereit.

4. Konfiguration validieren und starten

Prüfe die Compose-Datei auf Syntaxfehler. Achte darauf, dass das Passwort selbst nicht im Output auftaucht – es erscheint nur der Secret-Dateipfad:

docker compose config

Lade das Image herunter und starte Gotify:

docker compose pull
docker compose up -d

Prüfe, ob der Container läuft:

docker compose ps

Sieh dir die letzten Log-Meldungen an. Erwartet wird ein sauberer Start ohne Datenbank- oder Berechtigungsfehler:

docker compose logs --tail=50 gotify

5. Erstanmeldung

Gotify erstellt beim ersten Start automatisch ein Admin-Konto.[3] Lies das generierte Passwort aus der Secret-Datei:

cat ~/docker/gotify/secrets/admin_password.txt

Öffne im Browser:

http://<SERVER-IP>:8080/

Ersetze <SERVER-IP> durch die IP deines Docker-Hosts (identisch mit BIND_IP aus der .env).

Melde dich an:

  • Benutzername: admin
  • Passwort: der Inhalt aus admin_password.txt

Standard-Passwort sofort ändern

Das in der Secret-Datei gespeicherte Passwort ist das Initialpasswort. Nach der ersten Anmeldung solltest du unter Users das Admin-Passwort ändern oder ein zweites Administrator-Konto anlegen und das initiale Konto löschen.[3]

6. Application Token erstellen

Anders als bei ntfy (topic-basiert) verwendet Gotify Application Tokens: Jede Nachrichtenquelle (Backup-Skript, Cronjob, Home Assistant) bekommt ihren eigenen Token.[1]

  1. Klicke in der Web-UI auf Apps
  2. Klicke auf Create Application
  3. Gib einen Namen ein, z. B. Server-Backup oder Cronjob-Meldungen
  4. Kopiere den angezeigten Token (beginnt mit A)

Jede Anwendung erhält einen eigenen Token. Erstelle für verschiedene Zwecke separate Anwendungen – das erleichtert später die Fehlersuche.

7. Testnachricht senden

Sende die erste Nachricht mit curl. Ersetze <APPLICATION-TOKEN> durch den kopierten Token:

curl "http://<SERVER-IP>:8080/message?token=<APPLICATION-TOKEN>" \
  -F "title=Gotify läuft" \
  -F "message=Herzlichen Glückwunsch! Der Push-Server funktioniert." \
  -F "priority=5"

Die Nachricht erscheint sofort im Browser und (sobald verbunden) auf dem Smartphone.[4]

Bedeutung der Parameter:

  • title – Der Titel der Benachrichtigung (optional, wird ohne Titel leer dargestellt)
  • message – Der Nachrichtentext
  • priority – Priorität von 0 (still, keine Benachrichtigung) bis 10 (höchste Dringlichkeit, überwindet "Nicht stören" auf Android)[4]

8. Android-App verbinden (optional)

Die offizielle Gotify-Android-App ist im F-Droid-Store und auf GitHub verfügbar.[5] Nach der Installation:

  1. Gib als Server-URL http://<SERVER-IP>:8080/ ein (oder die HTTPS-Adresse mit Reverse Proxy)
  2. Melde dich mit deinem Benutzernamen und Passwort an
  3. Die App baut eine dauerhafte WebSocket-Verbindung auf

Hintergrundbetrieb auf dem Smartphone

Android beendet Hintergrundverbindungen oft nach einiger Zeit. Gehe zu Einstellungen → Apps → Gotify → Akku und setze die Optimierung auf Nicht optimieren oder Uneingeschränkt. Ohne diesen Schritt kann es passieren, dass Nachrichten auf dem Smartphone erst beim Öffnen der App ankommen.

9. Backup und Rückweg

Gotify speichert alle Daten (Benutzer, Anwendungen, Nachrichten, hochgeladene Bilder) im benannten Volume gotify_data. Sichere es regelmäßig:

cd ~/docker/gotify
docker compose down
docker run --rm -v gotify_data:/data -v "$(pwd):/backup" alpine \
  tar czf /backup/gotify-backup-$(date +%F).tar.gz -C /data .
docker compose up -d

Das Archiv enthält die SQLite-Datenbank mit allen Nachrichtentexten und muss entsprechend geschützt aufbewahrt werden.

Für den Rückweg nach einem fehlgeschlagenen Update:

docker compose down
docker compose rm -f gotify
docker volume rm gotify_gotify_data
docker compose up -d

Dann die Datenbank aus dem Backup wiederherstellen. Dazu den Container wieder stoppen, das Volume über ein temporäres Alpine-Container mounten und das Archiv einspielen.

Nachrichtentexte in der Datenbank

Gotify speichert alle Nachrichtentexte im Klartext in der SQLite-Datenbank. Wenn du vertrauliche Inhalte (Passwörter, API-Keys) per Gotify sendest, sind diese im Klartext in der Datenbank und im Backup vorhanden. Sende keine Geheimnisse über Push-Benachrichtigungen.

10. Typische Fehler

  • "address already in use" – Port 8080 ist bereits belegt. Ändere den Host-Port in der docker-compose.yml (z. B. 8081:80).
  • Oberfläche nicht erreichbar – Falsche BIND_IP in der .env. Prüfe die tatsächliche IP des Docker-Hosts mit hostname -I.
  • Container startet nicht – Rechte auf gotify_data prüfen. Lösche das Volume mit docker volume rm gotify_gotify_data und starte neu.
  • Anmeldung schlägt fehl – Das Passwort aus secrets/admin_password.txt stimmt nicht oder die Datenbank wurde bereits initialisiert. Lösche Volume und Secret-Datei und beginne neu.
  • HTTP 401 beim Senden – Falscher oder abgelaufener Application Token. Prüfe den Token in der Web-UI unter Apps.
  • Smartphone erhält nichts – Android-Akkuoptimierung blockiert die App. Setze die Akku-Optimierung wie oben beschrieben zurück. Ohne VPN funktioniert Gotify nur im Heimnetz.
  • Reverse Proxy ohne WebSocket-Weiterleitung – Gotify benötigt WebSocket (WSS) für Echtzeit-Nachrichten. Ein Reverse Proxy muss Upgrade- und Connection-Header korrekt weiterleiten.[1] Gotify stellt dafür Proxy-Beispiele bereit.

Fertig

Deine private Gotify-Instanz nimmt jetzt Nachrichten entgegen und zeigt sie im Browser und auf dem Smartphone an. Die Einrichtung funktioniert, wenn:

  1. docker compose config keine Fehler anzeigt
  2. docker compose ps den Container als running zeigt
  3. docker compose logs --tail=50 gotify keine Datenbank- oder Berechtigungsfehler enthält
  4. Die Web-UI unter http://<SERVER-IP>:8080/ erreichbar ist
  5. Die Anmeldung mit admin und dem Passwort aus der Secret-Datei gelingt
  6. Die curl-Testnachricht im Browser erscheint
  7. docker compose restart gotify den Dienst ohne Datenverlust neu startet

Quellen

[1] Gotify Installation (offiziell) – https://gotify.net/docs/install [2] Gotify Konfiguration (offiziell) – https://gotify.net/docs/config [3] Gotify Erstanmeldung (offiziell) – https://gotify.net/docs/first-login [4] Gotify Push-Nachrichten (offiziell) – https://gotify.net/docs/pushmsg [5] Docker Hub gotify/server – https://hub.docker.com/r/gotify/server [6] Gotify GitHub Releases – https://github.com/gotify/server/releases/latest