Docker, CI/CD e Coolify: uma fábrica automatizada de releases

Docker, CI/CD e Coolify: uma fábrica automatizada de releases

Atualizado: 14 min de leitura
  • Docker
  • CI/CD
  • Coolify
  • DevOps
  • Laravel
  • WordPress

Imagine uma fábrica em que cada produto sai com o mesmo molde, a mesma etiqueta e um controle de qualidade antes de chegar ao cliente. Isso é um bom pipeline de Docker + CI/CD + Coolify: não “subir na mão o que funcionou no meu laptop”, e sim um processo repetível que transforma código em um release confiável.

Este artigo explica, em linguagem clara e com passos concretos, como fazer deploy de APIs Laravel, apps Node e sites WordPress containerizados. Serve a donos de produto que querem menos incidentes, e a times técnicos que precisam de um runbook real — não só um Dockerfile solto.

Por que importa para o negócio

Cada deploy improvisado é risco: um pagamento que para de cobrar, um formulário que cai numa sexta, ou um rollback impossível porque ninguém lembra qual versão está rodando. Um pipeline bem feito reduz o tempo de saída, torna o staging crível e transforma o deploy numa operação mensurável — não num ritual de madrugada.

  • Menos “funciona na minha máquina”: o mesmo artefato é testado e promovido.
  • Rollback previsível: você volta à tag anterior em minutos, sem adivinhar.
  • Auditoria: você sabe qual commit está em produção e quem o promoveu.
  • Escala do time: um júnior consegue fazer deploy sem quebrar o ritual do sênior.

Conceitos-chave (simples + técnicos)

Docker: a caixa lacrada

O Docker empacota o app com suas dependências numa imagem. Pense num contêiner de carga: o cais (servidor) pode mudar, o conteúdo viaja igual. Tecnicamente: camadas, Dockerfile multi-stage e um runtime sem toolchain de build nem segredos.

CI/CD: a linha de montagem

CI (integração contínua) valida cada mudança: lint, testes, build. CD (entrega/deploy contínuo) leva o artefato ao staging e, com portões de qualidade, à produção. O Coolify brilha no deploy (SSL, variáveis, reinícios); o CI continua no GitHub Actions, GitLab CI ou outro runner.

Tags imutáveis vs latest

Marcar só como latest é como colocar “versão atual” numa caixa sem número de lote. Use registry/app:gitsha: você sabe exatamente o que roda e pode redeployar esse digest.

PeçaAnalogiaO que faz na prática
Imagem DockerProduto empacotadoMesmo binário/artefato em staging e prod
Pipeline CIControle de qualidadeLint, testes, scan, build
CoolifyArmazém + envioDeploy, SSL, env vars, healthcheck
Tag SHANúmero de loteRollback exato e rastreabilidade

Guia prático: pipeline mínimo

  1. PR: lint + typecheck + testes unitários (e e2e críticos se houver checkout).
  2. Build multi-stage: deps → build → runtime pequeno.
  3. Tag imutável: registry/app:gitsha (nunca só latest).
  4. Scan básico da imagem (CVEs óbvias, usuário root, segredos em camadas).
  5. Deploy em staging no Coolify com as mesmas variáveis (valores diferentes).
  6. Smoke / healthcheck: rota barata que verifique app + DB.
  7. Promote para produção do mesmo digest/tag — sem rebuild diferente.

Multi-stage para Laravel / Node

  • deps: Composer/npm com cache de camadas ordenadas.
  • build: npm ci + npm run build, php artisan optimize, assets.
  • runtime: usuário não-root, sem toolchain, sem .env embutido.
  • Permissões corretas em storage e bootstrap/cache (Laravel).

WordPress no Docker

  • Volume persistente para wp-content/uploads.
  • Segredos via env / wp-config gerado em runtime — nunca na imagem.
  • Object cache (Redis) como serviço separado quando o tráfego exigir.
  • Multisite: domínios, cookies e paths documentados.
  • Backup de DB + uploads antes de updates maiores.

Configuração no Coolify

  • Variáveis e secrets fora do Dockerfile.
  • Healthcheck real (HTTP 200 numa rota estável, não só “o processo existe”).
  • Domínio apex canônico; www com redirect 301.
  • SSL Let's Encrypt nos dois hosts.
  • Staging e produção separados; restart policies e logs acessíveis.

Erros comuns

  • Rebuild diferente em prod: você não sabe mais o que roda nem como reproduzir o bug.
  • Healthcheck em / com redirect 301 → loop de unhealthy.
  • Volumes do WordPress com dono root → uploads quebrados.
  • Rodar migrate --force duas vezes em paralelo.
  • Esquecer o worker de filas: a web responde, os webhooks não processam.
  • Segredos no Git ou em camadas Docker “por comodidade”.

Checklist pré-produção

  • Tag = git SHA (não só latest).
  • Secrets ausentes do repo e das camadas Docker.
  • Healthcheck verde em staging com a mesma imagem.
  • Migrações ensaiadas + backup recente.
  • Apex / www e SSL verificados.
  • Workers e cron vivos depois do deploy.
  • Plano de rollback escrito (redeploy do SHA anterior).
  • Nomes de variáveis alinhados entre staging e prod; valores diferentes.

Um checkout mal implantado é uma bomba. O pipeline conecta com pagamentos e auditoria de segurança .

Perguntas frequentes

O Coolify substitui um pipeline de CI?

Não por completo. O Coolify brilha em deploy, SSL, variáveis e reinícios. O CI (lint, testes, build) continua no GitHub Actions, GitLab CI ou outro runner. O habitual é combinar: o CI produz o artefato; o Coolify o executa.

Dá para colocar WordPress no Docker?

Sim, com cuidado: volumes para uploads, permissões corretas e nunca deixar segredos na imagem. Para sites muito simples às vezes não vale a pena; para times que já vivem em containers, sim.

Por que evitar a tag latest em produção?

Porque `latest` se move. Uma tag com git SHA permite rollback exato e responde “qual commit está em prod?” sem arqueologia.

Como tratar as migrações de banco de dados?

Como passo explícito e controlado do release, com backup recente e ensaio em staging. Não como “alguém roda artisan na mão em produção” sem registro.

O que o healthcheck deve incluir?

Uma rota barata que confirme que o app responde e, se aplicável, que o DB está alcançável. Evite bater numa home com redirects ou numa página que depende de um CDN lento.