| name | vps-debug |
| description | Diagnóstico e resolução de falhas no VPS Ywara em produção. Cobre erros 502/504, containers crashados, falhas de SSL, esgotamento de memória, problemas de conexão MySQL e indisponibilidade de endpoints. Ativado quando o usuário relata "o site caiu", "502 Bad Gateway", "container reiniciando", "erro de conexão com o banco", "API não responde" ou qualquer sintoma de falha em produção. |
Skill: VPS Debug — Diagnóstico de Falhas Ywara
Identificação Rápida do Problema
ssh neonorte@vps66668.publiccloud.com.br
docker compose -f /srv/ywara/docker-compose.production.yml ps
sudo systemctl status nginx
free -h
df -h
Diagnóstico por Sintoma
502 Bad Gateway
O Nginx está de pé, mas o backend não está respondendo na porta esperada.
docker ps | grep neonorte_kurupira
docker ps | grep neonorte_admin
docker logs neonorte_kurupira --tail 50
docker logs neonorte_admin --tail 50
ss -tlnp | grep 3002
ss -tlnp | grep 3003
curl -v http://127.0.0.1:3002/api/health
curl -v http://127.0.0.1:3003/admin/health
sudo tail -50 /var/log/nginx/error.log
Resolução mais comum: Container crashado → docker compose -f /srv/ywara/docker-compose.production.yml up -d
Container em Loop de Restart (Restarting)
docker ps -a | grep Restarting
docker logs <nome-container> --tail 100
docker logs neonorte_kurupira 2>&1 | grep -i "env\|undefined\|cannot read\|missing"
docker logs neonorte_kurupira 2>&1 | grep -i "mysql\|ECONNREFUSED\|connect"
docker logs neonorte_kurupira 2>&1 | grep -i "EADDRINUSE\|already in use"
docker logs neonorte_kurupira 2>&1 | grep -F "${"
# Se for ordem de inicialização (MySQL não estava pronto):
cd /srv/ywara
docker compose -f docker-compose.production.yml restart
Falha de Migração Prisma (P3005 / P3009 / P2022)
O backend crasha ou retorna erro de coluna inexistente logo após um deploy.
docker exec -it neonorte_kurupira npx prisma migrate deploy
docker exec -it neonorte_kurupira npx prisma db push
docker exec -it neonorte_kurupira npx prisma migrate resolve --applied <nome_da_migracao>
Fatal Crash Silencioso (Node morre sem Log)
Se o Nginx retornar 502/504 e o log do Docker parar subitamente após um evento (ex: login):
- Suspeite de Native Modules: Criptografia (JWT) ou Prisma (Binary Engine).
- Injete Trace Granular: Adicione
console.log em cada linha do middleware ou rota suspeita.
- Identifique a Linha da Morte: A última linha logada antes do silêncio é o ponto onde o processo do Node sofreu um crash fatal (Segfault).
- Resolução: Verifique versões de bibliotecas nativas ou compatibilidade de arquitetura do container.
Falha de SSL / Certificado Expirado
sudo certbot certificates
echo | openssl s_client -servername kurupira.neonorte-ywara.tech \
-connect kurupira.neonorte-ywara.tech:443 2>/dev/null \
| openssl x509 -noout -dates
sudo crontab -l | grep certbot
systemctl list-timers | grep certbot
sudo certbot renew --dry-run
sudo certbot renew
sudo systemctl stop nginx
sudo certbot renew
sudo systemctl start nginx
Esgotamento de Memória (OOM / Swap)
free -h
vmstat -s | head -10
docker stats --no-stream --format "table {{.Name}}\t{{.MemUsage}}\t{{.MemPerc}}"
docker inspect neonorte_kurupira | grep -i memory
docker inspect neonorte_admin | grep -i memory
docker inspect neonorte_db | grep -i memory
dmesg | grep -i "oom\|killed" | tail -20
watch -n 5 "docker stats --no-stream"
Limites de memória esperados:
neonorte_db: 512 MB
neonorte_kurupira: 512 MB
neonorte_admin: 384 MB
Falha de Conexão com MySQL
docker ps | grep neonorte_db
docker logs neonorte_db --tail 50
docker exec neonorte_db mysqladmin -u root -p ping
docker exec neonorte_kurupira sh -c "nc -zv neonorte_db 3306"
docker exec neonorte_db mysql -u root -p -e "SHOW STATUS LIKE 'Threads_connected';"
docker exec -it neonorte_db mysql -u root -p -e "SHOW PROCESSLIST;"
docker logs neonorte_db 2>&1 | grep -i "error\|crash\|innodb"
Falha de Integração Logto (M2M / SSO)
Erros 401, 403 ou 502 em rotas que dependem do Logto (ex: listagem de usuários, criação de tenant).
docker logs neonorte_admin --tail 50 | grep -i "logto\|m2m\|token\|unauthorized"
docker exec neonorte_admin env | grep LOGTO
Site Inacessível (DNS / Nginx)
sudo systemctl status nginx
sudo nginx -t
sudo tail -50 /var/log/nginx/error.log
ls -la /etc/nginx/sites-enabled/ywara
cat /etc/nginx/sites-available/ywara | grep -E "root|proxy_pass|server_name"
dig kurupira.neonorte-ywara.tech
nslookup admin.neonorte-ywara.tech
sudo ufw status verbose
Disco Cheio
df -h
du -sh /var/lib/docker/*
du -sh /srv/ywara
sudo find /var/log -type f -name "*.log" -size +100M
docker image prune -f
docker container prune -f
sudo logrotate -f /etc/logrotate.d/nginx
Protocolo de Escalação
| Severidade | Sintoma | Ação Imediata |
|---|
| 🔴 Crítico | Ambos os sites inacessíveis | Checar Nginx → containers → disco → OOM |
| 🟠 Alto | Um site inacessível | Checar container específico → logs → restart |
| 🟡 Médio | Lentidão / erros intermitentes | docker stats → logs → MySQL processlist |
| 🟢 Baixo | Erro em funcionalidade específica | Logs do backend específico |
Emergência sem SSH: Usar Console Web da Locaweb → painel VPS → vps66668 → Console.
Teste de Sanidade Pós-Correção
docker compose -f /srv/ywara/docker-compose.production.yml ps
curl -s -o /dev/null -w "%{http_code}" https://kurupira.neonorte-ywara.tech
curl -s -o /dev/null -w "%{http_code}" https://admin.neonorte-ywara.tech
docker logs neonorte_kurupira --tail 20 2>&1 | grep -v "info\|debug"
docker logs neonorte_admin --tail 20 2>&1 | grep -v "info\|debug"