This repository has been archived on 2026-06-09. You can view files and clone it, but cannot push or open issues or pull requests.
wedding-app/.gitea/workflows/deploy.yml
Leandro Ronetto 98dcafdf26
Some checks failed
Deploy / deploy (push) Failing after 1s
feat(ci): deploy automático via Gitea Actions + rename branch para main
- .gitea/workflows/deploy.yml: push na main (paths do app/infra) ou
  disparo manual -> SSH no host -> make deploy + health check /api/health
- Makefile: alvo `deploy` (git reset --hard + up-wedding com build), BRANCH=main
- CLAUDE.md: documenta o fluxo de deploy e o setup de secrets

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-09 06:19:31 -03:00

70 lines
2.6 KiB
YAML

# Deploy automático do app wedding.
#
# A cada push na branch principal (ou disparo manual), conecta por SSH no host
# de produção e roda `make deploy`, que faz git reset --hard na branch + rebuild
# do app wedding (docker compose up -d --build).
#
# Por que SSH (e não rodar docker direto no runner):
# os arquivos .env (segredos do app) ficam só no host, fora do git. O host já
# tem o repo configurado, então o deploy é só atualizar o código e subir.
#
# Segredos necessários (Gitea: repo > Settings > Actions > Secrets):
# DEPLOY_HOST IP ou hostname do host de produção
# DEPLOY_USER usuário SSH (precisa rodar docker + ter o repo clonado)
# DEPLOY_SSH_KEY chave PRIVADA SSH (conteúdo completo, incl. cabeçalhos)
# DEPLOY_PATH caminho absoluto do repo no host (ex.: /opt/wedding-app)
# Variáveis opcionais (Gitea: ... > Variables):
# DEPLOY_PORT porta SSH (default 22)
name: Deploy
on:
push:
branches:
- main
paths:
# Só dispara quando algo que afeta o app/infra muda. Edição de docs
# (CLAUDE.md, README) não redeploya.
- "infra/wedding_photo/**"
- "Makefile"
- ".gitea/workflows/deploy.yml"
workflow_dispatch: {}
# Cancela um deploy em andamento se um novo push chegar.
concurrency:
group: deploy-wedding
cancel-in-progress: false
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Configura chave SSH
run: |
mkdir -p ~/.ssh
echo "${{ secrets.DEPLOY_SSH_KEY }}" > ~/.ssh/deploy_key
chmod 600 ~/.ssh/deploy_key
PORT="${{ vars.DEPLOY_PORT }}"
ssh-keyscan -p "${PORT:-22}" -H "${{ secrets.DEPLOY_HOST }}" >> ~/.ssh/known_hosts 2>/dev/null
- name: Deploy via SSH
run: |
PORT="${{ vars.DEPLOY_PORT }}"
ssh -i ~/.ssh/deploy_key -p "${PORT:-22}" \
"${{ secrets.DEPLOY_USER }}@${{ secrets.DEPLOY_HOST }}" \
"set -e; cd '${{ secrets.DEPLOY_PATH }}'; make deploy BRANCH=main"
- name: Health check
run: |
PORT="${{ vars.DEPLOY_PORT }}"
# Espera o container ficar saudável e confere /health internamente.
ssh -i ~/.ssh/deploy_key -p "${PORT:-22}" \
"${{ secrets.DEPLOY_USER }}@${{ secrets.DEPLOY_HOST }}" \
"for i in \$(seq 1 15); do \
if docker exec wedding_app sh -c 'wget -qO- http://localhost:3000/api/health' >/dev/null 2>&1; then \
echo 'app OK'; exit 0; \
fi; \
echo \"aguardando app... (\$i/15)\"; sleep 4; \
done; \
echo 'app NAO respondeu'; docker logs --tail 50 wedding_app; exit 1"