4.6 KiB
4.6 KiB
Status Deploy: BI Dashboard Custom - 13/02/2026 19:11
🎯 Objetivo
Deploy dashboard Next.js custom para substituir Metabase, com PostgreSQL staging existente.
✅ Estado Actual
- Container: Running (2 minutos)
- Serviço Docker:
descomplicar_bi-descomplicaractivo - Build: Completou com sucesso
- Logs: "✓ Ready in 62ms" (Next.js iniciado)
- Health Check: ❌ HTTPS ainda não responde (erro SSL/domínio)
🔧 Problemas Resolvidos (7 iterações)
| # | Problema | Solução Aplicada |
|---|---|---|
| 1 | Falta class-variance-authority |
✅ Adicionado ao package.json |
| 2 | pnpm-lock.yaml desatualizado |
✅ Regenerado lockfile |
| 3 | Prisma: libssl.so.1.1 não encontrado (Alpine) |
✅ Instalado OpenSSL no builder |
| 4 | Runtime sem OpenSSL correcto | ✅ Tentado copiar Prisma client |
| 5 | Alpine OpenSSL 3.x incompatível com Prisma | ✅ Mudado para Debian slim |
| 6 | Prisma Alpine copiado para Debian | ✅ Copiar node_modules Prisma |
| 7 | prisma CLI não encontrado (devDependency) |
✅ Fresh install no Debian |
📋 Dockerfile Final (v8 - Actual)
# Build: Alpine (rápido)
# Runtime: Debian slim (fresh install, Prisma nativo)
Pontos-chave:
- Builder: Alpine com build Next.js apenas
- Runner: Debian instala deps do zero + gera Prisma nativo
- NÃO copia node_modules do builder (evita conflito Alpine/Debian)
🚨 Problema Pendente: Domínio/SSL
Sintoma: Container running, Next.js "Ready", mas HTTPS não responde.
Possíveis causas:
- Domínio
bi-custom.descomplicar.ptnão criado no EasyPanel - Traefik routing não configurado
- SSL certificate ainda não gerado
- Port mapping incorreto (container:3000 <-> Traefik)
🎯 Próximos Passos
1. Verificar Domínio EasyPanel
TOKEN=$(cat /etc/easypanel/.api-token)
curl -s "http://localhost:3000/api/trpc/domains.listDomains" \
-H "Authorization: Bearer $TOKEN" | jq '.result.data.json[] | select(.host | contains("bi-custom"))'
2. Criar Domínio (se não existir)
DOMAIN_ID="dom_$(date +%s)_bi-descomplicar"
curl -s -X POST "http://localhost:3000/api/trpc/domains.createDomain" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"json": {
"id": "'$DOMAIN_ID'",
"projectName": "descomplicar",
"host": "bi-custom.descomplicar.pt",
"path": "/",
"https": true,
"certificateResolver": "letsencrypt",
"wildcard": false,
"middlewares": [],
"destinationType": "service",
"serviceDestination": {
"projectName": "descomplicar",
"serviceName": "bi-descomplicar",
"port": 3000,
"protocol": "http"
}
}
}'
3. Verificar Traefik
docker service logs descomplicar_traefik --tail 50 | grep bi-custom
4. Testar Direto (sem SSL)
# Via container IP interno
docker inspect $(docker ps -q --filter "name=bi-descomplicar") | jq '.[0].NetworkSettings.Networks'
curl http://<container-ip>:3000/
5. Health Check Completo
Quando domínio funcionar:
- ✅ https://bi-custom.descomplicar.pt/ (200 OK)
- ✅ Dashboard carrega
- ✅ Conexão PostgreSQL funciona
- ✅ Métricas visíveis
📊 Métricas Deploy
- Tentativas: 8 deploys
- Tempo total: ~35 minutos
- Commits: 8 fixes
- Build time: ~4-5 minutos/deploy
- Container: Running estável
🗂️ Ficheiros Críticos
| Ficheiro | Estado | Notas |
|---|---|---|
Dockerfile |
✅ Funcional | v8: Fresh install Debian |
package.json |
✅ Completo | class-variance-authority adicionado |
pnpm-lock.yaml |
✅ Sync | Versão 10.29.3 |
prisma/schema.prisma |
✅ OK | Multi-schema (staging) |
next.config.ts |
✅ OK | output: standalone |
📝 Lições Aprendidas
- Alpine vs Debian: Prisma precisa binary nativo. Alpine (musl) != Debian (glibc).
- Multi-stage builds: NÃO copiar node_modules entre Alpine e Debian.
- pnpm build scripts: Prisma CLI é devDependency, precisa de install completo.
- EasyPanel API:
redeployServicenão existe, usardeployService. - Fresh install melhor: Para Prisma, install do zero no target OS > copiar binaries.
🔗 Repositório
- Gitea: git.descomplicar.pt/ealmeida/bi-descomplicar
- Branch: main
- Último commit:
525e629"Fix: Fresh install no Debian (não copiar Prisma Alpine)"
👤 Sessão
- Data: 13/02/2026
- Início: ~18:20
- Fim: 19:11
- Duração: ~50 minutos
- Status: Container running, domínio pendente
Próxima sessão: Configurar domínio/SSL e validar dashboard funcional.