ZOO-Project 2.1.0
Overview
ZOO-Project is the OSGeo OGC Web Processing Service (WPS) and OGC API - Processes server. The ZOO-Kernel C server runs geospatial processing services and exposes them over the open OGC standards. Any client can then submit a processing request over HTTP and retrieve the result.
This guide covers the deployment and use of ZOO-Project 2.1.0 on Ubuntu 24.04 on Azure, using SecureAnyCloud Azure Marketplace images. The image compiles ZOO-Kernel 2.1.0 from a pinned upstream release with FastCGI, Python, and the GDAL / GEOS / PROJ geospatial libraries. It serves ZOO-Kernel behind nginx on port 80 through an always-on fcgiwrap FastCGI gateway. No external database is required for the base WPS.
What you get:
- ZOO-Project 2.1.0 (ZOO-Kernel, compiled from the pinned upstream
rel-2.1.0source). - Both interfaces served on port 80: classic OGC WPS 1.0.0 / 2.0.0 at
/cgi-bin/zoo_loader.cgiand OGC API - Processes at/ogc-api/. - Safe built-in demonstration services, so the server does real geospatial work the moment it boots. They are a Python HelloPy service, the OGR/GEOS vector operations (Buffer, Centroid, ConvexHull, Intersection, Union, Simplify, Distance, GetArea, and more), OGR Ogr2Ogr, and the GDAL raster tools.
- GDAL, GEOS and PROJ geospatial libraries, with the OGR/GEOS vector-processing services and GDAL raster services.
zoo-fcgiwrap.service(FastCGI gateway, runs aswww-data) andnginx.service, both starting automatically on boot.zoo-project-firstboot.service, a systemd oneshot that resolves the VM public IP and writes endpoint info on first customer boot.- An unauthenticated
/healthzendpoint for load-balancer probes. - An Ubuntu 24.04 LTS base with the latest security patches applied at build time.
- The Azure Linux Agent for cloud integration and SSH key injection.
- 24/7 SecureAnyCloud support with a guaranteed 24 hour response SLA.
Prerequisites
- An active Azure subscription.
- A subscription to the ZOO-Project 2.1.0 on Ubuntu 24.04 listing on Azure Marketplace.
- An SSH public key for VM authentication.
- A virtual network and subnet in the target region.
Recommended virtual machine size: Standard_B2s (2 vCPU, 4 GB RAM) for evaluation and light processing workloads. Scale up for larger geometries, raster operations, or higher request concurrency.
A note on security: the base ZOO-Project WPS server is a public processing API with no login. This matches upstream, and the SecureAnyCloud image never invents a credential. Only the fixed, safe built-in demo services are enabled, and the arbitrary process-deployment (Deploy/Replace/Undeploy) endpoints are deliberately excluded.
Restrict inbound access to port 80 with a network security group, so that only your client networks can reach the processing endpoints.
Deploy from the Azure Portal
In the Azure Portal, open Marketplace, search for ZOO-Project, select the SecureAnyCloud publisher entry, and click Create.
On the Networking tab, attach a network security group that allows inbound TCP 22 from your management IP range and TCP 80 from your client networks (the WPS and OGC API endpoints). Click Review + create, wait for validation, then click Create. Deployment takes around two minutes.
Deploy from the Azure CLI
# Accept the Marketplace terms once per subscription (required before the first CLI deploy)
az vm image terms accept --urn sac1647283583153:zoo-project-ubuntu-24-04:default:latest
az vm create \
--resource-group my-geo-rg \
--name zoo-project \
--image sac1647283583153:zoo-project-ubuntu-24-04:default:latest \
--size Standard_B2s \
--admin-username azureuser \
--generate-ssh-keys \
--public-ip-sku Standard
# Open port 80 to your client network:
az vm open-port --resource-group my-geo-rg --name zoo-project --port 80 --priority 900Confirm the service is healthy
SSH in as azureuser. Confirm that the FastCGI gateway and nginx are both active and that the health endpoint responds:
systemctl is-active nginx zoo-fcgiwrap curl -s -o /dev/null -w 'health: HTTP %{http_code}\n' http://localhost/healthzExpected output:
active active health: HTTP 200The per-VM endpoint URLs are recorded at /root/zoo-project-info.txt. They are resolved to this VM's public IP on first boot.
WPS GetCapabilities
Ask the server which processing services it offers, using the classic OGC WPS 1.0.0 interface.
curl -s "http://localhost/cgi-bin/zoo_loader.cgi?service=WPS&version=1.0.0&request=GetCapabilities" -o /tmp/wps-capabilities.xml head -8 /tmp/wps-capabilities.xmlThe response is a wps:Capabilities XML document. This command lists the advertised process identifiers:
curl -s "http://localhost/cgi-bin/zoo_loader.cgi?service=WPS&version=1.0.0&request=GetCapabilities" \
| grep -oE '<ows:Identifier>[^<]+' | sed 's/<ows:Identifier>/ - /'Execute a process
HelloPy is the simplest process. It is a Python service that takes a literal string input and returns a welcome message, and it proves the Execute pipeline end to end:
curl -s "http://localhost/cgi-bin/zoo_loader.cgi?service=WPS&version=1.0.0&request=Execute&Identifier=HelloPy&DataInputs=a=sac&RawDataOutput=Result"Expected output:
Hello sac from Python World !Buffer is a real geospatial process built on GDAL and GEOS. Give it a GeoJSON polygon and a buffer distance, and it returns the buffered geometry as GML. In this example, a 10 by 10 square is buffered outward by 1 unit. Note the resulting bounding box, -1,-1 to 11,11:
curl -s -G "http://localhost/cgi-bin/zoo_loader.cgi" \
--data-urlencode 'service=WPS' \
--data-urlencode 'version=1.0.0' \
--data-urlencode 'request=Execute' \
--data-urlencode 'Identifier=Buffer' \
--data-urlencode 'DataInputs=InputPolygon={"type":"Polygon","coordinates":[[[0,0],[0,10],[10,10],[10,0],[0,0]]]}@mimeType=application/json;BufferDistance=1' \
--data-urlencode 'RawDataOutput=Result' -o /tmp/buffer-result.gml head -12 /tmp/buffer-result.gmlOGC API - Processes (JSON REST)
ZOO-Project also serves the modern OGC API - Processes interface at /ogc-api/. This command lists the processes collection as JSON:
curl -s http://localhost/ogc-api/processes \
| python3 -c 'import sys,json; d=json.load(sys.stdin); print("numberTotal:", d["numberTotal"]); [print(" -", p["id"]) for p in d["processes"][:12]]'This command retrieves a single process description:
curl -s http://localhost/ogc-api/processes/Buffer \
| python3 -c 'import sys,json; d=json.load(sys.stdin); print(d["id"], "-", d["title"])'The OGC API landing document (http://localhost/ogc-api/) links the conformance, processes and jobs resources. Each process is also available as HTML at /ogc-api/processes/<id>.html.
Configuration and customization
- Server configuration:
/usr/lib/cgi-bin/main.cfgis the ZOO-Kernel main configuration (server metadata, temp paths, GDAL/PROJ environment). On first boot, the advertised server host is set to this VM's public IP. - Services directory:
/usr/lib/cgi-bin/. Each process is a.zcfgdescriptor plus its service implementation (.zoshared object for the compiled OGR/GDAL services,.pyfor Python services). Add your own services here by dropping in a.zcfgand its implementation. - FastCGI gateway:
zoo-fcgiwrap.servicerunsfcgiwrapaswww-dataonunix:/run/zoo-project/fcgiwrap.sock, and nginx proxies to it. After changing services, restart withsudo systemctl restart zoo-fcgiwrap nginx. - Web server:
/etc/nginx/sites-available/zoo-projectroutes/cgi-bin/,/ogc-api/,/healthzand the static landing page.
Support
SecureAnyCloud images come with 24/7 support and a guaranteed 24 hour response SLA. Contact sales@secureanycloud.com for assistance. For ZOO-Project itself, see the upstream documentation at zoo-project.org.
Deploy on Azure
Launch ZOO-Project 2.1.0 on Ubuntu 24.04 LTS on Azure with 24/7 support from SecureAnyCloud.
View this image
Need Help?
Our support team is available 24/7.
sales@secureanycloud.com