From e77f5068fdc792c44072a8280850a3c946b20065 Mon Sep 17 00:00:00 2001 From: Emmanuel Mathot Date: Wed, 30 Apr 2025 14:52:05 +0200 Subject: [PATCH 1/6] Update version to 0.7.0 and set appVersion to 5.0.2 in Chart.yaml --- CHANGELOG.md | 27 +++++++++++++++------------ helm-chart/eoapi/Chart.yaml | 5 +++-- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5605d647..880f62aa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,24 +5,27 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [Unreleased] +## [v0.7.0] - 2025-04-30 -### Added +### Breaking Changes +- New unified ingress configuration requires migration from previous ingress setup [#219](https://github.com/developmentseed/eoapi-k8s/pull/219) +- Refactored PostgreSQL configuration with removal of deprecated database setup [#215](https://github.com/developmentseed/eoapi-k8s/pull/215) +- Major architectural changes with service-specific templates [#220](https://github.com/developmentseed/eoapi-k8s/pull/220) +### Added +- STAC Browser integration [#168](https://github.com/developmentseed/eoapi-k8s/pull/168) +- Azure secret vault integration for pg-stac secrets [#187](https://github.com/developmentseed/eoapi-k8s/pull/187) +- Support for both NGINX and Traefik ingress controllers [#219](https://github.com/developmentseed/eoapi-k8s/pull/219) +- ArtifactHub.io Integration [#216](https://github.com/developmentseed/eoapi-k8s/pull/216) ### Changed - -* Refactor pgstacbootstrap job and ConfigMaps to use Helm hooks for execution order [#207](https://github.com/developmentseed/eoapi-k8s/pull/207) -* Simplify PgSTAC Bootstrap Process [#208](https://github.com/developmentseed/eoapi-k8s/pull/208) -* Upgrade stac-fastapi-pgstac to v5.0.2 [#204](https://github.com/developmentseed/eoapi-k8s/pull/204) - -### Deprecated - -### Removed +- Refactor pgstacbootstrap job and ConfigMaps to use Helm hooks for execution order [#207](https://github.com/developmentseed/eoapi-k8s/pull/207) +- Simplify PgSTAC Bootstrap Process [#208](https://github.com/developmentseed/eoapi-k8s/pull/208) +- Upgrade stac-fastapi-pgstac to v5.0.2 [#204](https://github.com/developmentseed/eoapi-k8s/pull/204) +- Refactor Helm Chart to Service-Specific Templates [#220](https://github.com/developmentseed/eoapi-k8s/pull/220) ### Fixed - -### Security +- Add ArtifactHub.io Integration (Issue #16) [#216](https://github.com/developmentseed/eoapi-k8s/pull/216) ## [v0.6.0] - 2025-04-03 diff --git a/helm-chart/eoapi/Chart.yaml b/helm-chart/eoapi/Chart.yaml index bf544c42..53fb4a68 100644 --- a/helm-chart/eoapi/Chart.yaml +++ b/helm-chart/eoapi/Chart.yaml @@ -35,13 +35,14 @@ annotations: # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. # Versions are expected to follow Semantic Versioning (https://semver.org/) -version: "0.6.0" +version: "0.7.0" # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. Versions are not expected to # follow Semantic Versioning. They should reflect the version the application is using. # It is recommended to use it with quotes. -appVersion: "0.6.0" +# We use the stac-fastapi-pgstac version as the app version +appVersion: "5.0.2" dependencies: - name: postgrescluster From 22b97c5955c404769aebadf1ffe667ffea00c649 Mon Sep 17 00:00:00 2001 From: Emmanuel Mathot Date: Wed, 30 Apr 2025 15:03:09 +0200 Subject: [PATCH 2/6] Enhance values.schema.json with additional properties for service account, ingress, PostgreSQL, and STAC browser configurations --- helm-chart/eoapi/values.schema.json | 436 +++++++++++++++++++++++++++- 1 file changed, 425 insertions(+), 11 deletions(-) diff --git a/helm-chart/eoapi/values.schema.json b/helm-chart/eoapi/values.schema.json index dafc6c46..7d7f7a71 100644 --- a/helm-chart/eoapi/values.schema.json +++ b/helm-chart/eoapi/values.schema.json @@ -6,33 +6,447 @@ "gitSha" ], "properties": { + "gitSha": { + "type": "string", + "description": "Git SHA of the deployment" + }, + "testing": { + "type": "boolean", + "description": "Only used in CI for running parallel helm installs", + "default": false + }, + "serviceAccount": { + "type": "object", + "properties": { + "create": { + "type": "boolean", + "default": true, + "description": "Whether to create a service account" + }, + "name": { + "type": "string", + "description": "Service account name. If not set and create is true, a name is generated" + }, + "automount": { + "type": "boolean", + "default": true, + "description": "Automatically mount service account token" + }, + "annotations": { + "type": "object", + "description": "Annotations to add to the service account" + }, + "labels": { + "type": "object", + "description": "Labels to add to the service account" + } + } + }, "service": { "type": "object", - "required": [ - "port" - ], + "required": ["port"], "properties": { "port": { "type": "integer", - "pattern": "^[0-9]{4}$" + "description": "Service port number" } } }, "ingress": { "type": "object", - "required": [ - "className" - ], "properties": { + "enabled": { + "type": "boolean", + "default": true, + "description": "Enable ingress" + }, "className": { "type": "string", - "pattern": "^(nginx|traefik|testing123)$" + "enum": ["nginx", "traefik"], + "description": "Ingress controller class name" + }, + "pathType": { + "type": "string", + "enum": ["Prefix", "ImplementationSpecific"], + "description": "Ingress path type" + }, + "pathSuffix": { + "type": "string", + "description": "Suffix to add to service paths" + }, + "rootPath": { + "type": "string", + "description": "Root path for doc server" + }, + "host": { + "type": "string", + "description": "Ingress host" + }, + "annotations": { + "type": "object", + "description": "Additional annotations for ingress" + }, + "tls": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "description": "Enable TLS" + }, + "secretName": { + "type": "string", + "description": "TLS secret name" + }, + "certManager": { + "type": "boolean", + "description": "Use cert-manager for TLS" + }, + "certManagerIssuer": { + "type": "string", + "description": "cert-manager issuer to use" + }, + "certManagerEmail": { + "type": "string", + "description": "Email address for cert-manager" + } + } } } }, - "gitSha": { - "type": "string", - "pattern": "^.+$" + "postgresql": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": ["postgrescluster", "external-plaintext", "external-secret"], + "description": "PostgreSQL deployment type", + "default": "postgrescluster" + }, + "external": { + "type": "object", + "properties": { + "host": { + "type": "string", + "description": "External PostgreSQL host" + }, + "port": { + "type": "string", + "description": "External PostgreSQL port" + }, + "database": { + "type": "string", + "description": "External PostgreSQL database name" + }, + "credentials": { + "type": "object", + "properties": { + "username": { + "type": "string", + "description": "External PostgreSQL username" + }, + "password": { + "type": "string", + "description": "External PostgreSQL password" + } + } + }, + "existingSecret": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of existing secret" + }, + "keys": { + "type": "object", + "properties": { + "username": { + "type": "string", + "description": "Username key in secret" + }, + "password": { + "type": "string", + "description": "Password key in secret" + }, + "host": { + "type": "string", + "description": "Host key in secret" + }, + "port": { + "type": "string", + "description": "Port key in secret" + }, + "database": { + "type": "string", + "description": "Database key in secret" + } + } + } + } + } + } + } + } + }, + "postgrescluster": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "default": true, + "description": "Enable PostgreSQL cluster" + }, + "postgresVersion": { + "type": "integer", + "description": "PostgreSQL version" + }, + "postGISVersion": { + "type": "string", + "description": "PostGIS version" + }, + "pgBouncerReplicas": { + "type": "integer", + "description": "Number of PgBouncer replicas" + }, + "monitoring": { + "type": "boolean", + "description": "Enable monitoring" + }, + "patroni": { + "type": "object", + "description": "Patroni configuration" + }, + "databaseInitSQL": { + "type": "object", + "description": "Database initialization SQL" + }, + "instances": { + "type": "array", + "description": "PostgreSQL instances configuration" + }, + "users": { + "type": "array", + "description": "PostgreSQL users configuration" + } + } + }, + "pgstacBootstrap": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "default": true, + "description": "Enable PgSTAC bootstrap" + }, + "image": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "PgSTAC bootstrap image name" + }, + "tag": { + "type": "string", + "description": "PgSTAC bootstrap image tag" + } + } + }, + "settings": { + "type": "object", + "properties": { + "loadSamples": { + "type": "boolean", + "description": "Load sample data" + }, + "user": { + "type": "string", + "description": "Database user" + }, + "database": { + "type": "string", + "description": "Database name" + }, + "resources": { + "type": "object", + "description": "Resource requirements" + } + } + } + } + }, + "apiServices": { + "type": "array", + "items": { + "type": "string", + "enum": ["raster", "multidim", "stac", "vector"] + }, + "description": "List of API services to enable" + }, + "raster": { + "$ref": "#/definitions/apiService" + }, + "multidim": { + "$ref": "#/definitions/apiService" + }, + "stac": { + "$ref": "#/definitions/apiService" + }, + "vector": { + "$ref": "#/definitions/apiService" + }, + "browser": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "default": true, + "description": "Enable STAC browser" + }, + "replicaCount": { + "type": "integer", + "description": "Number of replicas" + }, + "image": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Image name" + }, + "tag": { + "type": "string", + "description": "Image tag" + } + } + }, + "ingress": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "description": "Enable ingress for browser" + } + } + } + } + }, + "docServer": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "default": true, + "description": "Enable documentation server" + } + } + } + }, + "definitions": { + "apiService": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "description": "Enable the service" + }, + "ingress": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "description": "Enable ingress for this service" + } + } + }, + "autoscaling": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "description": "Enable autoscaling" + }, + "minReplicas": { + "type": "integer", + "description": "Minimum number of replicas" + }, + "maxReplicas": { + "type": "integer", + "description": "Maximum number of replicas" + }, + "type": { + "type": "string", + "enum": ["cpu", "requestRate", "both"], + "description": "Autoscaling metric type" + }, + "behaviour": { + "type": "object", + "description": "Autoscaling behavior configuration" + }, + "targets": { + "type": "object", + "properties": { + "cpu": { + "type": "integer", + "description": "CPU utilization target" + }, + "requestRate": { + "type": "string", + "description": "Request rate target" + } + } + } + } + }, + "image": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Image name" + }, + "tag": { + "type": "string", + "description": "Image tag" + } + } + }, + "command": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Container command" + }, + "settings": { + "type": "object", + "properties": { + "labels": { + "type": "object", + "description": "Additional pod labels" + }, + "resources": { + "type": "object", + "description": "Resource requirements" + }, + "extraEnvFrom": { + "type": "array", + "description": "Additional environment variables from references" + }, + "extraVolumeMounts": { + "type": "array", + "description": "Additional volume mounts" + }, + "extraVolumes": { + "type": "array", + "description": "Additional volumes" + }, + "envVars": { + "type": "object", + "description": "Environment variables" + } + } + } + } } } } From 8d3f24f28b2a04e4d8f0dcf72b2a44d058ed97af Mon Sep 17 00:00:00 2001 From: Emmanuel Mathot Date: Wed, 30 Apr 2025 15:18:24 +0200 Subject: [PATCH 3/6] Update README and Chart.yaml for improved installation instructions and add logo --- README.md | 97 ++++++++++++++----- helm-chart/eoapi/Chart.yaml | 1 + helm-chart/eoapi/README.md | 182 ++++++++++++++++-------------------- helm-chart/eoapi/logo.png | Bin 0 -> 9087 bytes 4 files changed, 156 insertions(+), 124 deletions(-) create mode 100644 helm-chart/eoapi/logo.png diff --git a/README.md b/README.md index 2141520d..7e9edd9e 100644 --- a/README.md +++ b/README.md @@ -17,47 +17,98 @@ ## What is eoAPI? -[https://eoapi.dev/](https://eoapi.dev/) +[eoAPI](https://eoapi.dev/) is a collection of REST APIs for Earth Observation data access and analysis. This repository provides a production-ready Kubernetes deployment solution with flexible database options, unified ingress configuration, and built-in monitoring. -## Getting Started +## Quick Start -Make sure you have [helm](https://helm.sh/docs/intro/install/) installed on your machine. -Additionally, you will need a cluster to deploy the eoAPI helm chart. This can be on a cloud provider, like AWS, GCP, or any other that supports Kubernetes. You can also run a local cluster using minikube. +### Prerequisites -### Local +- [helm](https://helm.sh/docs/intro/install/) +- A Kubernetes cluster (local or cloud-based) +- `kubectl` configured for your cluster -For a local installation you can use a preinstalled [Minikube](https://minikube.sigs.k8s.io/), and simply execute the following command: +### Option 1: One-Command Installation +The fastest way to get started is using our Makefile commands: + +For local development with Minikube: ```bash -$ make minikube +make minikube ``` -Once the deployment is done, the url to access eoAPI will be printed to your terminal. +For cloud deployment: +```bash +make deploy +``` -### Cloud +This will automatically: +1. Install the PostgreSQL operator +2. Add the eoAPI helm repository +3. Install the eoAPI helm chart +4. Set up necessary namespaces and configurations -If you don't have a k8s cluster set up on AWS or GCP then follow an IaC guide below that is relevant to you +### Option 2: Step-by-Step Installation -> ⓘ The helm chart in this repo assumes your cluster has a few third-party add-ons and controllers installed. So -> it's in your best interest to read through the IaC guides to understand what those defaults are +If you prefer more control over the installation process: -* [AWS EKS Cluster Setup](./docs/aws-eks.md) -* [GCP GKE Cluster Setup](./docs/gcp-gke.md) +1. Install the PostgreSQL operator: +```bash +helm upgrade --install \ + --set disable_check_for_upgrades=true pgo \ + oci://registry.developers.crunchydata.com/crunchydata/pgo \ + --version 5.7.4 +``` + +2. Add the eoAPI helm repository: +```bash +helm repo add eoapi https://devseed.com/eoapi-k8s/ +``` + +3. Get your current git SHA: +```bash +export GITSHA=$(git rev-parse HEAD | cut -c1-10) +``` + +4. Install eoAPI: +```bash +helm upgrade --install \ + --namespace eoapi \ + --create-namespace \ + --set gitSha=$GITSHA \ + eoapi devseed/eoapi +``` + +### Post-Installation -Make sure you have your `kubectl` configured to point to the cluster you want to deploy eoAPI to. Then simply execute the following command: +1. Enable ingress (for Minikube): +```bash +minikube addons enable ingress +``` +2. Optional: Load sample data: ```bash -$ make deploy +make ingest ``` -### Manual step-by-step installation +## Cloud Provider Setup + +For cloud-based deployments, refer to our detailed setup guides: +* [AWS EKS Cluster Setup](./docs/aws-eks.md) +* [GCP GKE Cluster Setup](./docs/gcp-gke.md) +* [Azure Setup](./docs/azure.md) + +## Documentation + +* [Configuration Guide](./docs/configuration.md) +* [Data Management](./docs/manage-data.md) +* [Autoscaling and Monitoring](./docs/autoscaling.md) +* [Health Checks](./docs/health.md) +* [Unified Ingress Configuration](./docs/unified-ingress.md) -Instead of using the `make` commands above you can also [manually `helm install` eoAPI](./docs/helm-install.md). +## Contributing +We welcome contributions! See our [contributing guide](./CONTRIBUTING.md) for details. -## More information +## License -* Read about [Default Configuration](./docs/configuration.md#default-configuration) and -other [Configuration Options](./docs/configuration.md#additional-options) -* [Manage your data](./docs/manage-data.md) in eoAPI -* Learn about [Autoscaling / Monitoring / Observability](./docs/autoscaling.md) +This project is licensed under the [MIT License](./LICENSE). diff --git a/helm-chart/eoapi/Chart.yaml b/helm-chart/eoapi/Chart.yaml index 53fb4a68..59870b78 100644 --- a/helm-chart/eoapi/Chart.yaml +++ b/helm-chart/eoapi/Chart.yaml @@ -13,6 +13,7 @@ type: application kubeVersion: ">=1.23.0-0" # Artifacthub metadata +icon: logo.png annotations: artifacthub.io/changes: | - Adds integration with Artifacthub.io diff --git a/helm-chart/eoapi/README.md b/helm-chart/eoapi/README.md index f24990e7..8fb8a92c 100644 --- a/helm-chart/eoapi/README.md +++ b/helm-chart/eoapi/README.md @@ -1,141 +1,121 @@ -# EOAPI Helm Chart +# eoAPI Helm Chart -This Helm chart deploys the EOAPI (Earth Observation API) stack, which includes STAC API, raster tile services, vector tile services, and a multidimensional data service. +![Version: 0.7.0](https://img.shields.io/badge/Version-0.7.0-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 5.0.2](https://img.shields.io/badge/AppVersion-5.0.2-informational?style=flat-square) -## Overview +A Helm chart for deploying Earth Observation APIs with integrated STAC, raster, vector, and multidimensional services. -The chart sets up: +## Features -- A PostgreSQL database with PostGIS and PgSTAC extensions -- STAC API service for metadata discovery and search -- Titiler for raster tile services -- TIPG for vector tile services -- Optional multidimensional data service +- STAC API for metadata discovery and search +- Raster tile services (TiTiler) +- Vector tile services (TIPG) +- Multidimensional data support +- Built-in STAC Browser interface +- Flexible database configuration +- Unified ingress system -## Prerequisites - -- Kubernetes 1.16+ -- Helm 3.0+ -- PV provisioner support in the underlying infrastructure -- CrunchyData Postgres Operator (for the PostgreSQL database) - -## Installation +## TL;DR ```bash -# Install Postgres Operator first -helm install --set disable_check_for_upgrades=true pgo oci://registry.developers.crunchydata.com/crunchydata/pgo +# Add the eoAPI repository +helm repo add eoapi https://devseed.com/eoapi-k8s/ + +# Install the PostgreSQL operator (required) +helm install --set disable_check_for_upgrades=true pgo \ + oci://registry.developers.crunchydata.com/crunchydata/pgo \ + --version 5.7.4 -# Then install eoapi -helm install eoapi ./eoapi +# Install eoAPI +helm install eoapi eoapi/eoapi ``` -## Configuration +## Prerequisites -The chart can be configured via `values.yaml`. See the chart's `values.yaml` file for all available options and detailed descriptions. +- Kubernetes 1.23+ +- Helm 3.0+ +- PV provisioner support +- PostgreSQL operator -Key configuration sections: +## Quick Start Configuration ```yaml -# Services to enable +# Enable desired services apiServices: - raster - stac - vector - # - multidim (disabled by default) + - stac-browser + # - multidim # Optional -# Ingress configuration +# Configure ingress ingress: enabled: true - className: "nginx" - # ... - -# Database configuration -postgrescluster: - enabled: true - # ... -``` - -## PgSTAC Bootstrap Process - -The chart includes a streamlined process for initializing and setting up the PgSTAC database. - -### PgSTAC Bootstrap Overview - -The setup process consists of two main jobs: - -1. **pgstac-migrate job**: Runs the pypgstac migrate command to initialize the database schema, applies settings, and sets necessary permissions. -2. **pgstac-load-samples job**: (Optional) Loads sample STAC data only when sample loading is enabled. - -### Improvements in PgSTAC Bootstrap - -- Replaced custom Python script with pypgstac migrate command -- Moved SQL settings to a dedicated SQL file for better maintainability -- Separated sample data loading into an optional job -- Uses standard PostgreSQL environment variables -- Ensures the process remains idempotent for safe re-runs + className: "nginx" # or "traefik" + host: "your-domain.com" # Optional -### PgSTAC Directory Structure +# Database options +postgresql: + type: "postgrescluster" # or "external-plaintext" or "external-secret" -The codebase has been reorganized to separate different types of files: - -- `initdb-data/settings/`: Contains configuration settings like the PgSTAC settings SQL file -- `initdb-data/samples/`: Contains sample data files that are loaded only when sample loading is enabled - -### PgSTAC Configuration - -- Enable/disable the setup process through `pgstacBootstrap.enabled` -- Control sample data loading: - - New approach: `pgstacBootstrap.settings.loadSamples` (recommended) - - Legacy approach: `pgstacBootstrap.settings.envVars.LOAD_FIXTURES` (deprecated) - -Example configuration: - -```yaml +# Load sample data pgstacBootstrap: enabled: true settings: - # General configuration options - loadSamples: true # Set to false to disable sample data loading - - resources: - requests: - cpu: "512m" - memory: "1024Mi" - limits: - cpu: "512m" - memory: "1024Mi" + loadSamples: true ``` -## Services - -### STAC API - -The STAC API service provides a standardized way to search and discover geospatial data. - -### Raster Services (Titiler) +## Configuration Options -Provides dynamic tiling for raster data through the TiTiler implementation. +### Key Parameters -### Vector Services (TIPG) +| Parameter | Description | Default | +|-----------|-------------|---------| +| `postgresql.type` | Database deployment type | `postgrescluster` | +| `ingress.enabled` | Enable ingress | `true` | +| `ingress.className` | Ingress controller class | `nginx` | +| `browser.enabled` | Enable STAC Browser interface | `true` | +| `pgstacBootstrap.enabled` | Enable database initialization | `true` | -Provides vector tile services for PostGIS data through the TIPG implementation. +Refer to the [values.schema.json](./values.schema.json) for the complete list of configurable parameters. -### Multidimensional Services (Optional) +### Database Options -Provides services for multidimensional data (time series, etc.). +1. Integrated PostgreSQL Operator: +```yaml +postgresql: + type: "postgrescluster" +``` -## Persistence +2. External Database: +```yaml +postgresql: + type: "external-plaintext" + external: + host: "your-db-host" + port: "5432" + database: "eoapi" + credentials: + username: "your-user" + password: "your-password" +``` -The chart uses PostgreSQL for data persistence. Make sure to configure appropriate storage for production use. +3. External Database with Secrets: +```yaml +postgresql: + type: "external-secret" + external: + existingSecret: + name: "your-secret" +``` -## Upgrading +## Documentation -When upgrading the chart, consider any changes to values.yaml and migrations that might need to be applied. +For detailed configuration and usage: -## Uninstallation +- [Configuration Guide](https://github.com/developmentseed/eoapi-k8s/blob/main/docs/configuration.md) +- [Data Management](https://github.com/developmentseed/eoapi-k8s/blob/main/docs/manage-data.md) +- [Autoscaling Guide](https://github.com/developmentseed/eoapi-k8s/blob/main/docs/autoscaling.md) -```bash -helm delete eoapi -``` +## License -Note that PVs may need to be manually deleted if you want to remove all data. +[MIT License](https://github.com/developmentseed/eoapi-k8s/blob/main/LICENSE) diff --git a/helm-chart/eoapi/logo.png b/helm-chart/eoapi/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d65eb5a46ae1bc53afd5b799488b07a1a3a465dc GIT binary patch literal 9087 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 literal 0 HcmV?d00001 From f260ec268ed38882f0db5a339031413f760e0ff3 Mon Sep 17 00:00:00 2001 From: Emmanuel Mathot Date: Wed, 30 Apr 2025 15:21:05 +0200 Subject: [PATCH 4/6] Update CHANGELOG.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- CHANGELOG.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 880f62aa..1e14f140 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,8 +22,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Refactor pgstacbootstrap job and ConfigMaps to use Helm hooks for execution order [#207](https://github.com/developmentseed/eoapi-k8s/pull/207) - Simplify PgSTAC Bootstrap Process [#208](https://github.com/developmentseed/eoapi-k8s/pull/208) - Upgrade stac-fastapi-pgstac to v5.0.2 [#204](https://github.com/developmentseed/eoapi-k8s/pull/204) -- Refactor Helm Chart to Service-Specific Templates [#220](https://github.com/developmentseed/eoapi-k8s/pull/220) - ### Fixed - Add ArtifactHub.io Integration (Issue #16) [#216](https://github.com/developmentseed/eoapi-k8s/pull/216) From e68190e0842695fed8112f2623d3e54a5cceb2d4 Mon Sep 17 00:00:00 2001 From: Emmanuel Mathot Date: Wed, 30 Apr 2025 15:22:29 +0200 Subject: [PATCH 5/6] Fix postGISVersion format in values.yaml to ensure proper parsing --- helm-chart/eoapi/values.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/helm-chart/eoapi/values.yaml b/helm-chart/eoapi/values.yaml index fdc3cee5..9e0514d7 100644 --- a/helm-chart/eoapi/values.yaml +++ b/helm-chart/eoapi/values.yaml @@ -107,7 +107,7 @@ postgresql: postgrescluster: enabled: true postgresVersion: 16 - postGISVersion: 3.4 + postGISVersion: "3.4" pgBouncerReplicas: 1 monitoring: false # Configure Patroni to set proper schema permissions From cb7fa7ea2f39e591a9b230928b0367be6ab2a952 Mon Sep 17 00:00:00 2001 From: Emmanuel Mathot Date: Wed, 30 Apr 2025 15:28:08 +0200 Subject: [PATCH 6/6] Add installation notes for eoAPI deployment --- helm-chart/eoapi/templates/NOTES.txt | 58 ++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 helm-chart/eoapi/templates/NOTES.txt diff --git a/helm-chart/eoapi/templates/NOTES.txt b/helm-chart/eoapi/templates/NOTES.txt new file mode 100644 index 00000000..403f4fe1 --- /dev/null +++ b/helm-chart/eoapi/templates/NOTES.txt @@ -0,0 +1,58 @@ +Thank you for installing {{ .Chart.Name }} {{ .Chart.Version }} + +Your eoAPI deployment is now being set up. This may take a few minutes. + +{{- if .Values.ingress.enabled }} + +You can access the services at: +{{- if .Values.ingress.host }} + Host: {{ .Values.ingress.host }} +{{- else }} + Get the host using: + $ kubectl get ingress -n {{ .Release.Namespace }} +{{- end }} + +Available endpoints: +{{- if has "stac" .Values.apiServices }} +- STAC API: {{ if .Values.ingress.host }}https://{{ .Values.ingress.host }}{{ end }}/stac +{{- end }} +{{- if has "raster" .Values.apiServices }} +- Raster API: {{ if .Values.ingress.host }}https://{{ .Values.ingress.host }}{{ end }}/raster +{{- end }} +{{- if has "vector" .Values.apiServices }} +- Vector API: {{ if .Values.ingress.host }}https://{{ .Values.ingress.host }}{{ end }}/vector +{{- end }} +{{- if has "multidim" .Values.apiServices }} +- MultiDim API: {{ if .Values.ingress.host }}https://{{ .Values.ingress.host }}{{ end }}/multidim +{{- end }} +{{- if .Values.browser.enabled }} +- STAC Browser: {{ if .Values.ingress.host }}https://{{ .Values.ingress.host }}{{ end }}/browser +{{- end }} + +{{- else }} +You have disabled the ingress. To access the services, you need to: +1. Set up your own ingress controller, or +2. Use port forwarding: + +{{- if has "stac" .Values.apiServices }} + $ kubectl port-forward -n {{ .Release.Namespace }} svc/stac 8080:{{ .Values.service.port }} +{{- end }} +{{- if has "raster" .Values.apiServices }} + $ kubectl port-forward -n {{ .Release.Namespace }} svc/raster 8081:{{ .Values.service.port }} +{{- end }} +{{- if has "vector" .Values.apiServices }} + $ kubectl port-forward -n {{ .Release.Namespace }} svc/vector 8082:{{ .Values.service.port }} +{{- end }} +{{- if has "multidim" .Values.apiServices }} + $ kubectl port-forward -n {{ .Release.Namespace }} svc/multidim 8083:{{ .Values.service.port }} +{{- end }} +{{- end }} + +To verify the deployment status: + $ kubectl get pods -n {{ .Release.Namespace }} + +For troubleshooting: + $ kubectl describe pods -n {{ .Release.Namespace }} + $ kubectl logs -n {{ .Release.Namespace }} -l app.kubernetes.io/name={{ .Chart.Name }} + +Visit https://github.com/developmentseed/eoapi-k8s for more information.