fix(ci): health-probe the address the API actually binds, not loopback
deploy / build (push) Successful in 6m51s
deploy / deploy-web (push) Successful in 5s
deploy / deploy-api (push) Successful in 15s

The probe curled 127.0.0.1:25864 and got connection-refused against a daemon
that was running perfectly — the journal it captured on failure showed it
serving. The API binds the host's *mesh* address by design: the fleet has one
firewalld default zone, so a wildcard bind plus the named service would publish
it on every address the host carries, and the edge proxy is at another site, so
loopback-only would not serve the site at all.

`hostname -f` resolves to that mesh address, so the probe needs no value carried
between steps. Verified against the running service: loopback refuses, the FQDN
returns 200.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MSDYiibCtELsrjQq6KXnoi
This commit is contained in:
2026-09-04 13:48:14 +03:00
co-authored by Claude Opus 5
parent 151a30ae1a
commit 3db86cfc66
+9 -1
View File
@@ -256,7 +256,15 @@ jobs:
run: |
set -euo pipefail
for attempt in $(seq 1 30); do
if ssh "$API_HOST" "curl -sf http://127.0.0.1:$API_PORT/v1/healthz" > health.json; then
# NOT 127.0.0.1. The API binds the host's *mesh* address, never
# loopback and never 0.0.0.0 — the fleet has one firewalld default
# zone, so a wildcard bind plus the named service would publish it
# on every address the host carries, and the edge proxy is at
# another site so loopback-only would not serve it at all. Probing
# loopback therefore gets connection-refused against a perfectly
# healthy daemon. `hostname -f` resolves to the mesh address, so
# this needs no value carried between steps.
if ssh "$API_HOST" "curl -sf http://\$(hostname -f):$API_PORT/v1/healthz" > health.json; then
cat health.json
# `healthy` covers the database. Chain reachability is
# deliberately not part of it: a chain configured before it