v0.9.1 — Docker Socket Proxy + graceful shutdown + launch como processo único
Melhorias de segurança e resiliência do control-plane. Em produção em litedock.morenadoaco.com.br.
🔐 Docker Socket Proxy (Tecnativa)
O Node (dockerode) e o worker Python falam com a Docker Engine por um proxy de superfície mínima (docker-compose.socket-proxy.yml, loopback 127.0.0.1:2375) em vez do socket cru.
- Liberado só o que o LiteDock usa: containers, networks, images (+POST) e info/version/events/ping.
- Bloqueado (403):
exec,secrets,swarm,nodes,services,plugins,build,volumes. - Ligado por toggle: API via
LITEDOCK_DOCKER_PROXY; worker viaDOCKER_HOST=tcp://proxy. O build (que o proxy bloqueia de propósito) sempre usa o socket real viaDOCKER_REAL_SOCKET. - Nota: o proxy filtra por área+método, não por path/label — mata a superfície catastrófica (exec/secrets/swarm), mas não isola os containers de produção de um painel comprometido (isso exige daemon/VPS separados).
🔄 Graceful shutdown de deploys
Reconciliação em duas camadas: no boot (cobre crash duro) e no encerramento por sinal (SIGTERM/SIGINT).
- Deploys presos (
queued/building/deploying) viramfailed. - Containers temporários órfãos do blue-green (
*__deploy-*) são removidos.
🐛 Correção de raiz: launch como processo único
O pm2 rodava npm run start, e o npm engolia os sinais — o graceful shutdown nunca recebia SIGINT, e processos node netos ficavam órfãos segurando a porta 8088 com código antigo enquanto o processo gerenciado entrava em crash-loop por EADDRINUSE.
- Agora a API roda como processo único via
ecosystem.config.cjs(node --import tsx src/server.ts,kill_timeout: 12s). - O sinal chega direto no handler e não há mais órfãos.
pm2 savepersiste pra sobreviver a reboot da VPS.