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 sets RuntimeDirectory=ntfy for it (see admin socket)
Export ntfy_db_up per 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-url or a message-size-limit above 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-pid now 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
Source GitHub