Restaurar em novo servidor

Servidor pifou, instância terminada, ou você quer migrar para hardware maior. Este playbook restaura o runner com todas as apps e secrets intactos.

Sintomas / casos de uso

  • Servidor pifou (HD morreu, instância terminada)
  • Migrar runner para um servidor maior
  • Clonar produção para um servidor de teste

Pré-requisito crítico

Você tem a mkey exportada em backup seguro (feito antes do desastre):

runner mkey export --sealed > /backup/mkey.sealed

Se não tem mkey backup: todos os secrets estão inacessíveis. Não há como decriptar. Veja Bundle decrypt fail, sub-cenário "regenerar do plaintext local" — mas só funciona se você tem .env/.secrets copiados em outro lugar.

Passo 1: instalar runner no servidor novo

curl -sSL https://get.runner.ccs.systems/init.sh | sudo bash
runner -V   # confirmar versão >= a do servidor original

Passo 2: importar mkey

O mkey exportado é uma string base64. Importe via runner init --mkey:

# transferir mkey.sealed pro servidor novo (scp / vault / etc)
scp /backup/mkey.sealed servidor-novo:/tmp/

# no servidor novo: inicializar com a mkey do servidor original
runner init --mkey "$(cat /tmp/mkey.sealed)"

Isso garante que as ckeys existentes (armazenadas nos repos) possam ser decriptadas no servidor novo, porque a mkey é a mesma.

Passo 3: re-registrar apps

Para cada app que existia no servidor antigo:

runner add --repo user/app --instance production

Isso baixa o repo e o .runner/secrets.enc. Como a mkey é a mesma, o runner consegue decriptar as ckeys do bundle.

Passo 4: importar ckeys (se tem export antigo)

Se você fez backup das ckeys com runner ckeys export no servidor antigo, pode importá-las diretamente:

runner ckeys import-sealed --blob "$(cat /tmp/meu-app.ckey.sealed)"

Se não tem ckey export mas tem os .env/.secrets em outro lugar:

runner secrets reset-bundle meu-app --yes   # re-encripta do plaintext local

Passo 5: puxar secrets pro plaintext

runner secrets pull meu-app

Decripta .runner/secrets.enc e popula .env/.secrets local.

Passo 6: deploy

runner deploy meu-app

Workflow completo (script)

#!/bin/bash
# Restaura runner em servidor novo
set -e

MKEY_FILE=/tmp/mkey.sealed
APPS=(meu-app outro-app)

# 1. Instala
curl -sSL https://get.runner.ccs.systems/init.sh | sudo bash

# 2. Importa mkey
runner init --mkey "$(cat "$MKEY_FILE")"

# 3+4+5+6 por app
for app in "${APPS[@]}"; do
  runner add --repo user/"$app" --instance production

  if [ -f /tmp/"$app".ckey.sealed ]; then
    runner ckeys import-sealed --blob "$(cat /tmp/"$app".ckey.sealed)"
  fi

  runner secrets pull "$app"
  runner deploy "$app"
done

Pré-requisitos para que isto funcione

Recurso Obrigatório Observação
mkey exportada Sim (crítico) Sem isso, nenhum secret é recuperável
Acesso aos repos Sim GitHub token com permissão de leitura
ckeys exportadas Não Reduz steps, mas não é obrigatório
DNS atualizado Não (pós-deploy) Atualizar antes ou depois do deploy

Como prevenir surpresas no futuro

Backup periódico da mkey em vault separado:

runner mkey export --sealed > /vault/mkey-$(date +%Y%m%d).sealed

Backup das ckeys de cada app (incremental):

for app in $(runner list --json | jq -r '.[].name'); do
  runner ckeys export "$app" > /vault/ckeys/"$app".sealed
done

Documentar o inventário de apps — qual repo, qual instance, qual servidor.

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