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 usedServers 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