# 🚀 Guia de Deploy - AutomatizaSE Portal Este documento contém instruções completas para build, deploy e gerenciamento da aplicação AutomatizaSE Portal no Kubernetes. --- ## 📋 Pré-requisitos Antes de iniciar o deploy, certifique-se de ter: - **Docker** instalado (v24+) - **kubectl** instalado e configurado - Acesso ao cluster Kubernetes (v1.28+) - Acesso ao registry de imagens (Docker Hub, GCR, ou registry privado) - Nginx Ingress Controller instalado no cluster - **(Opcional)** cert-manager instalado para certificados automáticos Let's Encrypt --- ## 🏗️ Seção 1: Build da Imagem Docker ### 1.1 Build Local ```bash # Build da imagem com tag versionada docker build -t registry.automatizase.com/portal:v1.0.0 . # Verificar imagem criada docker images | grep portal ``` ### 1.2 Tag Latest ```bash # Criar tag 'latest' para facilitar referência docker tag registry.automatizase.com/portal:v1.0.0 registry.automatizase.com/portal:latest ``` ### 1.3 Push para Registry **Opção A: Docker Hub** ```bash # Login docker login # Push docker tag registry.automatizase.com/portal:v1.0.0 docker.io/automatizase/portal:v1.0.0 docker push docker.io/automatizase/portal:v1.0.0 ``` **Opção B: Registry Privado** ```bash # Login docker login registry.automatizase.com # Push docker push registry.automatizase.com/portal:v1.0.0 docker push registry.automatizase.com/portal:latest ``` **Opção C: Google Container Registry (GCR)** ```bash # Configure gcloud auth gcloud auth configure-docker # Tag e push docker tag registry.automatizase.com/portal:v1.0.0 gcr.io/seu-projeto/portal:v1.0.0 docker push gcr.io/seu-projeto/portal:v1.0.0 ``` > ⚠️ **IMPORTANTE:** Ajuste o caminho da imagem em `k8s/deployment.yaml` conforme o registry utilizado. --- ## 🔐 Seção 2: Criar Secret no Cluster O Secret contém todas as variáveis de ambiente sensíveis da aplicação. ### 2.1 Criar Secret via kubectl ```bash kubectl create secret generic portal-secrets \ --from-literal=NEXT_PUBLIC_SITE_URL=https://portal.automatizase.com.br \ --from-literal=NEXT_PUBLIC_SUPABASE_URL=https://supabase.automatizase.com.br \ --from-literal=NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... \ --from-literal=SUPABASE_SERVICE_ROLE_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... \ --from-literal=EVOLUTION_API_URL=https://evolutionapi.automatizase.com.br \ --from-literal=EVOLUTION_API_KEY=03919932dcb10fee6f28b1f1013b304c \ --from-literal=EVOLUTION_INSTANCE_NAMES=Rita,Lucia\ Refugio \ --from-literal=N8N_OAUTH_URL=https://n8n.automatizase.com.br/webhook/google-oauth \ --from-literal=N8N_API_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... \ --from-literal=N8N_API_URL=https://n8n.automatizase.com.br/api/v1 \ --from-literal=NEXT_PUBLIC_GOOGLE_CLIENT_ID=174466774807-tdsht53agf7v40suk5mmqgmfrn4iskck.apps.googleusercontent.com \ --from-literal=GOOGLE_CLIENT_SECRET=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 \ -n automatizase ``` ### 2.2 Criar Secret via Arquivo (Alternativa) ```bash # Copiar arquivo template cp k8s/secret.yaml k8s/secret-production.yaml # Editar secret-production.yaml com valores reais # NUNCA commitar secret-production.yaml! # Aplicar kubectl apply -f k8s/secret-production.yaml ``` ### 2.3 Verificar Secret Criado ```bash kubectl get secret portal-secrets -n automatizase kubectl describe secret portal-secrets -n automatizase ``` > ⚠️ **SEGURANÇA:** NUNCA commite valores reais de secrets no Git! Use variáveis de CI/CD ou gerenciadores de secrets (Sealed Secrets, External Secrets Operator, etc.) --- ## 🚀 Seção 3: Deploy dos Manifests Kubernetes ### 3.1 Deploy Ordenado (Recomendado) ```bash # 1. Criar namespace kubectl apply -f k8s/namespace.yaml # 2. Criar secret (se ainda não criou no passo anterior) kubectl create secret generic portal-secrets ... # (ver Seção 2) # 3. Deploy da aplicação kubectl apply -f k8s/deployment.yaml # 4. Criar service kubectl apply -f k8s/service.yaml # 5. Criar ingress kubectl apply -f k8s/ingress.yaml ``` ### 3.2 Deploy Rápido (Todos de Uma Vez) ```bash # Aplicar todos os manifests (exceto secret) kubectl apply -f k8s/namespace.yaml kubectl apply -f k8s/deployment.yaml kubectl apply -f k8s/service.yaml kubectl apply -f k8s/ingress.yaml ``` ### 3.3 Deploy com Kustomize (Futuro) ```bash # Se configurado com kustomize kubectl apply -k k8s/ ``` --- ## ✅ Seção 4: Verificação do Deploy ### 4.1 Verificar Pods ```bash # Listar pods kubectl get pods -n automatizase # Verificar status detalhado kubectl describe pod -n automatizase # Ver logs em tempo real kubectl logs -f deployment/portal -n automatizase # Ver logs de todos os pods kubectl logs -f -l app=portal -n automatizase ``` ### 4.2 Verificar Service ```bash # Listar services kubectl get svc -n automatizase # Detalhes do service kubectl describe svc portal-service -n automatizase ``` ### 4.3 Verificar Ingress ```bash # Listar ingress kubectl get ingress -n automatizase # Detalhes do ingress kubectl describe ingress portal-ingress -n automatizase # Verificar endereço IP alocado kubectl get ingress portal-ingress -n automatizase -o jsonpath='{.status.loadBalancer.ingress[0].ip}' ``` ### 4.4 Verificar DNS ```bash # Testar resolução DNS nslookup portal.automatizase.com.br # Testar conectividade curl -I https://portal.automatizase.com.br # Testar health check curl https://portal.automatizase.com.br/api/health ``` ### 4.5 Verificar Certificado TLS ```bash # Ver certificado kubectl get certificate -n automatizase # Detalhes do certificado (se usar cert-manager) kubectl describe certificate portal-tls-cert -n automatizase # Verificar via curl curl -vI https://portal.automatizase.com.br 2>&1 | grep -i 'SSL\|TLS' ``` --- ## 🔧 Seção 5: Troubleshooting ### 5.1 Pod Não Inicia **Sintomas:** Pod em estado `CrashLoopBackOff`, `Error`, ou `ImagePullBackOff` **Diagnóstico:** ```bash # Ver eventos do pod kubectl describe pod -n automatizase # Ver logs do pod kubectl logs -n automatizase # Ver logs do container anterior (se pod reiniciou) kubectl logs -n automatizase --previous ``` **Possíveis Causas:** - **ImagePullBackOff:** Imagem não existe ou falta autenticação no registry - **CrashLoopBackOff:** Aplicação falha ao iniciar (verificar logs) - **Secrets faltando:** Verificar se `portal-secrets` existe e está correto ### 5.2 Health Check Falhando **Sintomas:** Pod em estado `Running` mas não passa em readiness **Diagnóstico:** ```bash # Verificar health check endpoint diretamente kubectl port-forward deployment/portal 3100:3100 -n automatizase curl http://localhost:3100/api/health ``` **Possíveis Causas:** - Endpoint `/api/health` não responde - Timeout muito curto nos probes - Aplicação demora muito para iniciar **Soluções:** ```bash # Aumentar initialDelaySeconds no deployment.yaml # Editar e aplicar novamente kubectl edit deployment portal -n automatizase ``` ### 5.3 Ingress Não Responde **Sintomas:** `curl https://portal.automatizase.com.br` não responde ou retorna 404/502 **Diagnóstico:** ```bash # Verificar se Nginx Ingress Controller está rodando kubectl get pods -n ingress-nginx # Ver logs do Ingress Controller kubectl logs -f -n ingress-nginx deployment/ingress-nginx-controller # Testar service diretamente (bypass ingress) kubectl port-forward svc/portal-service 8080:80 -n automatizase curl http://localhost:8080 ``` **Possíveis Causas:** - DNS não aponta para IP do LoadBalancer - Certificado TLS inválido ou faltando - Nginx Ingress Controller não instalado **Soluções:** ```bash # Verificar IP do LoadBalancer kubectl get ingress portal-ingress -n automatizase # Configurar DNS apontando para o IP retornado # Ex: portal.automatizase.com.br -> 203.0.113.10 ``` ### 5.4 Certificado TLS Inválido **Sintomas:** Navegador retorna erro SSL/TLS **Soluções:** **Opção A: Usar cert-manager (Automático)** ```bash # Instalar cert-manager kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.13.0/cert-manager.yaml # Criar ClusterIssuer Let's Encrypt cat < -n automatizase # Logs dos últimos 100 linhas kubectl logs --tail=100 deployment/portal -n automatizase ``` ### 8.2 Acessar Container (Debug) ```bash # Abrir shell no container kubectl exec -it deployment/portal -n automatizase -- sh # Executar comando único kubectl exec deployment/portal -n automatizase -- env | grep NEXT_PUBLIC ``` ### 8.3 Eventos do Cluster ```bash # Ver eventos recentes do namespace kubectl get events -n automatizase --sort-by='.lastTimestamp' ``` --- ## 📊 Seção 9: Scaling ### 9.1 Escalar Manualmente ```bash # Aumentar para 3 replicas kubectl scale deployment/portal --replicas=3 -n automatizase # Diminuir para 1 replica kubectl scale deployment/portal --replicas=1 -n automatizase ``` ### 9.2 Autoscaling (HPA) - Opcional ```bash # Criar Horizontal Pod Autoscaler kubectl autoscale deployment portal \ --cpu-percent=70 \ --min=2 \ --max=10 \ -n automatizase # Verificar HPA kubectl get hpa -n automatizase ``` --- ## 🗑️ Seção 10: Remoção Completa ### 10.1 Deletar Aplicação ```bash # Deletar todos os recursos kubectl delete -f k8s/ingress.yaml kubectl delete -f k8s/service.yaml kubectl delete -f k8s/deployment.yaml kubectl delete secret portal-secrets -n automatizase kubectl delete -f k8s/namespace.yaml ``` ### 10.2 Deletar Namespace (Remove Tudo) ```bash # ⚠️ CUIDADO: Isso deleta TODOS os recursos no namespace kubectl delete namespace automatizase ``` --- ## 📝 Checklist de Deploy Use este checklist para garantir que todos os passos foram executados: - [ ] Docker instalado e funcionando - [ ] kubectl configurado e conectado ao cluster - [ ] Imagem Docker construída e enviada ao registry - [ ] Secret `portal-secrets` criado com todas as variáveis - [ ] Namespace `automatizase` criado - [ ] Deployment aplicado e pods rodando - [ ] Service criado e expondo pods - [ ] Ingress criado e funcionando - [ ] DNS apontando para LoadBalancer IP - [ ] Certificado TLS configurado e válido - [ ] Health check respondendo: `/api/health` - [ ] Aplicação acessível via `https://portal.automatizase.com.br` - [ ] Logs sem erros críticos - [ ] Monitoramento configurado (opcional) --- ## 📞 Suporte Para problemas ou dúvidas: - Verificar logs: `kubectl logs -f deployment/portal -n automatizase` - Verificar eventos: `kubectl get events -n automatizase` - Contato DevOps: devops@automatizase.com.br --- **Versão:** 1.0 **Última Atualização:** 2025-01-15 **Autor:** James (Dev Agent)