`runner manifest schema` (2.182.0+)
Imprime o JSON Schema do .deploy.yml que este runner lê. O schema sai
das mesmas structs do parser, então descreve o que a versão instalada aceita.
É só leitura: não carrega config, app nem state, e responde em qualquer
servidor com o binário.
Sintaxe
runner manifest schemaSem argumentos. A saída é sempre JSON, com exit 0. O comando manifest tem
outros subcomandos: veja `runner manifest`.
Saída
{
"runner_version": "2.182.0",
"schema_id": "sha256:8e5f3a45bca691f25a3687ddf2b8d036c4a4de51f16673871dc56f0875667b00",
"dialeto": "https://json-schema.org/draft/2020-12/schema",
"schema": {}
}| Campo | Significado |
|---|---|
runner_version |
Versão do runner que gerou o schema |
schema_id |
sha256: mais o SHA-256 do JSON canônico do schema |
dialeto |
JSON Schema 2020-12 |
schema |
O schema. Definições em $defs, ligadas por $ref |
O schema_id só muda quando o schema muda. O JSON canônico tem as chaves
ordenadas em todos os níveis e nenhum espaço. Para conferir o id por fora:
runner manifest schema | python3 -c "import hashlib,json,sys; s=json.load(sys.stdin)['schema']; print('sha256:'+hashlib.sha256(json.dumps(s,sort_keys=True,separators=(',',':'),ensure_ascii=False).encode()).hexdigest())"Como saber se o runner tem o comando
O runner anuncia a capability manifest.schema.v1:
runner --capabilitiesRunner sem a capability não tem o comando. Nesse caso, use o schema de uma versão mais nova só como referência. Não valide contra ele.
Pelo GitHub Release
Cada release publica o arquivo manifest-schema.json como asset. Ele traz o
envelope inteiro, inclusive o schema_id. O comando continua sendo a fonte
primária: responde pela versão instalada na app.
Como o editor deve usar o schema
- Chame
runner manifest schemano servidor da app. - Guarde o schema em cache pelo
schema_id. Se o id não mudou, reuse. - Use o schema do runner da app, não o de outro servidor. Em frota com versões diferentes, cada app tem o seu.
- Campo que o schema não conhece aparece em vermelho, com a versão do runner ("este runner (2.182.0) não aceita …"). Nunca remova o campo sozinho: o usuário decide.
- O schema não substitui o veredito do servidor. Antes de salvar, chame `manifest validate`, que cobre o que o schema não expressa.
Extensões `x-runner-*`
O schema acrescenta chaves que o JSON Schema não tem. Um validador comum as ignora. O editor as usa para sugerir valores e avisar.
| Extensão | Significado | Exemplo |
|---|---|---|
x-runner-ref |
O campo nomeia algo do servidor. Vale o vocabulário abaixo | "x-runner-ref": "porta" |
x-runner-unique |
Unicidade dentro da lista: true (item inteiro), "campo" ou lista de campos |
"x-runner-unique": ["domain","path_prefix"] |
x-runner-unique-global |
Unicidade entre todas as instâncias, no mesmo formato | "x-runner-unique-global": "domain" |
x-runner-sensivel |
O campo guarda segredo. O editor mascara o valor | secrets |
x-runner-desde |
Versão do runner que introduziu o campo | "x-runner-desde": "2.62.0" |
x-runner-regra |
Regra em texto que o JSON Schema não expressa | "O destino é caminho absoluto e não se repete." |
x-runner-aliases |
Outros nomes aceitos para este campo | "x-runner-aliases": ["type"] |
x-runner-alias-de |
Este campo é outro nome do canônico indicado | "x-runner-alias-de": "app_type" |
x-runner-obsoleto |
Forma antiga, ainda aceita | notify em formato de mapa |
A chave deprecated: true marca o que é obsoleto: image_mode, github,
type: docker-build, source.type: dist e o notify em formato de mapa.
Marca também as grafias antigas de image_mode e de env_sync (sync,
local, e Remote/Skip, que o runner escrevia até a 2.181.0). Só o
notify em mapa leva também x-runner-obsoleto.
Aliases
type, environment (dentro da instância) e tag_pattern existem no schema
como propriedades, com x-runner-alias-de. Assim um manifesto que usa
type: valida. O canônico (app_type, environment_overrides, tag)
lista o alias em x-runner-aliases. O editor pode esconder o alias e mostrar
só o canônico. Declarar os dois juntos não vale: o runner recusa o campo
duplicado.
Vocabulário do `x-runner-ref`
O valor é uma string, ou uma lista quando o campo aceita mais de uma coisa
(volumes, labels). Em lista, o x-runner-ref vale para cada item. Em
mapa, vale para as chaves, como em environment (app.env). Em labels
é diferente: o ref cobre os valores das labels traefik.* que citam
middleware ou entrypoint.
| Valor | O que o campo nomeia |
|---|---|
traefik.middleware |
Middleware do Traefik, ex.: vpn-only@file |
traefik.tls_options |
Opções de TLS do Traefik |
traefik.certresolver |
Resolvedor de certificado |
traefik.entrypoint |
Entrypoint (só em labels traefik.*) |
dominio |
Domínio da app |
porta |
Porta |
docker.network |
Rede Docker |
docker.volume |
Volume Docker nomeado |
docker.runtime |
Runtime do Docker, ex.: de GPU |
host.path |
Pasta ou arquivo do host |
host.arch |
Arquitetura do host |
runner.app |
App registrada neste runner |
runner.instancia_registrada |
Instância registrada da app |
app.env |
Variável de ambiente da app |
app.data |
Pasta de dados da app |
Exemplos reais do schema:
"ports": { "x-runner-ref": "porta" }
"volumes": { "x-runner-ref": ["docker.volume", "host.path"] }Em volumes, a origem é volume Docker na forma volume:<nome>:… e pasta do
host nas demais. A regra vem em x-runner-regra. O
`manifest context` lista os valores que existem no servidor
para cada ref.
O que o schema aceita de diferente
- Número, booleano e nulo em campo de texto. Todo campo de texto livre
(sem lista fechada de valores), inclusive item de lista e valor de mapa
como
environment,labelsehosts, aceita texto, número, booleano e nulo. O runner grava tudo como texto:PORT: 8000vira"8000",interval: 30vira"30"efile: nullvira o texto"null". A regra vem emx-runner-regra. Exceções, em que o runner recusa e o schema também: os campos denotify, ocommande orelease.command, e os itens denetworks. - Vazio em lista, mapa ou bloco.
volumes:,environment:,healthcheck:ouproduction:sem nada valem como vazio (ou padrão), e o schema aceita o nulo. Campo numérico, booleano ou de lista fechada vazio continua inválido. networks. Lista de nomes, lista com objetos ou mapa de nome para opções. O schema descreve a entrada. O nome da rede não se repete, e um item em texto conta como o próprio nome.notify. Lista de subscrições. O formato de mapa antigo é aceito, mas não envia notificação. Está marcado como obsoleto.command. Texto ou lista de textos.- Chaves que começam com
x-são aceitas no topo, em cada instância e emhealthcheck.
Divergências conhecidas entre o schema e o runner
O schema e o parser dão o mesmo veredito em todos os manifestos testados, com as exceções abaixo. Nelas, o editor deve confiar no `manifest validate`.
O schema recusa, mas o runner aceita:
| Caso | O que acontece |
|---|---|
| Chave desconhecida em bloco aberto | O runner descarta a chave sem avisar. O schema a marca. Lista de blocos abaixo da tabela |
env_sync com outra caixa |
LOCAL vale no runner. O schema lista as minúsculas e as grafias Remote/Skip que o runner escrevia |
notify: escalar |
O runner ignora e usa lista vazia |
networks: em mapa com valor escalar |
O runner ignora o valor |
Blocos em que o runner descarta chave desconhecida:
github,version,build,routingenetwork_specs;assetse seus itens;notify[]enotify[].request;logging,security,resourceseconfig_templates;routes[],depends_on[]e os objetos denetworks;canaryecanary.auto_promote;sourceesource.signature;configeconfig.vault.
Um github.user antigo cai neste caso. O campo github é obsoleto. O editor
mostra user em vermelho e não o remove.
O schema aceita, mas o runner recusa:
| Caso | O que acontece |
|---|---|
| Regras de consistência | healthcheck.mode: tcp sem porta, path_prefix repetido nas rotas, acme-dns sem provider. O schema só descreve em x-runner-regra |
| Alias e canônico juntos | type e app_type no mesmo manifesto |
Número, booleano ou nulo em campo de texto, em manifesto com chave x-, rede em objeto ou chave desconhecida |
O runner recusa PORT: 8000, interval: 30 e file: null nesse caminho. É um defeito conhecido do runner (issue #230, aberta). O schema aceita |
Veja também
- `runner manifest`: ler, gravar, fixar, contexto e validação
- Anatomia do .deploy.yml