DATABASE_URL readonly por padrão
TLDR: Torna
DATABASE_URLreadonly por padrão em todos os ambientes, comDATABASE_URL_WRITEinjetado por um entrypoint do commons apenas nos pods de runtime.
Contexto
Hoje todos os pods têm acesso de escrita ao banco por padrão. Qualquer acesso via shell ou k9s recebe uma conexão de escrita. O objetivo é tornar readonly o padrão e exigir opt-in explícito para escrita, feito pelo entrypoint de runtime.
Objetivos
DATABASE_URL= readonly por padrão (todos os pods, console, shell)DATABASE_URL_WRITE= escrita, injetado só pelo entrypoint nos pods de runtime- O entrypoint loga o modo do banco com cor: laranja = full access, ciano = readonly
- Sem mudanças na aplicação — o contrato é puramente de infra/runtime
Fora de escopo
— (não registrado na spec original)
Mudanças
Commons (feito)
shell/tasks/docker/entrypoint.sh— injetaDATABASE_URL=$DATABASE_URL_WRITEse definido e loga o mododocker/Dockerfile— adicionaCOPY entrypointno stage de runtime e defineENTRYPOINT ["entrypoint"]
onion-backend (branch feat/database-url-readonly-default)
config/settings/base.py—DB_URL→DATABASE_URLbin/console— remove o workaround deDB_URL.infra/terraform/secrets.tf—DATABASE_URL= url readonly,DATABASE_URL_WRITE= url de escrita
Terraform staging (a fazer)
database.tf— adicionardigitalocean_database_user.onion_readonlysecrets.tf—DATABASE_URL= url doonion_readonly,DATABASE_URL_WRITE= url doonion- Permissões via SQL:
GRANT SELECT ON ALL TABLES TO onion_readonly
Terraform production (a fazer)
database.tf—node_count = 2(primary + standby), adicionardigitalocean_database_connection_poolcommode = "replica"secrets.tf—DATABASE_URL= url do pool replica,DATABASE_URL_WRITE= url do primary
Manifests k8s (a fazer)
- Remover as env vars
DB_URLeDATABASE_URL_READONLYde todos os deployments - Adicionar a env var
DATABASE_URL_WRITEa partir do secret
Como verificar
mk console.staging→os.environ.get('DATABASE_URL')retorna a url readonlymk shell.staging→echo $DATABASE_URLretorna a url readonly- Logs do pod no startup mostram “readonly mode” em ciano ou “full access” em laranja
User.objects.first().save()falha no console (permission denied)- Escritas da aplicação (create/update) funcionam normalmente nos pods web/worker
Documentação
Nenhuma mudança de documentação necessária.