#!/bin/bash # ============================================================================= # Setup da Aula 10 - Gitea via Helm (Hetzner Cloud) # ============================================================================= # # Este script instala e configura: # 1. cert-manager (opcional, para Let's Encrypt) # 2. Gitea com Container Registry, SSH e Actions # # Pré-requisitos: # - Kubernetes cluster Talos na Hetzner (aula-08) com: # - Hetzner CSI Driver (StorageClass: hcloud-volumes) # - NGINX Ingress Controller com LoadBalancer # - kubectl configurado (KUBECONFIG=../aula-08/kubeconfig) # - Helm 3.x instalado # # Uso: # export KUBECONFIG=$(pwd)/../aula-08/kubeconfig # chmod +x setup.sh # ./setup.sh # # ============================================================================= set -e # Cores para output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' CYAN='\033[0;36m' NC='\033[0m' 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"; } SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # Variáveis de configuração GITEA_HOST="" DOMAIN="" USE_CLOUDFLARE="" USE_LETSENCRYPT="" LETSENCRYPT_EMAIL="" ADMIN_PASSWORD="" # ============================================================================= # FUNÇÕES DE CONFIGURAÇÃO # ============================================================================= save_config() { cat > "$SCRIPT_DIR/.env" </dev/null || true helm repo update jetstack if helm status cert-manager -n cert-manager &> /dev/null; then log_success "cert-manager já está instalado" else helm install cert-manager jetstack/cert-manager \ --namespace cert-manager \ --create-namespace \ --version v1.16.2 \ --set crds.enabled=true \ --wait \ --timeout 5m log_success "cert-manager instalado" fi } create_cluster_issuer() { log_info "Criando ClusterIssuer para Let's Encrypt..." cat </dev/null || echo "") GITEA_NAME=$(echo "$GITEA_HOST" | cut -d. -f1) echo "" echo -e "${CYAN}═══════════════════════════════════════════════════${NC}" echo -e "${CYAN} Configure o DNS${NC}" echo -e "${CYAN}═══════════════════════════════════════════════════${NC}" if [[ "$USE_CLOUDFLARE" == "true" ]]; then echo "" echo "No painel do CloudFlare (https://dash.cloudflare.com):" echo "" echo -e " ${YELLOW}Tipo:${NC} A" echo -e " ${YELLOW}Nome:${NC} ${GITEA_NAME}" echo -e " ${YELLOW}Conteúdo:${NC} ${GREEN}${LB_IP}${NC}" echo -e " ${YELLOW}Proxy:${NC} ✓ (ícone laranja)" echo "" echo -e "${GREEN}O CloudFlare cuida do TLS automaticamente!${NC}" else echo "" echo "No seu provedor DNS:" echo "" echo -e " ${YELLOW}Tipo:${NC} A" echo -e " ${YELLOW}Nome:${NC} ${GITEA_NAME}" echo -e " ${YELLOW}Valor:${NC} ${GREEN}${LB_IP}${NC}" if [[ "$USE_LETSENCRYPT" == "true" ]]; then echo "" echo -e "${GREEN}Let's Encrypt irá emitir certificados automaticamente!${NC}" echo -e "Aguarde ~2 minutos após configurar o DNS." fi fi } # ============================================================================= # VERIFICAÇÕES INICIAIS # ============================================================================= log_info "Verificando pré-requisitos..." if ! command -v kubectl &> /dev/null; then log_error "kubectl não encontrado" exit 1 fi log_success "kubectl encontrado" if ! command -v helm &> /dev/null; then log_error "Helm não encontrado" exit 1 fi log_success "Helm $(helm version --short) encontrado" if ! kubectl cluster-info &> /dev/null; then log_error "Não foi possível conectar ao cluster" exit 1 fi log_success "Conectado ao cluster Kubernetes" # ============================================================================= # 1. VERIFICAR PRÉ-REQUISITOS DA AULA-08 # ============================================================================= log_info "=== Verificando infraestrutura (aula-08) ===" if ! kubectl get storageclass hcloud-volumes &> /dev/null; then log_error "StorageClass hcloud-volumes não encontrado!" log_error "Execute primeiro o setup.sh da aula-08 para instalar o CSI Driver." exit 1 fi log_success "Hetzner CSI Driver instalado (hcloud-volumes)" if ! kubectl get ingressclass nginx &> /dev/null; then log_error "NGINX Ingress não encontrado!" log_error "Execute primeiro o setup.sh da aula-08 para instalar o Ingress Controller." exit 1 fi log_success "NGINX Ingress Controller instalado" echo "" # ============================================================================= # 2. COLETAR INPUT DO USUÁRIO # ============================================================================= collect_user_input echo "" # ============================================================================= # 3. INSTALAR CERT-MANAGER (se Let's Encrypt) # ============================================================================= if [[ "$USE_LETSENCRYPT" == "true" ]]; then log_info "=== Configurando cert-manager ===" install_cert_manager create_cluster_issuer echo "" fi # ============================================================================= # 3.5. PAUSA PARA CONFIGURAÇÃO DE DNS # ============================================================================= show_dns_instructions echo "" echo -e "${YELLOW}⚠ Configure o DNS agora antes de continuar.${NC}" if [[ "$USE_LETSENCRYPT" == "true" ]]; then echo -e "${YELLOW} O Let's Encrypt precisa do DNS configurado para emitir o certificado.${NC}" fi echo "" echo -n "Pressione ENTER quando o DNS estiver configurado..." read -r echo "" # ============================================================================= # 4. ADICIONAR REPOSITÓRIO HELM # ============================================================================= log_info "=== Preparando instalação do Gitea ===" log_info "Adicionando repositório Helm do Gitea..." helm repo add gitea-charts https://dl.gitea.com/charts/ 2>/dev/null || true helm repo update # ============================================================================= # 5. CRIAR NAMESPACE # ============================================================================= log_info "Criando namespace gitea..." kubectl create namespace gitea --dry-run=client -o yaml | kubectl apply -f - echo "" # ============================================================================= # 6. GERAR SENHA DO ADMIN # ============================================================================= ADMIN_PASSWORD=$(openssl rand -base64 24 | tr -dc 'a-zA-Z0-9' | head -c 16) # ============================================================================= # 7. DETERMINAR PROTOCOLO E ROOT_URL # ============================================================================= PROTOCOL="https" if [[ "$USE_CLOUDFLARE" == "false" && "$USE_LETSENCRYPT" == "false" ]]; then PROTOCOL="http" fi ROOT_URL="${PROTOCOL}://${GITEA_HOST}/" # ============================================================================= # 8. INSTALAR GITEA VIA HELM # ============================================================================= log_info "=== Instalando Gitea (isso leva ~2-3 minutos) ===" # Construir argumentos do Helm HELM_ARGS="" # Hosts e domínio HELM_ARGS="$HELM_ARGS --set ingress.hosts[0].host=${GITEA_HOST}" HELM_ARGS="$HELM_ARGS --set ingress.hosts[0].paths[0].path=/" HELM_ARGS="$HELM_ARGS --set gitea.config.server.DOMAIN=${GITEA_HOST}" HELM_ARGS="$HELM_ARGS --set gitea.config.server.ROOT_URL=${ROOT_URL}" HELM_ARGS="$HELM_ARGS --set gitea.config.server.SSH_DOMAIN=${GITEA_HOST}" # Senha do admin HELM_ARGS="$HELM_ARGS --set gitea.admin.password=${ADMIN_PASSWORD}" # TLS - gerar values overlay temporário para anotações com pontos TEMP_TLS_VALUES=$(mktemp) if [[ "$USE_LETSENCRYPT" == "true" ]]; then HELM_ARGS="$HELM_ARGS --set ingress.tls[0].secretName=gitea-tls" HELM_ARGS="$HELM_ARGS --set ingress.tls[0].hosts[0]=${GITEA_HOST}" cat > "$TEMP_TLS_VALUES" < "$TEMP_TLS_VALUES" else echo "{}" > "$TEMP_TLS_VALUES" fi # Verificar se já está instalado if helm status gitea -n gitea &> /dev/null; then log_warn "Gitea já está instalado. Atualizando..." eval helm upgrade gitea gitea-charts/gitea \ --namespace gitea \ -f "$SCRIPT_DIR/gitea-values.yaml" \ -f "$TEMP_TLS_VALUES" \ $HELM_ARGS \ --timeout 10m \ --wait log_success "Gitea atualizado com sucesso!" else log_info "Instalando Gitea..." eval helm install gitea gitea-charts/gitea \ --namespace gitea \ -f "$SCRIPT_DIR/gitea-values.yaml" \ -f "$TEMP_TLS_VALUES" \ $HELM_ARGS \ --timeout 10m \ --wait log_success "Gitea instalado com sucesso!" fi rm -f "$TEMP_TLS_VALUES" echo "" # ============================================================================= # 9. CONFIGURAR TCP PASSTHROUGH PARA SSH # ============================================================================= log_info "=== Configurando TCP passthrough para SSH ===" if kubectl get configmap tcp-services -n ingress-nginx &> /dev/null; then kubectl patch configmap tcp-services \ -n ingress-nginx \ --type merge \ -p '{"data":{"22":"gitea/gitea-ssh:22"}}' else kubectl create configmap tcp-services \ -n ingress-nginx \ --from-literal="22=gitea/gitea-ssh:22" fi # Reiniciar NGINX para aplicar kubectl rollout restart deployment ingress-nginx-controller -n ingress-nginx log_success "TCP passthrough configurado (porta 22 → Gitea SSH)" echo "" # ============================================================================= # RESUMO FINAL # ============================================================================= echo "" echo -e "${CYAN}═══════════════════════════════════════════════════${NC}" echo -e "${GREEN} Gitea Instalado com Sucesso!${NC}" echo -e "${CYAN}═══════════════════════════════════════════════════${NC}" echo "" echo "Componentes instalados:" if [[ "$USE_LETSENCRYPT" == "true" ]]; then echo " - cert-manager (ClusterIssuer: letsencrypt)" fi echo " - Gitea (namespace: gitea)" echo " - Web UI + API + Git" echo " - Container Registry (packages)" echo " - SSH (porta 22)" echo " - Gitea Actions (CI/CD)" echo " - PostgreSQL (standalone)" echo " - Valkey (cache)" echo "" echo "Configuração:" echo " Gitea: ${GITEA_HOST}" echo " Registry: ${GITEA_HOST} (integrado)" echo " Domínio: ${DOMAIN}" echo " CloudFlare: ${USE_CLOUDFLARE}" echo " Let's Encrypt: ${USE_LETSENCRYPT}" echo "" echo "URLs:" echo " Web: ${PROTOCOL}://${GITEA_HOST}" echo " Registry: ${PROTOCOL}://${GITEA_HOST}" echo " SSH: git@${GITEA_HOST} (porta 22)" echo "" echo "Credenciais:" echo " Usuário: gitea_admin" echo " Senha: ${ADMIN_PASSWORD}" echo "" echo -e "${YELLOW}⚠ Guarde a senha! Ela não pode ser recuperada depois.${NC}" echo "" echo "Container Registry:" echo " # Login" echo " docker login ${GITEA_HOST}" echo "" echo " # Push de imagem" echo " docker tag minha-app:v1 ${GITEA_HOST}/usuario/minha-app:v1" echo " docker push ${GITEA_HOST}/usuario/minha-app:v1" echo "" echo "Comandos úteis:" echo " # Ver pods" echo " kubectl get pods -n gitea" echo "" echo " # Ver logs" echo " kubectl logs -n gitea -l app.kubernetes.io/name=gitea -f" echo "" echo " # Desinstalar" echo " ./cleanup.sh" echo "" echo -e "${CYAN}═══════════════════════════════════════════════════${NC}" echo "" # Mostrar status dos pods log_info "Status dos pods:" kubectl get pods -n gitea