197 lines
4.5 KiB
Markdown
197 lines
4.5 KiB
Markdown
|
|
# 🖥️ Setup do Servidor de Produção
|
||
|
|
|
||
|
|
## 1. Sistema Operacional
|
||
|
|
|
||
|
|
Ubuntu 22.04+ ou Debian 12 recomendados.
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Atualiza
|
||
|
|
sudo apt update && sudo apt upgrade -y
|
||
|
|
|
||
|
|
# Instala Docker
|
||
|
|
sudo apt install -y docker.io docker-compose-plugin
|
||
|
|
|
||
|
|
# Habilita e inicia
|
||
|
|
sudo systemctl enable docker
|
||
|
|
sudo systemctl start docker
|
||
|
|
|
||
|
|
# Adiciona usuário deploy ao grupo docker (se usar usuário não-root)
|
||
|
|
sudo usermod -aG docker $USER
|
||
|
|
# Faça logout/login ou: newgrp docker
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 2. Estrutura de Diretórios
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Cria diretório da aplicação
|
||
|
|
sudo mkdir -p /opt/wifi-etl
|
||
|
|
sudo chown $USER:$USER /opt/wifi-etl # ou usuário deploy
|
||
|
|
cd /opt/wifi-etl
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 3. SSH Key (para CI/CD acessar)
|
||
|
|
|
||
|
|
No **servidor de produção**, gere uma chave para o deploy (ou use existente):
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Como usuário deploy (ou root)
|
||
|
|
ssh-keygen -t rsa -b 4096 -C "deploy@wifi-etl" -f ~/.ssh/id_rsa_wifi_etl -N ""
|
||
|
|
|
||
|
|
# Exiba a chave pública (adicionar no Gitea como Deploy Key ou user key)
|
||
|
|
cat ~/.ssh/id_rsa_wifi_etl.pub
|
||
|
|
# Copie o conteúdo → Gitea Settings → Deploy Keys → Add Key
|
||
|
|
```
|
||
|
|
|
||
|
|
**No Gitea (repositório):**
|
||
|
|
- Settings → Deploy Keys → Add Deploy Key
|
||
|
|
- Cole a chave pública
|
||
|
|
- Marque "Allow write access" (para permitir deploy via SSH)
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 4. Docker Network (opcional — o compose cria automáticamente)
|
||
|
|
|
||
|
|
```bash
|
||
|
|
docker network create wifi-etl-net
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 5. Banco de Dados (VM separada ou mesmo servidor)
|
||
|
|
|
||
|
|
Se o DB estiver na mesma VM (não recomendado p/ prod):
|
||
|
|
|
||
|
|
```bash
|
||
|
|
docker run -d \
|
||
|
|
--name wifi-db \
|
||
|
|
-e POSTGRES_PASSWORD=$DB_PASSWORD \
|
||
|
|
-e POSTGRES_DB=$DB_NAME \
|
||
|
|
-p 5432:5432 \
|
||
|
|
postgres:15-alpine
|
||
|
|
```
|
||
|
|
|
||
|
|
Se DB for externo: pule — apenas configure `DB_HOST` no `.env` do ETL.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 6. Variáveis de Ambiente no Servidor
|
||
|
|
|
||
|
|
No servidor, crie `/opt/wifi-etl/.env`:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
cat > /opt/wifi-etl/.env << 'EOF'
|
||
|
|
DB_HOST=localhost # ou IP do DB externo
|
||
|
|
DB_PORT=5432
|
||
|
|
DB_NAME=wifi_etl
|
||
|
|
DB_USER=postgres
|
||
|
|
DB_PASSWORD=sua_senha_aqui
|
||
|
|
|
||
|
|
RUIJIE_BASE_URL=https://cloud-eu.ruijienetworks.com
|
||
|
|
RUIJIE_APPID=open52d4899cdbe2
|
||
|
|
RUIJIE_SECRET=10493c81e8e94f56b8710d78ed2527c7
|
||
|
|
RUIJIE_ACCESS_TOKEN=
|
||
|
|
RUIJIE_GROUP_ID=9290679
|
||
|
|
|
||
|
|
WIFEED_BASE_URL=https://api.wifeed.com.br
|
||
|
|
WIFEED_CLIENT_ID=60e40ee2-f39f-4556-8a22-840a2e3fa686
|
||
|
|
WIFEED_CLIENT_SECRET=dRpd6FB2hjbyvcA
|
||
|
|
|
||
|
|
LOG_LEVEL=INFO
|
||
|
|
EOF
|
||
|
|
|
||
|
|
chmod 600 /opt/wifi-etl/.env
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 7. Deploy Inicial (manual)
|
||
|
|
|
||
|
|
Após primeiro push na `main` (CI/CD automático), ou manual:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
cd /opt/wifi-etl
|
||
|
|
|
||
|
|
# Copie arquivos do repositório (ou o CI/CD faz isso)
|
||
|
|
# Você precisará de:
|
||
|
|
# - docker-compose.prod.yml
|
||
|
|
# - infra/init.sql (schema)
|
||
|
|
|
||
|
|
# 1) Crie schema no DB
|
||
|
|
# Se DB local:
|
||
|
|
docker exec -i wifi-db psql -U postgres -d wifi_etl < infra/init.sql
|
||
|
|
|
||
|
|
# Se DB externo:
|
||
|
|
psql -h $DB_HOST -U $DB_USER -d $DB_NAME -f infra/init.sql
|
||
|
|
|
||
|
|
# 2) Teste imagem local (antes do CI/CD)
|
||
|
|
docker build -f infra/Dockerfile -t wifi-etl:test .
|
||
|
|
docker run --rm \
|
||
|
|
-e DB_HOST=... -e DB_PASSWORD=... \
|
||
|
|
-e RUIJIE_APPID=... -e RUIJIE_SECRET=... \
|
||
|
|
-e WIFEED_CLIENT_ID=... -e WIFEED_CLIENT_SECRET=... \
|
||
|
|
wifi-etl:test
|
||
|
|
|
||
|
|
# 3) Se OK, o CI/CD fará deploy automático no próximo push na main.
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 8. Monitoramento
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Logs do container
|
||
|
|
docker logs wifi-etl-worker -f
|
||
|
|
|
||
|
|
# Estatísticas
|
||
|
|
docker stats wifi-etl-worker
|
||
|
|
|
||
|
|
# graceful restart
|
||
|
|
docker restart wifi-etl-worker
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 9. Backup do Banco
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Diário via cron no servidor do DB
|
||
|
|
0 2 * * * pg_dump -U postgres wifi_etl > /backup/wifi_etl_$(date +\%Y-\%m-\%d).sql
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 10. Troubleshooting
|
||
|
|
|
||
|
|
| Problema | Solução |
|
||
|
|
|---|---|
|
||
|
|
| `permission denied` ao conectar SSH | Adicione chave pública ao `~/.ssh/authorized_keys` do usuário deploy |
|
||
|
|
| Container sobe e para | Verifique logs: `docker logs wifi-etl-worker` — falta `.env` ou erro de conexão DB |
|
||
|
|
| DBconnection refused | Verifique `DB_HOST`, firewall, `pg_hba.conf` |
|
||
|
|
| Token Ruijie expirado | Delete `RUIJIE_ACCESS_TOKEN` do `.env` — ETL renova automaticamente |
|
||
|
|
| Watermark não avança | `onlineTime` deve ser > watermark anterior; verifique formato (epoch ms) |
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 📋 Checklist Deploy
|
||
|
|
|
||
|
|
- [ ] Docker instalado no servidor
|
||
|
|
- [ ] Usuário `deploy` criado (ou use root)
|
||
|
|
- [ ] SSH key pair gerado; **public key** adicionada ao Gitea Deploy Keys
|
||
|
|
- [ ] Diretório `/opt/wifi-etl` criado
|
||
|
|
- [ ] `.env` copiado para `/opt/wifi-etl/` (ou use variáveis do CI/CD)
|
||
|
|
- [ ] `infra/init.sql` executado no banco
|
||
|
|
- [ ] Firewall: porta 5432 (DB) acessível do servidor ETL
|
||
|
|
- [ ] Gitea Variables configuradas (DB, Ruijie, WiFeed)
|
||
|
|
- [ ] Gitea Secret `SSH_PRIVATE_KEY` configurado
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
Após push em `main`, o workflow Gitea fará:
|
||
|
|
1. Build → artifact
|
||
|
|
2. SSH deploy → servidor
|
||
|
|
3. Container reiniciado
|