Bundle decrypt failed
Há três sub-cenários. O sintoma determina qual você está vendo.
Sub-cenário A: ckey mismatch (chave errada)
Sintoma:
[FAIL] meu-app Phase 1.4: failed to decrypt .runner/secrets.enc
aead::Errorou
[FAIL] meu-app bundle decrypt failed: invalid macO que o erro diz
O erro da fase 1.4 diz qual bundle falhou e o que se sabe dele:
Phase 1.4: failed to decrypt remote secrets.enc (`.runner/secrets.production.enc`) — sync aborted …
Underlying error: aead::Error. Diagnóstico: o bundle foi regravado depois do último deploy bom
desta app, pelo commit `a1b2c3d 2026-11-04 chore: update encrypted secrets`; o bundle é
compartilhado com loja-staging; ckeys diferentes regravando o mesmo arquivo é a causa mais
provável. If you genuinely want to proceed without sync, pass --insecure.- o arquivo:
secrets.<instância>.enc(ou osecrets.enclegado), no repo da app. - regravado depois do último deploy bom: o commit que mudou o bundle
desde o último deploy de sucesso desta instância. Com
version.source: git-commita comparação é pelo commit do deploy; nos outros, pela data. Se o bundle não mudou, o erro diz isso: aí quem mudou foi a ckey deste servidor. O clone local do repo é raso (últimos 50 commits): se o bundle não mudou dentro dessa janela, o erro diz que o commit que o gravou é mais antigo que o histórico local, sem afirmar se mudou. - compartilhado com: outras apps deste servidor com o mesmo repo, a
mesma branch, o mesmo
manifest_pathe a mesma instância. Cada uma regrava o bundle com a sua ckey no push de secrets, e a última a gravar vence. É a causa mais comum; veja Multi-service shared repo.
Sem pull/ (ou sem git), o erro traz só o arquivo.
Causa
O bundle .runner/secrets.enc foi encriptado com uma ckey diferente
da que o servidor local tem no state.
Quando isso acontece:
- Migrou repo de servidor A para servidor B, copiou o bundle mas não a ckey.
- Outro operator gerou bundle novo num servidor com ckey diferente.
- ckey local foi corrompida por edição manual do arquivo de state.
Diagnóstico
runner ckeys list # ver ckey local da app
runner secrets show meu-app --json # mostra erro com fingerprintFix — opção 1: importar ckey correta de outro servidor
No servidor que tem a ckey certa:
runner ckeys export meu-app > meu-app.ckey.sealed
scp meu-app.ckey.sealed servidor-novo:/tmp/No servidor que precisa da ckey:
runner ckeys import-sealed --app meu-app < /tmp/meu-app.ckey.sealed
runner secrets pull meu-app # re-popula plaintext local
runner deploy meu-appPré-requisito: ambos os servidores precisam ter a mesma mkey (master key). Veja Restaurar em novo servidor.
Fix — opção 2: regenerar bundle do plaintext local
Se você tem .env/.secrets em plaintext local mas o bundle no repo
está errado:
runner secrets reset-bundle meu-app --yesO comando re-encripta do plaintext local e faz push pro repo.
Sub-cenário B: bundle corrompido
Sintoma:
[FAIL] meu-app failed to parse .runner/secrets.enc: unexpected end of fileCausa
Push parcial, merge conflict não resolvido, ou edição manual do arquivo binário.
Fix
runner secrets reset-bundle meu-app --yesMesmo comando da opção 2 acima — re-encripta do plaintext local.
Sub-cenário C: bundle sumiu
Sintoma:
[WARN] .runner/secrets.enc não encontrado, continuando sem secretsCausa
Primeiro deploy da app, ou .gitignore está capturando .runner/.
Fix
runner env set meu-app KEY=value # primeira chave inicializa o bundleOu, se você já tem plaintext local:
runner secrets push meu-appDepois confirme que .gitignore não está ignorando .runner/:
grep -r '.runner' .gitignoreSe aparecer, remova a entrada e faça commit.
Como prevenir
- Faça backup da mkey:
runner mkey export > /backup/mkey.sealednum servidor seguro. Com a mkey, você consegue decriptar qualquer bundle de qualquer app daquele servidor. - Plaintext local é source of truth: se o servidor pifar, você
recupera o bundle do plaintext via
secrets reset-bundle. - Para apps novas em repos existentes, copie a ckey logo após o
runner add— veja multi-service-shared-repo.
Ver também
- Secrets lifecycle — como a ckey funciona
- Drift detected — bloqueio por hash mismatch
- Multi-service no mesmo repo — colisão de ckeys