4.9 KiB
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 startroda 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