fastgeoapi
Project description
fastgeoapi
A modern, high-performance geospatial API framework that extends pygeoapi with authentication, authorization, and security features using FastAPI, OpenID Connect, and Open Policy Agent (OPA) 🗺️🔒.
Architecture
This diagram gives an overview of the basic architecture:
Features
🔐 Security & Authentication
- OpenID Connect (OIDC) Integration - OAuth2/JWT Bearer token authentication with JWKS support
- API Key Authentication - Flexible API key-based authentication for programmatic access
- Open Policy Agent (OPA) - Policy-based authorization with fine-grained access control
- Multi-scheme Support - Seamlessly switch between authentication methods based on your needs
🚀 Performance & Modern Stack
- FastAPI Framework - High-performance async API built on Starlette and Pydantic
- Async I/O - Non-blocking operations for better scalability
- Modern Python - Python 3.12+ with type hints and modern language features
- Fast Dependency Management - UV-based tooling for lightning-fast installations
🗺️ Geospatial API Standards
- OGC API Compliance - Full support for OGC API - Features, Processes, and more
- OpenAPI Integration - Auto-generated, security-enhanced OpenAPI specifications
- Geospatial Data Access - Seamless access to vector and raster geospatial data
- pygeoapi Extension - Extends vanilla pygeoapi with enterprise-ready security
🛡️ Security Testing & Quality
- Contract Testing - Automated OpenAPI contract validation with Schemathesis
- Security Scanning - OWASP ZAP integration for continuous security testing
- Pre-commit Hooks - Code quality checks with Ruff formatting and linting
- Comprehensive Test Coverage - Full test suite with pytest and coverage reporting
Requirements
- pygeoapi
- fastapi-opa
- An OpenID Connect provider (Keycloak, WSO2, etc)
- Open Policy Agent (OPA)
Installation
You can install fastgeoapi via pip from PyPI:
pip install fastgeoapi
Development
Prerequisites
Install UV - a fast Python package installer and resolver:
macOS / Linux:
curl -sSf https://install.ultraviolet.dev | sh
Windows (PowerShell):
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
Setup
After cloning the repository, use UV to install dependencies:
git clone https://github.com/geobeyond/fastgeoapi.git
cd fastgeoapi
uv sync
This automatically:
- Creates a virtual environment in
.venv - Installs all required dependencies including git-based packages from
[tool.uv.sources](pygeoapi master, pygeofilter, fencer) - Sets up fastgeoapi in development mode
Note: For development, UV uses git-based dependencies defined in
[tool.uv.sources]to get the latest features from upstream projects. The PyPI release uses stable published versions. See uv.md for more details.
Activate the Virtual Environment
macOS / Linux:
source .venv/bin/activate
Windows (PowerShell):
.venv\Scripts\Activate.ps1
Running fastgeoapi
Once Keycloak and OPA have been started, configure the required environment variables:
export PYGEOAPI_CONFIG=pygeoapi-config.yml
export PYGEOAPI_OPENAPI=pygeoapi-openapi.yml
export FASTGEOAPI_CONTEXT='/geoapi'
Start fastgeoapi in development mode:
uv run fastapi run app/main.py --app app --host 0.0.0.0 --port 5000 --reload
Quick Start (Package Installation)
Install fastgeoapi:
pip install fastgeoapi
Create a .env file with the required configuration:
# Environment state: 'dev' or 'prod'
ENV_STATE=dev
# Server configuration
HOST=0.0.0.0
PORT=5000
# Logging (required)
DEV_LOG_PATH=/tmp
DEV_LOG_FILENAME=fastgeoapi.log
DEV_LOG_LEVEL=debug
DEV_LOG_ENQUEUE=true
DEV_LOG_ROTATION=1 days
DEV_LOG_RETENTION=1 months
# Pygeoapi configuration
DEV_PYGEOAPI_BASEURL=http://localhost:5000
DEV_PYGEOAPI_CONFIG=pygeoapi-config.yml
DEV_PYGEOAPI_OPENAPI=pygeoapi-openapi.yml
DEV_FASTGEOAPI_CONTEXT=/geoapi
# Authentication (choose one, all others must be false)
DEV_API_KEY_ENABLED=false
DEV_JWKS_ENABLED=false
DEV_OPA_ENABLED=false
Start the server:
fastgeoapi run
With options:
fastgeoapi run --host 0.0.0.0 --port 5000 --reload
See the Getting Started guide for complete setup instructions including authentication options and examples.
Common UV Commands
# Update dependencies
uv sync --upgrade
# View installed packages
uv pip list
# Install a new package
uv pip install package-name
# Install dev dependencies
uv pip install --group dev
For more details, see uv.md.
Release Workflow
This project uses a branching strategy with automated releases:
| Branch | Target | Description |
|---|---|---|
develop |
TestPyPI | Development releases with .dev suffix |
main |
PyPI | Production releases when version is bumped |
Development Releases
Push to develop branch triggers automatic publishing to TestPyPI:
git checkout develop
# Make changes
git commit -m "feat: add new feature"
git push origin develop
The workflow automatically creates a dev version (e.g., 0.0.4.dev.1733912345) and publishes to TestPyPI.
Production Releases
To create a production release on PyPI:
- Update the version in
pyproject.toml - Merge to
mainbranch - The workflow detects the version change, creates a git tag, and publishes to PyPI
# Update version in pyproject.toml to e.g., 0.0.4
git checkout main
git merge develop
git push origin main
Both workflows use Trusted Publisher (OIDC) for secure, tokenless authentication with PyPI/TestPyPI.
Usage
Please see the Command-line Reference for details.
Please have a look at the docker-compose.yml file under scripts/iam to start the stack with Keycloak and Open Policy Agent locally. There is a README.md file that explains how to use it.
The file scripts/iam/keycloak/realm-export.json can be used to import an already configured realm into Keycloak.
The files under scripts/postman can be used to setup Postman with a configuration that is ready to perform the requests for the whole stack.
Contributing
Contributions are very welcome. To learn more, see the Contributor Guide.
License
Distributed under the terms of the MIT license, fastgeoapi is free and open-source software.
Issues
If you encounter any problems, please file an issue along with a detailed description.
Credits
This project was generated from @cjolowicz's Hypermodern Python Cookiecutter template.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file fastgeoapi-0.0.6.tar.gz.
File metadata
- Download URL: fastgeoapi-0.0.6.tar.gz
- Upload date:
- Size: 21.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a59b7512e3bcadaec2ad7c7677f7aea588feeb8390a713ac4f2669d23f990791
|
|
| MD5 |
ab43c30930aee65ce35fd25803e2fdf7
|
|
| BLAKE2b-256 |
72d38857e5ae2a4da988aab8fd9090baa419073b763324b9c027d9e263861b1d
|
Provenance
The following attestation bundles were made for fastgeoapi-0.0.6.tar.gz:
Publisher:
release.yml on geobeyond/fastgeoapi
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
fastgeoapi-0.0.6.tar.gz -
Subject digest:
a59b7512e3bcadaec2ad7c7677f7aea588feeb8390a713ac4f2669d23f990791 - Sigstore transparency entry: 771832397
- Sigstore integration time:
-
Permalink:
geobeyond/fastgeoapi@499dc611055043b1c015b29793efc645fdea1360 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/geobeyond
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@499dc611055043b1c015b29793efc645fdea1360 -
Trigger Event:
push
-
Statement type:
File details
Details for the file fastgeoapi-0.0.6-py3-none-any.whl.
File metadata
- Download URL: fastgeoapi-0.0.6-py3-none-any.whl
- Upload date:
- Size: 28.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
160fbd3d7c2d90805ee98e3e489135bb1d20d15e3461767acffa61d8cd3cde23
|
|
| MD5 |
9b5f1c5eb0c4d2f1018577d2df933414
|
|
| BLAKE2b-256 |
7e7a13368de66475828550f496ce76695df342516e03330efd9e969f399d07f8
|
Provenance
The following attestation bundles were made for fastgeoapi-0.0.6-py3-none-any.whl:
Publisher:
release.yml on geobeyond/fastgeoapi
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
fastgeoapi-0.0.6-py3-none-any.whl -
Subject digest:
160fbd3d7c2d90805ee98e3e489135bb1d20d15e3461767acffa61d8cd3cde23 - Sigstore transparency entry: 771832400
- Sigstore integration time:
-
Permalink:
geobeyond/fastgeoapi@499dc611055043b1c015b29793efc645fdea1360 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/geobeyond
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@499dc611055043b1c015b29793efc645fdea1360 -
Trigger Event:
push
-
Statement type: