UrbanViable runs as two Docker containers orchestrated with Docker Compose on Oracle Cloud ARM infrastructure.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/danizd/urbanviable/llms.txt
Use this file to discover all available pages before exploring further.
urbanviable-tiles serves vector tiles from a local .mbtiles file via TileServer GL on port 8080, and urbanviable-web hosts the compiled React SPA, exposes the data-status endpoint, and serves tile data files from a shared read-only volume on port 3002. There is no database, no API server, and no server-side computation — all scouting logic runs in the browser.
Containers
| Container | Image | Host → Container Port | Role |
|---|---|---|---|
urbanviable-tiles | maptiler/tileserver-gl:latest | 8080 → 8080 | Serves vector tile data from .mbtiles |
urbanviable-web | nginx:1.25-alpine | 3002 → 80 | Hosts React SPA, serves /api/status and /data/ from mounted tile data |
Volumes
| Host path | Container | Container path | Mount flags | Purpose |
|---|---|---|---|---|
./tiles_data | urbanviable-tiles | /data | — | MBTiles file and TileServer GL config.json |
./nginx/conf.d | urbanviable-web | /etc/nginx/conf.d | :ro | Nginx virtual host config |
./frontend/build | urbanviable-web | /usr/share/nginx/html | :ro | Compiled React SPA static files |
./certs | urbanviable-web | /etc/letsencrypt | :ro | Let’s Encrypt TLS certificates |
./tiles_data | urbanviable-web | /data | :ro | Provides last_update.json for the /api/status endpoint and static tile data |
urbanviable-tiles binds port 8080 on the host. Internal tile requests within the Docker network go directly via urbanviable-net. TLS termination and public routing are handled by urbanviable-web (Nginx), which listens on host port 3002.docker-compose.yml
TileServer GL: tiles_data/config.json
TileServer GL is configured with a minimal config.json that registers the .mbtiles file under the dataset name galicia-scouting. This name is what the frontend references in its MapLibre source and what TileServer GL uses to serve tile requests at /data/galicia-scouting/{z}/{x}/{y}.pbf on port 8080.
First-time setup
Clone the repository and configure environment variables
Clone the repository on the OCI server and create a At minimum, replace all occurrences of
.env file from the template:tu-dominio.com with your real domain.Copy the .mbtiles file to tiles_data/
The The
.mbtiles file is generated by the ETL pipeline on a developer workstation (never on the server). Copy it over via scp:last_update.json file is served by Nginx at /api/status so the frontend can display data freshness information.Build the React frontend
The frontend is a Vite project. Build-time variables (prefixed The compiled output lands in
REACT_APP_) must be set in .env before building, as Vite bakes them into the JS bundle at compile time via the configured envPrefix:frontend/build/, which is bind-mounted read-only into the Nginx container.Start the containers
depends_on directive ensures urbanviable-tiles is healthy before urbanviable-web starts.Updating MBTiles after a new ETL run
TileServer GL monitors its data directory and picks up a replaced.mbtiles file without requiring a container restart.
Run the ETL pipeline locally
Execute the full ETL pipeline on your development machine:Review the output of
process_data.py (polygon count, null values) before proceeding to verify the data is sound.TileServer GL reloads in hot — no restart needed
TileServer GL detects the replaced file automatically. No container restart is required.If you need to force a reload manually: