Quick Start
Get GeoVertix up and running in under 5 minutes.
1. Download & Extract
Community Edition (Free)
Download the latest release from geovertix.com.
# Linux (AMD64)
tar -xzf geovertix-community-linux-amd64.tar.gz
cd geovertix-community
# macOS (Apple Silicon)
tar -xzf geovertix-community-macos-arm64.tar.gz
cd geovertix-community
# Windows (AMD64) β via WSL2
tar -xzf geovertix-community-linux-amd64.tar.gz
cd geovertix-community
Enterprise Edition
Contact sales@geovertix.com to obtain the Enterprise package. You will receive:
- Server package for your platform β server + worker binaries
license.key+license.key.sigβ your Ed25519-signed license- mTLS certificates β
client-cert.pem,client-key.pemfor license validation
# Extract (choose your platform)
tar -xzf geovertix-enterprise-linux-amd64.tar.gz # Linux / WSL2
tar -xzf geovertix-enterprise-macos-arm64.tar.gz # macOS Apple Silicon
cd geovertix-enterprise
# Place your license files
cp /path/to/license.key .
cp /path/to/license.key.sig .
# Place your mTLS certificates
mkdir -p certs
cp /path/to/client-cert.pem certs/
cp /path/to/client-key.pem certs/
2. Run the Installer
The install command handles everything interactively: prerequisite checks, database setup, admin user creation, and config file generation.
$ ./geovertix install
GeoVertix Community β Installation
==============================
Checking for PostgreSQL...
β PostgreSQL is running
Database setup
Do you already have a database for GeoVertix? [y/N]: n
Database name [geovertix]: <enter>
Username [geovertix]: <enter>
Password: ********
Confirm: ********
Step 1/6: Checking prerequisites...
β PostgreSQL 16.2 (connected)
β PostGIS 3.4 (extension available)
β GEOS 3.12.2
β PROJ 9.5.1
Step 2/6: Database setup...
Creating schema 'geovertix'...
Creating tables and indexes... done
Step 3/6: Create admin user
Username: admin
Password: ********
Confirm: ********
Email (optional): <enter>
β Admin user 'admin' created
Step 4/6: Configuration
β JWT_SECRET generated
β Log directory created: logs/
Step 5/6: Verify
β Ready to serve
Server configuration
Bind address [127.0.0.1]: 0.0.0.0
Server port [7501]: <enter>
Max upload size (MB) [2048]: <enter>
GIS data schema [gisdata]: <enter>
Log level (debug/info/warn/error) [info]: <enter>
β Config written to ./config/geovertix.toml
3. Start the Server
# Start in foreground (for development)
./geovertix serve --foreground
# Or start as a daemon (default)
./geovertix serve
# Output:
β WMS available at /wms
β WFS available at /wfs
β MVT available at /tiles
β COG available at /raster
β API available at /api/v1
β Server ready on http://0.0.0.0:7501
4. Import Data
Use the web UI or the REST API to import your spatial data.
# Upload a Shapefile via API
curl -X POST http://localhost:7501/api/v1/import/upload \
-H "Cookie: auth_token=<jwt>" \
-F "file=@parcels.zip"
# The server detects layers, imports to PostGIS,
# and auto-registers them for WMS/WFS/MVT.
5. View Your Maps
Open a WMS client (QGIS, MapLibre GL, OpenLayers) and connect to:
# WMS endpoint
http://localhost:7501/wms?SERVICE=WMS&REQUEST=GetCapabilities
# WFS endpoint
http://localhost:7501/wfs?SERVICE=WFS&REQUEST=GetCapabilities
# MVT tiles
http://localhost:7501/tiles/{layer}/{z}/{x}/{y}.pbf
Requirements
System Requirements
| Minimum | Recommended | |
|---|---|---|
| CPU | 2 cores | 4+ cores |
| RAM | 2 GB | 4+ GB |
| Disk | 10 GB | 50+ GB |
| OS | Linux (glibc 2.28+), macOS (ARM64), WSL2 | |
Software Dependencies
| Component | Version | Notes |
|---|---|---|
| PostgreSQL | 14+ | Required |
| PostGIS | 3.3+ | Required extension |
| GDAL, GEOS, PROJ | β | Bundled in Linux tarball |
libs/ directory with RPATH set. No system installation required.
Data Architecture
GeoVertix uses two canonical data backends β one for vector, one for raster. All other formats are converted on import.
Your Data
Shapefile, GeoPackage, GeoJSON, KML, GeoTIFF, ...
Vector
PostgreSQL + PostGIS
Raster
Cloud Optimized GeoTIFF (COG)
OGC Services
WMS, WFS, MVT
Vector Data: PostgreSQL + PostGIS
All vector layers are stored in PostgreSQL with the PostGIS extension. When you import a Shapefile, GeoPackage, or other vector format, GeoVertix's embedded GDAL converts it into a PostGIS table in the gisdata schema. This gives you full SQL access, spatial indexing, and transactional editing via WFS-T.
Raster Data: Cloud Optimized GeoTIFF (COG)
All raster layers are stored as COG files on disk. When you import a GeoTIFF or other supported raster format, GeoVertix converts it to COG with internal tiling and overview pyramids. This enables efficient range-request access β only the bytes needed for each WMS tile are read.
Supported Import Formats
The built-in importer accepts the following formats. All conversions happen server-side using embedded GDAL 3.10 β no external tools needed.
Vector Formats
Imported into PostgreSQL/PostGIS via the embedded GDAL API.
| Format | Extensions | Upload Method | Notes |
|---|---|---|---|
| Shapefile | .shp | ZIP | ZIP with .shp, .shx, .dbf, .prj; multiple shapefiles per ZIP |
| GeoPackage | .gpkg | Direct or ZIP | Multi-layer support |
| GeoJSON | .geojson, .json | Direct or ZIP | Single layer per file |
| KML | .kml | Direct or ZIP | Multi-layer support via libkml |
| KMZ | .kmz | Direct | Compressed KML, auto-extracted by GDAL |
| GPX | .gpx | Direct or ZIP | Tracks, routes, waypoints as separate layers |
| FlatGeobuf | .fgb | Direct or ZIP | High-performance streaming format |
| Esri File Geodatabase | .gdb/ | ZIP | Multi-layer; multiple GDBs per ZIP |
| MapInfo TAB | .tab | ZIP | With .dat, .map, .id companion files |
| SpatiaLite | .sqlite, .db | Direct | SQLite with spatial extension |
| CSV | .csv | Direct | With X/Y or WKT geometry columns |
| GML | .gml | Direct | Geography Markup Language |
| GeoParquet | .parquet | Direct | Apache Parquet with geometry |
Raster Formats
Converted to Cloud Optimized GeoTIFF (COG) on import with DEFLATE compression and overview pyramids.
| Format | Extensions | Notes |
|---|---|---|
| GeoTIFF | .tif, .tiff | Standard raster; non-COG files are converted to COG |
| PNG | .png | Georeferenced PNG (with world file or embedded CRS) |
| JPEG | .jpg, .jpeg | Georeferenced JPEG (with world file or embedded CRS) |
Configuration
Config file: ./config/geovertix.toml (or set GEOVERTIX_CONFIG env var). The install command generates this file interactively. You can also create it manually.
# ./config/geovertix.toml
# Database connection (required)
[database]
url = "postgres://geovertix:password@localhost:5432/geovertix"
# Server settings
[server]
host = "127.0.0.1" # default; use "0.0.0.0" for all interfaces
port = 7501 # Community default (Enterprise: 7500)
# Data storage
[storage]
import_schema = "gisdata"
max_upload_size_mb = 2048
# Logging
[logging]
level = "info" # debug, info, warn, error
install command and stored in .env as JWT_SECRET. Do not put it in config.toml.
Environment Variable Overrides
Key environment variables that override config file values:
# Config file path
export GEOVERTIX_CONFIG="./config/geovertix.toml"
# Database (overrides [database] url)
export GEOVERTIX_DATABASE_URL="postgres://..."
# JWT secret (auto-generated by install into .env)
export JWT_SECRET="..."
# Server
export GEOVERTIX_SERVER_HOST="0.0.0.0"
export GEOVERTIX_SERVER_PORT=7501
# Storage
export GIS_DATA_SCHEMA="gisdata"
export MAX_UPLOAD_SIZE_MB=2048
Database Setup
The ./geovertix install command handles database setup automatically β creating the database, user, extensions, and schemas. You only need manual setup if you prefer to manage your own PostgreSQL.
Automatic (Recommended)
# The install command will:
# 1. Check for PostgreSQL (offer to install from PGDG if missing)
# 2. Create database + user (or connect to existing)
# 3. Enable PostGIS extension
# 4. Create schemas: geovertix (metadata) + gisdata (spatial data)
# 5. Create admin user
$ ./geovertix install
Manual Setup
If you want to use an existing database, select "yes" when the installer asks "Do you already have a database for GeoVertix?" and provide the connection details. The installer will create the schemas and admin user in your existing database.
Schemas
| Schema | Purpose | Contents |
|---|---|---|
geovertix | Metadata | layers, styles, users, audit_log |
gisdata | Spatial data | Imported vector tables (configurable via import_schema) |
Connection Pool
[database]
url = "postgres://geovertix:password@localhost:5432/geovertix"
# read_url = "postgres://..." # Optional read replica
pool_min = 2 # Minimum connections (default: 2)
pool_max = 20 # Maximum connections (default: 20)
connection_timeout_ms = 5000 # Connection timeout (default: 5s)
statement_timeout_ms = 30000 # Query timeout (default: 30s)
idle_timeout_ms = 600000 # Idle timeout (default: 10min)
pool_max. Each WMS GetMap request holds a connection briefly for the spatial query.
WMS Settings
[wms]
enabled = true # Enable WMS service
title = "GeoVertix - FAST web map services" # GetCapabilities title
max_layers = 20 # Max layers per GetMap request
default_format = "image/png" # Default output format
# Rendering limits (shared by WMS/MVT)
[rendering]
max_width = 4096 # Max image width in pixels
max_height = 4096 # Max image height in pixels
max_concurrent_renders = 8 # Parallel render limit
max_geometry_vertices = 1000000 # Max vertices per request
fonts_dir = "./fonts" # Font directory for labels
Supported Operations
| Operation | Description |
|---|---|
GetCapabilities | Service metadata and layer listing |
GetMap | Render map image (PNG, WebP, JPEG) |
GetFeatureInfo | Query features at a point (JSON, HTML, Text) |
GetLegendGraphic | Zoom-aware legend image |
WFS Settings
[wfs]
enabled = true # Enable WFS service
max_features = 10000 # Hard limit per request
default_count = 1000 # Default if COUNT not specified
[wfs.transaction]
enabled = false # WFS-T disabled by default
max_insert_batch = 1000 # Max features per insert
max_update_batch = 5000 # Max features per update
max_delete_batch = 1000 # Max features per delete
Supported Operations
| Operation | Description |
|---|---|
GetCapabilities | Service metadata and type listing |
DescribeFeatureType | Schema introspection (JSON) |
GetFeature | Query features with filtering and pagination |
Transaction | Insert, Update, Delete (atomic) |
Cache Settings
[cache]
enabled = true # Global cache toggle
# Tile cache (rendered WMS images)
[cache.tile]
enabled = true
backend = "memory" # "memory" or "redis" (Enterprise only)
max_entries = 10000
max_size_mb = 512
ttl_seconds = 3600 # 1 hour
# Query cache (PostGIS feature results)
[cache.query]
enabled = true
max_entries = 5000
max_size_mb = 256
ttl_seconds = 1800 # 30 minutes
backend = "redis" and configure [cache.redis] with url, prefix ("geovertix:"), and pool_size (10). Also supports Redis Cluster via cluster = true. Community Edition uses in-memory cache only.
REST API
All REST endpoints are under /api/v1/ and require authentication via JWT (Bearer header or auth_token cookie).
auth_token HTTP-only cookie.
Layers API
| Method | Endpoint | Description |
|---|---|---|
GET | /api/v1/layers | List all accessible layers |
GET | /api/v1/layers/:id | Get layer details |
POST | /api/v1/layers | Register a new layer |
PUT | /api/v1/layers/:id | Update layer metadata |
DELETE | /api/v1/layers/:id | Delete a layer |
GET | /api/v1/layers/:id/attributes | List attributes with sample data |
GET | /api/v1/layers/:id/stats | Feature count, bbox, geometry stats |
Example: List Layers
GET /api/v1/layers
// Response
[
{
"id": 1,
"schema_name": "gisdata",
"table_name": "parcels",
"geometry_type": "MultiPolygon",
"srid": 4326,
"style_name": "default",
"is_public": false,
"owner": "admin"
}
]
Styles API
| Method | Endpoint | Description |
|---|---|---|
GET | /api/v1/styles | List all styles |
GET | /api/v1/styles/:name | Get style definition |
POST | /api/v1/styles | Create a new style |
PUT | /api/v1/styles/:name | Update a style |
DELETE | /api/v1/styles/:name | Delete a style |
POST | /api/v1/styles/validate | Validate style + count features per rule |
Import API
| Method | Endpoint | Description |
|---|---|---|
POST | /api/v1/import/upload | Upload a file for import |
GET | /api/v1/import/jobs | List import jobs |
GET | /api/v1/import/jobs/:id | Get job status |
GET | /api/v1/import/jobs/:id/events | SSE progress stream |
POST | /api/v1/import/jobs/:id/select-layers | Select layers from multi-layer file |
Supported Formats
See Supported Import Formats for the full list with details.
System API
| Method | Endpoint | Description |
|---|---|---|
GET | /api/v1/system/health | Detailed health status |
GET | /api/v1/system/ready | Liveness probe |
GET | /api/v1/system/info | Version, build time, git commit |
GET | /api/v1/system/metrics | Prometheus metrics |
POST | /api/v1/system/cache/clear | Clear all caches |
POST | /api/v1/system/reload | Hot-reload configuration |
CLI Commands
| Command | Description | Edition |
|---|---|---|
geovertix install | Interactive setup: prerequisites, DB, admin user, config | All |
geovertix serve | Start the server (daemonizes by default) | All |
geovertix serve --foreground | Start in foreground (for development / systemd) | All |
geovertix stop | Graceful shutdown via SIGTERM | All |
geovertix restart | Stop + serve | All |
geovertix seed -l NAME | Pre-generate tiles for a layer | Enterprise |
geovertix license info | Show license status | Enterprise |
geovertix license verify FILE | Validate a license file | Enterprise |
geovertix license machine-id | Print machine fingerprint | Enterprise |
Seed Options (Enterprise only)
| Flag | Default | Description |
|---|---|---|
-l, --layer | β | Layer name (required) |
--url | http://localhost:3000/wms | WMS base URL |
--min-zoom | 0 | Minimum zoom level |
--max-zoom | 12 | Maximum zoom level |
-c, --concurrency | 4 | Parallel requests |
--bbox | β | Bounding box: minx,miny,maxx,maxy |
# First-time setup
$ ./geovertix install
# Start as daemon (default)
$ ./geovertix serve
Server started (PID 12345)
# Start in foreground (for development)
$ ./geovertix serve --foreground
β Listening on 0.0.0.0:7501
# Graceful stop
$ ./geovertix stop
Server stopped
# Pre-generate tiles (Enterprise only)
$ ./geovertix seed -l parcels --min-zoom 0 --max-zoom 14 -c 8
License Management (Enterprise only)
The license subcommand manages Enterprise license validation. Community Edition does not require a license β running license on Community prints a notice and exits.
geovertix license info
Display the status of the currently configured license. Searches for the license file in order: [license] path in config, $GEOVERTIX_LICENSE env var, then ./license.key in the working directory. Verifies the Ed25519 signature and checks expiration (with a 30-day grace period).
$ ./geovertix license info
License Status: VALID
ID: acme-corp-2026
Licensee: Acme Corporation
Email: admin@acme.com
Plan: enterprise
Issued: 2026-01-15T00:00:00Z
Expires: 2027-01-15T00:00:00Z (336 days remaining)
geovertix license verify <path>
Verify a specific license file (ignores config and environment). Checks the Ed25519 signature in <path>.sig and validates expiration. Exits with code 0 if valid (or within grace period), 1 if invalid or expired.
$ ./geovertix license verify ./new-license.key
License is VALID: Acme Corporation (acme-corp-2026)
geovertix license machine-id
Print this machine's fingerprint (SHA-256 hash). On Linux, reads /etc/machine-id; on macOS, reads the IOPlatformUUID. Can be overridden with $GEOVERTIX_MACHINE_ID for containers. Provide this value to your license administrator when registering an instance.
$ ./geovertix license machine-id
Machine ID: a1b2c3d4e5f6... (64-char hex)
Platform: linux (/etc/machine-id)
Provide this value to your license administrator.
-v /etc/machine-id:/etc/machine-id:ro to get a stable fingerprint across container restarts.
Background Worker
GeoVertix processes CPU-intensive tasks (file imports, tile seeding, data exports) in a background worker. The worker architecture differs by edition:
| Community | Enterprise | |
|---|---|---|
| Architecture | Embedded in geovertix binary | Separate geovertix-worker binary |
| Concurrency | 2 concurrent tasks (fixed) | Configurable via [worker] config |
| Scaling | Single process only | Multiple workers across machines |
Community Edition
The worker starts automatically inside the geovertix process β no separate binary or configuration needed. Limited to 2 concurrent background tasks.
Enterprise Edition β Distributed Workers (Enterprise only)
Enterprise ships a standalone geovertix-worker binary that runs independently from the API server. Multiple workers can run on different machines, all connected to the same PostgreSQL database. Tasks are coordinated via PostgreSQL LISTEN/NOTIFY with atomic claiming (FOR UPDATE SKIP LOCKED) β no external message broker required.
# API server (handles HTTP: WMS, WFS, REST)
./geovertix serve
# Worker on same machine
./geovertix-worker
# Or scale out β run additional workers on other machines
# (all pointing to the same PostgreSQL database)
ssh worker-2 "./geovertix-worker"
ssh worker-3 "./geovertix-worker"
Worker Configuration
# Enterprise only β in config/geovertix.toml
[worker]
max_concurrent_tasks = 4 # Per worker instance (default: 4)
How Clustering Works
- API server receives an import/task request and inserts a row into the
geovertix.taskstable - PostgreSQL sends a
NOTIFY task_readyto all listening workers - The first worker to claim the task wins (
FOR UPDATE SKIP LOCKEDβ no double processing) - Each worker identifies itself with a unique
worker_id(hostname + PID) - Workers send heartbeats every 30s β if a worker dies, its stale tasks are recovered by other workers on startup
CQL Reference
Common Query Language is used for filtering in WMS (CQL_FILTER param), WFS, and style rules.
Comparison Operators
attribute = 'value'
attribute > 100
attribute >= 100
attribute < 100
attribute <= 100
attribute != 'value'
attribute LIKE 'prefix%' # % = any chars, _ = single char
attribute IN ('a', 'b', 'c')
attribute IS NULL
attribute IS NOT NULL
Logical Operators
expr AND expr
expr OR expr
NOT expr
(expr) # grouping
Spatial Predicates
BBOX(minx, miny, maxx, maxy)
BBOX(minx, miny, maxx, maxy, 'EPSG:4326')
INTERSECTS(geometry_wkt)
WITHIN(geometry_wkt)
CONTAINS(geometry_wkt)
CROSSES(geometry_wkt)
Examples
# Simple attribute filter
population > 1000000
# Combined filters
zone = 'residential' AND area_sqm < 500
# Pattern matching
name LIKE 'North%'
# Spatial + attribute
zone = 'commercial' AND BBOX(106.7, -6.3, 106.9, -6.1)
Style Format
GeoVertix uses a JSON-based style format. No SLD or XML required.
Basic Style
{
"rules": [
{
"name": "Default",
"fill": {
"color": "#3b82f6",
"opacity": 0.5
},
"stroke": {
"color": "#1e40af",
"width": 1
}
}
]
}
Rule-Based Classification
{
"rules": [
{
"name": "Residential",
"filter": "zone = 'residential'",
"fill": { "color": "#4ade80" }
},
{
"name": "Commercial",
"filter": "zone = 'commercial'",
"fill": { "color": "#f59e0b" }
},
{
"name": "Industrial",
"filter": "zone = 'industrial'",
"fill": { "color": "#ef4444" }
}
]
}
Zoom-Dependent Styling
{
"rules": [{
"stroke": {
"color": "#0891b2",
"width": {
"stops": [[8, 0.5], [12, 1], [16, 3]]
}
},
"label": {
"field": "name",
"size": { "stops": [[10, 10], [16, 16]] },
"color": "#0f172a",
"halo_color": "#ffffff",
"halo_width": 2,
"min_zoom": 12
}
}]
}
Production Deployment
Directory Structure
/opt/geovertix/
βββ geovertix # Binary
βββ config/
β βββ geovertix.toml # Configuration
βββ .env # JWT_SECRET (auto-generated)
βββ fonts/ # Font files for labels
βββ logs/ # Log files
βββ libs/ # Bundled shared libraries (Linux)
βββ libgdal.so
βββ libgeos.so
βββ libproj.so
βββ ...
Reverse Proxy (nginx)
server {
listen 443 ssl http2;
server_name maps.example.com;
ssl_certificate /etc/ssl/certs/maps.crt;
ssl_certificate_key /etc/ssl/private/maps.key;
location / {
proxy_pass http://127.0.0.1:7501;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Systemd Service
# /etc/systemd/system/geovertix.service
[Unit]
Description=GeoVertix WMS/WFS Server
After=network.target postgresql.service
[Service]
Type=simple
User=geovertix
WorkingDirectory=/opt/geovertix
ExecStart=/opt/geovertix/geovertix serve --foreground
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
# Enable and start
sudo systemctl daemon-reload
sudo systemctl enable geovertix
sudo systemctl start geovertix
# Check status
sudo systemctl status geovertix
# View logs
journalctl -u geovertix -f
Monitoring
Health Checks
# Detailed health (includes DB, GEOS, PROJ status)
GET /api/v1/system/health
# Liveness probe (for load balancers)
GET /api/v1/system/ready
# Version info
GET /api/v1/system/info
Prometheus Metrics
Scrape /api/v1/system/metrics with your Prometheus instance.
# Available metrics include:
geovertix_http_requests_total{service, operation, status}
geovertix_http_request_duration_seconds{service, operation}
geovertix_cache_hits_total{cache_type}
geovertix_cache_misses_total{cache_type}
geovertix_db_pool_connections{state}
geovertix_import_jobs_total{status}
Logging
Control log verbosity with the RUST_LOG environment variable.
# Default (info level)
export RUST_LOG=info
# Debug WMS rendering
export RUST_LOG=geovertix_wms=debug
# Debug everything
export RUST_LOG=debug