526e0f280a
Enabling Docker took three steps because the production image runs as `node` and the socket is mode 660 root:docker, so a matching group was required. The group id is host-specific — 0 on Docker Desktop, commonly 999 on Debian/Ubuntu, 993 on Amazon Linux 2023 — and a wrong value is a silent EACCES that shows up as "Docker never appears in the dashboard". There is no value that is right everywhere, so there is no default to ship. The container can read it off the socket. The runner stage no longer sets `USER node`; a new entrypoint starts as root, takes the socket's group with `stat -c %g`, joins it, and execs the command through `su-exec node`. The app process is still `node` and `tini` is still PID 1. With no socket mounted it drops to `node` and does nothing else, and a deployment that pins `user:` is left alone. `group_add` and `DOCKER_GID` are gone from all five compose files, `.env.example`, the docs in four languages, the dashboard guide (three steps to two) and the not-configured API message. Uncommenting one volume line is now the whole edit. The mount stays opt-in: the socket is root-equivalent on the host, and on by default would hand every deployment's backend the ability to take over its host whether or not it uses compute. Verified on a build of `target: runner` — no socket: uid 1000; socket at gid 0: joins root, writable; socket at gid 999 with the group already present: joins it, writable; and the old `USER node` path with no entrypoint: denied, which is the failure the removed step existed to avoid. Then end to end from that image against a live database: provider ready, metadata slice present, a service created and serving on its published port. Also batches the compute logs limiter test. 120 sequential requests overran the 10s timeout on a busy machine and 120 simultaneous ones had connections dropped; ten in flight is neither, and the assertion is by count rather than position. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>