A web application for hosting and serving HIFLD (Homeland Infrastructure Foundation-Level Data) datasets with GeoServer for OGC Feature API access.
- Dataset Processing: Download, validate, and convert datasets from Google Cloud Storage
- PMTiles Generation: Create PMTiles for efficient tile serving
- GeoServer Integration: OGC Feature API (WFS) access via GeoServer
- PostgreSQL Backend: GeoServer catalog metadata stored in PostgreSQL for persistence
- Object Storage: SeaweedFS for local object storage
- Web Catalog: Frontend catalog for browsing datasets
- Docker and Docker Compose
- (Optional) Copy
.env.exampleto.envand customize settings
docker compose up -dThis will start:
- PostgreSQL (with PostGIS) - Database for GeoServer catalog
- GeoServer - OGC Feature API server (auto-configured with JDBCConfig)
- SeaweedFS - Object storage (Master, Volume, Filer)
- GeoServer Web UI: http://localhost:8080/geoserver
- Default credentials:
admin/geoserver
- Default credentials:
- SeaweedFS Filer UI: http://localhost:8888
- SeaweedFS S3 API: http://localhost:8333
On first startup, GeoServer will:
- Wait for PostgreSQL to be ready
- Automatically configure JDBCConfig to use PostgreSQL
- Initialize the database with catalog tables
- Import any existing catalog from XML files
All GeoServer metadata (workspaces, stores, layers, styles) will be stored in PostgreSQL and persist across container restarts.
Create a .env file (see .env.example) to customize:
# Database Configuration
POSTGRES_DB=geoserver
POSTGRES_USER=geoserver
POSTGRES_PASSWORD=geoserver
POSTGRES_PORT=5432
# For external database (Cloud SQL, etc.)
# DB_HOST=your-db-host
# DB_PORT=5432
# DB_NAME=geoserver
# DB_USER=geoserver
# DB_PASSWORD=your-password
# GeoServer Configuration
GEOSERVER_PORT=8080
JAVA_OPTS=-Xms512m -Xmx2048m -Djava.awt.headless=true-
Update
.envwith your database connection details:DB_HOST=your-cloud-sql-ip DB_NAME=geoserver DB_USER=your-user DB_PASSWORD=your-password
-
Start services (PostgreSQL service will be skipped if not needed):
docker compose up -d geoserver seaweedfs-master seaweedfs-volume seaweedfs-filerGeoServer will automatically configure JDBCConfig to use your external database.
.
├── docker-compose.yaml # Service definitions
├── geoserver/ # GeoServer Docker image
│ ├── 2.28.0.dockerfile # GeoServer Dockerfile
│ ├── docker-entrypoint.sh # Auto-configuration script
│ └── binaries/ # GeoServer binaries and plugins
├── upload-processor/ # Dataset processing pipeline
├── webapp/ # Frontend catalog application
└── inventory.csv # Dataset inventory
- Port: 8080
- Catalog Backend: PostgreSQL (via JDBCConfig)
- Plugins: PMTiles Store, GeoParquet, JDBCConfig
- Data Directory:
/var/local/geoserver(persisted in Docker volume)
- Port: 5432
- Database:
geoserver(default) - Extensions: PostGIS
- Purpose: Stores GeoServer catalog metadata
- Master: Port 9333
- Volume: Port 8081
- Filer UI: Port 8888
- S3 API: Port 8333
- Purpose: Object storage for datasets and PMTiles
The upload-processor directory contains code for:
- Downloading datasets from Google Cloud Storage (
gs://URLs) - Validating datasets
- Creating PMTiles
- Uploading to storage
See upload-processor/README.md for details.
docker compose build geoserver
docker compose up -d geoserver# All services
docker compose logs -f
# Specific service
docker compose logs -f geoserver
docker compose logs -f geoserver-postgresCheck that GeoServer is using PostgreSQL:
docker exec hifld-geoserver-postgres psql -U geoserver -d geoserver -c "SELECT COUNT(*) FROM object;"You should see catalog objects stored in the database.
# Stop and remove containers
docker compose down
# Remove volumes (WARNING: deletes all data)
docker compose down -v
# Start fresh
docker compose up -d- GeoServer JDBCConfig Setup - Detailed JDBCConfig configuration guide
- GeoServer Database Setup - Database connection guide
- Check logs:
docker compose logs geoserver - Verify PostgreSQL is healthy:
docker compose ps - Check JDBCConfig properties:
docker exec hifld-geoserver cat /usr/share/geoserver/webapps/geoserver/data/jdbcconfig/jdbcconfig.properties
- Verify PostgreSQL is accessible:
docker exec hifld-geoserver-postgres psql -U geoserver -d geoserver -c "SELECT 1;" - Check network connectivity:
docker exec hifld-geoserver ping -c 2 geoserver-postgres - Review connection parameters in
.envfile
- Check that JDBCConfig extension is installed:
docker exec hifld-geoserver ls /usr/share/geoserver/webapps/geoserver/WEB-INF/lib/ | grep jdbcconfig - Verify properties file exists and
enabled=true:docker exec hifld-geoserver cat /usr/share/geoserver/webapps/geoserver/data/jdbcconfig/jdbcconfig.properties - Check GeoServer logs for JDBCConfig messages
Copyright (C) 2026 Public Environmental Data Partners (PEDP) This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, version 3.0.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the LICENSE file for details.