#!/bin/bash # ============================================================================= # Script para criar/recriar Docker Secrets no Swarm # QR Rapido - Produção # ============================================================================= # # USO: # ./create-docker-secrets.sh # Modo interativo (pede cada valor) # ./create-docker-secrets.sh --from-env # Lê de variáveis de ambiente # ./create-docker-secrets.sh --from-file secrets.env # Lê de arquivo .env # ./create-docker-secrets.sh --delete # Remove todos os secrets # ./create-docker-secrets.sh --list # Lista secrets existentes # # IMPORTANTE: Execute este script no servidor MANAGER do Docker Swarm # ============================================================================= set -e # Cores para output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # Lista de secrets necessários SECRETS=( "stripe_secret_key" "stripe_webhook_secret" "mongodb_connection_string" "google_client_id" "google_client_secret" "microsoft_client_id" "microsoft_client_secret" ) # Descrições dos secrets declare -A SECRET_DESCRIPTIONS=( ["stripe_secret_key"]="Stripe API Secret Key (sk_live_xxx)" ["stripe_webhook_secret"]="Stripe Webhook Signing Secret (whsec_xxx)" ["mongodb_connection_string"]="MongoDB Connection String completa" ["google_client_id"]="Google OAuth Client ID" ["google_client_secret"]="Google OAuth Client Secret" ["microsoft_client_id"]="Microsoft OAuth Client ID (GUID)" ["microsoft_client_secret"]="Microsoft OAuth Client Secret" ) # Função para exibir uso show_usage() { echo -e "${BLUE}=== QR Rapido - Docker Secrets Manager ===${NC}" echo "" echo "Uso: $0 [opção]" echo "" echo "Opções:" echo " (sem opção) Modo interativo - pede cada valor" echo " --from-env Lê valores de variáveis de ambiente" echo " --from-file F Lê valores de arquivo .env" echo " --delete Remove todos os secrets" echo " --list Lista secrets existentes" echo " --check Verifica quais secrets estão faltando" echo " --help Exibe esta ajuda" echo "" echo "Variáveis de ambiente esperadas (para --from-env):" for secret in "${SECRETS[@]}"; do local env_var=$(echo "$secret" | tr '[:lower:]' '[:upper:]') echo " $env_var" done } # Função para verificar se está no Swarm check_swarm() { if ! docker info 2>/dev/null | grep -q "Swarm: active"; then echo -e "${RED}ERRO: Docker Swarm não está ativo neste nó.${NC}" echo "Execute este script no servidor manager do Swarm." exit 1 fi if ! docker info 2>/dev/null | grep -q "Is Manager: true"; then echo -e "${RED}ERRO: Este nó não é um manager do Swarm.${NC}" echo "Execute este script no servidor manager do Swarm." exit 1 fi } # Função para listar secrets list_secrets() { echo -e "${BLUE}=== Secrets existentes ===${NC}" docker secret ls echo "" echo -e "${BLUE}=== Status dos secrets do QR Rapido ===${NC}" for secret in "${SECRETS[@]}"; do if docker secret inspect "$secret" > /dev/null 2>&1; then echo -e " ${GREEN}✓${NC} $secret" else echo -e " ${RED}✗${NC} $secret (não existe)" fi done } # Função para verificar secrets faltantes check_secrets() { echo -e "${BLUE}=== Verificando secrets do QR Rapido ===${NC}" local missing=0 for secret in "${SECRETS[@]}"; do if docker secret inspect "$secret" > /dev/null 2>&1; then echo -e " ${GREEN}✓${NC} $secret" else echo -e " ${RED}✗${NC} $secret - ${SECRET_DESCRIPTIONS[$secret]}" missing=$((missing + 1)) fi done if [ $missing -gt 0 ]; then echo "" echo -e "${YELLOW}$missing secret(s) faltando.${NC}" echo "Execute: $0 (modo interativo) para criar os secrets faltantes." return 1 else echo "" echo -e "${GREEN}Todos os secrets estão configurados!${NC}" return 0 fi } # Função para deletar secrets delete_secrets() { echo -e "${YELLOW}=== Removendo secrets do QR Rapido ===${NC}" echo -e "${RED}ATENÇÃO: Isso vai remover TODOS os secrets listados!${NC}" read -p "Tem certeza? (digite 'sim' para confirmar): " confirm if [ "$confirm" != "sim" ]; then echo "Operação cancelada." exit 0 fi for secret in "${SECRETS[@]}"; do if docker secret inspect "$secret" > /dev/null 2>&1; then echo -n "Removendo $secret... " if docker secret rm "$secret" 2>/dev/null; then echo -e "${GREEN}OK${NC}" else echo -e "${RED}ERRO (pode estar em uso por um service)${NC}" fi else echo -e " $secret - ${YELLOW}não existe${NC}" fi done echo "" echo -e "${YELLOW}IMPORTANTE: Se algum secret estava em uso, você precisa:${NC}" echo "1. Parar o service: docker service rm qrrapido-prod" echo "2. Remover os secrets: $0 --delete" echo "3. Recriar os secrets: $0" echo "4. Recriar o service (via CI/CD ou manualmente)" } # Função para criar um secret create_secret() { local name=$1 local value=$2 # Verifica se já existe if docker secret inspect "$name" > /dev/null 2>&1; then echo -e " ${YELLOW}!${NC} $name já existe (pulando)" return 0 fi # Cria o secret echo -n " Criando $name... " if echo -n "$value" | docker secret create "$name" - > /dev/null 2>&1; then echo -e "${GREEN}OK${NC}" return 0 else echo -e "${RED}ERRO${NC}" return 1 fi } # Função para modo interativo interactive_mode() { echo -e "${BLUE}=== Modo Interativo ===${NC}" echo "Você será perguntado sobre cada secret." echo "Pressione ENTER para pular secrets que já existem." echo "" for secret in "${SECRETS[@]}"; do # Verifica se já existe if docker secret inspect "$secret" > /dev/null 2>&1; then echo -e "${GREEN}✓${NC} $secret já existe" read -p " Deseja recriar? (s/N): " recreate if [ "$recreate" != "s" ] && [ "$recreate" != "S" ]; then continue fi echo -n " Removendo secret antigo... " docker secret rm "$secret" > /dev/null 2>&1 || true echo "OK" fi echo "" echo -e "${BLUE}$secret${NC}" echo " Descrição: ${SECRET_DESCRIPTIONS[$secret]}" # Lê o valor (sem mostrar na tela) read -s -p " Valor: " value echo "" if [ -z "$value" ]; then echo -e " ${YELLOW}Pulando (valor vazio)${NC}" continue fi create_secret "$secret" "$value" done echo "" echo -e "${GREEN}=== Concluído ===${NC}" list_secrets } # Função para ler de variáveis de ambiente from_env_mode() { echo -e "${BLUE}=== Lendo de variáveis de ambiente ===${NC}" local errors=0 for secret in "${SECRETS[@]}"; do local env_var=$(echo "$secret" | tr '[:lower:]' '[:upper:]') local value="${!env_var}" if [ -z "$value" ]; then echo -e " ${RED}✗${NC} $env_var não está definida" errors=$((errors + 1)) else create_secret "$secret" "$value" fi done if [ $errors -gt 0 ]; then echo "" echo -e "${RED}$errors variável(is) de ambiente não encontrada(s).${NC}" exit 1 fi echo "" echo -e "${GREEN}=== Concluído ===${NC}" } # Função para ler de arquivo from_file_mode() { local file=$1 if [ ! -f "$file" ]; then echo -e "${RED}ERRO: Arquivo não encontrado: $file${NC}" exit 1 fi echo -e "${BLUE}=== Lendo de arquivo: $file ===${NC}" # Carrega as variáveis do arquivo set -a source "$file" set +a # Usa o modo from_env from_env_mode } # ============================================================================= # MAIN # ============================================================================= # Verifica se está no Swarm (exceto para --help) if [ "$1" != "--help" ] && [ "$1" != "-h" ]; then check_swarm fi # Processa argumentos case "$1" in --help|-h) show_usage ;; --list) list_secrets ;; --check) check_secrets ;; --delete) delete_secrets ;; --from-env) from_env_mode ;; --from-file) if [ -z "$2" ]; then echo -e "${RED}ERRO: Especifique o arquivo .env${NC}" echo "Uso: $0 --from-file secrets.env" exit 1 fi from_file_mode "$2" ;; "") interactive_mode ;; *) echo -e "${RED}Opção desconhecida: $1${NC}" show_usage exit 1 ;; esac