CI/CD: Ajustado para uso de N versões de Dockers
Some checks failed
Deploy WiFi-ETL Prod / deploy (push) Failing after 0s
Some checks failed
Deploy WiFi-ETL Prod / deploy (push) Failing after 0s
This commit is contained in:
parent
331a021d9a
commit
e4a2bb7f18
@ -34,7 +34,20 @@ jobs:
|
||||
- name: Build e deploy container
|
||||
run: |
|
||||
cd /opt/wifi-etl
|
||||
docker compose -f infra/docker-compose.yml up -d --build
|
||||
|
||||
# Tentar com docker compose (v2)
|
||||
if command -v docker &> /dev/null && docker compose version &> /dev/null; then
|
||||
echo "Usando docker compose v2..."
|
||||
docker compose up -d --build
|
||||
# Fallback para docker-compose (v1)
|
||||
elif command -v docker-compose &> /dev/null; then
|
||||
echo "Usando docker-compose v1..."
|
||||
docker-compose -f infra/docker-compose.yml up -d --build
|
||||
else
|
||||
echo "✗ Nem docker compose nem docker-compose encontrado"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "✓ Container iniciado"
|
||||
|
||||
- name: Aguardar inicialização
|
||||
|
||||
28
README.md
28
README.md
@ -243,31 +243,6 @@ WHERE online_time::date = CURRENT_DATE - 1;
|
||||
|
||||
---
|
||||
|
||||
## 🏗️ Arquitetura (versão simplificada)
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
|
||||
A[Cron (5min)] --> B[main.py]
|
||||
|
||||
B --> C{Watermark<br/>last_run < 1h?}
|
||||
C -->|Sim| D[Usa watermark<br/>(delta only)]
|
||||
C -->|Não| E[Extrai tudo]
|
||||
|
||||
D --> F[Ruijie API<br/>page=1..N]
|
||||
E --> F
|
||||
|
||||
F --> G[transform_ruijie<br/>normalize_mac]
|
||||
F --> H[transform_wifeed<br/>normalize_mac + CPF]
|
||||
|
||||
G --> I[PostgreSQL<br/>sessions + users]
|
||||
H --> I
|
||||
|
||||
I --> J[Update watermarks<br/>last_run_at + last_value]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 Modelo de Dados
|
||||
|
||||
```
|
||||
@ -328,11 +303,10 @@ watermarks
|
||||
- [x] CI/CD (push → deploy)
|
||||
- [ ] Retry com backoff nas APIs
|
||||
- [ ] Testes unitários (pytest)
|
||||
- [ ] Métricas Prometheus
|
||||
|
||||
---
|
||||
|
||||
## 📝 Licença
|
||||
|
||||
Proprietário — uso interno.
|
||||
Proprietário — Sothis
|
||||
|
||||
|
||||
213
docs/DEPLOY.md
213
docs/DEPLOY.md
@ -1,213 +0,0 @@
|
||||
# Deploy WiFi-ETL em Produção
|
||||
|
||||
## Arquitetura
|
||||
|
||||
- **Aplicação**: `/opt/wifi-etl` (clone do repositório)
|
||||
- **Config**: `.env` copiado de `/home/desenvolvimento/.envs/wifi_etl/.env`
|
||||
- **Container**: Rodando via `docker compose` (cron + ETL)
|
||||
- **Runner**: Self-hosted na VM (pull automático na mudança de código)
|
||||
|
||||
## Setup Inicial (uma única vez na VM)
|
||||
|
||||
### 1. Configurar Self-Hosted Runner no Gitea
|
||||
|
||||
Na **VM de produção**:
|
||||
|
||||
```bash
|
||||
# Criar diretório para o runner
|
||||
mkdir -p ~/gitea-runner
|
||||
cd ~/gitea-runner
|
||||
|
||||
# Baixar runner Gitea (Linux x86_64)
|
||||
# Substitua URL pela sua instância Gitea
|
||||
wget https://seu-gitea.com/api/v1/repos/seu-usuario/wifi-etl/actions/runners/download/linux_x86_64
|
||||
|
||||
# Ou use curl:
|
||||
# curl -LO https://seu-gitea.com/api/v1/repos/seu-usuario/wifi-etl/actions/runners/download/linux_x86_64
|
||||
|
||||
# Descompactar
|
||||
unzip linux_x86_64
|
||||
chmod +x act_runner
|
||||
|
||||
# Gerar token no Gitea:
|
||||
# 1. Vá para: Repositório → Settings → Actions → Runners
|
||||
# 2. Clique "Create Runner"
|
||||
# 3. Copie o Token gerado
|
||||
|
||||
# Registrar runner (substitua o token)
|
||||
./act_runner register \
|
||||
--instance https://seu-gitea.com \
|
||||
--token seu_token_aqui
|
||||
|
||||
# Rodar em background
|
||||
nohup ./act_runner daemon > runner.log 2>&1 &
|
||||
|
||||
# OU criar systemd service (recomendado):
|
||||
sudo tee /etc/systemd/system/gitea-runner.service > /dev/null << 'EOF'
|
||||
[Unit]
|
||||
Description=Gitea Runner
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=ubuntu
|
||||
WorkingDirectory=/home/ubuntu/gitea-runner
|
||||
ExecStart=/home/ubuntu/gitea-runner/act_runner daemon
|
||||
Restart=always
|
||||
RestartSec=10
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
|
||||
sudo systemctl enable gitea-runner
|
||||
sudo systemctl start gitea-runner
|
||||
sudo systemctl status gitea-runner
|
||||
```
|
||||
|
||||
### 2. Preparar diretório da aplicação
|
||||
|
||||
```bash
|
||||
# Criar diretório
|
||||
mkdir -p /opt/wifi-etl
|
||||
|
||||
# Primeiro clone manual (depois é automático)
|
||||
cd /opt/wifi-etl
|
||||
git clone https://seu-gitea.com/seu-usuario/wifi-etl.git .
|
||||
```
|
||||
|
||||
## Fluxo de Deploy Automático
|
||||
|
||||
```
|
||||
1. git push main (local → Gitea)
|
||||
↓
|
||||
2. Gitea dispara workflow (push event)
|
||||
↓
|
||||
3. Runner na VM executa
|
||||
↓
|
||||
4. git pull /opt/wifi-etl (atualiza código)
|
||||
↓
|
||||
5. Copiar .env
|
||||
↓
|
||||
6. docker compose up -d --build
|
||||
↓
|
||||
7. Validar CRON status
|
||||
↓
|
||||
8. Testar conexão BD
|
||||
↓
|
||||
DONE! ✓
|
||||
```
|
||||
|
||||
## Deploy Manual (se necessário)
|
||||
|
||||
```bash
|
||||
# Na VM
|
||||
cd /opt/wifi-etl
|
||||
git pull origin main
|
||||
cp /home/desenvolvimento/.envs/wifi_etl/.env ./.env
|
||||
docker compose -f infra/docker-compose.yml up -d --build
|
||||
|
||||
# Aguardar inicialização
|
||||
sleep 5
|
||||
docker logs -f wifi_etl_worker
|
||||
```
|
||||
|
||||
## Verificações Pós-Deploy
|
||||
|
||||
```bash
|
||||
# Status do container
|
||||
docker ps -a | grep wifi_etl
|
||||
|
||||
# Logs em tempo real
|
||||
docker logs -f wifi_etl_worker
|
||||
|
||||
# Validar cron rodando
|
||||
docker exec wifi_etl_worker ps aux | grep cron
|
||||
|
||||
# Testar banco de dados
|
||||
docker exec wifi_etl_worker python3 << 'EOF'
|
||||
import psycopg2, os
|
||||
try:
|
||||
conn = psycopg2.connect(
|
||||
host=os.getenv('DB_HOST'),
|
||||
port=int(os.getenv('DB_PORT', 5432)),
|
||||
dbname=os.getenv('DB_NAME'),
|
||||
user=os.getenv('DB_USER'),
|
||||
password=os.getenv('DB_PASSWORD')
|
||||
)
|
||||
print("✓ Database conectado")
|
||||
conn.close()
|
||||
except Exception as e:
|
||||
print(f"✗ Erro: {e}")
|
||||
EOF
|
||||
|
||||
# Ver logs de ETL
|
||||
docker exec wifi_etl_worker tail -50 /var/log/wifi-etl.log
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Container não inicia
|
||||
```bash
|
||||
docker logs wifi_etl_worker
|
||||
docker exec wifi_etl_worker env | grep DB_
|
||||
```
|
||||
|
||||
### Cron não funciona
|
||||
```bash
|
||||
docker exec -it wifi_etl_worker bash
|
||||
cat /etc/cron.d/wifi-etl # Verificar arquivo
|
||||
tail -20 /var/log/syslog # Verificar logs
|
||||
```
|
||||
|
||||
### Banco não conecta
|
||||
```bash
|
||||
# Verificar variáveis de ambiente
|
||||
docker exec wifi_etl_worker env | grep DB_
|
||||
|
||||
# Testar conexão
|
||||
docker exec wifi_etl_worker python3 -m \
|
||||
psycopg2 "postgresql://user:pass@host:port/db"
|
||||
```
|
||||
|
||||
### Runner não pegando mudanças
|
||||
```bash
|
||||
cd ~/gitea-runner
|
||||
./act_runner status
|
||||
|
||||
# Ver logs
|
||||
tail -50 runner.log
|
||||
|
||||
# Restart
|
||||
pkill act_runner
|
||||
nohup ./act_runner daemon > runner.log 2>&1 &
|
||||
```
|
||||
|
||||
## Revertir Deploy
|
||||
|
||||
```bash
|
||||
# Parar container
|
||||
docker-compose -f /opt/wifi-etl/infra/docker-compose.yml down
|
||||
|
||||
# Remover para forçar rebuild
|
||||
docker rmi wifi-etl:latest
|
||||
|
||||
# Ou voltar para commit anterior
|
||||
cd /opt/wifi-etl
|
||||
git reset --hard HEAD~1
|
||||
# Depois fazer deploy novamente
|
||||
```
|
||||
|
||||
## ETL Schedule
|
||||
|
||||
Roda a cada **5 minutos** em produção:
|
||||
|
||||
```
|
||||
*/5 * * * * /usr/local/bin/python /app/main.py
|
||||
```
|
||||
|
||||
Logs: `/var/log/wifi-etl.log` (dentro do container)
|
||||
|
||||
---
|
||||
|
||||
**Last updated**: 2026-04-22
|
||||
@ -1,196 +0,0 @@
|
||||
# 🖥️ 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
|
||||
Loading…
Reference in New Issue
Block a user