nginx port 80 returns 444 (no response) for requests with an unrecognised
Host header. The poller's curl sends Host: 10.100.0.10 (the IP) which
doesn't match any server_name, causing the 180s readiness timeout and
"empty reply from server" on every poll.
Since livefetch v6 builds synthetic HTML from stored properties and no
longer fetches live pages, the poller no longer needs to go through nginx.
It now connects directly to Indiekit on INDIEKIT_BIND_HOST:PORT.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Trap previously only killed the webmention poller, leaving the node process
orphaned on service stop. On restart, the new node instance would fail to bind
port 3000 (EADDRINUSE) causing 502s with clean logs.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The root /status responds before MongoDB collections and plugin routes
are fully initialised, causing 502 on the first poll. Now probes the
plugin's own /api/status which only responds once everything is ready.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The /status endpoint becomes available before all plugin routes are
fully mounted, causing a 502 on the first webmention-sender POST.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Direct connections from the node jail to itself cause empty replies in
FreeBSD jails. Route through nginx (INTERNAL_FETCH_URL=http://10.100.0.10)
instead, which also provides correct Host and X-Forwarded-Proto headers.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
FreeBSD jails often don't have loopback available. The webmention poller
and readiness check now use INDIEKIT_BIND_HOST (defaults to 127.0.0.1
for backward compat). Set INDIEKIT_BIND_HOST=10.100.0.20 in .env.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The bodyless POST (no Content-Type/Content-Length) caused curl error 52
(empty reply from server). Adding `-d ""` sends proper headers and
`--max-time 300` prevents hangs on long-running webmention processing.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- start.example.sh: replace fixed sleep 30 with /status poll loop (up to 2min)
so the webmention poller waits exactly until indiekit is ready, not longer
- indiekit.config.mjs: remove redundant webmentionIoMountPath variable and
mountPath from webmention-io config (package default /webmentions is correct)
- .env.example: remove all stale proxy and unused WEBMENTION_SENDER_* vars
(HOST, PORT, ENDPOINT, READY_TIMEOUT, STOP_TIMEOUT, AUTO_POLL) that were
never read by start.example.sh; keep only WEBMENTION_SENDER_POLL_INTERVAL
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The poller fired immediately after indiekit was backgrounded, before
the HTTP server finished initializing — causing curl error 52 (empty
reply). A 30s initial sleep gives indiekit time to become ready.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Remove complex PID tracking, readiness probe, graceful-shutdown and
daemon-parent machinery. Replace with the minimal polling loop from
the @rmdes/indiekit-endpoint-webmention-sender README: generate JWT,
POST to 127.0.0.1 (local), sleep 300s. Also drop the related tuning
vars from .env (WEBMENTION_SENDER_READY_TIMEOUT, STOP_TIMEOUT,
INDIEKIT_STOP_TIMEOUT, KILL_DAEMON_PARENT_ON_SHUTDOWN).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>