#!/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 -n n8n deployment/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 " # Verificar historico de releases" echo " helm history n8n -n n8n" echo "" echo " # Fazer rollback do historico de releases" echo " helm rollback 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 ""