`runner preflight`

Roda as checagens de prontidao que ja acontecem antes de um deploy e as agrega num relatorio unico — manifesto, secrets, portas, DNS e argumentos de imagem — com verde/amarelo/vermelho por componente. Nao sobe container nenhum.

O exit code so e diferente de zero quando o status geral e vermelho (problema bloqueante). Amarelo passa. Isso e o que permite CI e o Deploy Wizard do CCS gatearem em cima dele sem quebrar por avisos.

Dois modos

Modo Alvo Como
App registrada Uma app ja no Runner runner preflight <app>
Repo (dry) Um deploy que ainda nao existe runner preflight --repo <owner/name> --branch <b>

O modo repo clona para um tempdir, opcionalmente escreve o .deploy.yml gerado pelo wizard (via stdin), roda as mesmas checagens e limpa tudo — sem registrar, sem commitar, sem deployar. E o que permite validar um manifesto antes de ele existir.

De exatamente um dos dois: <app> ou --repo + --branch. Sao mutuamente exclusivos.

Hosts internos que não resolvem (v2.160.0+)

O componente rede olha as envs que citam um host de nome curto. Entram as que têm forma de URL (http://muxally-sys:5000) e as *_HOST/*_HOSTNAME. Para cada host, confere se ele é nome ou alias de algum container numa das redes da app.

● rede   SYS_INTERNAL_URL → "muxally-sys" não resolve(m) em nenhuma rede deste
         container [public, mysql, redis]. Redes compartilhadas não recebem
         network_aliases: ponha as duas apps numa rede do projeto e declare o
         alias lá.

É só aviso: o deploy segue, e o mesmo aviso aparece no log do deploy. FQDN, IP, localhost e template não resolvido ({{::Var}}) ficam de fora. Para corrigir, veja Container não resolve sibling.

Identidade do registro (v2.152.0+)

No modo app registrada, o relatório abre com o componente identidade: o que o próximo deploy vai usar, antes de agir.

preflight: minha-api-b
  ● identidade   staging-b (registro) · projeto minha-api-b
                 instancia        staging-b
                 origem_instancia registro
                 projeto          minha-api-b
                 cofre            .runner/secrets.staging-b.enc
                 esquema_cofre    v2
                 container        minha_api_b_staging_b_v1-2-0
                 routers          minha-api-b-staging-b
                 dominios         b.exemplo.com.br
                 branch           dev-b
Campo O que é
instancia / origem_instancia A instância e de onde ela veio: registro (fixada com add --instance ou edit -i), manifesto_production, manifesto_primeira (a primeira declarada) ou padrao
projeto Projeto efetivo: o slug do registro
cofre / esquema_cofre Arquivo de secrets da instância e o esquema (v2, legado ou nenhum)
container Nome do container da versão atual
routers / dominios Routers Traefik e domínios da instância, com os mesmos nomes que o deploy grava

Em -o json, os campos vêm em components[].dados do componente identidade.

  • Vermelho quando a instância do registro não existe no manifesto.
  • Amarelo quando o registro não fixa a instância e o manifesto declara mais de uma. A resolução depende da ordem do bloco instances:, e reordená-lo muda domínio e cofre em silêncio. A correção é runner edit <app> -i <instância>.

Desde a v2.152.0, as checagens de roteamento usam a instância do registro, e não production.

Diferença de env (v2.197.0+)

O componente env_drift compara o que o manifesto declara com o valor em uso no .env/.secrets da app. Quando fica amarelo, o texto de sempre continua em detail, e -o json traz também components[].dados:

{
  "vence": ".env/.secrets",
  "itens": [
    {
      "chave": "SITE_URL",
      "tipo": "valor",
      "manifesto": "{{::URL do site?https://docs.exemplo.com.br}}",
      "manifesto_padrao": "https://docs.exemplo.com.br",
      "runtime": "https://app.exemplo.com.br",
      "mascarado": false
    }
  ]
}
Campo O que é
vence Quem vale no deploy: sempre o .env/.secrets, não o manifesto
chave A variável divergente
tipo porta (a PORT difere do port: do manifesto) ou valor
manifesto O valor como está no manifesto, com o placeholder
manifesto_padrao O padrão do placeholder ({{::Prompt?padrão}}), ou o literal; null quando o placeholder não tem padrão
runtime O valor em uso
mascarado true quando a chave é sensível: manifesto, manifesto_padrao e runtime saem mascarados

Verde não traz dados.

Sintaxe

runner preflight <app>
runner preflight <app> --json
runner preflight --repo acme/app --branch main --json
cat gen.deploy.yml | runner preflight --repo acme/app --branch dev --manifest-stdin --json

Flags

Flag Descricao
--repo <OWNER/NAME> Modo repo: clona num tempdir e checa sem registrar. Exclui <app>
--branch <BRANCH> Modo repo: branch a clonar. Obrigatorio com --repo
--token <TOKEN> Modo repo: PAT para repo privado
--manifest-stdin Modo repo: le o .deploy.yml do stdin e escreve no clone antes das checagens. O conteudo nunca e logado
-o, --output human | json | yaml
--json Relatorio em JSON (consumido pelo deploy wizard do CCS)
-x, --exact Exige match exato de identidade
--insecure Bypass dos guards de seguranca

Semantica do exit code

Status geral Exit Significado
verde 0 Pronto
amarelo 0 Ha avisos, mas nada bloqueia o deploy
vermelho != 0 Problema bloqueante

Gatear CI em preflight e seguro justamente porque amarelo nao derruba o pipeline.

Preflight vs validate vs doctor

Comando Pergunta que responde
`validate` O .deploy.yml esta sintatica e semanticamente correto?
preflight Este deploy subiria agora? (secrets, portas, DNS, imagem)
`doctor` O servidor esta saudavel? (mkey, ckeys, dependencias)

Ver tambem

By Borlot.com.br on 19/08/2026