Reconnaissance done 2026-09-06, before the v0.20.0 Delving/HN post. RUNBOOK.md §7 lists what must be closed before a public write endpoint is announced. One item does not fit the architecture as written.
What §7 assumes vs what exists
§7 says: "If the coordinator is a separate box, set COORD_BIND to its private-network IP (not 0.0.0.0) and firewall :8899 to the web box."
There is no private network. The coordinator's interfaces are:
lo 127.0.0.1/8
eth0 152.53.93.164/22 <- public
docker0 172.17.0.1/16
The web box (83.136.255.218) proxies to the coordinator over the public internet. So:
COORD_BIND=127.0.0.1 would break the proxy — the board would go dark
- there is no private IP to bind to instead
COORD_BIND=0.0.0.0 is currently the only workable value
What is actually protecting it
Measured, with a working control:
| probe |
result |
152.53.93.164:8899 |
curl_exit=28 — timed out, i.e. filtered |
152.53.93.164:9110 |
curl_exit=7 — refused |
bitcoinghost.org/hazync/api/meta (control) |
http=200 — the probe method works |
So a provider-level filter drops :8899 from arbitrary hosts while allowing the web box. That is real protection, but it is one layer, and it is not ours — ufw is inactive and iptables INPUT is empty on the host.
Proposed
- Host firewall allowing
:8899 only from the web box's egress address — defence in depth that does not need a private network, and survives a provider-side rule changing.
- Keep
COORD_BIND=0.0.0.0 and correct §7's wording, which currently prescribes something impossible on this topology.
- The rest of §7 (nginx
limit_req/limit_conn, the 1s /api/state micro-cache, client_max_body_size 8m, TRUSTED_PROXIES) applies on the web box and is unaffected.
⚠ Not changed yet, deliberately: altering live network access mid-release risks the board. Do it with the cutover restart, when the coordinator is already down.
Blocks: the Delving/HN post. An anonymous GET flood on /api/state is, in §7's own words, "the cheapest board-takedown".
Reconnaissance done 2026-09-06, before the v0.20.0 Delving/HN post.
RUNBOOK.md§7 lists what must be closed before a public write endpoint is announced. One item does not fit the architecture as written.What §7 assumes vs what exists
§7 says: "If the coordinator is a separate box, set
COORD_BINDto its private-network IP (not0.0.0.0) and firewall:8899to the web box."There is no private network. The coordinator's interfaces are:
The web box (83.136.255.218) proxies to the coordinator over the public internet. So:
COORD_BIND=127.0.0.1would break the proxy — the board would go darkCOORD_BIND=0.0.0.0is currently the only workable valueWhat is actually protecting it
Measured, with a working control:
152.53.93.164:8899curl_exit=28— timed out, i.e. filtered152.53.93.164:9110curl_exit=7— refusedbitcoinghost.org/hazync/api/meta(control)http=200— the probe method worksSo a provider-level filter drops
:8899from arbitrary hosts while allowing the web box. That is real protection, but it is one layer, and it is not ours —ufwis inactive andiptables INPUTis empty on the host.Proposed
:8899only from the web box's egress address — defence in depth that does not need a private network, and survives a provider-side rule changing.COORD_BIND=0.0.0.0and correct §7's wording, which currently prescribes something impossible on this topology.limit_req/limit_conn, the 1s/api/statemicro-cache,client_max_body_size 8m,TRUSTED_PROXIES) applies on the web box and is unaffected.⚠ Not changed yet, deliberately: altering live network access mid-release risks the board. Do it with the cutover restart, when the coordinator is already down.
Blocks: the Delving/HN post. An anonymous GET flood on
/api/stateis, in §7's own words, "the cheapest board-takedown".