Skip to content

Notifications (Gotify + Apprise + Loggifly)

TL;DR / when to use this: A self-hosted push stack: Gotify as the notification server (phone app + API), Apprise as the multi-provider bridge, Loggifly as the log-watcher that fires notifications from container logs, and ntfy as the lighter alternative. Use Gotify when you want app notifications from Radarr/Sonarr/Jellyseer/Authentik with full control; use ntfy when you just need topic-based pub/sub.

Architecture

apps (Arrs, Jellyseer, Authentik, containers)
        │
        ├── direct Gotify app tokens
        ├── Apprise (bridges to Gotify / email / etc.)
        └── Loggifly (watches docker logs, matches keywords)
                │
              Gotify ──> phone app / web UI

Gotify

Standard docker-compose install with env config (see config docs):

services:
  gotify:
    image: gotify/server
    container_name: gotify
    ports:
      - 2212:80
    volumes:
      - './data:/app/data'
    user: "1000:1000"
    environment:
      GOTIFY_SERVER_PORT: 80

Create an app per client in the Gotify UI (one for Radarr, one for Sonarr, etc.) — each gets its own token. Test:

curl -X POST "http://<server>:2212/message?token=<app-token>" -d '{"title":"test","message":"hello"}'

Gotify token handling

When wiring Gotify into other stacks, pass the token as an env var and keep the base URL token-free (GOTIFY_URL=/message, GOTIFY_TOKEN appended as ?token=) — some clients append the query themselves and double-token URLs break.

Apprise

Install Apprise alongside Gotify; it accepts Gotify URLs (gotify://host:port/token) so any app that supports Apprise can target Gotify, and it can fan out to other providers. Both stateless (URL-only) and stateful (keyfile) setups are covered in the full post.

  • Arr apps: point Radarr/Sonarr/Lidarr at an Apprise URL (public domain via Pangolin or Cloudflare).
  • Jellyseer / Beszel: native webhook → Apprise or Gotify.
  • Authentik: use notification transports with webhook body/header mappings (see Authentik).

Loggifly

Loggifly watches Docker container logs and pushes Gotify messages on keyword matches — the glue for services with no native notification support. Config is a simple TOML/YAML with monitored keywords per container; the full config example is in the post.

ntfy (lighter alternative)

ntfy is topic-based pub/sub with a phone app. For a private server, set in server.yml:

auth-file: "/var/lib/ntfy/user.db"
auth-default-access: "deny-all"

Then create an admin user and an access token inside the container:

docker exec -it ntfy sh
ntfy user add --role=admin <username>
ntfy token add <username>      # non-expiring token for pushes

Subscribe to a test topic from your devices and push with the token.

See also