Initial Commit: Estrutura para o ETL e start coding
This commit is contained in:
commit
f2f6f0327a
17
.env.example
Normal file
17
.env.example
Normal 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
|
||||||
0
.gitea/workflows/deploy.yml
Normal file
0
.gitea/workflows/deploy.yml
Normal file
38
.gitignore
vendored
Normal file
38
.gitignore
vendored
Normal 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
197
README.md
Normal 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:  -->
|
||||||
|
|
||||||
|
### 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
18
app/core/config.py
Normal 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
0
app/core/db.py
Normal file
0
app/extractor/__init__.py
Normal file
0
app/extractor/__init__.py
Normal file
0
app/extractor/ruijie.py
Normal file
0
app/extractor/ruijie.py
Normal file
0
app/extractor/wifeed.py
Normal file
0
app/extractor/wifeed.py
Normal file
0
app/load/load_database.py
Normal file
0
app/load/load_database.py
Normal file
0
app/main.py
Normal file
0
app/main.py
Normal file
0
app/transform/merge_mac.py
Normal file
0
app/transform/merge_mac.py
Normal file
0
infra/Dockerfile
Normal file
0
infra/Dockerfile
Normal file
0
infra/crontab
Normal file
0
infra/crontab
Normal file
0
infra/docker-compose.yml
Normal file
0
infra/docker-compose.yml
Normal file
3
requirements.txt
Normal file
3
requirements.txt
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
requests==2.31.0
|
||||||
|
psycopg2-binary==2.9.9
|
||||||
|
python-dotenv==1.0.1
|
||||||
Loading…
Reference in New Issue
Block a user