QrRapido/Scripts/create-docker-secrets.sh
Ricardo Carneiro 6d4a8904f2 feat: Docker Secrets para credenciais sensíveis
- Criado DockerSecretsConfigurationProvider para ler secrets de /run/secrets/
- Removidas credenciais sensíveis do appsettings.Production.json
- Adicionado indicador visual no rodapé (✓/✗) para verificar se secrets foram carregados
- Atualizado deploy.yml para usar Docker Secrets no Swarm
- Criado script create-docker-secrets.sh para gerenciar secrets
- Criado template secrets.env.template para facilitar configuração
- Documentação completa em DOCKER_SECRETS_SETUP.md

Secrets gerenciados:
- stripe_secret_key
- stripe_webhook_secret
- mongodb_connection_string
- google_client_id / google_client_secret
- microsoft_client_id / microsoft_client_secret

IMPORTANTE: Após este deploy, é necessário criar os secrets no Swarm
e recriar o service. Consulte DOCKER_SECRETS_SETUP.md.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 21:39:20 -03:00

310 lines
8.9 KiB
Bash

#!/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