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