docs(wiki): Deploy V.1.0.0 - automacao de deploy GitOps

VPS 4 Deploy Agent
2026-05-30 14:43:35 +02:00
parent a4357e4906
commit 091ba27534
2 changed files with 118 additions and 3 deletions
+106 -3
@@ -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
# 🚀 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-<projeto>.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/<projeto>.env
# editar PORT, WEBHOOK_TOKEN, DEPLOY_SCRIPT, GITEA_TOKEN
sudo cp webhook-listener/webhook-listener.service /etc/systemd/system/webhook-<projeto>.service
sudo systemctl daemon-reload && sudo systemctl enable --now webhook-<projeto>
```
2. **Webhook no Gitea** (repo → Settings → Webhooks → Gitea):
- URL: `http://10.99.0.4:<porta>/webhook?token=<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-<projeto>` | 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).
+12
@@ -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/`.