DSP modules¶
Which modules exist and what does each one do?¶
The DSP is made up of 6 application/job repositories under Rural-Environmental-Registry on GitHub, plus infrastructure packaged in dsp-core (nginx gateway, two GeoServers, SeaweedFS object storage, and PostgreSQL/PostGIS databases). Each repository below evolves in its own git repo; the core orchestrates build and containers via Docker Compose.
| Module | Responsibility | Main technology | More details |
|---|---|---|---|
| dsp-core | Orchestration and configuration: ./config.sh, ./setup.sh, ./start.sh; starts databases, gateway, two GeoServers (Exhibition + Download), object storage (profile object-storage), and orchestrates builds of the other modules |
Docker Compose, Python 3 (wizard) | More details |
| dsp-backend | REST API—business data, territories, downloads (WFS or CSV pre-generated in S3) | Java 21 + Spring Boot 3.4.2 + PostGIS | More details |
| dsp-frontend | Web UI—search, KPIs, interactive map | Vue 3 + Vite + TypeScript | More details |
| dsp-job-data-migration | Geospatial ETL—synchronizes the adopter JDBC source with dsp-db and geoserver-db (dual-write); post-migration KPI job (AOI area + kpi_measure) |
Java 21 + Spring Batch | More details |
| dsp-job-geo-file-generation | Pre-generates territorial download files and publishes to object storage; keeps consultation fast at high volume (e.g. SICAR scale) | Java 21 + Spring Boot / Batch | More details |
| dsp-docs (this repository) | Central ecosystem documentation | Zensical | — |
Local demo vs real adopter
Local demo (evaluation only)—In Quick start you run the DSP with a synthetic Brazil seed: sample squares on the map, filters, KPIs, and site navigation, without connecting your organization’s database. For that goal (exploring the UI and consultation flow) you do not need the geo-file job or object storage (S3). If someone requests a download in the demo, the backend can use GeoServer Download (WFS), which is acceptable at small volume with fictitious data.
Real adopter (production and performance)—When the JDBC source has millions of records and large territories (like the Brazilian CAR public consultation), generating export files on demand in GeoServer and the database on every click overloads the stack and slows downloads. That is why the full installation enables the Compose profile object-storage: after each successful migration, the watermark indicates which territories changed and migration marks in dsp-db which regions need a new file; dsp-job-geo-file-generation pre-generates only those CSVs and stores them in SeaweedFS (dsp-object-storage). The backend serves those bytes when available, with fallback to WFS. Downloads stay fast and GeoServer is reserved mainly for maps (WMS/WFS for viewing), not repeated bulk exports.
Summary: local test = map + site with sample data, no S3; real high-volume use = S3 + pre-generation recommended. Details: Architecture and Full installation.
How modules connect¶
flowchart LR
browser["BROWSER<br/>Public map consultation."]
gw["GATEWAY<br/>nginx · single HTTP entry.<br/>/dsp/ · /dsp-backend/ · GeoServers."]
srcDb[("YOUR DATABASE<br/>Your organization's DB to migrate from.<br/>Source for the DSP.")]
jobMig["JOB-DATA-MIGRATION<br/>Spring Batch ETL.<br/>source → dsp-db + geoserver-db."]
jobGeo["JOB-GEO-FILE-GENERATION<br/>Pre-generates download files.<br/>"]
core["CORE<br/>CONFIG · SETUP · START.<br/>Prepares DBs and orchestrates modules."]
dspDb[("DSP DB<br/>Operational: business + bbox/centroid.")]
gsDb[("GEOSERVER DB<br/>Full geometry dsp.*<br/>Read by both GeoServers.")]
objStor[("OBJECT STORAGE<br/>SeaweedFS S3.<br/>")]
be["DSP BACKEND<br/>REST API and business rules."]
fe["DSP FRONTEND<br/>Web platform UI.<br/>Consultation, maps, sharing."]
gsEx["GEOSERVER-EXHIBITION<br/>Publishes layers for viewing.<br/>WMS/WFS map service."]
gsDl["GEOSERVER-DOWNLOAD<br/>WFS for download export.<br/>Used by the backend."]
browser --> gw
gw -->|/dsp/| fe
gw -->|/dsp-backend/| be
gw -->|/geoserver-exhibition/| gsEx
jobMig -->|read| srcDb
jobMig -->|"business + bbox/centroid + KPIs"| dspDb
jobMig -->|"full geom"| gsDb
core -.config/schema/build.-> jobMig
core -.-> jobGeo
core -.-> dspDb
core -.-> gsDb
core -.-> objStor
core -.-> gw
core -.-> be
core -.-> fe
core -.-> gsEx
core -.-> gsDl
dspDb --> be
gsDb --> gsEx
gsDb --> gsDl
gsDb --> jobGeo
jobGeo -->|"pre-generated CSV"| objStor
be -->|WFS downloads| gsDl
be -->|CSV when available| objStor
classDef app fill:#0f766e22,color:#115e59,stroke:#0f766e,stroke-width:2px
classDef geoCls fill:#16653422,color:#14532d,stroke:#166534,stroke-width:2px
classDef db fill:#b4530922,color:#92400e,stroke:#b45309,stroke-width:2px
classDef job fill:#7c2d1222,color:#7c2d12,stroke:#9a3412,stroke-width:2px
classDef coreCls fill:#312e8122,color:#312e81,stroke:#4338ca,stroke-width:2px
classDef entryCls fill:#1e3a5f22,color:#1e3a5f,stroke:#2563eb,stroke-width:2px
classDef storageCls fill:#4c1d9522,color:#4c1d95,stroke:#7c3aed,stroke-width:2px
class fe,be app
class gsEx,gsDl geoCls
class dspDb,gsDb,srcDb db
class jobMig,jobGeo job
class core coreCls
class browser,gw entryCls
class objStor storageCls
Which technologies are used?¶
| Layer | Technology |
|---|---|
| Orchestration | Git, Docker 24+, Docker Compose v2, Python 3 |
| HTTP entry | nginx (dsp-gateway, defined in core) |
| Backend | Java 21, Spring Boot 3.4.2, Gradle, JPA/Hibernate + hibernate-spatial, springdoc-openapi |
| Frontend | Vue 3 (Composition API), TypeScript, Vite, Tailwind CSS, @rural-environmental-registry/map_component (Leaflet) |
| ETL and geo-file | Java 21, Spring Boot 3.4.2, Spring Batch, Maven |
| Databases | PostgreSQL + PostGIS |
| Object storage | SeaweedFS (S3 API), profile object-storage |
| Map publication | GeoServer 3.0.0 (Exhibition + Download) |