- 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>
310 lines
8.9 KiB
Bash
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
|