Deployment¶
The repository evidence covers a Go binary with parent-repository systemd and Apache assets. Docker, Compose, Nginx, native TLS, horizontal scaling, and dedicated health/ready/metrics endpoints are not provided or verified. Configurations for those mechanisms are operator-supplied and must not be represented as supported GeoVault examples.
systemd¶
The checked-in parent unit is ../systemd/geovault.service (also copied under ../systemd/production-current/). It runs:
| Setting | Checked-in value |
|---|---|
| User/group | www-data:www-data |
| Working directory | /opt/geovault |
| Command | /opt/geovault/geovault |
| Environment | optional -/etc/geovault.env |
| Restart | on-failure, after 5 seconds |
| Writable paths | /opt/geovault, /data/projects, /tmp |
| Hardening | NoNewPrivileges=yes, ProtectSystem=full, ProtectHome=yes, PrivateTmp=no |
| Output | systemd journal, identifier geovault |
Install from the federation checkout:
sudo install -d -o www-data -g www-data /opt/geovault /opt/geovault/web /opt/geovault/shared/ui /data/projects
sudo install -o root -g root -m 0755 geovault /opt/geovault/geovault
sudo cp -a web/. /opt/geovault/web/
sudo cp -a ../shared/ui/. /opt/geovault/shared/ui/
sudo install -o root -g root -m 0644 ../systemd/geovault.service /etc/systemd/system/geovault.service
sudo systemctl daemon-reload
sudo systemctl enable --now geovault
Create /etc/geovault.env separately with reviewed placeholders and restrictive permissions. Do not copy the credential-like value in deploy/geovault.env; rotate it if it was ever used. Add any GEOVAULT_VERSIONS_JSON, GEOVAULT_DATA_DIR, FEDERATION_SHARED_UI_ROOT, or QGIS_PROJECTS_ROOT outside the existing allowlist to ReadWritePaths as appropriate. The service also needs GDAL executables on its PATH.
Apache¶
The parent ../apache.conf/000-default-le-ssl.conf verifies a prefix-stripping mapping to 127.0.0.1:8085, excludes /geovault/ from the Central catch-all proxy, and applies:
ProxyPass /geovault/ http://127.0.0.1:8085/
ProxyPassReverse /geovault/ http://127.0.0.1:8085/
ProxyPass /geovault http://127.0.0.1:8085
ProxyPassReverse /geovault http://127.0.0.1:8085
<Location /geovault>
RequestHeader set X-Forwarded-Prefix "/geovault"
RequestHeader set X-Forwarded-Proto "https"
</Location>
For this exact mapping, leave BASE_PATH empty: Apache removes /geovault upstream, while X-Forwarded-Prefix makes generated links external-prefix aware. Setting BASE_PATH=/geovault simultaneously would mount routes at a prefix Apache has already removed. Preserve the host and cookies, route Central /login and /logout, and adapt the parent vhost's environment-specific hostname and certificate paths.
GeoVault has no native TLS and calls http.ListenAndServe(":8085", ...), binding all interfaces rather than loopback only. Terminate TLS at the verified Apache layer, send X-Forwarded-Proto: https, and block direct access to port 8085 with host/network policy.
No GeoVault Nginx asset is checked in. An operator choosing Nginx must independently supply and validate prefix handling, forwarded headers, request-size/time limits, authentication cookies, TLS, and Central routes; this documentation does not claim that configuration is supported.
Storage and external dependencies¶
Persist and permission:
/data/projects, including dataset/folder/version trees;- metadata PostgreSQL, or the selected JSON version catalog;
- CWD-relative
data/metadata(/opt/geovault/data/metadataunder the checked-in unit); /etc/geovault.envand stable encryption keys.
Enabled features may require Central PostgreSQL, metadata PostgreSQL/PostGIS, QGIS Publish Service, TileServer, PostGIS Service, GeoServer, ArcGIS, S3-compatible storage, remote HTTP(S) sources, and browser CDN/basemap access. Validate connectivity from the service account and preserve caller session forwarding where required.
Scaling and jobs¶
Run a single GeoVault process per catalog. Versions are held in process memory and persisted using full-table or whole-JSON replacement; multiple writers can lose updates. Background GeoServer/ESRI work uses in-process goroutines and has no distributed queue or restart recovery. No horizontal-scaling deployment is provided or verified; scale CPU, memory, temporary space, and disk I/O vertically after workload testing.
Logging, monitoring, and health¶
Application logs go to stdout/stderr and therefore the journal under the parent unit. Monitor:
- unit restarts and
journalctl -u geovault; - database availability and migration/reconciliation errors;
- failed or long-running rows in
geoserver_jobs; - capacity/inodes for
/data/projects,/opt/geovault/data, and/tmp; - latency/failure of enabled external services.
There is no /health, /ready, or Prometheus endpoint. systemctl is-active geovault is only a process check. An authenticated request such as /api/discovery is an operator-defined functional probe, not a provided health contract, and can depend on auth/database state.
Backups and hardening¶
Take coordinated, tested backups of Central auth PostgreSQL, metadata PostgreSQL, /data/projects, JSON catalog (when used), data/metadata, configuration, and encryption keys. No built-in backup, restore, retention, or consistency hook is provided. Quiesce writes or use database/filesystem snapshot procedures that produce a consistent set, then test restoration.
For production, keep the environment file secret, require PostgreSQL TLS, restrict outbound destinations and direct port 8085 access, set reverse-proxy body/time limits, patch Go/GDAL dependencies, run as the non-login service user, narrow ReadWritePaths where practical, protect backups, rotate credentials, and monitor disk growth. Review whether the checked-in broad write access to /opt/geovault and PrivateTmp=no is acceptable for the host.