#!/bin/sh set -e echo "🔎 --- SUPER DIAGNÓSTICO DE CONEXÃO (v2) ---" # Extrai os dados da URL usando Node (muito mais seguro que sed) export DB_HOST=$(node -e "try { const u = new URL(process.env.DATABASE_URL); console.log(u.hostname); } catch(e) { console.log('error'); }") export DB_PORT=$(node -e "try { const u = new URL(process.env.DATABASE_URL); console.log(u.port || '5432'); } catch(e) { console.log('5432'); }") if [ "$DB_HOST" = "error" ]; then echo "❌ ERRO: A DATABASE_URL está em um formato inválido!" exit 1 fi echo "📡 Tentando contato com: $DB_HOST na porta $DB_PORT" # Teste de porta usando Node node -e " const net = require('net'); const client = net.createConnection({ host: '$DB_HOST', port: parseInt('$DB_PORT') }, () => { console.log('✅ REDE OK: A porta $DB_PORT está aberta!'); process.exit(0); }); client.on('error', (err) => { console.log('❌ FALHA DE REDE: Porta fechada ou host inacessível: ' + err.message); process.exit(1); }); setTimeout(() => { process.exit(1); }, 3000); " || echo "⚠️ Aguardando rede estabilizar..." # Função de espera wait_for_db() { echo "⏳ Validando login no banco..." max_retries=15 count=0 while true; do count=$((count + 1)) echo "🔄 Tentativa $count/$max_retries..." # Tenta o dry-run do prisma PRISMA_ERR=$(./node_modules/.bin/prisma db push --dry-run 2>&1) if [ $? -eq 0 ]; then echo "✅ SUCESSO: Banco conectado e autenticado!" break fi echo "❌ FALHA: O Prisma disse:" echo "$PRISMA_ERR" | grep -E "P1001|P1002|P1003|P1010|Authentication|denied|Database" || echo "Erro desconhecido (verificar logs)" if [ $count -gt $max_retries ]; then echo "❌ Desistindo." exit 1 fi sleep 4 done } if [ -n "$DATABASE_URL" ]; then wait_for_db echo "🔄 Sincronizando tabelas..." ./node_modules/.bin/prisma db push --accept-data-loss ./node_modules/.bin/prisma db seed || echo "⚠️ Seed já configurado." fi echo "🚀 Iniciando aplicação..." exec node server.js