Dashboard-Automatizase/docs/architecture/containerizao-e-orquestrao.md
2025-10-05 21:17:43 -03:00

4.9 KiB

Containerização e Orquestração

Dockerfile (Simplificado para POC)

# Dockerfile simples para NextJS
FROM node:18-alpine

WORKDIR /app

# Copiar package files
COPY package*.json ./

# Install dependencies
RUN npm ci

# Copiar código
COPY . .

# Build Next.js
ENV NEXT_TELEMETRY_DISABLED=1
RUN npm run build

# Expor porta 3000
EXPOSE 3000

# Start NextJS
CMD ["npm", "start"]

Notas para POC:

  • Build simples sem multi-stage (mais rápido para POC)
  • Porta 3000 (padrão NextJS)
  • Comando npm start roda servidor production

Build Rápido:

# Build
docker build -t portal:latest .

# Test local (opcional)
docker run -p 3000:3000 --env-file .env.local portal:latest

# Tag e push para registry
docker tag portal:latest registry.automatizase.com/portal:latest
docker push registry.automatizase.com/portal:latest

Kubernetes Manifests (POC Mínima)

1. Namespace

# k8s/namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: automatizase-portal

2. ConfigMap

# k8s/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: portal-config
  namespace: automatizase-portal
data:
  NODE_ENV: "production"
  NEXT_PUBLIC_SITE_URL: "http://portal.automatizase.com"
  NEXT_PUBLIC_SUPABASE_URL: "https://xxxxx.supabase.co"

3. Secret

# k8s/secret.yaml
# ATENÇÃO: NÃO commitar este arquivo! Criar manualmente no cluster
apiVersion: v1
kind: Secret
metadata:
  name: portal-secrets
  namespace: automatizase-portal
type: Opaque
stringData:
  NEXT_PUBLIC_SUPABASE_ANON_KEY: "eyJhbGci..."
  SUPABASE_SERVICE_ROLE_KEY: "eyJhbGci..."
  EVOLUTION_API_URL: "https://evolution.automatizase.com"
  EVOLUTION_API_KEY: "your-key"
  EVOLUTION_INSTANCE_NAMES: "instance1,instance2"
  N8N_OAUTH_URL: "https://n8n.automatizase.com/webhook/google-oauth"

Criar secret:

kubectl create secret generic portal-secrets \
  --from-literal=NEXT_PUBLIC_SUPABASE_ANON_KEY='...' \
  --from-literal=SUPABASE_SERVICE_ROLE_KEY='...' \
  --from-literal=EVOLUTION_API_URL='...' \
  --from-literal=EVOLUTION_API_KEY='...' \
  --from-literal=EVOLUTION_INSTANCE_NAMES='...' \
  --from-literal=N8N_OAUTH_URL='...' \
  -n automatizase-portal

4. Deployment

# k8s/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: portal
  namespace: automatizase-portal
spec:
  replicas: 1  # POC: 1 replica suficiente
  selector:
    matchLabels:
      app: portal
  template:
    metadata:
      labels:
        app: portal
    spec:
      containers:
      - name: nextjs
        image: registry.automatizase.com/portal:latest
        ports:
        - containerPort: 3000
        envFrom:
        - configMapRef:
            name: portal-config
        - secretRef:
            name: portal-secrets
        resources:
          requests:
            memory: "128Mi"
            cpu: "50m"
          limits:
            memory: "256Mi"
            cpu: "200m"

5. Service

# k8s/service.yaml
apiVersion: v1
kind: Service
metadata:
  name: portal-service
  namespace: automatizase-portal
spec:
  type: ClusterIP
  selector:
    app: portal
  ports:
  - port: 80
    targetPort: 3000

6. Ingress (Nginx)

# k8s/ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: portal-ingress
  namespace: automatizase-portal
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  rules:
  - host: portal.automatizase.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: portal-service
            port:
              number: 80

Deploy Rápido (POC)

Deploy Manual via kubectl:

# 1. Criar namespace
kubectl apply -f k8s/namespace.yaml

# 2. Criar ConfigMap
kubectl apply -f k8s/configmap.yaml

# 3. Criar Secret (manualmente com valores reais)
kubectl create secret generic portal-secrets \
  --from-literal=NEXT_PUBLIC_SUPABASE_ANON_KEY='seu-anon-key' \
  --from-literal=SUPABASE_SERVICE_ROLE_KEY='seu-service-role-key' \
  --from-literal=EVOLUTION_API_URL='https://evolution.automatizase.com' \
  --from-literal=EVOLUTION_API_KEY='sua-api-key' \
  --from-literal=EVOLUTION_INSTANCE_NAMES='instance1,instance2' \
  --from-literal=N8N_OAUTH_URL='https://n8n.automatizase.com/webhook/google-oauth' \
  -n automatizase-portal

# 4. Deploy app
kubectl apply -f k8s/deployment.yaml

# 5. Criar Service
kubectl apply -f k8s/service.yaml

# 6. Criar Ingress
kubectl apply -f k8s/ingress.yaml

# 7. Verificar
kubectl get pods -n automatizase-portal
kubectl get svc -n automatizase-portal
kubectl get ingress -n automatizase-portal

# 8. Ver logs
kubectl logs -f deployment/portal -n automatizase-portal

Deploy Completo (1 comando):

# Aplicar todos manifests de uma vez
kubectl apply -f k8s/

# Aguardar pod ficar ready
kubectl wait --for=condition=ready pod -l app=portal -n automatizase-portal --timeout=120s