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
spatterlight and Claude 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