Initial Commit: Estrutura para o ETL e start coding

This commit is contained in:
Rafael Alves Lopes 2026-04-20 11:10:29 -03:00
commit f2f6f0327a
16 changed files with 273 additions and 0 deletions

17
.env.example Normal file
View File

@ -0,0 +1,17 @@
# PostgreSQL
DB_HOST=localhost
DB_PORT=5432
DB_NAME=wifi_etl
DB_USER=postgres
DB_PASSWORD=
# API Ruijie (AP)
RUIJIE_BASE_URL=
RUIJIE_API_KEY=
# API WiFeed (autenticação)
WIFEED_BASE_URL=
WIFEED_API_KEY=
# ETL config
LOG_LEVEL=INFO

View File

38
.gitignore vendored Normal file
View File

@ -0,0 +1,38 @@
# Ambiente
.env
.env.local
*.env
# Python
__pycache__/
*.py[cod]
*.pyo
*.pyd
.Python
*.egg-info/
dist/
build/
*.egg
# Virtual env
.venv/
venv/
env/
ENV/
# IDEs
.vscode/
.idea/
*.swp
*.swo
# Logs
*.log
logs/
# Docker
*.override.yml
# OS
.DS_Store
Thumbs.db

197
README.md Normal file
View File

@ -0,0 +1,197 @@
# 📡 WiFi ETL Pipeline
🚧 **Em construção** 🚧
Este projeto está em desenvolvimento. Este primeiro commit contém a estrutura base do pipeline ETL.
---
## 🧠 Visão Geral
Este projeto tem como objetivo realizar a ingestão periódica de dados de duas APIs distintas:
* **API de Autenticação (WiFeed)** → Nome, CPF, sexo, MAC
* **API do Access Point (Ruijie)** → MAC, tempo conectado, AP
Os dados serão cruzados pelo **MAC Address** e persistidos em um banco **PostgreSQL** para análise e consulta.
---
## ⚙️ Arquitetura
```mermaid
flowchart TD
A["Cron (Docker)\na cada 5 minutos"]
B["Python ETL Script"]
C["API Autenticação\nnome, cpf, sexo, MAC"]
D["API do AP\nMAC, tempo, AP"]
E["Transform\nmerge pelo MAC"]
F["PostgreSQL\nusers + sessions"]
A --> B
B --> C
B --> D
C --> E
D --> E
E --> F
```
<!-- Inserir diagrama aqui -->
<!-- Exemplo: ![Arquitetura do ETL](./docs/diagram.png) -->
### Fluxo
1. Execução automática a cada 5 minutos (cron via Docker)
2. Extração dos dados das APIs
3. Transformação (merge pelo MAC + normalização)
4. Carga no banco PostgreSQL
---
## 🏗️ Estrutura do Projeto
```
app/
├── core/ # Configurações e conexão com banco
│ ├── config.py
│ └── db.py
├── extractor/ # Extração das APIs externas
│ ├── ruijie.py
│ └── wifeed.py
├── transform/ # Regras de transformação
│ └── merge_mac.py
├── load/ # Persistência no banco
│ └── load_database.py
└── main.py # Orquestrador do pipeline
infra/
├── Dockerfile
├── docker-compose.yml
└── crontab
.env.example
requirements.txt
README.md
```
---
## 🚀 Como executar
> ⚠️ Observação: o projeto ainda está em fase inicial e algumas partes podem não estar totalmente implementadas.
### 1. Clonar o repositório
```bash
git clone <seu-repo>
cd wifi-etl
```
---
### 2. Configurar variáveis de ambiente
Crie um `.env` baseado no exemplo:
```bash
cp .env.example .env
```
Preencha com suas credenciais:
```env
DB_HOST=
DB_PORT=5432
DB_NAME=
DB_USER=
DB_PASSWORD=
RUIJIE_BASE_URL=
RUIJIE_API_KEY=
WIFEED_BASE_URL=
WIFEED_API_KEY=
```
---
### 3. Subir o ambiente
```bash
docker-compose up --build -d
```
---
### 4. Execução
O pipeline será executado automaticamente a cada **5 minutos** via cron.
---
## 🗄️ Modelo de Dados (planejado)
### Tabela: users
* nome
* cpf
* sexo
* mac
### Tabela: sessions
* mac
* access_point
* tempo_conectado
* timestamp
---
## 🔄 Processo ETL
### Extract
Coleta dados das APIs Ruijie e WiFeed
### Transform
* Normalização de dados
* Merge pelo MAC Address
### Load
Inserção e/ou atualização no PostgreSQL
---
## 📦 Tecnologias
* Python
* Docker
* PostgreSQL
* Requests
---
## 📌 Roadmap
* [x] Estrutura inicial do projeto
* [ ] Integração com APIs
* [ ] Implementação do transform (merge por MAC)
* [ ] Persistência no banco
* [ ] Logging e tratamento de erros
* [ ] Deploy automatizado (CI/CD)
---

18
app/core/config.py Normal file
View File

@ -0,0 +1,18 @@
from dotenv import load_dotenv
import os
load_dotenv()
DB_HOST = os.getenv("DB_HOST", "localhost")
DB_PORT = int(os.getenv("DB_PORT", 5432))
DB_NAME = os.getenv("DB_NAME", "wifi_etl")
DB_USER = os.getenv("DB_USER", "postgres")
DB_PASSWORD = os.getenv("DB_PASSWORD", "")
RUIJIE_BASE_URL = os.getenv("RUIJIE_BASE_URL")
RUIJIE_API_KEY = os.getenv("RUIJIE_API_KEY")
WIFEED_BASE_URL = os.getenv("WIFEED_BASE_URL")
WIFEED_API_KEY = os.getenv("WIFEED_API_KEY")
LOG_LEVEL = os.getenv("LOG_LEVEL", "INFO")

0
app/core/db.py Normal file
View File

View File

0
app/extractor/ruijie.py Normal file
View File

0
app/extractor/wifeed.py Normal file
View File

View File

0
app/main.py Normal file
View File

View File

0
infra/Dockerfile Normal file
View File

0
infra/crontab Normal file
View File

0
infra/docker-compose.yml Normal file
View File

3
requirements.txt Normal file
View File

@ -0,0 +1,3 @@
requests==2.31.0
psycopg2-binary==2.9.9
python-dotenv==1.0.1