This release keeps the daily limits across restarts and, with PostgreSQL, shares them between servers, so a visitor gets one daily allowance in total. Each visitor's day now starts at its own time instead of midnight UTC. It also adds an experimental local admin socket.
Features:
- Daily limits (messages, e-mails, phone calls) are stored in the user database, so they survive restarts; with PostgreSQL, all servers share them. Each visitor's day starts at its own time instead of midnight UTC, and the account page and
/v1/account(stats.reset_at) show when it resets (#2131, see message limits) - Experimental local admin socket (
experimental-listen-admin-unix, off by default) that serves the admin API without credentials to whoever can open it; the shipped systemd unit setsRuntimeDirectory=ntfyfor it (see admin socket) - Export
ntfy_db_upper PostgreSQL pool, and health-check the primary like the replicas (#2133)
Upgrade notes:
- Everyone's daily counts start over at the upgrade: the
stats_*columns of the user table are zeroed and no longer used - Servers that share a PostgreSQL database must keep their clocks in sync (NTP)
- Visitors without a tier have a daily e-mail limit again (24h /
visitor-email-limit-replenish) - The whole server config is checked again when
base-urlor amessage-size-limitabove 4K is set, so an invalid config that used to start now fails at startup (#1969, thanks to @mikejgray for the contribution)
Bug fixes + maintenance:
- Web app: Messages replayed by a poll or a reconnect no longer bring back deleted notifications, lose their read state or notify again (#2098, #2090, thanks to @mattford63, @arminus and @tobykaspar79 for reporting)
- CLI:
ntfy pub --wait-pidnow waits for processes owned by other users instead of failing with "not running" (#1710, thanks to @bekoeppel for the contribution) - Admin API (internal): manage other users' tokens, tiers and password reset links, return 4xx instead of 500 for invalid input, and remove a deleted user's web push subscriptions