Workshop completo: aulas 08-10 com Talos, n8n e GitLab na Hetzner

Aula 08 - Cluster Kubernetes HA:
- Setup interativo com OpenTofu para Talos na Hetzner
- CCM, CSI Driver, Cluster Autoscaler, Metrics Server
- NGINX Ingress com LoadBalancer (HTTP/HTTPS/SSH)

Aula 09 - n8n na Hetzner:
- Deploy via Helm com PostgreSQL e Redis
- Suporte multi-tenant com add-client.sh
- Integração com Hetzner CSI para volumes persistentes

Aula 10 - GitLab na Hetzner:
- Setup agnóstico: CloudFlare (trusted proxies) ou Let's Encrypt
- Anti-affinity para distribuir webservice/sidekiq em nós diferentes
- Container Registry e SSH via TCP passthrough
- Documentação do erro 422 e solução com trustedCIDRsForXForwardedFor

Melhorias gerais:
- READMEs atualizados com arquitetura e troubleshooting
- Scripts cleanup.sh para todas as aulas
- CLAUDE.md atualizado com contexto do projeto
This commit is contained in:
Allyson de Paula
2025-12-31 17:57:02 -03:00
parent 50dc74c1d8
commit 07b7ee62d3
35 changed files with 4665 additions and 311 deletions

View File

@@ -1,6 +1,6 @@
#!/bin/bash
# =============================================================================
# Setup da Aula 06 - n8n via Helm
# Setup da Aula 06 - n8n via Helm (Ambiente LOCAL)
# =============================================================================
#
# Este script instala e configura:
@@ -8,7 +8,7 @@
# 2. n8n com PostgreSQL, Redis, Workers e Webhooks
#
# Pré-requisitos:
# - Kubernetes cluster rodando (k3s, minikube, kind, etc)
# - Kubernetes cluster LOCAL rodando (Docker Desktop, minikube, kind, k3d)
# - kubectl configurado
# - Helm 3.x instalado
#
@@ -52,6 +52,10 @@ 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."
log_info "Verifique se seu cluster local está rodando:"
log_info " - Docker Desktop: Habilite Kubernetes nas configurações"
log_info " - minikube: minikube start"
log_info " - kind: kind create cluster"
exit 1
fi
log_success "Conectado ao cluster Kubernetes"
@@ -67,68 +71,7 @@ log_success "Helm $(helm version --short) encontrado"
echo ""
# =============================================================================
# 1. INSTALAR HETZNER CSI DRIVER (para provisionar volumes)
# =============================================================================
log_info "=== Configurando Hetzner CSI Driver ==="
# Verificar se secret já existe (evita pedir token novamente)
if kubectl get secret hcloud -n kube-system &> /dev/null; then
log_success "Secret hcloud já existe em kube-system"
else
# Pedir token via input interativo
echo ""
log_info "Token da Hetzner Cloud necessário para provisionar volumes."
log_info "Crie um token em: https://console.hetzner.cloud/projects/*/security/tokens"
echo ""
log_info "Cole o token e pressione ENTER:"
# Desabilita echo, lê linha completa, reabilita echo
stty -echo
IFS= read -r HCLOUD_TOKEN
stty echo
echo ""
if [ -z "$HCLOUD_TOKEN" ]; then
log_error "Token não pode ser vazio."
exit 1
fi
log_info "Criando secret hcloud em kube-system..."
kubectl create secret generic hcloud \
--namespace=kube-system \
--from-literal=token="$HCLOUD_TOKEN"
log_success "Secret hcloud criado"
fi
# Instalar Hetzner CSI Driver via Helm (se não instalado)
if helm status hcloud-csi -n kube-system &> /dev/null; then
log_success "Hetzner CSI Driver já está instalado"
else
log_info "Instalando Hetzner CSI Driver..."
helm repo add hcloud https://charts.hetzner.cloud 2>/dev/null || true
helm repo update hcloud
helm install hcloud-csi hcloud/hcloud-csi \
--namespace kube-system \
--wait \
--timeout 5m
log_success "Hetzner CSI Driver instalado"
fi
# Verificar StorageClass
log_info "Verificando StorageClass..."
if kubectl get storageclass hcloud-volumes &> /dev/null; then
log_success "StorageClass hcloud-volumes disponível"
else
log_error "StorageClass hcloud-volumes não encontrado"
exit 1
fi
echo ""
# =============================================================================
# 2. INSTALAR NGINX INGRESS (se não existir)
# 1. INSTALAR NGINX INGRESS (se não existir)
# =============================================================================
log_info "=== Verificando NGINX Ingress ==="
@@ -152,7 +95,7 @@ fi
echo ""
# =============================================================================
# 3. CRIAR NAMESPACE E APLICAR SECRETS
# 2. CRIAR NAMESPACE E APLICAR SECRETS
# =============================================================================
log_info "=== Configurando namespace n8n ==="
@@ -169,7 +112,7 @@ fi
echo ""
# =============================================================================
# 4. INSTALAR n8n VIA HELM
# 3. INSTALAR n8n VIA HELM
# =============================================================================
log_info "=== Instalando n8n ==="
@@ -201,7 +144,7 @@ fi
echo ""
# =============================================================================
# 5. AGUARDAR PODS FICAREM PRONTOS
# 4. AGUARDAR PODS FICAREM PRONTOS
# =============================================================================
log_info "=== Aguardando pods ficarem prontos ==="
@@ -248,7 +191,6 @@ echo -e "${GREEN} Setup Completo!${NC}"
echo "=============================================="
echo ""
echo "Componentes instalados:"
echo " - Hetzner CSI Driver (StorageClass: hcloud-volumes)"
echo " - NGINX Ingress Controller"
echo " - n8n (namespace: n8n)"
echo " - Main node"
@@ -279,15 +221,6 @@ 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 <nº da release>"
echo ""
echo "=============================================="
echo ""