diff --git a/Deploy-V.1.0.0.md b/Deploy-V.1.0.0.md index 85c39d5..66074b2 100644 --- a/Deploy-V.1.0.0.md +++ b/Deploy-V.1.0.0.md @@ -1,3 +1,106 @@ -Bem-vindo a Wiki. - -Primeira versão sem instruções, ao implementar novas atualizações importantes sempre crie nova versão da WIKI - V1.0.0 -> V1.0.1 por diante \ No newline at end of file +# 🚀 Deploy V.1.0.0 — Automação GitOps (Gitea + Multi-VPS) + +> Versão **1.0.0** da documentação do pipeline de deploy automático. +> Todos os exemplos de código estão **sanitizados** (sem tokens/segredos reais). + +--- + +## 1. Visão geral + +A cada `git push` na branch `main`, o **Gitea (VPS 3)** dispara um **webhook** para um +**listener na VPS 4 (Builder)**, que executa o script de deploy do projeto e reporta o +status do commit de volta ao Gitea. O resultado vai para a **VPS 1 (Produção)** em Docker. + +| Servidor | IP (VPN) | Função | +|---|---|---| +| VPS 1 — App | `10.99.0.1` | Produção (containers Docker rootless) | +| VPS 3 — Data/Git | `10.99.0.3` | Gitea + PostgreSQL | +| VPS 4 — Builder | `10.99.0.4` | Listener + build + disparo do deploy | + +``` +Dev (VPS4) ──push──► Gitea (VPS3) ──webhook──► listener (VPS4) ──► deploy-*.sh ──► Docker (VPS1) +``` + +--- + +## 2. O listener do webhook + +Um **listener por projeto**, cada um numa **porta** própria (ex.: 9000, 9002, 9003). +Responsabilidades: + +1. **Valida o token** (`?token=` ou header `x-gitea-token`). +2. **Trava de concorrência** (`isBuilding`) → responde `429` se já há build rodando. +3. **Ignora commits `chore(deploy): bump version`** → evita loop de CI. +4. Responde **202** imediatamente e roda o `deploy-*.sh` em background. +5. **Reporta status** ao Gitea via API: `pending` → `success`/`failure` (✔/✘ no commit). + +Código de referência: `webhook-listener/listener.js`. Serviço: `webhook-.service` (systemd). + +--- + +## 3. Dois modelos de deploy + +### 🅰️ Builder-to-Host (build na VPS 4) +A VPS 4 **compila** e envia apenas os **artefatos** (`dist/`, `node_modules`) para a VPS 1, +que **só reinicia** os containers. Ideal para frontends pesados (Next/Vite). +Script: `scripts/deploy-prod-builder.sh`. + +``` +git reset --hard ► build (VPS4) ► rsync artefato ► ssh VPS1 "docker compose up -d" +``` + +### 🅱️ Build no host (build na VPS 1) +A VPS 4 envia o **código-fonte** e a **VPS 1 builda** a imagem Docker e troca o container +(`--no-deps`, quase sem downtime). Ideal para apps leves (ex.: Node servindo estáticos). +Script: `scripts/deploy-prod-onhost.sh`. + +``` +git reset --hard ► rsync fonte ► ssh VPS1 "docker compose build app && up -d --no-deps app" +``` + +> Há ainda `scripts/deploy-to-prod.sh` para **promoção manual** Staging(VPS4) → Produção(VPS1). + +--- + +## 4. Configurar um novo projeto (passo a passo) + +1. **Listener** (VPS 4): + ```bash + cp webhook-listener/config.example.env /home/deploy/stack/webhook-listener/.env + # editar PORT, WEBHOOK_TOKEN, DEPLOY_SCRIPT, GITEA_TOKEN + sudo cp webhook-listener/webhook-listener.service /etc/systemd/system/webhook-.service + sudo systemctl daemon-reload && sudo systemctl enable --now webhook- + ``` +2. **Webhook no Gitea** (repo → Settings → Webhooks → Gitea): + - URL: `http://10.99.0.4:/webhook?token=` + - Método `POST`, evento *Push*, branch `main`. +3. **Token de status**: Settings → Applications → Generate Token (escopo `repo:status`). +4. **Testar**: `git commit --allow-empty -m "test" && git push` e acompanhar + `tail -f /home/deploy/stack/webhook-listener/deploy.log`. + +--- + +## 5. Segurança (resumo) + +- **Sem segredos no Git** — usar `.env` + `EnvironmentFile=`. +- **VPS 1 = Docker rootless**: sempre `DOCKER_HOST=unix:///run/user/1000/docker.sock`; + daemon root permanece desabilitado de propósito. +- **SSH** do usuário `deploy` (sem passphrase, `BatchMode=yes`), só pela VPN. +- **Commite antes de buildar** — o deploy faz `git reset --hard` e descarta mudanças locais. +- **Nunca editar arquivos na VPS 1** — o `rsync --delete` sobrescreve no próximo deploy. + +--- + +## 6. Troubleshooting + +| Problema | Diagnóstico | Solução | +|---|---|---| +| Webhook não dispara | `systemctl status webhook-` | Reiniciar o listener | +| `429` no webhook | build concorrente | Aguardar o build atual terminar | +| `rsync`/`ssh` falha | `ssh deploy@10.99.0.1 echo ok` | Checar chave SSH e VPN | +| Build falha na VPS 1 | `docker logs` no container | Ver erro de `npm`/Dockerfile | +| Deploy em loop | commit de bump redisparando | Conferir regex anti-loop no listener | + +--- + +*Changelog* — **v1.0.0**: primeira versão (listener, modelos A/B, configuração Gitea, segurança). diff --git a/Home.md b/Home.md new file mode 100644 index 0000000..0d88a1d --- /dev/null +++ b/Home.md @@ -0,0 +1,12 @@ +# 🏠 Deploy-Automático — Wiki + +Documentação da automação de deploy GitOps (Gitea + Multi-VPS) usada no ecossistema. + +## Versões +- [Deploy V.1.0.0](Deploy-V.1.0.0) — versão inicial: listener de webhook, modelos A/B de deploy, + configuração no Gitea e segurança. + +## Repositório de exemplos +Scripts e instruções de referência (sanitizados) estão no repositório +[`ruicesar/Deploy-Automatico`](http://10.99.0.3:3000/ruicesar/Deploy-Automatico): +`webhook-listener/`, `scripts/` e `docs/`.