# 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"