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 init executado)
  • 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: 3

Build 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 dist

Passo 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 main

O Runner:

  1. Clona o repo (branch dist) em /data/apps/meu-app/
  2. Valida o .deploy.yml (parse + validacao semantica)
  3. 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_date

Passo 3: Deploy

# Primeiro deploy manual
runner deploy meu-app

# Acompanhar
runner deploy meu-app -V   # Verbose — mostra cada fase

O 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/health

Passo 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>&1

Agora, 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 1

Com 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 (campo version)
  • Multi-instancia: adicione staging: em instances: para ter um ambiente de teste
  • Rollback: runner rollback meu-app reverte para a versao anterior
By Borlot.com.br on 16/04/2026