Coolify's docker compose workdir doesn't always resolve ./config.yaml,
so Docker silently created the mount target as a directory, breaking
runner startup with 'is a directory'. Embed the config in the compose
file via the configs: top-level key — no external file dependency.
act_runner's defaults autodetect its own container IP as the cache
host, which per-job networks can't route to — every actions/cache
restore and save hit a 5-minute ETIMEDOUT. Add a config.yaml that
pins the cache port and advertises host.docker.internal, publish
that port on the host, and inject --add-host=host-gateway into
job containers so the hostname resolves inside isolated networks.