291 lines
9.3 KiB
Markdown
291 lines
9.3 KiB
Markdown
# MetaSet BI - Apache Superset Integration
|
|
|
|
> **Status:** ✅ Consolidado (Abril 2026)
|
|
> **Localização:** `/server/bi/metaset/` (implementação Python)
|
|
> **Legado:** `/server/metaset/backup/` (implementação anterior Metabase - deprecated)
|
|
|
|
---
|
|
|
|
## 🏗️ Arquitetura
|
|
|
|
O MetaSet BI é um fork customizado do **Apache Superset 4.1.0** integrado ao Arcádia Suite.
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────────────┐
|
|
│ ARCÁDIA SUITE (Porta 5000) │
|
|
│ ┌─────────────────────────────────────────────────────┐ │
|
|
│ │ BI-API Gateway (Porta 8004) │ │
|
|
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
|
|
│ │ │ /bi/api/* │ │/bi/metaset/*│ │ /bi/fdb/* │ │ │
|
|
│ │ │ (nativo) │ │ (proxy) │ │ (proxy) │ │ │
|
|
│ │ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │ │
|
|
│ │ └─────────────────┴─────────────────┘ │ │
|
|
│ └─────────────────────────┬───────────────────────────┘ │
|
|
└────────────────────────────┼────────────────────────────────┘
|
|
│
|
|
┌───────────────────┴───────────────────┐
|
|
▼ ▼
|
|
┌─────────────────────────┐ ┌─────────────────────────┐
|
|
│ METASET BI (8100) │ │ FDB-BRIDGE (8200) │
|
|
│ Apache Superset 4.1.0 │◄───────►│ Sync Firebird → PG │
|
|
│ - Dashboards │ │ - Change Data Capture │
|
|
│ - SQL Lab │ │ - Real-time sync │
|
|
│ - Charts │ │ - Tenant isolation │
|
|
│ - Row Level Security │ │ │
|
|
└─────────────────────────┘ └─────────────────────────┘
|
|
│
|
|
▼
|
|
┌─────────────────────────┐
|
|
│ PostgreSQL + Redis │
|
|
│ (metaset_db + cache) │
|
|
└─────────────────────────┘
|
|
```
|
|
|
|
---
|
|
|
|
## 📁 Estrutura de Arquivos
|
|
|
|
### Implementação Atual (Apache Superset)
|
|
|
|
**Local:** `/server/bi/metaset/`
|
|
|
|
| Arquivo/Pasta | Descrição |
|
|
|---------------|-----------|
|
|
| `main.py` | FastAPI wrapper - entry point principal (Porta 8100) |
|
|
| `run.py` | Entry point alternativo via Gunicorn |
|
|
| `superset_config.py` | Configuração principal do Superset |
|
|
| `security_manager.py` | ArcadiaSecurityManager (JWT + RLS) |
|
|
| `Dockerfile` | Container do MetaSet |
|
|
| `init.sh` | Script de inicialização |
|
|
| `requirements.txt` | Dependências Python |
|
|
| `superset-src/` | Código fonte Apache Superset 4.1.0 |
|
|
| `config/` | Configurações adicionais |
|
|
| `branding/` | Assets de branding (logos, favicons) |
|
|
| `security/` | Módulos de segurança customizados |
|
|
| `extensions/` | Extensões do Superset |
|
|
| `templates/` | Templates customizados |
|
|
|
|
### Código Legado (Backup)
|
|
|
|
**Local:** `/server/metaset/backup/`
|
|
|
|
| Arquivo | Descrição | Status |
|
|
|---------|-----------|--------|
|
|
| `client.ts` | Cliente TypeScript para Metabase | ❌ Deprecated |
|
|
| `routes.ts` | Rotas Express para Metabase API | ❌ Deprecated |
|
|
|
|
> **Nota:** O código legado foi baseado em Metabase e foi substituído pela implementação Apache Superset mais robusta.
|
|
|
|
---
|
|
|
|
## 🔌 API Endpoints
|
|
|
|
### BI-API Gateway (Porta 8004)
|
|
|
|
Proxy e endpoints nativos para o MetaSet:
|
|
|
|
```typescript
|
|
// Proxy para MetaSet
|
|
GET/POST /bi/metaset/* → Proxy para http://metaset:8100/*
|
|
|
|
// Endpoints nativos
|
|
GET /bi/api/dashboards // Lista dashboards
|
|
POST /bi/api/dashboards // Cria dashboard
|
|
GET /bi/api/health // Health check
|
|
POST /bi/api/query // Query SQL
|
|
```
|
|
|
|
### MetaSet Direto (Porta 8100)
|
|
|
|
API nativa do Apache Superset:
|
|
|
|
```
|
|
GET /health // Health check
|
|
GET /api/v1/dashboard/ // Lista dashboards
|
|
GET /api/v1/dashboard/{id} // Detalhes do dashboard
|
|
POST /api/v1/dashboard/ // Cria dashboard
|
|
GET /api/v1/chart/ // Lista charts
|
|
GET /api/v1/dataset/ // Lista datasets
|
|
POST /api/v1/security/guest_token/ // Guest token (embedding)
|
|
GET /api/v1/database/ // Lista conexões de banco
|
|
POST /api/v1/database/ // Cria conexão
|
|
GET /sqllab/ // SQL Lab UI
|
|
```
|
|
|
|
---
|
|
|
|
## ⚙️ Configuração
|
|
|
|
### Variáveis de Ambiente
|
|
|
|
```bash
|
|
# MetaSet Connection
|
|
METASET_HOST=metaset
|
|
METASET_PORT=8100
|
|
|
|
# Database
|
|
DATABASE_URL=postgresql://arcadia:arcadia123@db:5432/metaset_db
|
|
ARCADIA_DATABASE_URL=postgresql://arcadia:arcadia123@db:5432/arcadia
|
|
|
|
# Redis (Cache)
|
|
REDIS_URL=redis://redis:6379/1
|
|
|
|
# Security
|
|
METASET_SECRET_KEY=change-in-production
|
|
JWT_SECRET_KEY=arcadia-jwt-secret
|
|
|
|
# Admin
|
|
METASET_ADMIN_USER=admin
|
|
METASET_ADMIN_EMAIL=admin@arcadia.app
|
|
METASET_ADMIN_PASSWORD=metaset2026
|
|
```
|
|
|
|
### Feature Flags
|
|
|
|
```python
|
|
FEATURE_FLAGS = {
|
|
"EMBEDDED_SUPERSET": True, # Embedding de dashboards
|
|
"GUEST_EMBEDDING_ENABLED": True, # Guest tokens
|
|
"DASHBOARD_RBAC": True, # Controle de acesso
|
|
"SQLLAB_BACKEND_PERSISTENCE": True, # Persistência SQL Lab
|
|
"DRILL_BY": True, # Drill-down
|
|
"DASHBOARD_CROSS_FILTERS": True, # Filtros cruzados
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 🔐 Segurança
|
|
|
|
### ArcadiaSecurityManager
|
|
|
|
Integração customizada que:
|
|
|
|
1. **Extrai JWT** do header `Authorization: Bearer <token>`
|
|
2. **Identifica tenant** do payload JWT (`tenant_id`)
|
|
3. **Aplica RLS** automaticamente via `SET LOCAL app.current_tenant`
|
|
4. **Mapeia roles:**
|
|
- `superadmin` → `Admin`
|
|
- `admin` → `Alpha`
|
|
- `analyst` → `Gamma`
|
|
- `viewer` → `Public`
|
|
|
|
### Row Level Security (RLS)
|
|
|
|
```sql
|
|
-- Política aplicada automaticamente
|
|
SET LOCAL app.current_tenant = <tenant_id>;
|
|
|
|
-- Views filtram por tenant
|
|
CREATE VIEW tenant_data AS
|
|
SELECT * FROM data
|
|
WHERE tenant_id = current_setting('app.current_tenant')::int;
|
|
```
|
|
|
|
---
|
|
|
|
## 🚀 Deployment
|
|
|
|
### Docker Compose (Desenvolvimento)
|
|
|
|
```yaml
|
|
services:
|
|
metaset:
|
|
build: ./server/bi/metaset
|
|
ports:
|
|
- "8100:8100"
|
|
environment:
|
|
- DATABASE_URL=postgresql://arcadia:arcadia123@db:5432/metaset_db
|
|
- REDIS_URL=redis://redis:6379/1
|
|
labels:
|
|
- "arcadia.discovery.enabled=true"
|
|
- "arcadia.name=MetaSet BI"
|
|
- "arcadia.type=python"
|
|
- "arcadia.port=8100"
|
|
- "arcadia.capabilities=dashboards,charts,sql_lab,rls"
|
|
```
|
|
|
|
### Inicialização
|
|
|
|
```bash
|
|
# Via docker compose
|
|
docker compose up metaset
|
|
|
|
# Ou diretamente
|
|
cd server/bi/metaset
|
|
python run.py --host 0.0.0.0 --port 8100 --workers 2
|
|
```
|
|
|
|
---
|
|
|
|
## 📊 Uso
|
|
|
|
### Criar Dashboard via API
|
|
|
|
```bash
|
|
curl -X POST http://localhost:8004/bi/api/dashboards \
|
|
-H "Authorization: Bearer <token>" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{
|
|
"name": "Vendas Q1 2026",
|
|
"description": "Dashboard de vendas"
|
|
}'
|
|
```
|
|
|
|
### Executar Query SQL
|
|
|
|
```bash
|
|
curl -X POST http://localhost:8004/bi/metaset/sqllab/execute \
|
|
-H "Authorization: Bearer <token>" \
|
|
-d '{
|
|
"database_id": 1,
|
|
"query": "SELECT * FROM sales LIMIT 100"
|
|
}'
|
|
```
|
|
|
|
### Guest Token (Embedding)
|
|
|
|
```bash
|
|
curl -X POST http://localhost:8100/api/v1/security/guest_token/ \
|
|
-H "Content-Type: application/json" \
|
|
-d '{
|
|
"resources": [{"type": "dashboard", "id": "1"}],
|
|
"rls": [{"dataset": 1, "clause": "tenant_id = 123"}]
|
|
}'
|
|
```
|
|
|
|
---
|
|
|
|
## 🔄 Integração FDB-Bridge
|
|
|
|
O FDB-Bridge (Porta 8200) sincroniza dados do Firebird (ERP legado) para PostgreSQL:
|
|
|
|
```
|
|
Firebird (ERP) → FDB-Bridge → PostgreSQL → MetaSet
|
|
```
|
|
|
|
**Endpoints:**
|
|
- `POST /bi/fdb/sync/trigger` - Inicia sync manual
|
|
- `GET /bi/fdb/sync/status/{job_id}` - Status do sync
|
|
|
|
---
|
|
|
|
## 📝 Histórico de Mudanças
|
|
|
|
| Data | Mudança |
|
|
|------|---------|
|
|
| 2026-04-08 | Consolidação: removido código legado Metabase, unificado em Apache Superset |
|
|
| 2026-04-07 | Implementação ArcadiaSecurityManager com JWT + RLS |
|
|
| 2026-04-01 | Setup inicial Apache Superset 4.1.0 fork |
|
|
| 2026-03-27 | Código legado Metabase (backup em `/server/metaset/backup/`) |
|
|
|
|
---
|
|
|
|
## 🔗 Referências
|
|
|
|
- [Apache Superset Docs](https://superset.apache.org/docs/)
|
|
- [Superset API Reference](https://superset.apache.org/docs/api/)
|
|
- [Embedding Docs](https://superset.apache.org/docs/embedding/)
|
|
- `/docs/ARCADIA_SUITE_ARQUITETURA.md`
|
|
- `/docs/KERNEL_SPEC.md`
|