# GeoServer Configuration Elixir Client
This Elixir application provides a convenient way to interact with GeoServer's REST API to manage workspaces, datastores, and coveragestores.
## Prerequisites
- Elixir 1.12+ installed
- Req HTTP client (included in mix.exs dependencies)
- GeoServer instance with REST API enabled
- Valid GeoServer credentials
## Setup
1. Clone the repository
2. Install dependencies:
```bash
mix deps.get
- Set environment variables:
export GEOSERVER_USERNAME="your_username" export GEOSERVER_PASSWORD="your_password" export GEOSERVER_BASE_URL="your_geoserver_base_url"
GeoserverConfig.Workspaces.fetch_workspaces()
GeoserverConfig.Workspaces.create_workspace("new_workspace_name")
GeoserverConfig.Workspaces.update_workspace("old_name", "new_name")
GeoserverConfig.Workspaces.delete_workspace("workspace_to_delete")
GeoserverConfig.Datastores.list_datastores("workspace_name")
GeoserverConfig.Datastores.create_datastore(
"workspace_name",
"datastore_name",
"shapefile",
%{url: "file:///path/to/shapefile_directory"}
)
GeoserverConfig.Datastores.create_datastore(
"workspace_name",
"datastore_name",
"postgis",
%{
host: "localhost",
port: 5432,
database: "db_name",
user: "db_user",
passwd: "db_password"
}
)
GeoserverConfig.Datastores.create_datastore(
"workspace_name",
"datastore_name",
"geopkg",
%{database: "file:///path/to/file.gpkg"}
)
GeoserverConfig.Datastores.update_datastore(
"workspace_name",
"old_datastore_name",
"shapefile", # or "postgis", "geopkg"
%{
description: "New description",
url: "file:///new/path" # or PostGIS/GeoPackage params
}
)
GeoserverConfig.Datastores.delete_datastore(
"workspace_name",
"datastore_name",
true # set to false if you don't want recursive delete
)
GeoserverConfig.Coveragestores.list_coveragestores("workspace_name")
GeoserverConfig.Coveragestores.create_coveragestore(
"workspace_name",
"coveragestore_name",
"file:///path/to/geotiff.tif",
"Optional description"
)
GeoserverConfig.Coveragestores.create_coveragestore(
"workspace_name",
"coveragestore_name",
"cog://https://path.to/your/cog_geotiff_cog.tif",
"Description of your coverage store",
%{
connectionParameters: "",
metadata: %{
"entry" => %{
"@key" => "CogSettings.Key",
"cogSettings" => %{
"useCachingStream" => false,
"rangeReaderSettings" => "HTTP"
}
}
},
disableOnConnFailure: false
}
)
GeoserverConfig.Coveragestores.update_coveragestore(
"workspace_name",
"store_name",
%{
type: "GeoTIFF",
enabled: true,
url: "file:///new/path/to/file.tif",
description: "Updated description"
}
)
GeoserverConfig.Coveragestores.delete_coveragestore(
"workspace_name",
"coveragestore_name"
)
GeoserverConfig.list_coverages("workspace_name", "coveragestore_name")
GeoserverConfig.Coverages.create_coverage(
"workspace_name",
"coveragestore_name",
"coverage_layer_name",
%{
title: "Layer Title",
description: "Layer Description",
abstract: "Abstract info",
srs: "EPSG:3301",
native_crs: "EPSG:3301",
native_bbox: %{minx: ..., maxx: ..., miny: ..., maxy: ...},
latlon_bbox: %{minx: ..., maxx: ..., miny: ..., maxy: ...},
grid: %{
dimension: [width, height],
transform: [scale_x, 0.0, translate_x, 0.0, scale_y, translate_y]
},
metadata: %{
"cacheAgeMax" => 3600,
"cachingEnabled" => true
}
},
"file:///path/to/geotiff.tif"
)
GeoserverConfig.delete_coverage("workspace_name", "coveragestore_name", "coverage_layer_name", "true")
GeoserverConfig.list_styles()
GeoserverConfig.list_styles_workspace_specific("workspace_name")
GeoserverConfig.Styles.create_style(%{
name: "style_name",
sld_content: "<StyledLayerDescriptor>...</StyledLayerDescriptor>",
filename: "style.sld",
# Optional: workspace: "workspace_name"
})
GeoserverConfig.Styles.update_style(%{
name: "style_name",
sld_content: "<UpdatedSLD>...</UpdatedSLD>",
filename: "updated_style.sld",
workspace: "workspace_name"
})
GeoserverConfig.delete_style("style_name", "workspace_name", recurse: true)
GeoserverConfig.assign_style_to_layer(
"workspace_name",
"layer_name",
"style_name",
"workspace_name" # style workspace if applicable
)
All functions return either:
- Success tuple
{:ok, message}
for 200/201 responses - Error tuple
{:error, reason}
for failures
You can pattern match on these responses to handle success/failure cases.
The application uses the following environment variables:
GEOSERVER_USERNAME
: Your GeoServer usernameGEOSERVER_PASSWORD
: Your GeoServer passwordGEOSERVER_BASE_URL
: Base URL of your GeoServer instance
- For file paths, use
file://
prefix for GeoServer compatibility - When deleting resources, set
recurse=true
to delete all dependent resources - Coverage layer creation requires detailed bounding box and CRS info
- Supports both local and cloud-based COG files (cog:// scheme)
- Compatible with styles scoped globally or per workspace
This README provides:
1. Clear setup instructions
2. Comprehensive usage examples for all CRUD operations
3. Error handling information
4. Configuration details
5. Notes about important considerations