`runner wizard` (CLI) — v2.17.0+
Wizard interativo de linha de comando para gerar .deploy.yml (e opcionalmente .runner/secrets.enc) a partir do que ja existe no repositorio. Funciona em qualquer cenario:
- Repositorio cru (so README) — constroi do zero
- Repositorio com
Dockerfile— pre-preencheimage/port - Repositorio com
docker-compose.yml— detecta multi-service e pergunta qual e o app principal - Repositorio com
.env/.env.example— extrai vars e classifica secrets automaticamente
Existe versao web tambem: se voce ainda nao instalou o runner em nenhum servidor, use o Wizard Web — formulario guiado de 10 passos no navegador, gera o mesmo
.deploy.yml. Diferenca: a versao web nao detecta arquivos do repo automaticamente; voce responde tudo manualmente. A versao CLI tem deteccao + multi-service compose + geracao desecrets.enc.
Quando usar
| Situacao | Comando |
|---|---|
| Comecar do zero em um repo novo | runner wizard --path . |
| Converter docker-compose existente | runner wizard --path /caminho/repo |
| Inspecionar repo remoto sem clonar primeiro | runner wizard --repo user/app --branch main |
runner add falhou com no_deploy_yml |
aceitar o prompt automatico (TTY) |
| Automacao/CI (sem prompts) | runner wizard --path . --accept-defaults --json --dry-run |
Sintaxe
runner wizard [OPTIONS]Opcoes
| Flag | Tipo | Descricao |
|---|---|---|
--path <PATH> |
path local | Repo ja clonado. Mutuamente exclusivo com --repo. |
--repo <USER/REPO> |
string | Repo no GitHub. Sera clonado em shallow num temp dir. Mutuamente exclusivo com --path. |
--branch <BRANCH> |
string | Obrigatorio se usar --repo. |
--token <TOKEN> |
string | GitHub token para clonar repos privados. |
--out <PATH> |
path | Onde gravar o .deploy.yml. Default: <repo_dir>/.deploy.yml. |
--ckey [<VALUE>] |
string | Ckey para encriptar secrets. Sem valor: gera random 32-char. Com valor: usa literal. |
--accept-defaults |
flag | Pula todos os prompts e aceita defaults da deteccao. Util para CI/automacao. |
--answers <FILE> |
path | (v2.18.0+) JSON com respostas. Implica --accept-defaults. Schema abaixo. |
--dry-run |
flag | Calcula tudo mas nao escreve nenhum arquivo. |
--json |
flag | Imprime o resultado em JSON na stdout. |
`--answers` schema (v2.18.0+)
{
"project": "middleware-241",
"system": "api",
"type": "docker-build",
"port": 5000,
"image": "php:8.3-fpm",
"instance": "production",
"instance_branch": "dev",
"instance_domain": "app.example.com",
"keep_versions": 3,
"healthcheck_mode": "http",
"healthcheck_path": "/health",
"env_overrides": {
"APP_ENV": "production",
"APP_DEBUG": "false"
},
"skip_env": ["AWS_*", "MAIL_*", "MEMCACHED_*"],
"secret_keys": ["DB_PASSWORD", "JWT_SECRET"],
"non_secret_keys": ["LOG_LEVEL"]
}Todos os campos sao opcionais. Combina com auto-deteccao: detection roda primeiro, answers sobrescrevem os campos providos. Util para IA/CI gerar manifestos validos sem TTY.
Exemplos
Wizard interativo padrao
runner wizard --path /tmp/meu-repoInicia conversa pergunta-a-pergunta. Saida final:
━━━ Runner Deploy Wizard ━━━
repo_dir: /tmp/meu-repo
detectado: linguagem=python
detectado: type sugerido=sys
detectado: Dockerfile (EXPOSE 5000)
detectado: 5 env pairs
? Slug do projeto: meu-repo
? Sistema: sys
? Tipo de deploy: sys
? Imagem: python:3.12-slim
? Port: 5000
...
━━━ Preview do .deploy.yml ━━━
project: meu-repo
system: sys
...
🔒 2 secrets serao encriptados:
- DB_PASSWORD
- JWT_SECRET
? Confirma e salva? [Y/n]Repo remoto
runner wizard --repo devborlot/meu-app --branch main --token ghp_xxxForcar geracao com defaults (CI)
runner wizard --path . --accept-defaults --jsonSem perguntas. Aceita todos os defaults da deteccao. Util em scripts.
Dry-run para inspecao
runner wizard --path . --accept-defaults --dry-run --jsonMostra o YAML que seria gerado sem escrever nada. Combinacao perfeita para validar ou debug.
Gerar com ckey explicita
runner wizard --path . --ckey "minha-ckey-segura"Ou random:
runner wizard --path . --ckeyA ckey gerada e mostrada uma unica vez no fim. Anote.
O que o wizard detecta
Linguagem e tipo
| Sinal no repo | system |
type |
|---|---|---|
package.json com next/astro |
front |
front-ssr |
package.json com react/vite |
front |
front-static |
package.json (outros) |
sys |
sys |
requirements.txt com flask/fastapi/django |
sys |
sys |
requirements.txt com celery/rq/dramatiq |
worker |
sys |
Cargo.toml |
worker |
rust-binary |
composer.json (sem Laravel) |
sys |
sys |
composer.json + Laravel + routes/api.php (sem views) |
api |
docker-build* |
composer.json + Laravel + resources/views/ populado |
sys |
docker-build* |
* docker-build apenas se houver Dockerfile; senão sys.
A detecção de Laravel busca laravel/framework ou laravel/laravel no
composer.json e analisa routes/api.php/routes/fasttrack.php +
resources/views/ (v2.18.0+).
Imagem e porta
| Sinal | Usado para |
|---|---|
Dockerfile EXPOSE |
port: |
Dockerfile FROM |
image: (apenas como sugestao) |
docker-compose.yml services.X.image |
image: |
docker-compose.yml services.X.ports |
port: |
Variaveis de ambiente
Extraidas de:
docker-compose.ymlservices (lista ou mapa)DockerfileENV.env,.env.example,.env.template(na ordem)
Para cada variavel, o wizard pergunta:
- manter como esta (default para nao-secrets)
- editar valor
- marcar como secret (encriptar) — vai pra
secrets: - remover
Deteccao de secrets
Chaves contendo: PASSWORD, TOKEN, SECRET, PRIVATE, JWT, API_KEY, APIKEY, ACCESS_KEY, AWS_SECRET, DB_PASS, REDIS_PASS, MYSQL_PASS, POSTGRES_PASS sao automaticamente sugeridas como secrets.
Curadoria de `.env.example` — Perfil de Producao (v2.18.0+)
Quando o wizard detecta valores tipicos de dev no .env.example:
| Chave | Detectado se | Sugestao producao |
|---|---|---|
APP_ENV |
= local / dev / development |
production |
APP_DEBUG |
= true / 1 / on |
false |
DEBUG |
= true / 1 |
false |
LOG_LEVEL / APP_LOG_LEVEL |
= debug / trace |
info |
NODE_ENV |
= development / dev |
production |
Em modo interativo, o wizard pergunta antes de aplicar. Em --accept-defaults
ou --answers, aplica silenciosamente.
Pruning automatico de placeholders comuns vazios (sem perguntar):
AWS_*, MAIL_*, MEMCACHED_*, PUSHER_*, VITE_PUSHER_*,
PUSHER_APP_*. Evita poluir o manifesto com dezenas de chaves vazias
do template Laravel/outros frameworks.
Motivacao: APP_DEBUG=true em producao expõe stacktrace e variaveis
sensiveis em paginas de erro — vetor real de leak.
Multi-service docker-compose
Se o docker-compose.yml tem multiplos services, o wizard precisa saber qual e o app principal (1 repo = 1 container no Runner):
⚠ Compose tem 3 services; preciso saber qual e o app principal:
? App principal:
> api (python:3.12-slim)
worker (python:3.12-slim)
redis (redis:7) [asset]Services como redis, postgres, mysql, mongo, rabbitmq, etc. sao automaticamente marcados como [asset]. Apos a escolha, o wizard mostra:
⚠ services nao incluidos (assets provaveis):
- redis
- postgres
→ use deployally ou rode-os manualmente fora do CI/CD
⚠ services nao incluidos (parecem outras apps):
- worker
→ cada app extra precisa de um `runner add` separadoAuto-trigger no `runner add`
Em modo interativo (TTY, sem --json), runner add chama o wizard automaticamente quando o repo nao tem .deploy.yml e nao tem Dockerfile/docker-compose:
$ runner add --repo user/repo-sem-deploy --branch main
[runner] Cloning shallow...
⚠ Repositorio sem perfil de deploy detectado.
motivo: no_deploy_profile: repo sem perfil de deploy detectado.
? Executar wizard interativo agora? [Y/n] y
━━━ Runner Deploy Wizard ━━━
...
✔ Wizard concluido. Continuando o registro...Em pipe/script (--json ou stdin nao-TTY), o add falha direto com mensagem instrutiva — sem travar em prompt.
Arquivos gerados
<repo_dir>/
├── .deploy.yml # Configuracao de deploy
└── .runner/
└── secrets.enc # Bundle encriptado (so se houver secrets literais).runner/secrets.enc usa o mesmo formato que o Runner ja decifra:
- Algoritmo: AES-256-GCM
- Chave: SHA-256(ckey)
- Layout binario:
[12 bytes nonce][N bytes ciphertext] - Plaintext interno:
---ENV---\n\n---SECRETS---\n{KEY=VALUE\n}*
Proximos passos
Apos o wizard:
# 1) Commit no repo
git add .deploy.yml .runner/secrets.enc
git commit -m "chore: add runner deploy config"
git push
# 2) No servidor com runner instalado
runner add --repo user/repo --branch main --ckey "<sua-ckey>"Subcomando relacionado: `runner template`
Inspeciona o template embutido (mesmo schema do wizard web):
runner template # listagem human
runner template --json # schema parseado
runner template --raw # YAML cruUse para verificar quais campos o wizard pede em sua versao instalada — util para debug e para sincronizar o web wizard.
Ver tambem
- generator de .deploy.yml — geracao automatica nao-interativa (perfis A-D)
- Wizard web — versao browser, mesmo schema
- Secrets e encriptacao — como o
.secrets.ence usado no deploy