Some checks failed
Deploy / deploy (push) Failing after 1s
- .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>
70 lines
2.6 KiB
YAML
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"
|