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::Error

ou

[FAIL] meu-app  bundle decrypt failed: invalid mac

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 fingerprint

Fix — 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-app

Pré-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 --yes

O 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 file

Causa

Push parcial, merge conflict não resolvido, ou edição manual do arquivo binário.

Fix

runner secrets reset-bundle meu-app --yes

Mesmo 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 secrets

Causa

Primeiro deploy da app, ou .gitignore está capturando .runner/.

Fix

runner env set meu-app KEY=value    # primeira chave inicializa o bundle

Ou, se você já tem plaintext local:

runner secrets push meu-app

Depois confirme que .gitignore não está ignorando .runner/:

grep -r '.runner' .gitignore

Se aparecer, remova a entrada e faça commit.


Como prevenir

  • Faça backup da mkey: runner mkey export > /backup/mkey.sealed num 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

By Borlot.com.br on 27/05/2026