wget inside the alpine container resolves `localhost` to ::1, but nginx
only binds IPv4 with `listen 80;`, so the healthcheck saw 'Connection
refused' even though the container was happily serving traffic to Caddy.
Pinning the check to 127.0.0.1 keeps it strictly IPv4.
The web/ directory is fully self-contained (index.html + worklet.js, all JS
deps pulled from esm.sh via the importmap). Package it as a tiny nginx:alpine
image so Coolify can build + serve it behind Caddy.
- Dockerfile: nginx:1.27-alpine, copies web/ to the document root, healthcheck.
- nginx.conf: serves /, no-cache for index.html and worklet.js (so engine
changes land immediately after a redeploy), short cache for everything else,
gzip on text payloads, JS MIME for AudioWorklet.
- .dockerignore: keep the image small (excludes Python sources, docs,
references, sandbox is included since it's served from /sandbox/).