Servidor & DevOps 33 visualizações

Como configurar um script de healthcheck para reiniciar containers travados no VPS

Ver no WHMCS

Como configurar um script de healthcheck para reiniciar containers travados no VPS

Oi! Aqui é a Sensei da GeHost 🥋 e hoje eu vou te ensinar uma mãozinha valiosa pra quem roda aplicações em containers (Docker) no seu VPS: um script de healthcheck. Ele fica de olho nos seus containers e, se algum "travar" (parar de responder, mas sem cair de vez), ele reinicia sozinho — sem você precisar acordar de madrugada pra dar um restart manual. Vamos com calma, passo a passo.

O que é um healthcheck, afinal?

Um container pode continuar "rodando" (o processo está de pé) mesmo travado por dentro — travou numa conexão de banco, ficou preso em memória, parou de responder requisições, etc. O Docker sozinho não sabe diferenciar isso de um container saudável, a menos que você ensine ele a checar. É exatamente isso que o healthcheck faz: testa periodicamente se o container está respondendo de verdade, e se não estiver, avisa (ou, com o nosso script, reinicia).

💡 Dica da Sensei: antes de sair reiniciando tudo automaticamente, é sempre bom entender por que o container está travando. Um restart automático é um bom curativo de emergência, mas se o problema se repete direto, vale investigar a causa (memória insuficiente, bug na aplicação, banco lento etc.).

Passo 1 — Acesse seu VPS via SSH

Conecte no seu servidor normalmente pelo terminal:

ssh usuario@seu-servidor

Se você tiver dúvida de qual usuário/porta usar no seu VPS, dá uma olhada nos dados de acesso que ficam no painel.gehost.com.br ou chama o suporte pra confirmar.

Passo 2 — Confira quais containers você tem rodando

Liste os containers ativos com:

docker ps

Anote o nome (ou o CONTAINER ID) dos containers que você quer monitorar. É esse nome que vamos usar no script.

Passo 3 — Garanta que o container tem um HEALTHCHECK definido

Pra esse tipo de monitoramento funcionar direitinho, o ideal é que a imagem/container já tenha uma diretiva de HEALTHCHECK configurada (no Dockerfile ou no docker-compose.yml). Um exemplo simples num docker-compose.yml:

services:
  minha-app:
    image: minha-imagem:latest
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:80/"]
      interval: 30s
      timeout: 5s
      retries: 3

Isso faz o Docker testar a cada 30 segundos se a aplicação responde. Se falhar 3 vezes seguidas, o status do container vira unhealthy — e é esse status que nosso script vai vigiar.

📌 Sem HEALTHCHECK definido? Sem problema, o script ainda funciona checando se o container simplesmente parou de rodar (status exited), só que ele não vai pegar travamentos "silenciosos" (processo de pé, mas sem responder). Se puder, vale configurar o HEALTHCHECK — fica bem mais preciso.

Passo 4 — Crie o script de vigilância

Vamos criar um arquivo chamado healthcheck-monitor.sh. Pode usar o editor que preferir (nano, vim, etc.):

nano /root/healthcheck-monitor.sh

Cole este conteúdo, trocando meu-container pelo nome real do(s) seu(s) container(s):

#!/bin/bash

CONTAINERS=("meu-container" "outro-container")
LOG="/var/log/healthcheck-monitor.log"

for CONTAINER in "${CONTAINERS[@]}"; do
  STATUS=$(docker inspect --format='{{.State.Health.Status}}' "$CONTAINER" 2>/dev/null)

  if [ "$STATUS" == "unhealthy" ]; then
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $CONTAINER está unhealthy, reiniciando..." >> "$LOG"
    docker restart "$CONTAINER" >> "$LOG" 2>&1
  fi

  # Caso o container tenha parado de vez (sem healthcheck definido)
  RUNNING=$(docker inspect --format='{{.State.Running}}' "$CONTAINER" 2>/dev/null)
  if [ "$RUNNING" == "false" ]; then
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $CONTAINER está parado, iniciando..." >> "$LOG"
    docker start "$CONTAINER" >> "$LOG" 2>&1
  fi
done

Salve o arquivo e saia do editor.

Passo 5 — Dê permissão de execução

chmod +x /root/healthcheck-monitor.sh

Passo 6 — Teste manualmente

Antes de automatizar, rode o script uma vez na mão pra ver se está tudo certinho:

/root/healthcheck-monitor.sh
cat /var/log/healthcheck-monitor.log

Se o log aparecer vazio, é sinal de que nenhum container estava travado no momento do teste — ótimo sinal! Se algo travar de propósito (pode simular parando um processo dentro do container), você deve ver a linha de "reiniciando..." no log.

Passo 7 — Automatize com o cron

Agora vamos fazer esse script rodar sozinho de tempos em tempos. Edite o crontab:

crontab -e

E adicione uma linha pra rodar, por exemplo, a cada 5 minutos:

*/5 * * * * /root/healthcheck-monitor.sh

Salve e pronto — a partir de agora, a cada 5 minutos o servidor confere a saúde dos containers listados e reinicia quem estiver travado, sem você precisar fazer nada.

Passo 8 — Acompanhe o log de vez em quando

Vale o hábito de espiar o arquivo de log de vez em quando pra entender se algum container está travando com frequência:

tail -n 50 /var/log/healthcheck-monitor.log

Se um mesmo container aparece reiniciando toda hora, isso é um sinal de alerta — o restart automático está "tampando" um problema que merece ser investigado (uso de memória, configuração da aplicação, dependência externa, etc.).

🌱 Dica final da Sensei: reinício automático é uma rede de segurança, não uma solução definitiva. Ele evita que seu site/sistema fique fora do ar enquanto ninguém percebe — mas a causa raiz do travamento continua valendo a pena ser investigada com calma. Se precisar de uma mãozinha nessa investigação, é só chamar o suporte da GeHost pelo painel.gehost.com.br que a gente ajuda a entender o que está pegando. 💙
Precisa de Ajuda?

Nossa equipe está pronta para resolver suas dúvidas.