Use este inventário para decidir quais valores pertencem ao ambiente de execução, quais são gerados no banco de dados e quais são armazenados por plugins. Cada seção indica como a rotação afeta um site em execução.
No Node.js, coloque segredos de execução no gerenciador de segredos da plataforma de hospedagem para que entrem em process.env quando o processo iniciar. Para um Worker, use wrangler secret put. Não coloque valores secretos em astro.config.mjs, wrangler.jsonc ou import.meta.env; o Vite pode incorporar valores de tempo de build no bundle do servidor.
Visão geral
| Segredo | Fonte | Armazenado em | Impacto por perda de chave |
|---|---|---|---|
EMDASH_ENCRYPTION_KEY | Operador (emdash secrets generate) | Apenas ambiente / Worker secret | Sem impacto nos dados atuais; EmDash verifica apenas o formato |
| Preview secret | Auto-gerado (override de env) | Tabela options (emdash:preview_secret) | Links de preview pendentes param de funcionar; novos são OK |
| IP salt | Auto-gerado (override de env) | Tabela options (emdash:ip_salt) | Continuidade do rate-limit de comentários é resetada |
| Session e API tokens | Gerados por sessão/token | Session store / banco de dados (apenas hashes) | Nada — texto puro nunca é armazenado |
| Credenciais de provedor OAuth | Você (console Google/GitHub) | Ambiente | Login via esse provedor para até substituição |
| Segredo Turnstile | Você (dashboard Cloudflare) | Ambiente | Verificação CAPTCHA de comentários falha |
| Credenciais S3 | Você (provedor de storage) | Ambiente de execução | Upload/download de mídia falha até substituição |
| Segredos de plugins | Você (UI de configurações admin) | Banco de dados (configurações/storage do plugin) | Reinserir no admin |
| Credenciais CLI | emdash login / emdash plugin publish device flows | ~/.config/emdash/auth.json (modo 0600) | Executar o device flow novamente |
| Credenciais CLI do registro | emdash-plugin atproto OAuth | ~/.emdash/oauth/, ~/.emdash/credentials.json (modo 0600) | Login novamente; identidade vive no seu PDS |
A chave de criptografia
EMDASH_ENCRYPTION_KEY atualmente não criptografa segredos de plugins nem outros dados armazenados. Se a variável estiver definida, o EmDash verifica seu formato durante a inicialização. Um valor malformado produz uma mensagem de log para o operador, mas o site continua processando requisições.
O comando a seguir gera um valor corretamente formatado. Armazene-o no ambiente de execução ou como Worker secret se sua implantação usa essa variável.
npx emdash secrets generate
# emdash_enc_v1_<43 caracteres base64url>
# Cloudflare:
wrangler secret put EMDASH_ENCRYPTION_KEY
O formato é emdash_enc_v1_ seguido de 32 bytes aleatórios como base64url sem padding. O valor é fornecido pelo operador e não é armazenado no banco de dados. Perdê-lo não tem impacto na recuperação de dados porque nenhum dado armazenado depende dele.
Segredos do site gerados
Dois segredos são gerados automaticamente no primeiro uso e persistidos na tabela options, então são estáveis entre requisições, implantações e isolates. A geração é atômica — cold starts concorrentes convergem em um valor.
Preview secret
Assina URLs de preview (HMAC). Armazenado como emdash:preview_secret; 32 bytes aleatórios, base64url.
- Override: defina
EMDASH_PREVIEW_SECRET(alias legado:PREVIEW_SECRET) se precisar do mesmo segredo entre múltiplos processos ou quiser fixá-lo por razões de auditoria. O ambiente sempre tem prioridade sobre o valor armazenado. - Rotação: exclua a linha
emdash:preview_secret(ou mude a variável de env) e reimplante. Impacto: links de preview emitidos anteriormente param de validar. Nada mais quebra — um novo segredo é gerado (ou lido do env) na próxima requisição de preview. - Se perdido: nada é irrecuperável. Links de preview são de curta duração por design.
Veja o guia de preview para como URLs de preview são construídos e verificados.
IP salt
Adiciona salt ao hash SHA-256 dos endereços IP dos comentaristas (ip_hash em comentários) usado para rate limiting de comentários. Armazenado como emdash:ip_salt. Específico do site, então hashes não são correlacionáveis entre instalações EmDash.
- Override: defina
EMDASH_IP_SALT. Para compatibilidade retroativa,EMDASH_AUTH_SECRET/AUTH_SECRETtambém são consultados — instalações que historicamente derivaram o salt deles mantêm hashes estáveis. - Rotação: mude a variável de env ou exclua a linha
emdash:ip_salt. Impacto: novas submissões de comentários geram hashes diferentes, então a contagem de rate-limit recomeça para todos. Comentários existentes e seus hashes armazenados não são afetados. - Se perdido: sem perda de dados. Apenas a continuidade do rate-limiting é resetada.
Session e API tokens
- Sessions usam o session store do Astro (Workers KV no Cloudflare, filesystem no Node). O cookie carrega um ID de sessão opaco; não há segredo de assinatura para gerenciar. Faça logout para encerrar uma sessão, ou limpe o session store (ex. o namespace KV) para forçar todos a fazerem login novamente.
- API tokens (prefixos
ec_pat_,ec_oat_,ec_ort_) são valores opacos aleatórios de 256 bits; apenas seu hash SHA-256 é armazenado. O texto puro é mostrado uma vez na criação. Rotacione revogando e recriando no admin. - Tokens de convite, magic-link e recuperação são de uso único, armazenados como hashes SHA-256 em
auth_tokens, e limitados no tempo (convites 7 dias, magic links 15 minutos).
Não há nada para fazer backup ou rotacionar proativamente: um vazamento de banco de dados expõe apenas hashes, e cada token pode ser revogado ou reemitido pelo admin.
Credenciais de serviço fornecidas pelo usuário
Credenciais para serviços externos são lidas do ambiente e nunca escritas no banco de dados. Rotacione-as no provedor, atualize a variável, reimplante.
| Serviço | Variáveis |
|---|---|
| Login Google | EMDASH_OAUTH_GOOGLE_CLIENT_ID, EMDASH_OAUTH_GOOGLE_CLIENT_SECRET (ou aliases sem prefixo) |
| Login GitHub | EMDASH_OAUTH_GITHUB_CLIENT_ID, EMDASH_OAUTH_GITHUB_CLIENT_SECRET (ou aliases sem prefixo) |
| Publicação marketplace (CI) | EMDASH_MARKETPLACE_TOKEN |
| Turnstile (comentários) | EMDASH_TURNSTILE_SECRET_KEY (ou TURNSTILE_SECRET_KEY) |
| Storage S3 | S3_ACCESS_KEY_ID, S3_SECRET_ACCESS_KEY, S3_ENDPOINT, S3_BUCKET, S3_REGION |
No Cloudflare, defina-as com wrangler secret put; para desenvolvimento local, coloque-as em .env. O Wrangler lê .dev.vars ou .env, não ambos, e .dev.vars tem precedência quando presente. R2 via binding não precisa de variáveis de access-key porque o binding concede acesso em runtime. Veja storage de mídia.
Segredos de plugins
Configurações que um plugin declara com type: "secret" (chaves de API para provedores de email, CAPTCHAs de formulários, etc.) são inseridas na UI do admin e armazenadas no banco de dados — na tabela options em plugin:<id>:settings:<key>, ou no storage chave-valor do plugin. Se um segredo armazenado é devolvido à UI do admin depende do plugin; plugins bem implementados retornam apenas um flag “valor está definido” em vez do segredo em si (o plugin de formulários incluído faz isso).
- Rotação: rotacione a chave no provedor e cole o novo valor na página de configurações do plugin. Tem efeito imediato.
- Se perdido: reinsira o valor no admin. Nada mais depende dele.
Credenciais CLI
A CLI emdash mantém dois tipos de credenciais, ambas em ~/.config/emdash/auth.json (respeitando XDG_CONFIG_HOME), criadas com permissões somente do proprietário (0600):
- Site tokens —
emdash loginautentica contra sua instância EmDash via fluxo de dispositivo OAuth e armazena o token resultante indexado pela URL da instância.emdash logouto remove; por invocação,--tokenouEMDASH_TOKENsobrescreve o token armazenado. - Marketplace tokens —
emdash plugin publishautentica no EmDash Marketplace via fluxo de dispositivo GitHub e armazena o JWT resultante indexado pormarketplace:<origin>. Para publicação CI, definaEMDASH_MARKETPLACE_TOKEN— tem prioridade sobre a credencial armazenada.
Perder o arquivo é inofensivo: execute emdash login (ou emdash plugin publish, que re-executa o fluxo de dispositivo) novamente.
Credenciais CLI do plugin registry
A CLI separada emdash-plugin (pacote @emdash-cms/plugin-cli) visa o registro experimental AT Protocol. Publicar lá está vinculado à sua identidade AT Protocol (seu DID de publisher) — o site em si não mantém credenciais de publicação, e instalações verificam artefatos contra checksums de registros de release atribuídos a esse DID.
- Autentica via atproto OAuth. Os blobs de sessão/estado OAuth vivem em
~/.emdash/oauth/, e a identidade do publisher (DID, handle, PDS) é armazenada em cache em~/.emdash/credentials.json; ambos são escritos com permissões somente do proprietário. - Em CI, forneça a identidade via
EMDASH_PUBLISHER_DID,EMDASH_PUBLISHER_HANDLEeEMDASH_PUBLISHER_PDS;EMDASH_REGISTRY_URLsobrescreve o host do registro. Opublishautomatizado do CI ainda precisa dos arquivos de sessão OAuth em~/.emdash/oauth/no runner — as variáveis de env sozinhas não carregam a sessão OAuth. - Rotacionar ou revogar o acesso de publicação acontece na sua conta AT Protocol (ex. senhas de app), não no EmDash. Veja Autenticação Atmosphere.
Referência rápida de rotação
| Quero… | Fazer isso |
|---|---|
| Invalidar todos os links de preview | Excluir a linha de opção emdash:preview_secret (ou mudar o override de env) |
| Resetar o hashing de rate-limit de comentários | Mudar EMDASH_IP_SALT (ou excluir a linha de opção emdash:ip_salt) |
| Revogar um API token vazado | Admin → Usuários → API tokens → revogar, depois criar um substituto |
| Encerrar todas as sessões | Limpar o session store (namespace Workers KV / diretório de sessões) |
| Substituir uma credencial de provedor | Rotacionar no provedor, atualizar a variável de env, reimplantar |
| Substituir uma chave de API de plugin | Rotacionar no provedor, reinserir nas configurações admin do plugin |