QrRapido/DOCKER_SECRETS_SETUP.md
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

6.1 KiB

Docker Secrets Setup - QR Rapido

Este documento descreve como configurar Docker Secrets para o QR Rapido em ambiente de produção.

Por que usar Docker Secrets?

  • Credenciais sensíveis não ficam expostas no código ou em arquivos de configuração
  • Secrets são criptografados em repouso e em trânsito
  • Apenas containers autorizados têm acesso
  • Facilita rotação de credenciais sem rebuild de imagens

Secrets Necessários

Secret Name Descrição Exemplo
stripe_secret_key Stripe API Secret Key sk_live_xxx
stripe_webhook_secret Stripe Webhook Signing Secret whsec_xxx
mongodb_connection_string String de conexão MongoDB completa mongodb://user:pass@host:port/db?options
google_client_id Google OAuth Client ID xxx.apps.googleusercontent.com
google_client_secret Google OAuth Client Secret GOCSPX-xxx
microsoft_client_id Microsoft OAuth Client ID guid
microsoft_client_secret Microsoft OAuth Client Secret xxx

Criando os Secrets (Uma única vez)

Conecte no servidor manager do Swarm e execute os comandos abaixo.

Opção 1: Via linha de comando (menos seguro - fica no histórico)

# Stripe
echo "sk_live_SUBSTITUA_PELA_SUA_CHAVE" | docker secret create stripe_secret_key -
echo "whsec_SUBSTITUA_PELO_SEU_SECRET" | docker secret create stripe_webhook_secret -

# MongoDB
echo "mongodb://admin:SENHA@129.146.116.218:27017,141.148.162.114:27017/QrRapido?replicaSet=rs0&authSource=admin" | docker secret create mongodb_connection_string -

# Google OAuth
echo "SEU_GOOGLE_CLIENT_ID.apps.googleusercontent.com" | docker secret create google_client_id -
echo "GOCSPX-SEU_CLIENT_SECRET" | docker secret create google_client_secret -

# Microsoft OAuth
echo "SEU_MICROSOFT_CLIENT_ID" | docker secret create microsoft_client_id -
echo "SEU_MICROSOFT_CLIENT_SECRET" | docker secret create microsoft_client_secret -

Opção 2: Via arquivo (mais seguro)

# Cria arquivo temporário, insere o valor, cria o secret, e remove o arquivo
nano /tmp/stripe_secret && docker secret create stripe_secret_key /tmp/stripe_secret && rm /tmp/stripe_secret

Repita para cada secret.

Verificando Secrets Criados

# Lista todos os secrets
docker secret ls

# Deve mostrar:
# ID                          NAME                        CREATED
# xxx                         stripe_secret_key           X minutes ago
# xxx                         stripe_webhook_secret       X minutes ago
# xxx                         mongodb_connection_string   X minutes ago
# xxx                         google_client_id            X minutes ago
# xxx                         google_client_secret        X minutes ago
# xxx                         microsoft_client_id         X minutes ago
# xxx                         microsoft_client_secret     X minutes ago

Recriando o Service com Secrets

Se o service já existe sem os secrets, você precisa recriá-lo:

# Remove o service existente
docker service rm qrrapido-prod

# O próximo deploy vai criar o service com os secrets automaticamente

Ou manualmente:

docker service create \
  --name qrrapido-prod \
  --replicas 2 \
  --network qrrapido-network \
  --publish published=5001,target=8080 \
  --mount type=bind,source=/app/keys,target=/app/keys \
  --secret stripe_secret_key \
  --secret stripe_webhook_secret \
  --secret mongodb_connection_string \
  --secret google_client_id \
  --secret google_client_secret \
  --secret microsoft_client_id \
  --secret microsoft_client_secret \
  --env ASPNETCORE_ENVIRONMENT=Production \
  --env ASPNETCORE_URLS=http://+:8080 \
  --update-delay 30s \
  --update-parallelism 1 \
  --update-order start-first \
  --restart-condition on-failure \
  --restart-max-attempts 3 \
  registry.redecarneir.us/qrrapido:latest

Atualizando um Secret

Docker Secrets são imutáveis. Para atualizar:

# 1. Cria novo secret com nome diferente
echo "novo_valor" | docker secret create stripe_secret_key_v2 -

# 2. Atualiza o service para usar o novo secret
docker service update \
  --secret-rm stripe_secret_key \
  --secret-add stripe_secret_key_v2 \
  qrrapido-prod

# 3. Remove o secret antigo
docker secret rm stripe_secret_key

# 4. (Opcional) Renomeia o novo secret
# Infelizmente não é possível renomear, então mantenha a convenção de versões
# ou recrie o service com o nome correto

Verificando se os Secrets estão funcionando

No rodapé da página, você verá:

  • QR Rapido v1.0.0 | Production ✓ - Secrets carregados corretamente
  • QR Rapido v1.0.0 | Production ✗ - Secrets NÃO carregados (problema!)

Você também pode verificar os logs:

docker service logs qrrapido-prod --tail 50 | grep -i secret

Como funciona internamente

  1. O Docker monta cada secret como arquivo em /run/secrets/<nome_do_secret>
  2. O DockerSecretsConfigurationProvider lê esses arquivos na inicialização
  3. Os valores sobrescrevem as configurações do appsettings.json
  4. A variável App:SecretsLoaded é definida como true quando pelo menos um secret é carregado

Testando Localmente

Para simular Docker Secrets localmente (sem Swarm):

# Cria diretório de secrets
mkdir -p /tmp/secrets

# Cria arquivos de teste
echo "sk_test_xxx" > /tmp/secrets/stripe_secret_key
echo "whsec_test" > /tmp/secrets/stripe_webhook_secret

# Executa o container com os secrets montados
docker run -d \
  -v /tmp/secrets:/run/secrets:ro \
  -p 5001:8080 \
  -e ASPNETCORE_ENVIRONMENT=Development \
  qrrapido:latest

Troubleshooting

Secret não está sendo lido

  1. Verifique se o container tem acesso ao secret:

    docker exec -it $(docker ps -q -f name=qrrapido) ls -la /run/secrets/
    
  2. Verifique o conteúdo (apenas para debug):

    docker exec -it $(docker ps -q -f name=qrrapido) cat /run/secrets/stripe_secret_key
    

Service não inicia

Verifique se todos os secrets existem antes de criar o service:

docker secret ls

Erro "secret not found"

O secret precisa existir ANTES de criar/atualizar o service que o usa.