Topology
- Image:
binwiederhier/ntfy, swarm stack pinned todebian-2(lightweight node). - Ingress:
https://ntfy.augustin.aivia Traefik (port 80 on the overlay). - Internal publish: other swarm services post to
http://ntfy/<topic>directly on theswarmoverlay — no round-trip through Cloudflare. - State:
./dataholds the message cache (NTFY_CACHE_DURATION=12h) and attachments.
Publishing
Tags (ntfy renders matching shortcodes like canoe as 🛶); the message body is UTF-8 and takes anything.
Subscribing
In the ntfy app (iOS/Android) or browser, add serverhttps://ntfy.augustin.ai and the topic name (e.g. river-permits).
iOS instant delivery needs NTFY_UPSTREAM_BASE_URL=https://ntfy.sh (set in the compose file): self-hosted servers can’t reach Apple’s push network, so poll requests — topic name only, never message content — are forwarded through ntfy.sh, which triggers APNs. Android and desktop use the WebSocket connection and ignore this.
Access control
Open by default — anyone who knows a topic name can read and write it. To lock down, addNTFY_AUTH_FILE with NTFY_AUTH_DEFAULT_ACCESS=deny-all and provision users via the ntfy user/ntfy access CLI.
Monitoring
Health endpoint:http://ntfy:80/v1/health.