The container failed to start with 'exec ./webhooker: no such file or
directory'. Two issues:
1. Relative paths: COPY destination and CMD used relative paths (./webhooker).
Changed to absolute paths (/app/webhooker) throughout.
2. Dynamic linking: The binary was built with CGO on Debian (glibc) but
deployed to Alpine (musl). The kernel couldn't find the glibc dynamic
linker, producing the misleading 'no such file or directory' error.
Added a static rebuild step after make check so the binary runs on
Alpine without glibc.
Replace unbounded goroutine-per-delivery fan-out with a fixed-size
worker pool (10 workers). Channels serve as bounded queues (10,000
buffer). Workers are the only goroutines doing HTTP delivery.
When retry channel overflows, timers are dropped instead of re-armed.
The delivery stays in 'retrying' status in the DB and a periodic sweep
(every 60s) recovers orphaned retries. The database is the durable
fallback — same path used on startup recovery.
Addresses owner feedback on circuit breaker recovery goroutine flood.