diff --git a/aula-06/custom-values.yaml b/aula-06/custom-values.yaml new file mode 100644 index 0000000..cb650be --- /dev/null +++ b/aula-06/custom-values.yaml @@ -0,0 +1,151 @@ +# ============================================================================= +# n8n Helm Chart - Custom Values +# ============================================================================= +# Aula 06 - Deploy n8n via Helm +# +# Chart: community-charts/n8n +# Docs: https://community-charts.github.io/docs/charts/n8n/configuration +# ============================================================================= + +# ----------------------------------------------------------------------------- +# Imagem +# ----------------------------------------------------------------------------- +image: + repository: n8nio/n8n + tag: "2.1.4" + pullPolicy: IfNotPresent + +# ----------------------------------------------------------------------------- +# Chave de Criptografia +# ----------------------------------------------------------------------------- +encryptionKey: "workshop-n8n-encryption-key-32ch" + +# ----------------------------------------------------------------------------- +# Banco de Dados PostgreSQL +# ----------------------------------------------------------------------------- +db: + type: postgresdb + +postgresql: + enabled: true + auth: + database: n8n + username: n8n + password: "n8n-postgres-workshop-2025" + primary: + persistence: + enabled: true + size: 5Gi + +# ----------------------------------------------------------------------------- +# Redis (necessário para Queue Mode) +# ----------------------------------------------------------------------------- +redis: + enabled: true + architecture: standalone + auth: + enabled: true + password: "n8n-redis-workshop-2025" + +# ----------------------------------------------------------------------------- +# Ingress NGINX +# ----------------------------------------------------------------------------- +ingress: + enabled: true + className: nginx + annotations: + nginx.ingress.kubernetes.io/proxy-body-size: "50m" + nginx.ingress.kubernetes.io/proxy-read-timeout: "3600" + nginx.ingress.kubernetes.io/proxy-send-timeout: "3600" + hosts: + - host: n8n.localhost + paths: + - path: / + pathType: Prefix + +# ----------------------------------------------------------------------------- +# Main Node +# ----------------------------------------------------------------------------- +main: + extraEnvVars: + N8N_SECURE_COOKIE: "false" # Permite HTTP sem HTTPS (apenas para dev/workshop) + persistence: + enabled: true + size: 2Gi + mountPath: "/home/node/.n8n" + resources: + requests: + cpu: 100m + memory: 256Mi + limits: + cpu: 1000m + memory: 1Gi + +# ----------------------------------------------------------------------------- +# Workers (Queue Mode) +# ----------------------------------------------------------------------------- +worker: + mode: queue + count: 2 + concurrency: 10 + extraEnvVars: + N8N_SECURE_COOKIE: "false" + resources: + requests: + cpu: 100m + memory: 256Mi + limits: + cpu: 500m + memory: 512Mi + autoscaling: + enabled: true + minReplicas: 2 + maxReplicas: 5 + metrics: + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: 70 + - type: Resource + resource: + name: memory + target: + type: Utilization + averageUtilization: 80 + +# ----------------------------------------------------------------------------- +# Webhooks (Queue Mode) +# ----------------------------------------------------------------------------- +webhook: + mode: queue + count: 1 + url: "http://n8n.localhost" + extraEnvVars: + N8N_SECURE_COOKIE: "false" + resources: + requests: + cpu: 50m + memory: 128Mi + limits: + cpu: 250m + memory: 256Mi + autoscaling: + enabled: true + minReplicas: 1 + maxReplicas: 3 + metrics: + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: 70 + +# ----------------------------------------------------------------------------- +# Configurações de Segurança +# ----------------------------------------------------------------------------- +securityContext: + runAsNonRoot: true + runAsUser: 1000 diff --git a/aula-06/setup.sh b/aula-06/setup.sh new file mode 100755 index 0000000..7f82ee6 --- /dev/null +++ b/aula-06/setup.sh @@ -0,0 +1,236 @@ +#!/bin/bash +# ============================================================================= +# Setup da Aula 06 - n8n via Helm +# ============================================================================= +# +# Este script instala e configura: +# 1. NGINX Ingress Controller (se necessário) +# 2. n8n com PostgreSQL, Redis, Workers e Webhooks +# +# Pré-requisitos: +# - Kubernetes cluster rodando (k3s, minikube, kind, etc) +# - kubectl configurado +# - Helm 3.x instalado +# +# Uso: +# chmod +x setup.sh +# ./setup.sh +# +# ============================================================================= + +set -e # Para na primeira falha + +# Cores para output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# Funções de log +log_info() { echo -e "${BLUE}[INFO]${NC} $1"; } +log_success() { echo -e "${GREEN}[OK]${NC} $1"; } +log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } +log_error() { echo -e "${RED}[ERRO]${NC} $1"; } + +# Diretório do script +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +# ============================================================================= +# VERIFICAÇÕES INICIAIS +# ============================================================================= + +log_info "Verificando pré-requisitos..." + +# Verificar kubectl +if ! command -v kubectl &> /dev/null; then + log_error "kubectl não encontrado. Instale o kubectl primeiro." + exit 1 +fi +log_success "kubectl encontrado" + +# Verificar conexão com cluster +if ! kubectl cluster-info &> /dev/null; then + log_error "Não foi possível conectar ao cluster Kubernetes." + exit 1 +fi +log_success "Conectado ao cluster Kubernetes" + +# Verificar helm +if ! command -v helm &> /dev/null; then + log_error "Helm não encontrado. Instale o Helm >= 3.14 primeiro." + log_info "Instalação: https://helm.sh/docs/intro/install/" + exit 1 +fi +log_success "Helm $(helm version --short) encontrado" + +echo "" + +# ============================================================================= +# 1. INSTALAR NGINX INGRESS (se não existir) +# ============================================================================= + +log_info "=== Verificando NGINX Ingress ===" + +if kubectl get ingressclass nginx &> /dev/null; then + log_success "NGINX Ingress já está instalado" +else + log_info "Instalando NGINX Ingress Controller..." + helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx 2>/dev/null || true + helm repo update + + helm install nginx-ingress ingress-nginx/ingress-nginx \ + --namespace ingress-nginx \ + --create-namespace \ + --wait + + log_success "NGINX Ingress instalado" +fi +echo "" + +# ============================================================================= +# 2. CRIAR NAMESPACE E APLICAR SECRETS +# ============================================================================= + +log_info "=== Configurando namespace n8n ===" + +# Criar namespace se não existir +if kubectl get namespace n8n &> /dev/null; then + log_success "Namespace n8n já existe" +else + log_info "Criando namespace n8n..." + kubectl create namespace n8n + log_success "Namespace n8n criado" +fi + +echo "" + +# ============================================================================= +# 3. INSTALAR n8n VIA HELM +# ============================================================================= + +log_info "=== Instalando n8n ===" + +# Adicionar repo do community-charts +log_info "Adicionando repositório Helm do community-charts..." +helm repo add community-charts https://community-charts.github.io/helm-charts 2>/dev/null || true +helm repo update + +# Verificar se já está instalado +if helm status n8n -n n8n &> /dev/null; then + log_warn "n8n já está instalado. Atualizando..." + helm upgrade n8n community-charts/n8n \ + --namespace n8n \ + --values "$SCRIPT_DIR/custom-values.yaml" \ + --wait \ + --timeout 10m + log_success "n8n atualizado com sucesso!" +else + log_info "Instalando n8n..." + helm install n8n community-charts/n8n \ + --namespace n8n \ + --values "$SCRIPT_DIR/custom-values.yaml" \ + --wait \ + --timeout 10m + log_success "n8n instalado com sucesso!" +fi + +echo "" + +# ============================================================================= +# 4. AGUARDAR PODS FICAREM PRONTOS +# ============================================================================= + +log_info "=== Aguardando pods ficarem prontos ===" + +log_info "Aguardando PostgreSQL..." +kubectl wait --for=condition=ready pod \ + -l app.kubernetes.io/name=postgresql \ + -n n8n \ + --timeout=180s 2>/dev/null || log_warn "Timeout aguardando PostgreSQL" + +log_info "Aguardando Redis..." +kubectl wait --for=condition=ready pod \ + -l app.kubernetes.io/name=redis \ + -n n8n \ + --timeout=120s 2>/dev/null || log_warn "Timeout aguardando Redis" + +log_info "Aguardando n8n main..." +kubectl wait --for=condition=ready pod \ + -l app.kubernetes.io/component=main \ + -n n8n \ + --timeout=180s 2>/dev/null || log_warn "Timeout aguardando n8n main" + +log_info "Aguardando n8n workers..." +kubectl wait --for=condition=ready pod \ + -l app.kubernetes.io/component=worker \ + -n n8n \ + --timeout=120s 2>/dev/null || log_warn "Timeout aguardando workers" + +log_info "Aguardando n8n webhooks..." +kubectl wait --for=condition=ready pod \ + -l app.kubernetes.io/component=webhook \ + -n n8n \ + --timeout=120s 2>/dev/null || log_warn "Timeout aguardando webhooks" + +log_success "Todos os componentes estão rodando!" +echo "" + +# ============================================================================= +# RESUMO FINAL +# ============================================================================= + +echo "==============================================" +echo -e "${GREEN} Setup Completo!${NC}" +echo "==============================================" +echo "" +echo "Componentes instalados:" +echo " - NGINX Ingress Controller" +echo " - n8n (namespace: n8n)" +echo " - Main node" +echo " - Workers (2-5 réplicas, autoscaling)" +echo " - Webhooks (1-3 réplicas, autoscaling)" +echo " - PostgreSQL" +echo " - Redis" +echo "" +echo "Acesso:" +echo " URL: http://n8n.localhost" +echo "" +echo " Se n8n.localhost não resolver, adicione ao /etc/hosts:" +echo " 127.0.0.1 n8n.localhost" +echo "" +echo "Comandos úteis:" +echo " # Ver todos os pods" +echo " kubectl get pods -n n8n" +echo "" +echo " # Ver logs do n8n" +echo " kubectl logs -f -l app.kubernetes.io/component=main -n n8n" +echo "" +echo " # Ver HPA (autoscaler)" +echo " kubectl get hpa -n n8n" +echo "" +echo " # Ver ingress" +echo " kubectl get ingress -n n8n" +echo "" +echo " # Desinstalar" +echo " helm uninstall n8n -n n8n" +echo "" +echo " # Fazer upgrade do helm chart" +echo " helm upgrade --reuse-values --values --custom-values.yaml n8n community-charts/n8n --namespace n8n" +echo "" +echo "==============================================" +echo "" + +# Mostrar status atual +log_info "Status atual dos pods:" +echo "" +kubectl get pods -n n8n +echo "" +log_info "Status do HPA:" +echo "" +kubectl get hpa -n n8n 2>/dev/null || echo "HPA ainda não criado" +echo "" +log_info "Status do Ingress:" +echo "" +kubectl get ingress -n n8n +echo ""