Arquitectura
Cómo se despliega MappView y cómo está organizado el código. Dos vistas, un mismo sistema.
Entrega
MappView se distribuye de tres formas desde un único monorepo de workspaces Bun. El visor es una aplicación React servida como archivos estáticos por nginx (Docker) o instalada como app de escritorio Tauri v2 para Windows, macOS y Linux. La consola de gestión y la API de administración se despliegan como contenedores, y un anywidget de Jupyter incrusta el visor en cuadernos. La distribución es closed-source: imágenes Docker e instaladores de escritorio firmados, sin tiendas de aplicaciones ni servidores de actualización.
Topología en ejecución
flowchart LR
subgraph clients["Clientes"]
Browser["Navegador · PWA"]
Desktop["Escritorio · Tauri v2"]
Jupyter["Jupyter · anywidget"]
Console["Consola de gestión"]
end
subgraph viewer["Stack del visor · nginx"]
Static["App React estática"]
Sidecar["Sidecar FastAPI · /sidecar
Whitebox · conversión · ráster · SQL"]
Static --> Sidecar
end
subgraph control["Plano de control"]
Admin["API de gestión · Bun
SQLite share.db · auth Clerk"]
RustFS["RustFS · almacén S3
capas · fotos · blobs compartidos"]
Plugins["CDN de registro de plugins
registry.json"]
end
subgraph ai["Relé de IA"]
Edge["Proxy Edge · Bun
enrutado de modelos · límites"]
EdgeRedis["Redis"]
end
subgraph geonode["Stack GeoNode · perfil hosted-layers"]
Django["GeoNode Django + API puente"]
PostGIS["PostGIS"]
GeoServer["GeoServer"]
Celery["Celery + Redis"]
end
Browser --> Static
Desktop --> LocalSidecar["Sidecar local · 127.0.0.1:8765"]
Jupyter --> Static
Console --> Admin
Admin --> RustFS
Admin --> Django
Admin --> Edge
Edge --> EdgeRedis
Django --> PostGIS
Django --> GeoServer
Django --> Celery
Browser -->|"capas alojadas WMS/WFS/teselas"| GeoServer
Límites de confianza
- La app de escritorio habla con su sidecar local solo por
127.0.0.1; el procesamiento pesado en Python nunca sale de la máquina salvo que se configure un servicio remoto. - El contenedor del visor alcanza el sidecar en el mismo origen en
/sidecar, sin superficie CORS. ConMAPPVIEW_DISABLE_SIDECAR=1se sirve solo estático. - La API de gestión antepone el almacenamiento de objetos con URL de capa firmadas y temporales (
LAYER_ACCESS_TTL_SECONDS) y cuotas por tenant. - El relé de IA autentica visores con token, restringe modelos y limita la tasa por cliente; las claves de proveedores nunca llegan al navegador.
Estructura del workspace
flowchart TD
subgraph apps["apps/*"]
WebDesktop["web-desktop · shell, I/O Tauri, composición"]
ManagementApp["consola de gestión"]
Docs["docs · este sitio"]
end
subgraph packages["packages/*"]
Core["@mappview/core · tipos de dominio, esquema, runtime, sesiones"]
MapPkg["@mappview/map · ciclo MapLibre, sync de capas, globo"]
UiPkg["@mappview/ui · primitivas estilo shadcn"]
Proc["@mappview/processing · algoritmos cliente"]
PluginsPkg["@mappview/plugins · API de plugins, plugins integrados"]
end
subgraph services["services/*"]
EdgeSvc["edge · proxy de IA"]
MgmtSvc["management · API de administración"]
Bridge["geonode-bridge · app Django"]
end
subgraph backend["backend/mappview_server"]
FastAPI["Sidecar FastAPI · Whitebox, conversión, ráster, /sql, /vector"]
end
WebDesktop --> Core
WebDesktop --> MapPkg
WebDesktop --> UiPkg
WebDesktop --> PluginsPkg
PluginsPkg --> Core
Proc --> Core
MapPkg --> Core
MgmtSvc --> Bridge
Flujo de estado
sequenceDiagram
participant User
participant UI as Paneles / Añadir datos
participant Session as ProjectSession
participant Doc as Almacén del documento + Travels
participant Sync as MapController.syncLayers
participant ML as MapLibre · deck.gl · Cesium
User->>UI: Añadir datos / estilar / reordenar
UI->>UI: Parsear o convertir (DuckDB-WASM Spatial)
UI->>Session: Comando de documento (createGeoJsonLayer…)
Session->>Doc: Registrar cambio (deshacible)
Doc-->>Sync: Registros MappViewLayer
Sync->>ML: Añadir/actualizar/eliminar fuentes y capas
ML-->>User: Mapa renderizado
Motores
- Conversión vectorial: DuckDB-WASM Spatial en el navegador; GeoPandas/Shapely en el sidecar o los mismos módulos
vector_ops.pyen Pyodide — una única fuente de verdad, tres tiempos de ejecución. - SQL espacial: DuckDB, PostGIS (PGlite en el navegador) y Apache Sedona (SedonaDB en el sidecar, CereusDB WASM en el navegador), con alternancia automática sidecar-first.
- Renderizado: MapLibre GL JS principal; deck.gl para ráster, nubes de puntos y overlays 3D; globo CesiumJS como modo de vista por panel tras un chunk diferido de ~4,8 MB y un token Ion opcional.
- Contratos: Effect v4 gestiona programas, esquemas y errores tipados; TanStack Query el ciclo de vida asíncrono; TanStack Store el estado de ejecución. El artefacto persistido es el proyecto
.mappview.jsonagnóstico del motor (formato 0.2.0).