4690 Commits
Author SHA1 Message Date
Philipp C. Heckel 59f9931f0f Merge pull request #2171 from binwiederhier/ws-drain-close
Do not count WebSockets closed by a drain as 500 errors
2026-11-03 21:33:56 -05:00
binwiederhier f9dd78eecc Release note link 2026-11-04 02:28:24 +00:00
binwiederhier 3613166d1e Do not count WebSockets closed by a drain as 500 errors 2026-11-04 02:28:18 +00:00
Philipp C. Heckel 05109571fd Merge pull request #2169 from binwiederhier/release-2380
Release notes for v2.37.2, install docs for v2.37.2
v2.37.2
2026-11-03 20:22:12 -05:00
binwiederhier bb8976dfc0 Make the release v2.37.2 instead of v2.38.0
Claude-Session: https://claude.ai/code/session_01DeXuhSjq5Gta5qPJgSceFe
2026-11-04 01:19:07 +00:00
binwiederhier f89ceb0ada Revert "Drop the experimental- prefix from the cluster and admin socket options" (#2154)
Not in the v2.37.2 patch release; it comes back in a separate PR for the next feature release.

Claude-Session: https://claude.ai/code/session_01DeXuhSjq5Gta5qPJgSceFe
2026-11-04 01:19:07 +00:00
binwiederhier ac0c3c4a18 Release notes for v2.38.0, install docs for v2.38.0
Claude-Session: https://claude.ai/code/session_01DeXuhSjq5Gta5qPJgSceFe
2026-11-04 01:14:04 +00:00
binwiederhier 6db70ed568 Revert "Listen for clients without TCP keep-alive probes" (#2152)
Without the probes and without an http.Server IdleTimeout, an idle keep-alive connection from a client that silently went away (a phone switching networks) stays open until ntfy restarts. The probes come back as they were; a version with probe timing above the keepalive interval follows in a separate PR.

Claude-Session: https://claude.ai/code/session_01DeXuhSjq5Gta5qPJgSceFe
2026-11-03 23:04:56 +00:00
Philipp C. Heckel 75857d28bb Merge pull request #2159 from binwiederhier/pg-tcp-timeout
Give up on a database connection after 30s without an acknowledgment
2026-11-03 17:48:27 -05:00
Philipp C. Heckel 4b734449db Merge pull request #2149 from 0xzerolight/add-topic-watch
docs: add Topic Watch to integrations
2026-11-03 17:01:02 -05:00
0xzerolight 9fb928c7a2 docs: add Topic Watch to integrations 2026-11-03 22:55:00 +01:00
binwiederhier 41eba63c93 Merge remote-tracking branch 'origin/main' into pg-tcp-timeout
# Conflicts:
#	docs/releases.md
2026-11-03 21:01:52 +00:00
binwiederhier f7d106a73c Do not set TCP_USER_TIMEOUT on Unix sockets
The option only exists for TCP, so every connection over a socket (host=/var/run/postgresql) failed with "operation not supported".

Claude-Session: https://claude.ai/code/session_01DeXuhSjq5Gta5qPJgSceFe
2026-11-03 21:01:27 +00:00
Philipp C. Heckel 18c322a6f9 Merge pull request #2158 from spatterIight/docs/fix-mash-docs-link
docs: update MASH ntfy documentation link
2026-11-03 14:50:51 -05:00
Philipp C. Heckel 2a12cb7353 Merge pull request #2156 from binwiederhier/replica-least-busy
Send reads to the least busy replica
2026-11-03 14:50:35 -05:00
binwiederhier 6b680ef935 Wait for the least busy replica when every replica's pool is full, instead of reading from the primary
The primary takes every write, so it should not also take the reads of stalled replicas.

Claude-Session: https://claude.ai/code/session_01DeXuhSjq5Gta5qPJgSceFe
2026-11-03 18:09:38 +00:00
binwiederhier f6483d536a Link the release note to the PR 2026-11-03 16:56:41 +00:00
binwiederhier 9e94633cb4 Give up on a database connection after 30s without an acknowledgment
After a managed database node is replaced (resize, failover), queries in flight on connections to
the old node are never acknowledged, and the kernel retransmits for ~15 minutes before the
connection fails. On 2026-11-03 that held ~40 pool slots per replica for ~25 minutes after each
replica resize. TCP_USER_TIMEOUT bounds unacknowledged data to 30s on Linux.
2026-11-03 16:56:25 +00:00
spatterlightandClaude Opus 5.5 c30d6eb23d docs: update MASH ntfy documentation link
MASH moved each service's documentation into its component directory, so docs/services/ntfy.md now 404s.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 11:09:16 -05:00
binwiederhier 3140f7a7de Link the release note to the PR 2026-11-03 14:01:55 +00:00
binwiederhier b2b1fc1f71 Send reads to the least busy replica, and export each database's health check time
A stalled replica piles up connections in use, so reads go to the replica with the fewest
connections in use instead of round-robin, and to the primary when every replica's pool is
full. ntfy_db_ping_seconds shows how long each database took to answer its health check.
2026-11-03 14:01:34 +00:00
Philipp C. Heckel 8ed8684feb Merge pull request #2154 from binwiederhier/cluster-flags
Drop the experimental- prefix from the cluster and admin socket options
2026-11-02 22:51:44 -05:00
binwiederhier 24b57cc57f server.yml: drop the EXPERIMENTAL labels on the clustering and admin socket sections
Claude-Session: https://claude.ai/code/session_01DeXuhSjq5Gta5qPJgSceFe
2026-11-03 03:50:39 +00:00
binwiederhier 6d613e1781 Merge remote-tracking branch 'origin/main' into cluster-flags
# Conflicts:
#	docs/config.md
#	docs/releases.md
2026-11-03 03:49:04 +00:00
Philipp C. Heckel c0111091fd Merge pull request #2153 from binwiederhier/cluster-status-self
ntfy cluster status: this node as the table's first row
2026-11-02 22:46:08 -05:00
binwiederhier 92d620fb12 Link the PR in the release note
Claude-Session: https://claude.ai/code/session_01DeXuhSjq5Gta5qPJgSceFe
2026-11-03 03:31:57 +00:00
binwiederhier 39c5ef99f9 Drop the experimental- prefix from the cluster and admin socket options
cluster-listen, cluster-secret, cluster-node-id, cluster-advertise-url, cluster-role, cluster-batch-linger, cluster-drain-delay, cluster-drain-duration and listen-admin-unix (env NTFY_CLUSTER_*, NTFY_LISTEN_ADMIN_UNIX). The old names, YAML keys and environment variables stay as aliases, so existing configs keep working.

Claude-Session: https://claude.ai/code/session_01DeXuhSjq5Gta5qPJgSceFe
2026-11-03 03:31:48 +00:00
binwiederhier 4365e8b379 Release note for the cluster status layout
Claude-Session: https://claude.ai/code/session_01DeXuhSjq5Gta5qPJgSceFe
2026-11-03 03:29:39 +00:00
binwiederhier f60ed55b5a ntfy cluster status: this node as the table's first row
Claude-Session: https://claude.ai/code/session_01DeXuhSjq5Gta5qPJgSceFe
2026-11-03 03:29:15 +00:00
Philipp C. Heckel 547b0e9d45 Merge pull request #2144 from joexk1/docs-wudland-integration
docs: add Wudland to community projects
2026-11-02 22:16:27 -05:00
Philipp C. Heckel 94be840859 Merge pull request #2152 from binwiederhier/tcp-keepalive
Listen for clients without TCP keep-alive probes
2026-11-02 22:13:35 -05:00
binwiederhier 1ebe3faf18 Remove the TCP keep-alive test
Claude-Session: https://claude.ai/code/session_01DeXuhSjq5Gta5qPJgSceFe
2026-11-03 03:12:21 +00:00
binwiederhier aaab76a594 Move listenTCP to util.go and its test to util_test.go; release note under v2.38.0
Claude-Session: https://claude.ai/code/session_01DeXuhSjq5Gta5qPJgSceFe
2026-11-03 03:10:36 +00:00
binwiederhier 07ead53570 Listen for clients without TCP keep-alive probes
Go sends a TCP keep-alive probe every 15s on an idle accepted connection by default. To a phone holding a stream, each is a radio wake-up on top of ntfy's own keepalive event every 45s, which already keeps the connection alive and finds dead ones. Matters where clients connect to ntfy directly; behind nginx, only the proxy's upstream connections had them.

Claude-Session: https://claude.ai/code/session_01DeXuhSjq5Gta5qPJgSceFe
2026-11-03 03:05:51 +00:00
Philipp C. Heckel e7eb45e2e9 Merge pull request #2151 from binwiederhier/topic-touch
Write a UnifiedPush topic's subscriber activity about once an hour, spread over time
v2.37.1
2026-11-02 13:02:14 -05:00
binwiederhier 644e84acb0 Release notes for v2.37.1, install docs for v2.37.1
Claude-Session: https://claude.ai/code/session_01DeXuhSjq5Gta5qPJgSceFe
2026-11-02 18:01:12 +00:00
binwiederhier 43a26501b9 Advance by the topic's own touch interval in the tests that touch after an hour
Claude-Session: https://claude.ai/code/session_01DeXuhSjq5Gta5qPJgSceFe
2026-11-02 18:01:06 +00:00
binwiederhier 858af8c6ad Write a topic's subscriber activity every one to two hours instead of every 30 to 60 minutes
Claude-Session: https://claude.ai/code/session_01DeXuhSjq5Gta5qPJgSceFe
2026-11-02 17:59:00 +00:00
binwiederhier 3000245ad6 Link the PR in the v2.37.1 release note
Claude-Session: https://claude.ai/code/session_01DeXuhSjq5Gta5qPJgSceFe
2026-11-02 17:52:02 +00:00
binwiederhier 799d13f6d8 Write a UnifiedPush topic's subscriber activity about once an hour, spread over time
v2.37.0 wrote every topic with an open stream every 5 minutes, and the topics touched together after a restart stayed in step, so ntfy.sh wrote ~45k topic rows in the same minute every 5 minutes (~145 rows/s on average, more than the message inserts), stalling the primary. Each topic now has its own interval between 30 and 60 minutes (by hash), and a subscribe or poll that only repeats the same rate visitor is a touch.

Claude-Session: https://claude.ai/code/session_01DeXuhSjq5Gta5qPJgSceFe
2026-11-02 17:51:41 +00:00
Philipp C. Heckel ad162eea0a Merge pull request #2148 from binwiederhier/release-v2370
Release notes and install docs for v2.37.0
v2.37.0
2026-11-02 08:13:53 -05:00
binwiederhier 51d23183d8 Link the PRs in the v2.37.0 release notes 2026-11-02 01:45:36 +00:00
binwiederhier 400f39505e Release notes for v2.37.0, install docs for v2.37.0 2026-11-02 01:31:13 +00:00
Philipp C. Heckel 5a52d476f7 Merge pull request #2136 from binwiederhier/up-payer
UnifiedPush across nodes: shared rate visitors in a new topic table, 410 Gone for abandoned topics
2026-11-01 20:30:15 -05:00
binwiederhier c795ba4fd7 server.yml: rewrap the clustering note 2026-11-02 01:26:27 +00:00
binwiederhier 666c63700c server.yml: the tail recovers messages a node misses 2026-11-02 01:26:16 +00:00
binwiederhier 750e5f49c6 Bring the example server.yml up to date: ban defaults, database-replica-urls, shared daily limits
ban-window defaults to 10m and ban-weights to 42909:2, 50701:0.05 and 41002:0.05 (weights may be fractional); database-replica-urls was missing; the cluster note now says daily limits are shared.
2026-11-02 01:25:18 +00:00
binwiederhier 4f1f62b0b5 Rename RecordRefused to Refused 2026-11-02 01:23:04 +00:00
binwiederhier 7250c3d474 Weigh the abandoned-topic 410 like the UnifiedPush 507 in the ban feed (0.05) 2026-11-02 01:15:26 +00:00
binwiederhier bfb257b3eb Merge remote-tracking branch 'origin/main' into up-payer
# Conflicts:
#	cmd/serve_test.go
#	docs/releases.md
2026-11-02 01:15:09 +00:00