Deployment guide

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.0 source).
  • Both interfaces served on port 80: classic OGC WPS 1.0.0 / 2.0.0 at /cgi-bin/zoo_loader.cgi and 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 as www-data) and nginx.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 /healthz endpoint 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.

1

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.

2

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 900
3

Confirm 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/healthz

Expected output:

active active health: HTTP 200

The per-VM endpoint URLs are recorded at /root/zoo-project-info.txt. They are resolved to this VM's public IP on first boot.

4

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.xml

The 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>/ - /'
5

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.gml
6

OGC 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.

7

Configuration and customization

  • Server configuration: /usr/lib/cgi-bin/main.cfg is 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 .zcfg descriptor plus its service implementation (.zo shared object for the compiled OGR/GDAL services, .py for Python services). Add your own services here by dropping in a .zcfg and its implementation.
  • FastCGI gateway: zoo-fcgiwrap.service runs fcgiwrap as www-data on unix:/run/zoo-project/fcgiwrap.sock, and nginx proxies to it. After changing services, restart with sudo systemctl restart zoo-fcgiwrap nginx.
  • Web server: /etc/nginx/sites-available/zoo-project routes /cgi-bin/, /ogc-api/, /healthz and 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

Deploy on Azure