Skip to content

Publish GeoZarr to S3 and display it on Kubernetes

The development-platform deployment runs SeaweedFS, TiTiler-EOPF 0.12.2, a stac-fastapi-geoparquet API and the HTML client alongside the PDE editor. It uses the upstream TiTiler image without the historical local-reader patch.

Producer and stage-out

Use cwl-tests/jobs/producer-job-item.yml: TiTiler resolves STAC Item assets. The producer now points its measurements asset to the complete .zarr store, and its multiscale layout points to dataset groups with a shared base group. Root metadata and all measurement overviews are available to the reader.

task containers:build:stage-out
task cwl:wrap:producer
# An explicit job supplies the normal producer inputs plus the stage-out inputs.
task cwl:run:producer:s3 JOB=/path/to/private-job.yml

The wrapper uses eoap-cwlwrap 0.32.0 and cwl-loader 0.27.0, serializes an explicit CWL v1.2 graph and embeds the necessary schemas. It only stages the final zarr_stac_catalog; intermediate catalogs stay internal. Original source CWL imports remain unchanged. No packing command is used.

The extra inputs are s3_bucket, sub_path, aws_access_key_id, aws_secret_access_key, region_name and endpoint_url. Do not commit private credentials. Set STAGE_OUT_IMAGE when wrapping to select your locally built or published updated mastering image. The historical released stage image does not support recursive Zarr uploads.

The reusable mastering stage-out uploads directories recursively. A subgroup asset causes the entire enclosing Zarr store to be uploaded, including root metadata and sibling overviews. It publishes rewritten STAC documents after asset upload succeeds and preserves the original local catalog. The wrapper returns an S3 catalog URI as zarr_stac_catalog.value.

Development-platform publication

In dev-platform-eoap/zarr-cloud-native-format:

task deploy
task viewer:publish DATA_ROOT=/workspace/zarr-cloud-native-format/runs/my-output
# Local CWL results are staged; an already staged URI is indexed directly.
task viewer:publish RESULTS=/workspace/zarr-cloud-native-format/cwl-tests/results-s3.json
task test:viewer
task viewer

The platform publication task wraps a completed-output workflow and runs its stage-out with the PDE's isolated Calrissian environment. It obtains the image and S3 settings from Kubernetes configuration, then generates a GeoParquet index from the S3-published Items. The index preserves S3 asset URLs and render/time metadata. A portable items.parquet is uploaded beside the catalog in S3; the API queries an atomic local mirror on the shared PVC to avoid requiring DuckDB's own custom-S3 endpoint configuration. No database is deployed.

The API exposes standard collection/item routes. TiTiler resolves an item asset through that API, then reads Zarr arrays directly from SeaweedFS. The client uses /stac/ for metadata and /api/ for TiTiler, both through its same-origin proxy. Its variable resolver handles root variable names such as ndwi.

task test:viewer:fixture creates two local raster dates, runs the actual module writer and GeoZarr validation, executes the wrapped stage-out in a real Kubernetes pod, publishes the index and verifies actual S3-backed tiles and time selection. It switches the active collection to that fixture; publish your learning outputs afterwards. Full remote EO product processing is a separate validation path.