#!/bin/bash # ============================================================================= # Aula 13 - Container Factory (eStargz Images) # ============================================================================= # # Este script configura: # 1. Namespace para deploy de imagens customizadas # 2. Secrets e ConfigMaps # 3. Instruções para criar repositório no Gitea # # Pré-requisitos: # - Cluster Kubernetes com Talos + stargz-snapshotter (aula-07/08) # - Gitea instalado (aula-10) # - Gitea Actions Runner (aula-10) # # ============================================================================= 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}[ERROR]${NC} $1"; } SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ENV_FILE="${SCRIPT_DIR}/.env" # ============================================================================= # VERIFICAR PRÉ-REQUISITOS # ============================================================================= log_info "Verificando pré-requisitos..." # Verificar kubectl if ! command -v kubectl &> /dev/null; then log_error "kubectl não encontrado. Instale com: brew install kubectl" exit 1 fi # 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 KUBECONFIG está configurado corretamente" exit 1 fi # Verificar se Gitea está instalado if ! kubectl get namespace gitea &> /dev/null; then log_error "Namespace 'gitea' não encontrado" log_info "Execute primeiro a aula-10 para instalar o Gitea" exit 1 fi log_success "Pré-requisitos verificados" # ============================================================================= # CARREGAR CONFIGURAÇÃO EXISTENTE # ============================================================================= # Carregar configuração local PRIMEIRO (se existir) if [[ -f "$ENV_FILE" ]]; then log_info "Carregando configuração local..." source "$ENV_FILE" fi # Se não tiver configuração local, tentar herdar da aula-10 if [[ -z "$DOMAIN" ]]; then AULA10_ENV="${SCRIPT_DIR}/../aula-10/.env" if [[ -f "$AULA10_ENV" ]]; then log_info "Herdando configuração da aula-10..." source "$AULA10_ENV" fi fi # ============================================================================= # COLETAR CONFIGURAÇÃO # ============================================================================= echo "" echo "==========================================" echo " Container Factory - eStargz Images" echo "==========================================" echo "" # Domínio if [[ -z "$DOMAIN" ]]; then read -p "Domínio base (ex: kube.quest): " DOMAIN fi log_info "Domínio: ${DOMAIN}" GITEA_HOST="gitea.${DOMAIN}" # Namespace para deploy if [[ -z "$DEPLOY_NAMESPACE" ]]; then DEFAULT_NS="factory" read -p "Namespace para deploy [${DEFAULT_NS}]: " DEPLOY_NAMESPACE DEPLOY_NAMESPACE="${DEPLOY_NAMESPACE:-$DEFAULT_NS}" fi log_info "Namespace: ${DEPLOY_NAMESPACE}" # Gerar senha PostgreSQL se não existir if [[ -z "$POSTGRES_PASSWORD" ]]; then POSTGRES_PASSWORD=$(openssl rand -base64 24 | tr -dc 'a-zA-Z0-9' | head -c 24) log_info "Senha PostgreSQL gerada automaticamente" fi # Salvar configuração cat > "$ENV_FILE" << EOF # Configuração gerada pelo setup.sh - $(date) DOMAIN=${DOMAIN} GITEA_HOST=${GITEA_HOST} DEPLOY_NAMESPACE=${DEPLOY_NAMESPACE} POSTGRES_PASSWORD=${POSTGRES_PASSWORD} EOF log_success "Configuração salva em ${ENV_FILE}" # ============================================================================= # CRIAR NAMESPACE # ============================================================================= echo "" log_info "=== Criando Namespace ===" kubectl create namespace ${DEPLOY_NAMESPACE} --dry-run=client -o yaml | kubectl apply -f - log_success "Namespace ${DEPLOY_NAMESPACE} criado" # ============================================================================= # CRIAR SECRET DO POSTGRESQL # ============================================================================= log_info "Criando secret do PostgreSQL..." kubectl create secret generic postgresql-secret \ --namespace ${DEPLOY_NAMESPACE} \ --from-literal=username=postgres \ --from-literal=password="${POSTGRES_PASSWORD}" \ --dry-run=client -o yaml | kubectl apply -f - log_success "Secret postgresql-secret criado" # ============================================================================= # CRIAR CONFIGMAP # ============================================================================= log_info "Criando ConfigMap do PostgreSQL..." kubectl apply -f "${SCRIPT_DIR}/k8s/postgresql/configmap.yaml" -n ${DEPLOY_NAMESPACE} log_success "ConfigMap postgresql-config criado" # ============================================================================= # INSTRUÇÕES PARA CRIAR REPOSITÓRIO # ============================================================================= echo "" echo "==========================================" echo " Próximos Passos" echo "==========================================" echo "" echo -e "${CYAN}1. Criar organização 'factory' no Gitea:${NC}" echo " URL: https://${GITEA_HOST}/-/admin/orgs" echo " Nome: factory" echo " Visibilidade: Private" echo "" echo -e "${CYAN}2. Criar repositório 'postgresql' na org:${NC}" echo " URL: https://${GITEA_HOST}/repo/create" echo " Owner: factory" echo " Nome: postgresql" echo "" echo -e "${CYAN}3. Clonar e copiar os arquivos:${NC}" echo "" echo " git clone git@${GITEA_HOST}:factory/postgresql.git" echo " cd postgresql" echo " cp ${SCRIPT_DIR}/images/postgresql/* ." echo " mkdir -p .gitea/workflows" echo " cp ${SCRIPT_DIR}/pipelines/postgresql/ci.yml .gitea/workflows/ci.yml" echo "" echo -e "${CYAN}4. Push inicial:${NC}" echo "" echo " git add ." echo " git commit -m 'Initial commit: PostgreSQL factory image'" echo " git push -u origin main" echo "" echo -e "${CYAN}5. Aguardar pipeline (Gitea Actions):${NC}" echo " https://${GITEA_HOST}/factory/postgresql/actions" echo "" echo -e "${CYAN}6. Após pipeline completo, deploy no cluster:${NC}" echo "" echo " kubectl apply -f ${SCRIPT_DIR}/k8s/postgresql/pvc.yaml -n ${DEPLOY_NAMESPACE}" echo " kubectl apply -f ${SCRIPT_DIR}/k8s/postgresql/deployment.yaml -n ${DEPLOY_NAMESPACE}" echo " kubectl apply -f ${SCRIPT_DIR}/k8s/postgresql/service.yaml -n ${DEPLOY_NAMESPACE}" echo "" echo "==========================================" echo " Credenciais PostgreSQL" echo "==========================================" echo " Host: postgresql.${DEPLOY_NAMESPACE}.svc.cluster.local" echo " Port: 5432" echo " User: postgres" echo " Pass: ${POSTGRES_PASSWORD}" echo " DB: app" echo "==========================================" echo "" echo -e "${CYAN}7. Testar conexão:${NC}" echo "" echo " kubectl run pg-client --rm -it --restart=Never \\" echo " --image=postgres:17-alpine \\" echo " --env=PGPASSWORD=${POSTGRES_PASSWORD} \\" echo " -- psql -h postgresql.${DEPLOY_NAMESPACE}.svc.cluster.local -U postgres -d app" echo "" echo "==========================================" echo " Container Registry (Gitea Packages)" echo "==========================================" echo "" echo " # Login" echo " docker login ${GITEA_HOST}" echo "" echo " # Imagens são publicadas automaticamente pelo Gitea Actions" echo " # Após pipeline: ${GITEA_HOST}/factory/postgresql/packages" echo "" echo "==========================================" echo " Verificar Lazy Pulling (eStargz)" echo "==========================================" echo "" echo " # Ver tempo de startup do pod" echo " kubectl get pods -n ${DEPLOY_NAMESPACE} -w" echo "" echo " # Ver logs do stargz-snapshotter (se tiver acesso ao node)" echo " talosctl -n logs stargz-snapshotter" echo ""