arcadiasuite/server/metaset/README.md

9.3 KiB

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:

// 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

# 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

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:
    • superadminAdmin
    • adminAlpha
    • analystGamma
    • viewerPublic

Row Level Security (RLS)

-- 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)

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

# 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

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

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)

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