Skip to content

Troubleshooting

Logs and first checks

Foreground logs go to stdout/stderr; the parent systemd unit sends both to the journal. GeoServer/ESRI job details are in geoserver_jobs.error_message and log_text. Apache uses its configured access and error logs.

systemctl status geovault
journalctl -u geovault -b -e --no-pager
ss -ltnp | grep 8085
sudo -u www-data sh -c 'command -v ogrinfo ogr2ogr gdalinfo gdal_translate gdalwarp'
curl -i http://127.0.0.1:8085/api/discovery

An unauthenticated API response is not a health contract. GeoVault provides no health, readiness, or metrics endpoint.

Startup and installation errors

Symptom or log Check
Build cannot resolve module shared Build inside the federation tree; ../shared must exist because of the local replace directive.
database: ... check DATABASE_URL A non-empty metadata DSN is malformed/unreachable, PostgreSQL rejected it, or migrations lack CREATE. Remove DATABASE_URL only when JSON metadata mode is intentional.
auth: ... set GEOVAULT_AUTH_DATABASE_URL... None of GEOVAULT_AUTH_DATABASE_URLCENTRAL_DATABASE_URLDATABASE_URL selected a reachable Central auth database.
Fatal template parse Install all of web/; templates try CWD and then the executable directory.
/shared/ui/* returns 404 Install shared UI assets or set FEDERATION_SHARED_UI_ROOT; check its exact search precedence in configuration docs.
Static files 404 while templates work The static file server uses CWD-relative ./web; verify systemd WorkingDirectory=/opt/geovault.
Unit cannot execute or write Check binary mode/architecture, www-data ownership, /data/projects, /opt/geovault/data, JSON path, temporary directory, and systemd ReadWritePaths.
Port already in use :8085 is fixed. GEOVAULT_LISTEN is unused and cannot move the listener.

Authentication and authorization

Symptom Likely cause
Browser redirects to /login Missing, expired, or invalid acugis_session; Central login route unavailable.
API 401 No valid session cookie. Shared auth can parse Bearer PATs, but GeoVault's auth provider does not supply a token store, so PAT authentication is unsupported here.
Login loop or cookie not sent Wrong host/domain, HTTP instead of HTTPS, inconsistent ACUGIS_SESSION_COOKIE_DOMAIN, or proxy cookie/path handling. Prefer host-only cookies unless cross-subdomain sharing is required.
403 permission page User groups lack the required geovault service view, edit, or admin ACL.
Dataset 403 permission required User groups lack the requested geovault_dataset permission.
503 authentication unavailable Central auth database query/connectivity failure.

Confirm Central works on the same external origin, Apache routes /login and /logout, and X-Forwarded-Proto is exactly https.

Database and catalog errors

Symptom Check
sslmode=prefer mapped to sslmode=disable This is source behavior. Use sslmode=require or stronger when TLS is mandatory.
libpq string is missing dbname= Quote a keyword DSN containing spaces in the systemd environment file, or use a no-space PostgreSQL URI.
Migration/FK errors Metadata DB needs schema privileges and compatible Central tables such as dashboard_users.
dataset registry requires DATABASE_URL The feature needs metadata PostgreSQL; JSON mode supports only the versions catalog.
Catalog starts empty Verify DATABASE_URL selection or the JSON path precedence and service read permission.
JSON save/rename failure Verify parent-directory write permission, free space, and that only one GeoVault process writes the catalog.
Lost or inconsistent versions Multiple processes can race whole-table/whole-file replacement; stop extra writers and restore a consistent backup.

Never paste DSNs or /etc/geovault.env into tickets. The tracked deploy draft contains a credential-like sample; rotate it if it has ever been used.

GDAL, storage, and imports

Symptom Check
executable file not found All five GDAL/OGR commands must be on the systemd service PATH, not only the interactive shell's path.
Metadata/preview/transform failure Run the reported ogrinfo, gdalinfo, ogr2ogr, gdal_translate, or gdalwarp operation as www-data; inspect format drivers and file permissions.
Upload/import permission denied Dataset storage is hard-coded below /data/projects; GEOVAULT_DATA_DIR does not relocate it.
URL/S3 import stops near 500 MiB Adjust GEOVAULT_IMPORT_MAX_BYTES and operator-supplied proxy limits; the default is 524288000 bytes.
URL import times out GEOVAULT_IMPORT_HTTP_TIMEOUT defaults to 15m; also inspect DNS, firewall, certificates, and remote response.
Temporary-space exhaustion Imports, extraction, clips, and GDAL use the OS temporary area; monitor /tmp under the parent unit.
Browser map or styling is blank Check browser CSP/network access to cdnjs, unpkg, Google Fonts, and CARTO, or vendor the assets.

Proxy and publication failures

Symptom Check
Apache 502 Unit is down, port 8085 is blocked locally, or upstream mapping is wrong.
/geovault works but links/assets 404 With the checked-in prefix-stripping Apache mapping, leave BASE_PATH empty and set X-Forwarded-Prefix: /geovault.
Direct and proxied routes disagree Do not combine a stripped upstream prefix with BASE_PATH=/geovault; verify the actual path Apache sends upstream.
Mixed-content/Secure-cookie issue Terminate TLS at Apache and send X-Forwarded-Proto: https; GeoVault has no native TLS.
Raster publish fails Set and reach QGIS_PUBLISH_URL; verify forwarded caller authentication and QGIS service logs.
Project history fails while publish works Check QGIS_PUBLISH_BASE_URL or its derivation from QGIS_PUBLISH_URL.
Vector publish fails Check TILESERVER_REGISTER_URL; its empty default is http://localhost:8081/register.
PostGIS Service calls fail Check POSTGIS_SERVICE_URL, metadata tables, network access, and matching POSTGIS_SECRETS_KEY.
GeoServer private URL rejected Only literal RFC1918 IPv4 is enabled by GEOVAULT_GEOSERVER_ALLOW_PRIVATE=1, true, or yes; link-local/metadata targets remain blocked.
GeoServer password decrypts incorrectly Restore the original valid key. Missing/invalid keys make new passwords use plain: storage.
Job remains running after restart Jobs run in-process and have no recovery worker or resume API; investigate, mark/clean up under an operator procedure, then resubmit.
SELECT id, job_type, status, error_message, updated_at
FROM geoserver_jobs
ORDER BY id DESC
LIMIT 20;

Docker/Compose, Nginx, native TLS, scaling, and health-check configurations are not provided or verified. Diagnose any operator-supplied configuration against its own runtime and proxy logs.