diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml index 86bf87f..2de5125 100644 --- a/.gitea/workflows/deploy.yml +++ b/.gitea/workflows/deploy.yml @@ -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 diff --git a/README.md b/README.md index c6aca38..c8f111e 100644 --- a/README.md +++ b/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
last_run < 1h?} - C -->|Sim| D[Usa watermark
(delta only)] - C -->|Não| E[Extrai tudo] - - D --> F[Ruijie API
page=1..N] - E --> F - - F --> G[transform_ruijie
normalize_mac] - F --> H[transform_wifeed
normalize_mac + CPF] - - G --> I[PostgreSQL
sessions + users] - H --> I - - I --> J[Update watermarks
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 diff --git a/docs/DEPLOY.md b/docs/DEPLOY.md deleted file mode 100644 index 2b6e926..0000000 --- a/docs/DEPLOY.md +++ /dev/null @@ -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 diff --git a/docs/PROD_SETUP.md b/docs/PROD_SETUP.md deleted file mode 100644 index 4433ae3..0000000 --- a/docs/PROD_SETUP.md +++ /dev/null @@ -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