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.pem for 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
PostgreSQL not installed? The installer can install PostgreSQL 16 + PostGIS automatically from PGDG repositories on Debian/Ubuntu and RHEL/Rocky/Alma/Fedora.

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

MinimumRecommended
CPU2 cores4+ cores
RAM2 GB4+ GB
Disk10 GB50+ GB
OSLinux (glibc 2.28+), macOS (ARM64), WSL2

Software Dependencies

ComponentVersionNotes
PostgreSQL14+Required
PostGIS3.3+Required extension
GDAL, GEOS, PROJβ€”Bundled in Linux tarball
Note: On Linux, all spatial libraries (GDAL, GEOS, PROJ) are bundled in the tarball's 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, ...

Import & Convert

Vector

PostgreSQL + PostGIS

Raster

Cloud Optimized GeoTIFF (COG)

Serve

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.

Key principle: GeoVertix does not serve data from its original format. Everything is normalized to PostGIS (vector) or COG (raster) on import. This means consistent performance and behavior regardless of what format you started with.

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.

FormatExtensionsUpload MethodNotes
Shapefile.shpZIPZIP with .shp, .shx, .dbf, .prj; multiple shapefiles per ZIP
GeoPackage.gpkgDirect or ZIPMulti-layer support
GeoJSON.geojson, .jsonDirect or ZIPSingle layer per file
KML.kmlDirect or ZIPMulti-layer support via libkml
KMZ.kmzDirectCompressed KML, auto-extracted by GDAL
GPX.gpxDirect or ZIPTracks, routes, waypoints as separate layers
FlatGeobuf.fgbDirect or ZIPHigh-performance streaming format
Esri File Geodatabase.gdb/ZIPMulti-layer; multiple GDBs per ZIP
MapInfo TAB.tabZIPWith .dat, .map, .id companion files
SpatiaLite.sqlite, .dbDirectSQLite with spatial extension
CSV.csvDirectWith X/Y or WKT geometry columns
GML.gmlDirectGeography Markup Language
GeoParquet.parquetDirectApache Parquet with geometry

Raster Formats

Converted to Cloud Optimized GeoTIFF (COG) on import with DEFLATE compression and overview pyramids.

FormatExtensionsNotes
GeoTIFF.tif, .tiffStandard raster; non-COG files are converted to COG
PNG.pngGeoreferenced PNG (with world file or embedded CRS)
JPEG.jpg, .jpegGeoreferenced JPEG (with world file or embedded CRS)
How it works: Files are opened with GDAL, which auto-detects whether the data is vector or raster and routes to the appropriate import pipeline. ZIP archives are extracted and scanned for recognized vector formats. Non-ZIP files are passed directly to GDAL for format detection.

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
JWT secret: Generated automatically by the 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

SchemaPurposeContents
geovertixMetadatalayers, styles, users, audit_log
gisdataSpatial dataImported 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)
Tip: For production with concurrent WMS/WFS clients, increase 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

OperationDescription
GetCapabilitiesService metadata and layer listing
GetMapRender map image (PNG, WebP, JPEG)
GetFeatureInfoQuery features at a point (JSON, HTML, Text)
GetLegendGraphicZoom-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

OperationDescription
GetCapabilitiesService metadata and type listing
DescribeFeatureTypeSchema introspection (JSON)
GetFeatureQuery features with filtering and pagination
TransactionInsert, 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
Enterprise only β€” Redis backend: Set 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).

Authentication: Include the JWT as a Bearer token in the Authorization header, or let the browser send it automatically via the auth_token HTTP-only cookie.

Layers API

MethodEndpointDescription
GET/api/v1/layersList all accessible layers
GET/api/v1/layers/:idGet layer details
POST/api/v1/layersRegister a new layer
PUT/api/v1/layers/:idUpdate layer metadata
DELETE/api/v1/layers/:idDelete a layer
GET/api/v1/layers/:id/attributesList attributes with sample data
GET/api/v1/layers/:id/statsFeature 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

MethodEndpointDescription
GET/api/v1/stylesList all styles
GET/api/v1/styles/:nameGet style definition
POST/api/v1/stylesCreate a new style
PUT/api/v1/styles/:nameUpdate a style
DELETE/api/v1/styles/:nameDelete a style
POST/api/v1/styles/validateValidate style + count features per rule

Import API

MethodEndpointDescription
POST/api/v1/import/uploadUpload a file for import
GET/api/v1/import/jobsList import jobs
GET/api/v1/import/jobs/:idGet job status
GET/api/v1/import/jobs/:id/eventsSSE progress stream
POST/api/v1/import/jobs/:id/select-layersSelect layers from multi-layer file

Supported Formats

See Supported Import Formats for the full list with details.

Shapefile (.zip)
GeoPackage (.gpkg)
GeoJSON (.geojson)
KML / KMZ
GPX
FlatGeobuf (.fgb)
File GDB (.gdb)
MapInfo TAB
GeoTIFF (.tif)

System API

MethodEndpointDescription
GET/api/v1/system/healthDetailed health status
GET/api/v1/system/readyLiveness probe
GET/api/v1/system/infoVersion, build time, git commit
GET/api/v1/system/metricsPrometheus metrics
POST/api/v1/system/cache/clearClear all caches
POST/api/v1/system/reloadHot-reload configuration

CLI Commands

CommandDescriptionEdition
geovertix installInteractive setup: prerequisites, DB, admin user, configAll
geovertix serveStart the server (daemonizes by default)All
geovertix serve --foregroundStart in foreground (for development / systemd)All
geovertix stopGraceful shutdown via SIGTERMAll
geovertix restartStop + serveAll
geovertix seed -l NAMEPre-generate tiles for a layerEnterprise
geovertix license infoShow license statusEnterprise
geovertix license verify FILEValidate a license fileEnterprise
geovertix license machine-idPrint machine fingerprintEnterprise

Seed Options (Enterprise only)

FlagDefaultDescription
-l, --layerβ€”Layer name (required)
--urlhttp://localhost:3000/wmsWMS base URL
--min-zoom0Minimum zoom level
--max-zoom12Maximum zoom level
-c, --concurrency4Parallel 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.
Container tip: Mount the host's machine ID into your container with -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:

CommunityEnterprise
ArchitectureEmbedded in geovertix binarySeparate geovertix-worker binary
Concurrency2 concurrent tasks (fixed)Configurable via [worker] config
ScalingSingle process onlyMultiple 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

  1. API server receives an import/task request and inserts a row into the geovertix.tasks table
  2. PostgreSQL sends a NOTIFY task_ready to all listening workers
  3. The first worker to claim the task wins (FOR UPDATE SKIP LOCKED β€” no double processing)
  4. Each worker identifies itself with a unique worker_id (hostname + PID)
  5. Workers send heartbeats every 30s β€” if a worker dies, its stale tasks are recovered by other workers on startup
No message broker needed. Task coordination uses PostgreSQL directly β€” the same database you already have. No Redis, RabbitMQ, or other infrastructure required for worker clustering.

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