Skip to content

v0.9.1 — Docker Socket Proxy + graceful shutdown + launch como processo único

Choose a tag to compare

@AlexandreAlan AlexandreAlan released this 24 Jun 11:21

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 via DOCKER_HOST=tcp://proxy. O build (que o proxy bloqueia de propósito) sempre usa o socket real via DOCKER_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) viram failed.
  • 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 save persiste pra sobreviver a reboot da VPS.