Deploy de Repositorio Publico
Este tutorial mostra como deployar uma aplicacao a partir de um repositorio GitHub publico (open source ou fork). Nao precisa de token de acesso.
Cenario
Voce quer deployar um projeto open source (ou um repo publico seu) no servidor de producao. Exemplo: um frontend React buildado com Vite.
Pre-requisitos
- Runner instalado (
runner initexecutado) - Docker e Traefik rodando no servidor
- Dominio apontando pro servidor (DNS configurado)
Passo 1: Preparar o Repositorio
O repositorio precisa ter uma branch dist com:
.deploy.yml— configuracao do deploy- Artefatos buildados (dist/, src/, etc.)
Criar .deploy.yml
Na raiz do repo, crie .deploy.yml:
project: meu-app
system: front
port: 80
# Modo IMAGE: usar imagem pronta (sem Dockerfile)
image: caddy:2-alpine
# NOTA: bloco `github:` foi DEPRECATED em v2.16.0 — o repo é resolvido
# automaticamente do state file (registrado via `runner add --repo`).
version:
source: file # opcional desde v2.18.2
file: package.json
field: version
# Desde v2.18.2, generator default emite `source: git-commit`
# (deploys auto-versionados via SHA, sem precisar `version` field).
networks:
- public
healthcheck:
path: /
interval: 10s
timeout: 5s
retries: 3
instances:
production:
domain: app.meusite.com.br
source:
type: dist
keep_versions: 3Build e Push para dist
# Build do projeto
npm run build
# Preparar branch dist
git checkout dist 2>/dev/null || git checkout -b dist
rm -rf dist/
cp -r /caminho/build/dist ./dist/
cp .deploy.yml ./
# Commit e push
git add .
git commit -m "deploy: v1.0.0"
git push origin distPasso 2: Registrar no Runner
No servidor de producao:
# Repo publico — sem --token (--branch obrigatorio v2.12.0+)
runner add --repo seu-usuario/meu-app --branch mainO Runner:
- Clona o repo (branch
dist) em/data/apps/meu-app/ - Valida o
.deploy.yml(parse + validacao semantica) - Registra a app no state
Sem token: repos publicos nao precisam de --token. O clone usa
HTTPS sem autenticacao.
Verificar registro
runner list
# Deve mostrar: meu-app (front) — up_to_datePasso 3: Deploy
# Primeiro deploy manual
runner deploy meu-app
# Acompanhar
runner deploy meu-app -V # Verbose — mostra cada faseO que acontece internamente
1. FETCH — git pull da dist
2. PREPARE — copia artefatos para src/production/v1.0.0/
3. BUILD — pull da imagem caddy:2-alpine (image mode)
4. CONTAINER — docker run com volumes, networks, healthcheck
5. HEALTH — espera container ficar healthy
6. ROUTING — configura Traefik (SSL automatico)Passo 4: Verificar
# Testar via HTTPS
curl -s https://app.meusite.com.br/ | head -5
# Verificar container
docker ps | grep meu-app
# Health check
curl -s https://app.meusite.com.br/healthPasso 5: Deploys Automaticos
Adicione ao crontab para o Runner detectar novos pushes:
crontab -e
# Adicionar:
*/5 * * * * /opt/runner/runner fetch --deploy --json >> /var/log/runner-fetch.json 2>&1Agora, a cada push na branch dist, o Runner detecta e deploya
automaticamente em ate 5 minutos.
Proximo Deploy
# No seu ambiente de dev:
npm run build
git checkout dist
rm -rf dist/ && cp -r build/dist ./dist/
git add . && git commit -m "deploy: v1.1.0"
git push origin dist
# O cron detecta e deploya automaticamente.
# Ou force manualmente:
ssh servidor "runner fetch --deploy"Usando Dockerfile Customizado (Build Mode)
Se o repo tem um Dockerfile, use build mode em vez de image mode:
# .deploy.yml
project: meu-app
port: 80
# Modo BUILD: usa Dockerfile do repo
build:
context: .
dockerfile: Dockerfile
# NOTA: bloco `github:` foi DEPRECATED em v2.16.0 — o repo é resolvido
# automaticamente do state file (registrado via `runner add --repo`).
instances:
production:
domain: app.meusite.com.br
source:
type: dist# Dockerfile na branch dist
FROM node:22-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM caddy:2-alpine
COPY --from=build /app/dist /srv
COPY Caddyfile /etc/caddy/Caddyfile
HEALTHCHECK --interval=10s --timeout=3s --retries=3 \
CMD wget -q -O /dev/null http://127.0.0.1:80/ || exit 1Com Dockerfile e HEALTHCHECK declarado, o Runner respeita o healthcheck
da imagem e nao injeta o seu proprio.
Dicas
- Sem ckey: repos publicos nao precisam de
--ckey(nao ha secrets a proteger) - Versao: o Runner extrai a versao do
package.json(campoversion) - Multi-instancia: adicione
staging:eminstances:para ter um ambiente de teste - Rollback:
runner rollback meu-appreverte para a versao anterior