Generator de `.deploy.yml` (v2.16.0+)
Quando voce roda runner add em um repo que nao tem .deploy.yml, o runner detecta o perfil do repositorio e gera o manifesto proporcionalmente.
Filosofia: auxiliar, nao fazer magica. Quanto mais o repo ja tem definido (Dockerfile, compose, .env), mais o runner ajuda. Quanto mais cru, mais o runner instrui voce a definir o config manualmente.
Detecção de perfil
A detecção e baseada nos arquivos presentes na raiz do repo. O primeiro perfil que matchar ganha:
| Perfil | Sinais | Comportamento |
|---|---|---|
| A | .deploy.yml presente |
Usa o que tem. Sem geracao. |
| B | Dockerfile + (docker-compose.yml OU .env*) |
Gera completo: build, port (do EXPOSE), environment: extraido |
| C | Dockerfile so |
Gera parcial + warning instrutivo |
| D | docker-compose.yml so |
Gera baseado no service app (ou primeiro service) |
| E | Nada de Docker | Falha com instrucao (sem gerar) |
Perfil A — Repo já preparado
runner add --repo user/app --branch main
# usa o .deploy.yml que ja existe no repoSem mudancas — comportamento igual a versoes anteriores.
Perfil B — Containerizado completo
Repo com Dockerfile + algum sinal de envs (.env, .env.example, docker-compose.yml):
# Dockerfile no repo
FROM python:3.12-slim
EXPOSE 5000
ENV FLASK_ENV=production# .env.example no repo
DB_HOST=mysql
DB_NAME=meudb
DB_PASSWORD=changeme # auto-detectado como secretrunner add --repo user/app --branch main --ckey
# [generator] Profile B detected. Generating .deploy.yml from inputs: Dockerfile, .env.example.deploy.yml gerado:
project: app
system: api
build:
context: .
dockerfile: Dockerfile
port: 5000
networks:
- public
environment:
DB_HOST: "mysql"
DB_NAME: "meudb"
FLASK_ENV: "production"
DB_PASSWORD: "{{::DB_PASSWORD}}" # auto-detected (sensitive) → vira prompt
healthcheck:
mode: tcp # ← v2.18.2 W2: python:3.12-slim → TCP (genérico)
tcp: 5000
interval: 30s
version:
source: git-commit # ← v2.18.2: deploys auto-versionados via SHA
instances:
production:
domain: app.example.com
source:
type: branch
branch: main # ← v2.18.1: --branch propagado pra source.branch
keep_versions: 3Note como DB_PASSWORD virou placeholder com sintaxe de prompt — o runner detectou como sensivel via Aho-Corasick e sugere preenchimento via wizard.
Perfil C — Dockerfile só
Repo com Dockerfile mas sem .env* ou compose:
runner add --repo user/app --branch main
# [generator] Profile C detected. Generating .deploy.yml from inputs: Dockerfile
# WARN [generator] Profile C: Dockerfile sem env detectado. Adicione `environment:`
# no .deploy.yml com as vars que sua app precisa antes de fazer deploy..deploy.yml gerado e parcial — voce precisa adicionar environment: manualmente. O runner avisa explicitamente. Nao tenta inventar variaveis.
Perfil D — Compose só
Repo com docker-compose.yml mas sem Dockerfile:
# docker-compose.yml no repo
services:
app:
image: nginx:1.25
ports:
- "80:8080"
environment:
- LOG_LEVEL=inforunner add --repo user/app --branch main
# [generator] Profile D detected. Generating .deploy.yml from inputs: docker-compose.yml
# WARN [generator] Profile D: usando service 'app' do compose. Confira .deploy.yml gerado
# antes do deploy.Generator usa o service app se existir, senao o primeiro. Extrai image, primeira porta de ports, e environment.
v2.19.0+: o bloco
ports:no.deploy.ymlcontinua funcionando (publish_strategy: explicit, default). Mas se o config global temnetwork.publish_strategy: random(ousequential), o runner aloca porta livre automaticamente sem precisarports:no manifesto — primeira deploy sorteia, depois sticky. Veja Referencia config.yml — network ou o exemplo end-to-end em Wizard por perfil.
Perfil E — Cru (sem Docker)
Repo sem nenhum sinal de containerizacao:
runner add --repo user/app --branch main
# Error: no_deploy_yml: no_deploy_profile: repo sem perfil de deploy detectado.
# Adicione um Dockerfile ou .deploy.yml no repo.
# Documentação: https://docs.runner.ccs.systems/getting-startedFalha explicita — o runner nao tenta inventar config pra repo sem padrao. Voce precisa:
- Adicionar um
Dockerfileno repo (e fazer push), ou - Criar um
.deploy.ymlmanualmente (userunner generate-configcomo template), ou - Forcar com
--insecure(NAO RECOMENDADO — vai gerar config minimo invalido)
Onde o gerado e salvo
Por padrao, o .deploy.yml gerado e salvo em /data/apps/{app}/.deploy.yml apos o runner add (mesmo lugar do manifesto normal). Voce pode editar apos a geracao.
Nota: O
.deploy.ymlgerado nao e commitado de volta no repo automaticamente. Se quiser persistir, copie pra raiz do repo e faca commit:cp /data/apps/meu-app/.deploy.yml ~/repos/meu-app/.deploy.yml cd ~/repos/meu-app && git add .deploy.yml && git commit -m "feat: add .deploy.yml" && git push
Heuristicas de geracao
| Fonte | Como o generator extrai |
|---|---|
Dockerfile |
regex FROM\s+(\S+) (ignora AS xxx), EXPOSE\s+(\d+), ENV\s+KEY[\s=]+VALUE |
.env, .env.example, .env.template |
linhas KEY=VALUE (parser do environment::read_env_file) |
docker-compose.yml |
serde_yaml. Lê services.app (preferencial) ou primeiro service. Pega image, ports[].host:container, environment (lista ou dict) |
Detector de secrets (Aho-Corasick): keys como DB_PASSWORD, API_KEY, JWT_SECRET, AUTH_TOKEN viram placeholders em secrets: (futuro: ou {{::KEY}} no environment: se nao tiver secrets: section ainda).
Quando NAO usar o generator
Apps em producao: prefira commitar
.deploy.ymlno repo (perfil A). Geracao e pra prototipagem ou onboarding rapido.Layouts customizados: monorepo,
source_direspecifico, etc — geracao nao cobre. Edite o.deploy.ymlmanualmente.Apps com healthchecks especificos: desde a v2.18.2 o generator escolhe healthcheck type-aware baseado na imagem (W2):
nginx*,caddy*,httpd*,apache*,traefik*→mode: http path: /php-fpm*,*fpm*→mode: tcp(FastCGI, não HTTP)node*,python*,ruby*,openjdk*,rust*→mode: tcp(genérico)- Outros →
mode: tcp(fallback seguro)
Se sua app tem endpoint custom (ex:
/healthz,/api/v1/health) ou precisa de outro modo (cmd:,tcp:com porta diferente), edite o.deploy.ymlgerado. Veja Sistema de Health Check pra detalhes.
Bypass: `--insecure`
Em situacoes excepcionais voce pode forcar o registro mesmo sem Dockerfile/compose:
runner add --repo user/app --branch main --insecureIsso suprime a falha do perfil E. NAO RECOMENDADO — voce vai precisar criar .deploy.yml manualmente antes do primeiro deploy. Veja --insecure.
Veja Tambem
- Referencia .deploy.yml — schema completo do manifesto
- Env Wizard — sintaxe de prompts (
{{::KEY?default}}) e generators ({RANDOM}) - runner generate-config — template completo manual
- --insecure — bypass de validacoes