From 24a8b0e2ed7510661fa46c8a2544a4dbbb06d871 Mon Sep 17 00:00:00 2001 From: Felix Delattre Date: Fri, 25 Jul 2025 14:41:07 +0200 Subject: [PATCH 1/9] Removed github actions issue templates. --- .github/ISSUE_TEMPLATE/bug_report.md | 19 ------------------- .github/ISSUE_TEMPLATE/config.yml | 4 ---- .github/ISSUE_TEMPLATE/feature_request.md | 20 -------------------- 3 files changed, 43 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/bug_report.md delete mode 100644 .github/ISSUE_TEMPLATE/config.yml delete mode 100644 .github/ISSUE_TEMPLATE/feature_request.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index 72e25147..00000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -name: Bug Report -about: Create a report to help us improve -labels: bug ---- - - - - -#### Problem description - -[this should explain **why** the current behavior is a problem and why the expected output is a better solution.] - -#### Expected Output - - -#### Environment Information - -Os, Python version, ... diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml deleted file mode 100644 index 48d85ed3..00000000 --- a/.github/ISSUE_TEMPLATE/config.yml +++ /dev/null @@ -1,4 +0,0 @@ -contact_links: - - name: Discussions and Q/A - url: https://github.com/developmentseed/eoapi-k8s/discussions/categories/q-a - about: Please ask and answer questions here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index 516403f3..00000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,20 +0,0 @@ -## Feature Request: [Title of the Feature] - - - -### Summary -A brief summary of the feature request and what it aims to accomplish. - -### Problem Statement -Describe the problem or pain point that this feature would address. Why is this feature important? What issues are users currently facing that this feature would solve? - -### Proposed Solution -Outline the proposed solution for the feature. Include any relevant details, such as how the feature would work, what changes it would involve, and any specific requirements or considerations. - -### Additional Details -Provide any additional information that might be helpful for understanding the feature request. This could include: - -- Examples of how the feature could be used -- Screenshots or diagrams illustrating the feature -- Potential limitations or edge cases -- Links to related discussions or prior issues \ No newline at end of file From 3f872255d25816f8dfa27b0cdc0c3781e752b69e Mon Sep 17 00:00:00 2001 From: Felix Delattre Date: Fri, 25 Jul 2025 14:42:03 +0200 Subject: [PATCH 2/9] Removed and ignored vscode specific files. --- .gitignore | 2 ++ .vscode/settings.json | 3 --- 2 files changed, 2 insertions(+), 3 deletions(-) delete mode 100644 .vscode/settings.json diff --git a/.gitignore b/.gitignore index 335b2c80..a3853f0c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,6 @@ .idea/ +.vscode/ +.pytest_cache helm-chart/config.yaml config_ingress.yaml helm-chart/eoapi/charts/*.tgz diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 082b1943..00000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "makefile.configureOnOpen": false -} \ No newline at end of file From 6849e91ba46ffec6da05880b6d10d21f8ec8bccf Mon Sep 17 00:00:00 2001 From: Felix Delattre Date: Fri, 25 Jul 2025 14:42:28 +0200 Subject: [PATCH 3/9] Removed some unused legacy files. --- configs/aws-asg-policy.json | 29 --- configs/cluster-autoscaler-autodiscover.yaml | 179 ------------------- iac/aws/README.md | 1 - iac/gcp/README.md | 1 - 4 files changed, 210 deletions(-) delete mode 100644 configs/aws-asg-policy.json delete mode 100644 configs/cluster-autoscaler-autodiscover.yaml delete mode 100644 iac/aws/README.md delete mode 100644 iac/gcp/README.md diff --git a/configs/aws-asg-policy.json b/configs/aws-asg-policy.json deleted file mode 100644 index d29a27dd..00000000 --- a/configs/aws-asg-policy.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "Version": "2012-10-17", - "Statement": [ - { - "Effect": "Allow", - "Action": [ - "autoscaling:DescribeAutoScalingGroups", - "autoscaling:DescribeAutoScalingInstances", - "autoscaling:DescribeLaunchConfigurations", - "autoscaling:DescribeScalingActivities", - "autoscaling:DescribeTags", - "ec2:DescribeInstanceTypes", - "ec2:DescribeLaunchTemplateVersions" - ], - "Resource": ["*"] - }, - { - "Effect": "Allow", - "Action": [ - "autoscaling:SetDesiredCapacity", - "autoscaling:TerminateInstanceInAutoScalingGroup", - "ec2:DescribeImages", - "ec2:GetInstanceTypesFromInstanceRequirements", - "eks:DescribeNodegroup" - ], - "Resource": ["*"] - } - ] - } \ No newline at end of file diff --git a/configs/cluster-autoscaler-autodiscover.yaml b/configs/cluster-autoscaler-autodiscover.yaml deleted file mode 100644 index 1e2fae82..00000000 --- a/configs/cluster-autoscaler-autodiscover.yaml +++ /dev/null @@ -1,179 +0,0 @@ -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - k8s-addon: cluster-autoscaler.addons.k8s.io - k8s-app: cluster-autoscaler - name: cluster-autoscaler - namespace: kube-system ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: cluster-autoscaler - labels: - k8s-addon: cluster-autoscaler.addons.k8s.io - k8s-app: cluster-autoscaler -rules: -- apiGroups: [""] - resources: ["events", "endpoints"] - verbs: ["create", "patch"] -- apiGroups: [""] - resources: ["pods/eviction"] - verbs: ["create"] -- apiGroups: [""] - resources: ["pods/status"] - verbs: ["update"] -- apiGroups: [""] - resources: ["endpoints"] - resourceNames: ["cluster-autoscaler"] - verbs: ["get", "update"] -- apiGroups: [""] - resources: ["nodes"] - verbs: ["watch", "list", "get", "update"] -- apiGroups: [""] - resources: - - "namespaces" - - "pods" - - "services" - - "replicationcontrollers" - - "persistentvolumeclaims" - - "persistentvolumes" - verbs: ["watch", "list", "get"] -- apiGroups: ["extensions"] - resources: ["replicasets", "daemonsets"] - verbs: ["watch", "list", "get"] -- apiGroups: ["policy"] - resources: ["poddisruptionbudgets"] - verbs: ["watch", "list"] -- apiGroups: ["apps"] - resources: ["statefulsets", "replicasets", "daemonsets"] - verbs: ["watch", "list", "get"] -- apiGroups: ["storage.k8s.io"] - resources: ["storageclasses", "csinodes", "csidrivers", "csistoragecapacities"] - verbs: ["watch", "list", "get"] -- apiGroups: ["batch", "extensions"] - resources: ["jobs"] - verbs: ["get", "list", "watch", "patch"] -- apiGroups: ["coordination.k8s.io"] - resources: ["leases"] - verbs: ["create"] -- apiGroups: ["coordination.k8s.io"] - resourceNames: ["cluster-autoscaler"] - resources: ["leases"] - verbs: ["get", "update"] ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: cluster-autoscaler - namespace: kube-system - labels: - k8s-addon: cluster-autoscaler.addons.k8s.io - k8s-app: cluster-autoscaler -rules: -- apiGroups: [""] - resources: ["configmaps"] - verbs: ["create", "list", "watch"] -- apiGroups: [""] - resources: ["configmaps"] - resourceNames: ["cluster-autoscaler-status", "cluster-autoscaler-priority-expander"] - verbs: ["delete", "get", "update", "watch"] - ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: cluster-autoscaler - labels: - k8s-addon: cluster-autoscaler.addons.k8s.io - k8s-app: cluster-autoscaler -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: cluster-autoscaler -subjects: -- kind: ServiceAccount - name: cluster-autoscaler - namespace: kube-system - ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: cluster-autoscaler - namespace: kube-system - labels: - k8s-addon: cluster-autoscaler.addons.k8s.io - k8s-app: cluster-autoscaler -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: cluster-autoscaler -subjects: -- kind: ServiceAccount - name: cluster-autoscaler - namespace: kube-system - ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: cluster-autoscaler - namespace: kube-system - labels: - app: cluster-autoscaler -spec: - replicas: 1 - selector: - matchLabels: - app: cluster-autoscaler - template: - metadata: - labels: - app: cluster-autoscaler - annotations: - prometheus.io/scrape: 'true' - prometheus.io/port: '8085' - spec: - priorityClassName: system-cluster-critical - securityContext: - runAsNonRoot: true - runAsUser: 65534 - fsGroup: 65534 - seccompProfile: - type: RuntimeDefault - serviceAccountName: cluster-autoscaler - containers: - - image: registry.k8s.io/autoscaling/cluster-autoscaler:v1.26.2 - name: cluster-autoscaler - resources: - limits: - cpu: 100m - memory: 600Mi - requests: - cpu: 100m - memory: 600Mi - command: - - ./cluster-autoscaler - - --v=4 - - --stderrthreshold=info - - --cloud-provider=aws - - --skip-nodes-with-local-storage=false - - --expander=least-waste - - --node-group-auto-discovery=asg:tag=k8s.io/cluster-autoscaler/enabled,k8s.io/cluster-autoscaler/sandbox - volumeMounts: - - name: ssl-certs - mountPath: /etc/ssl/certs/ca-certificates.crt # /etc/ssl/certs/ca-bundle.crt for Amazon Linux Worker Nodes - readOnly: true - imagePullPolicy: "Always" - securityContext: - allowPrivilegeEscalation: false - capabilities: - drop: - - ALL - readOnlyRootFilesystem: true - volumes: - - name: ssl-certs - hostPath: - path: "/etc/ssl/certs/ca-bundle.crt" diff --git a/iac/aws/README.md b/iac/aws/README.md deleted file mode 100644 index d05e2535..00000000 --- a/iac/aws/README.md +++ /dev/null @@ -1 +0,0 @@ -please refer to https://github.com/developmentseed/eoapi-k8s-terraform \ No newline at end of file diff --git a/iac/gcp/README.md b/iac/gcp/README.md deleted file mode 100644 index d05e2535..00000000 --- a/iac/gcp/README.md +++ /dev/null @@ -1 +0,0 @@ -please refer to https://github.com/developmentseed/eoapi-k8s-terraform \ No newline at end of file From f92a3a0c25a07c18bee84ae462ba2c6abe85121b Mon Sep 17 00:00:00 2001 From: Felix Delattre Date: Fri, 25 Jul 2025 14:42:43 +0200 Subject: [PATCH 4/9] Moved ingest.sh to scripts folder. --- Makefile | 2 +- ingest.sh => scripts/ingest.sh | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename ingest.sh => scripts/ingest.sh (100%) diff --git a/Makefile b/Makefile index 1d3dbe08..753ee029 100755 --- a/Makefile +++ b/Makefile @@ -34,7 +34,7 @@ minikube: ingest: @echo "Ingesting STAC collections and items into the database." @command -v bash >/dev/null 2>&1 || { echo "bash is required but not installed"; exit 1; } - @./ingest.sh || { echo "Ingestion failed."; exit 1; } + @./scripts/ingest.sh || { echo "Ingestion failed."; exit 1; } tests: @echo "Running tests." diff --git a/ingest.sh b/scripts/ingest.sh similarity index 100% rename from ingest.sh rename to scripts/ingest.sh From 475e5b84544d5be0c6903cee558ea63b23d19879 Mon Sep 17 00:00:00 2001 From: Felix Delattre Date: Fri, 25 Jul 2025 14:47:31 +0200 Subject: [PATCH 5/9] Moved helm charts to charts folder. --- .github/workflows/helm-tests.yml | 4 +- .github/workflows/release.yml | 3 +- .gitignore | 4 +- Makefile | 4 +- {helm-chart => charts}/.gitignore | 0 .../eoapi-support/.gitignore | 0 .../eoapi-support/.helmignore | 0 .../eoapi-support/Chart.yaml | 0 .../eoapi-support/README.md | 0 .../dashboards/eoAPI-Dashboard.json | 0 .../templates/dashboard.config.yaml | 0 .../eoapi-support/values.yaml | 0 {helm-chart => charts}/eoapi/.gitignore | 0 {helm-chart => charts}/eoapi/.helmignore | 0 {helm-chart => charts}/eoapi/Chart.yaml | 0 {helm-chart => charts}/eoapi/README.md | 0 {helm-chart => charts}/eoapi/helm-template.sh | 0 .../eoapi/initdb-data/samples/my_data.sql | 0 .../samples/noaa-emergency-response.json | 0 .../samples/noaa-eri-nashville2020.json | 0 .../initdb-data/settings/pgstac-settings.sql | 0 {helm-chart => charts}/eoapi/logo.png | Bin .../eoapi/rm-ci-releases.sh | 0 .../eoapi/samples/values-with-nginx.yaml | 0 .../eoapi/templates/NOTES.txt | 0 .../eoapi/templates/_helpers.tpl | 0 .../eoapi/templates/_pgstac_init.tpl | 0 .../templates/pgstacbootstrap/configmap.yaml | 0 .../eoap-superuser-initdb.yaml | 0 .../eoapi/templates/pgstacbootstrap/job.yaml | 0 .../eoapi/templates/service-account.yaml | 0 .../eoapi/templates/services/README.md | 0 .../eoapi/templates/services/_common.tpl | 0 .../services/browser/deployment.yaml | 0 .../templates/services/browser/service.yaml | 0 .../eoapi/templates/services/doc-server.yaml | 0 .../templates/services/ingress-browser.yaml | 0 .../eoapi/templates/services/ingress.yaml | 0 .../services/multidim/configmap.yaml | 0 .../services/multidim/deployment.yaml | 0 .../templates/services/multidim/hpa.yaml | 0 .../templates/services/multidim/service.yaml | 0 .../templates/services/raster/configmap.yaml | 0 .../templates/services/raster/deployment.yaml | 0 .../eoapi/templates/services/raster/hpa.yaml | 0 .../templates/services/raster/service.yaml | 0 .../eoapi/templates/services/rbac.yaml | 0 .../templates/services/stac/configmap.yaml | 0 .../templates/services/stac/deployment.yaml | 0 .../eoapi/templates/services/stac/hpa.yaml | 0 .../templates/services/stac/service.yaml | 0 .../services/traefik-middleware.yaml | 0 .../templates/services/vector/configmap.yaml | 0 .../templates/services/vector/deployment.yaml | 0 .../eoapi/templates/services/vector/hpa.yaml | 0 .../templates/services/vector/service.yaml | 0 .../eoapi/test-helm-values.yaml | 0 .../eoapi/test-k3s-unittest-values.yaml | 0 .../eoapi/tests/config_tests.yaml | 0 .../eoapi/tests/deploy_tests.yaml | 0 .../eoapi/tests/hpa_tests.yaml | 0 .../eoapi/tests/ingress_tests.yaml | 0 .../eoapi/tests/multidim_tests.yaml | 0 .../eoapi/tests/postgres_tests.yaml | 0 .../eoapi/tests/raster_tests.yaml | 0 .../eoapi/tests/stac_tests.yaml | 0 .../eoapi/tests/vector_tests.yaml | 0 .../eoapi/values.schema.json | 0 {helm-chart => charts}/eoapi/values.yaml | 2 +- .../postgrescluster/Chart.yaml | 0 .../postgrescluster/templates/NOTES.txt | 0 .../postgrescluster/templates/_azure.tpl | 0 .../postgrescluster/templates/_gcs.tpl | 0 .../postgrescluster/templates/_s3.tpl | 0 .../templates/pgbackrest-secret.yaml | 0 .../postgrescluster/templates/postgres.yaml | 0 .../postgrescluster/values.yaml | 0 docs/autoscaling.md | 40 +++++++++--------- docs/health.md | 6 +-- docs/helm-install.md | 4 +- docs/release.md | 14 +++--- scripts/release.sh | 6 +-- 82 files changed, 42 insertions(+), 45 deletions(-) rename {helm-chart => charts}/.gitignore (100%) rename {helm-chart => charts}/eoapi-support/.gitignore (100%) rename {helm-chart => charts}/eoapi-support/.helmignore (100%) rename {helm-chart => charts}/eoapi-support/Chart.yaml (100%) rename {helm-chart => charts}/eoapi-support/README.md (100%) rename {helm-chart => charts}/eoapi-support/dashboards/eoAPI-Dashboard.json (100%) rename {helm-chart => charts}/eoapi-support/templates/dashboard.config.yaml (100%) rename {helm-chart => charts}/eoapi-support/values.yaml (100%) rename {helm-chart => charts}/eoapi/.gitignore (100%) rename {helm-chart => charts}/eoapi/.helmignore (100%) rename {helm-chart => charts}/eoapi/Chart.yaml (100%) rename {helm-chart => charts}/eoapi/README.md (100%) rename {helm-chart => charts}/eoapi/helm-template.sh (100%) rename {helm-chart => charts}/eoapi/initdb-data/samples/my_data.sql (100%) rename {helm-chart => charts}/eoapi/initdb-data/samples/noaa-emergency-response.json (100%) rename {helm-chart => charts}/eoapi/initdb-data/samples/noaa-eri-nashville2020.json (100%) rename {helm-chart => charts}/eoapi/initdb-data/settings/pgstac-settings.sql (100%) rename {helm-chart => charts}/eoapi/logo.png (100%) rename {helm-chart => charts}/eoapi/rm-ci-releases.sh (100%) rename {helm-chart => charts}/eoapi/samples/values-with-nginx.yaml (100%) rename {helm-chart => charts}/eoapi/templates/NOTES.txt (100%) rename {helm-chart => charts}/eoapi/templates/_helpers.tpl (100%) rename {helm-chart => charts}/eoapi/templates/_pgstac_init.tpl (100%) rename {helm-chart => charts}/eoapi/templates/pgstacbootstrap/configmap.yaml (100%) rename {helm-chart => charts}/eoapi/templates/pgstacbootstrap/eoap-superuser-initdb.yaml (100%) rename {helm-chart => charts}/eoapi/templates/pgstacbootstrap/job.yaml (100%) rename {helm-chart => charts}/eoapi/templates/service-account.yaml (100%) rename {helm-chart => charts}/eoapi/templates/services/README.md (100%) rename {helm-chart => charts}/eoapi/templates/services/_common.tpl (100%) rename {helm-chart => charts}/eoapi/templates/services/browser/deployment.yaml (100%) rename {helm-chart => charts}/eoapi/templates/services/browser/service.yaml (100%) rename {helm-chart => charts}/eoapi/templates/services/doc-server.yaml (100%) rename {helm-chart => charts}/eoapi/templates/services/ingress-browser.yaml (100%) rename {helm-chart => charts}/eoapi/templates/services/ingress.yaml (100%) rename {helm-chart => charts}/eoapi/templates/services/multidim/configmap.yaml (100%) rename {helm-chart => charts}/eoapi/templates/services/multidim/deployment.yaml (100%) rename {helm-chart => charts}/eoapi/templates/services/multidim/hpa.yaml (100%) rename {helm-chart => charts}/eoapi/templates/services/multidim/service.yaml (100%) rename {helm-chart => charts}/eoapi/templates/services/raster/configmap.yaml (100%) rename {helm-chart => charts}/eoapi/templates/services/raster/deployment.yaml (100%) rename {helm-chart => charts}/eoapi/templates/services/raster/hpa.yaml (100%) rename {helm-chart => charts}/eoapi/templates/services/raster/service.yaml (100%) rename {helm-chart => charts}/eoapi/templates/services/rbac.yaml (100%) rename {helm-chart => charts}/eoapi/templates/services/stac/configmap.yaml (100%) rename {helm-chart => charts}/eoapi/templates/services/stac/deployment.yaml (100%) rename {helm-chart => charts}/eoapi/templates/services/stac/hpa.yaml (100%) rename {helm-chart => charts}/eoapi/templates/services/stac/service.yaml (100%) rename {helm-chart => charts}/eoapi/templates/services/traefik-middleware.yaml (100%) rename {helm-chart => charts}/eoapi/templates/services/vector/configmap.yaml (100%) rename {helm-chart => charts}/eoapi/templates/services/vector/deployment.yaml (100%) rename {helm-chart => charts}/eoapi/templates/services/vector/hpa.yaml (100%) rename {helm-chart => charts}/eoapi/templates/services/vector/service.yaml (100%) rename {helm-chart => charts}/eoapi/test-helm-values.yaml (100%) rename {helm-chart => charts}/eoapi/test-k3s-unittest-values.yaml (100%) rename {helm-chart => charts}/eoapi/tests/config_tests.yaml (100%) rename {helm-chart => charts}/eoapi/tests/deploy_tests.yaml (100%) rename {helm-chart => charts}/eoapi/tests/hpa_tests.yaml (100%) rename {helm-chart => charts}/eoapi/tests/ingress_tests.yaml (100%) rename {helm-chart => charts}/eoapi/tests/multidim_tests.yaml (100%) rename {helm-chart => charts}/eoapi/tests/postgres_tests.yaml (100%) rename {helm-chart => charts}/eoapi/tests/raster_tests.yaml (100%) rename {helm-chart => charts}/eoapi/tests/stac_tests.yaml (100%) rename {helm-chart => charts}/eoapi/tests/vector_tests.yaml (100%) rename {helm-chart => charts}/eoapi/values.schema.json (100%) rename {helm-chart => charts}/eoapi/values.yaml (99%) rename {helm-chart => charts}/postgrescluster/Chart.yaml (100%) rename {helm-chart => charts}/postgrescluster/templates/NOTES.txt (100%) rename {helm-chart => charts}/postgrescluster/templates/_azure.tpl (100%) rename {helm-chart => charts}/postgrescluster/templates/_gcs.tpl (100%) rename {helm-chart => charts}/postgrescluster/templates/_s3.tpl (100%) rename {helm-chart => charts}/postgrescluster/templates/pgbackrest-secret.yaml (100%) rename {helm-chart => charts}/postgrescluster/templates/postgres.yaml (100%) rename {helm-chart => charts}/postgrescluster/values.yaml (100%) diff --git a/.github/workflows/helm-tests.yml b/.github/workflows/helm-tests.yml index 802000f9..bd9c11b5 100644 --- a/.github/workflows/helm-tests.yml +++ b/.github/workflows/helm-tests.yml @@ -23,7 +23,7 @@ jobs: github-token: ${{ secrets.GITHUB_TOKEN }} - run: | - cd helm-chart + cd charts helm unittest eoapi -f 'tests/*.yaml' -v eoapi/test-helm-values.yaml k3s-integration-tests: if: github.event.pull_request.head.repo.full_name == github.repository @@ -80,7 +80,7 @@ jobs: run: | export GITSHA='${{github.sha}}' - cd helm-chart + cd charts helm dependency build eoapi diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ca8c11c8..3189d19a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -37,9 +37,8 @@ jobs: - name: run chart-releaser uses: helm/chart-releaser-action@v1.6.0 with: - charts_dir: helm-chart + charts_dir: charts env: CR_TOKEN: "${{ secrets.GITHUB_TOKEN }}" CR_SKIP_EXISTING: true CR_INDEX_PATH: "." - diff --git a/.gitignore b/.gitignore index a3853f0c..22414605 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,6 @@ .idea/ .vscode/ .pytest_cache -helm-chart/config.yaml +charts/config.yaml +charts/eoapi/charts/*.tgz config_ingress.yaml -helm-chart/eoapi/charts/*.tgz diff --git a/Makefile b/Makefile index 753ee029..c069f115 100755 --- a/Makefile +++ b/Makefile @@ -17,7 +17,7 @@ deploy: @echo "Adding eoAPI helm repository." @helm repo add eoapi $(HELM_REPO_URL) @echo "Installing eoAPI helm chart." - @cd ./helm-chart && \ + @cd ./charts && \ helm dependency build ./eoapi && \ helm upgrade --install --namespace eoapi --create-namespace --set gitSha=$$(git rev-parse HEAD | cut -c1-10) eoapi ./eoapi @@ -39,7 +39,7 @@ ingest: tests: @echo "Running tests." @command -v helm >/dev/null 2>&1 || { echo "helm is required but not installed"; exit 1; } - @helm unittest helm-chart/eoapi -f 'tests/*.yaml' -v helm-chart/eoapi/test-helm-values.yaml + @helm unittest charts/eoapi -f 'tests/*.yaml' -v charts/eoapi/test-helm-values.yaml help: @echo "Makefile commands:" diff --git a/helm-chart/.gitignore b/charts/.gitignore similarity index 100% rename from helm-chart/.gitignore rename to charts/.gitignore diff --git a/helm-chart/eoapi-support/.gitignore b/charts/eoapi-support/.gitignore similarity index 100% rename from helm-chart/eoapi-support/.gitignore rename to charts/eoapi-support/.gitignore diff --git a/helm-chart/eoapi-support/.helmignore b/charts/eoapi-support/.helmignore similarity index 100% rename from helm-chart/eoapi-support/.helmignore rename to charts/eoapi-support/.helmignore diff --git a/helm-chart/eoapi-support/Chart.yaml b/charts/eoapi-support/Chart.yaml similarity index 100% rename from helm-chart/eoapi-support/Chart.yaml rename to charts/eoapi-support/Chart.yaml diff --git a/helm-chart/eoapi-support/README.md b/charts/eoapi-support/README.md similarity index 100% rename from helm-chart/eoapi-support/README.md rename to charts/eoapi-support/README.md diff --git a/helm-chart/eoapi-support/dashboards/eoAPI-Dashboard.json b/charts/eoapi-support/dashboards/eoAPI-Dashboard.json similarity index 100% rename from helm-chart/eoapi-support/dashboards/eoAPI-Dashboard.json rename to charts/eoapi-support/dashboards/eoAPI-Dashboard.json diff --git a/helm-chart/eoapi-support/templates/dashboard.config.yaml b/charts/eoapi-support/templates/dashboard.config.yaml similarity index 100% rename from helm-chart/eoapi-support/templates/dashboard.config.yaml rename to charts/eoapi-support/templates/dashboard.config.yaml diff --git a/helm-chart/eoapi-support/values.yaml b/charts/eoapi-support/values.yaml similarity index 100% rename from helm-chart/eoapi-support/values.yaml rename to charts/eoapi-support/values.yaml diff --git a/helm-chart/eoapi/.gitignore b/charts/eoapi/.gitignore similarity index 100% rename from helm-chart/eoapi/.gitignore rename to charts/eoapi/.gitignore diff --git a/helm-chart/eoapi/.helmignore b/charts/eoapi/.helmignore similarity index 100% rename from helm-chart/eoapi/.helmignore rename to charts/eoapi/.helmignore diff --git a/helm-chart/eoapi/Chart.yaml b/charts/eoapi/Chart.yaml similarity index 100% rename from helm-chart/eoapi/Chart.yaml rename to charts/eoapi/Chart.yaml diff --git a/helm-chart/eoapi/README.md b/charts/eoapi/README.md similarity index 100% rename from helm-chart/eoapi/README.md rename to charts/eoapi/README.md diff --git a/helm-chart/eoapi/helm-template.sh b/charts/eoapi/helm-template.sh similarity index 100% rename from helm-chart/eoapi/helm-template.sh rename to charts/eoapi/helm-template.sh diff --git a/helm-chart/eoapi/initdb-data/samples/my_data.sql b/charts/eoapi/initdb-data/samples/my_data.sql similarity index 100% rename from helm-chart/eoapi/initdb-data/samples/my_data.sql rename to charts/eoapi/initdb-data/samples/my_data.sql diff --git a/helm-chart/eoapi/initdb-data/samples/noaa-emergency-response.json b/charts/eoapi/initdb-data/samples/noaa-emergency-response.json similarity index 100% rename from helm-chart/eoapi/initdb-data/samples/noaa-emergency-response.json rename to charts/eoapi/initdb-data/samples/noaa-emergency-response.json diff --git a/helm-chart/eoapi/initdb-data/samples/noaa-eri-nashville2020.json b/charts/eoapi/initdb-data/samples/noaa-eri-nashville2020.json similarity index 100% rename from helm-chart/eoapi/initdb-data/samples/noaa-eri-nashville2020.json rename to charts/eoapi/initdb-data/samples/noaa-eri-nashville2020.json diff --git a/helm-chart/eoapi/initdb-data/settings/pgstac-settings.sql b/charts/eoapi/initdb-data/settings/pgstac-settings.sql similarity index 100% rename from helm-chart/eoapi/initdb-data/settings/pgstac-settings.sql rename to charts/eoapi/initdb-data/settings/pgstac-settings.sql diff --git a/helm-chart/eoapi/logo.png b/charts/eoapi/logo.png similarity index 100% rename from helm-chart/eoapi/logo.png rename to charts/eoapi/logo.png diff --git a/helm-chart/eoapi/rm-ci-releases.sh b/charts/eoapi/rm-ci-releases.sh similarity index 100% rename from helm-chart/eoapi/rm-ci-releases.sh rename to charts/eoapi/rm-ci-releases.sh diff --git a/helm-chart/eoapi/samples/values-with-nginx.yaml b/charts/eoapi/samples/values-with-nginx.yaml similarity index 100% rename from helm-chart/eoapi/samples/values-with-nginx.yaml rename to charts/eoapi/samples/values-with-nginx.yaml diff --git a/helm-chart/eoapi/templates/NOTES.txt b/charts/eoapi/templates/NOTES.txt similarity index 100% rename from helm-chart/eoapi/templates/NOTES.txt rename to charts/eoapi/templates/NOTES.txt diff --git a/helm-chart/eoapi/templates/_helpers.tpl b/charts/eoapi/templates/_helpers.tpl similarity index 100% rename from helm-chart/eoapi/templates/_helpers.tpl rename to charts/eoapi/templates/_helpers.tpl diff --git a/helm-chart/eoapi/templates/_pgstac_init.tpl b/charts/eoapi/templates/_pgstac_init.tpl similarity index 100% rename from helm-chart/eoapi/templates/_pgstac_init.tpl rename to charts/eoapi/templates/_pgstac_init.tpl diff --git a/helm-chart/eoapi/templates/pgstacbootstrap/configmap.yaml b/charts/eoapi/templates/pgstacbootstrap/configmap.yaml similarity index 100% rename from helm-chart/eoapi/templates/pgstacbootstrap/configmap.yaml rename to charts/eoapi/templates/pgstacbootstrap/configmap.yaml diff --git a/helm-chart/eoapi/templates/pgstacbootstrap/eoap-superuser-initdb.yaml b/charts/eoapi/templates/pgstacbootstrap/eoap-superuser-initdb.yaml similarity index 100% rename from helm-chart/eoapi/templates/pgstacbootstrap/eoap-superuser-initdb.yaml rename to charts/eoapi/templates/pgstacbootstrap/eoap-superuser-initdb.yaml diff --git a/helm-chart/eoapi/templates/pgstacbootstrap/job.yaml b/charts/eoapi/templates/pgstacbootstrap/job.yaml similarity index 100% rename from helm-chart/eoapi/templates/pgstacbootstrap/job.yaml rename to charts/eoapi/templates/pgstacbootstrap/job.yaml diff --git a/helm-chart/eoapi/templates/service-account.yaml b/charts/eoapi/templates/service-account.yaml similarity index 100% rename from helm-chart/eoapi/templates/service-account.yaml rename to charts/eoapi/templates/service-account.yaml diff --git a/helm-chart/eoapi/templates/services/README.md b/charts/eoapi/templates/services/README.md similarity index 100% rename from helm-chart/eoapi/templates/services/README.md rename to charts/eoapi/templates/services/README.md diff --git a/helm-chart/eoapi/templates/services/_common.tpl b/charts/eoapi/templates/services/_common.tpl similarity index 100% rename from helm-chart/eoapi/templates/services/_common.tpl rename to charts/eoapi/templates/services/_common.tpl diff --git a/helm-chart/eoapi/templates/services/browser/deployment.yaml b/charts/eoapi/templates/services/browser/deployment.yaml similarity index 100% rename from helm-chart/eoapi/templates/services/browser/deployment.yaml rename to charts/eoapi/templates/services/browser/deployment.yaml diff --git a/helm-chart/eoapi/templates/services/browser/service.yaml b/charts/eoapi/templates/services/browser/service.yaml similarity index 100% rename from helm-chart/eoapi/templates/services/browser/service.yaml rename to charts/eoapi/templates/services/browser/service.yaml diff --git a/helm-chart/eoapi/templates/services/doc-server.yaml b/charts/eoapi/templates/services/doc-server.yaml similarity index 100% rename from helm-chart/eoapi/templates/services/doc-server.yaml rename to charts/eoapi/templates/services/doc-server.yaml diff --git a/helm-chart/eoapi/templates/services/ingress-browser.yaml b/charts/eoapi/templates/services/ingress-browser.yaml similarity index 100% rename from helm-chart/eoapi/templates/services/ingress-browser.yaml rename to charts/eoapi/templates/services/ingress-browser.yaml diff --git a/helm-chart/eoapi/templates/services/ingress.yaml b/charts/eoapi/templates/services/ingress.yaml similarity index 100% rename from helm-chart/eoapi/templates/services/ingress.yaml rename to charts/eoapi/templates/services/ingress.yaml diff --git a/helm-chart/eoapi/templates/services/multidim/configmap.yaml b/charts/eoapi/templates/services/multidim/configmap.yaml similarity index 100% rename from helm-chart/eoapi/templates/services/multidim/configmap.yaml rename to charts/eoapi/templates/services/multidim/configmap.yaml diff --git a/helm-chart/eoapi/templates/services/multidim/deployment.yaml b/charts/eoapi/templates/services/multidim/deployment.yaml similarity index 100% rename from helm-chart/eoapi/templates/services/multidim/deployment.yaml rename to charts/eoapi/templates/services/multidim/deployment.yaml diff --git a/helm-chart/eoapi/templates/services/multidim/hpa.yaml b/charts/eoapi/templates/services/multidim/hpa.yaml similarity index 100% rename from helm-chart/eoapi/templates/services/multidim/hpa.yaml rename to charts/eoapi/templates/services/multidim/hpa.yaml diff --git a/helm-chart/eoapi/templates/services/multidim/service.yaml b/charts/eoapi/templates/services/multidim/service.yaml similarity index 100% rename from helm-chart/eoapi/templates/services/multidim/service.yaml rename to charts/eoapi/templates/services/multidim/service.yaml diff --git a/helm-chart/eoapi/templates/services/raster/configmap.yaml b/charts/eoapi/templates/services/raster/configmap.yaml similarity index 100% rename from helm-chart/eoapi/templates/services/raster/configmap.yaml rename to charts/eoapi/templates/services/raster/configmap.yaml diff --git a/helm-chart/eoapi/templates/services/raster/deployment.yaml b/charts/eoapi/templates/services/raster/deployment.yaml similarity index 100% rename from helm-chart/eoapi/templates/services/raster/deployment.yaml rename to charts/eoapi/templates/services/raster/deployment.yaml diff --git a/helm-chart/eoapi/templates/services/raster/hpa.yaml b/charts/eoapi/templates/services/raster/hpa.yaml similarity index 100% rename from helm-chart/eoapi/templates/services/raster/hpa.yaml rename to charts/eoapi/templates/services/raster/hpa.yaml diff --git a/helm-chart/eoapi/templates/services/raster/service.yaml b/charts/eoapi/templates/services/raster/service.yaml similarity index 100% rename from helm-chart/eoapi/templates/services/raster/service.yaml rename to charts/eoapi/templates/services/raster/service.yaml diff --git a/helm-chart/eoapi/templates/services/rbac.yaml b/charts/eoapi/templates/services/rbac.yaml similarity index 100% rename from helm-chart/eoapi/templates/services/rbac.yaml rename to charts/eoapi/templates/services/rbac.yaml diff --git a/helm-chart/eoapi/templates/services/stac/configmap.yaml b/charts/eoapi/templates/services/stac/configmap.yaml similarity index 100% rename from helm-chart/eoapi/templates/services/stac/configmap.yaml rename to charts/eoapi/templates/services/stac/configmap.yaml diff --git a/helm-chart/eoapi/templates/services/stac/deployment.yaml b/charts/eoapi/templates/services/stac/deployment.yaml similarity index 100% rename from helm-chart/eoapi/templates/services/stac/deployment.yaml rename to charts/eoapi/templates/services/stac/deployment.yaml diff --git a/helm-chart/eoapi/templates/services/stac/hpa.yaml b/charts/eoapi/templates/services/stac/hpa.yaml similarity index 100% rename from helm-chart/eoapi/templates/services/stac/hpa.yaml rename to charts/eoapi/templates/services/stac/hpa.yaml diff --git a/helm-chart/eoapi/templates/services/stac/service.yaml b/charts/eoapi/templates/services/stac/service.yaml similarity index 100% rename from helm-chart/eoapi/templates/services/stac/service.yaml rename to charts/eoapi/templates/services/stac/service.yaml diff --git a/helm-chart/eoapi/templates/services/traefik-middleware.yaml b/charts/eoapi/templates/services/traefik-middleware.yaml similarity index 100% rename from helm-chart/eoapi/templates/services/traefik-middleware.yaml rename to charts/eoapi/templates/services/traefik-middleware.yaml diff --git a/helm-chart/eoapi/templates/services/vector/configmap.yaml b/charts/eoapi/templates/services/vector/configmap.yaml similarity index 100% rename from helm-chart/eoapi/templates/services/vector/configmap.yaml rename to charts/eoapi/templates/services/vector/configmap.yaml diff --git a/helm-chart/eoapi/templates/services/vector/deployment.yaml b/charts/eoapi/templates/services/vector/deployment.yaml similarity index 100% rename from helm-chart/eoapi/templates/services/vector/deployment.yaml rename to charts/eoapi/templates/services/vector/deployment.yaml diff --git a/helm-chart/eoapi/templates/services/vector/hpa.yaml b/charts/eoapi/templates/services/vector/hpa.yaml similarity index 100% rename from helm-chart/eoapi/templates/services/vector/hpa.yaml rename to charts/eoapi/templates/services/vector/hpa.yaml diff --git a/helm-chart/eoapi/templates/services/vector/service.yaml b/charts/eoapi/templates/services/vector/service.yaml similarity index 100% rename from helm-chart/eoapi/templates/services/vector/service.yaml rename to charts/eoapi/templates/services/vector/service.yaml diff --git a/helm-chart/eoapi/test-helm-values.yaml b/charts/eoapi/test-helm-values.yaml similarity index 100% rename from helm-chart/eoapi/test-helm-values.yaml rename to charts/eoapi/test-helm-values.yaml diff --git a/helm-chart/eoapi/test-k3s-unittest-values.yaml b/charts/eoapi/test-k3s-unittest-values.yaml similarity index 100% rename from helm-chart/eoapi/test-k3s-unittest-values.yaml rename to charts/eoapi/test-k3s-unittest-values.yaml diff --git a/helm-chart/eoapi/tests/config_tests.yaml b/charts/eoapi/tests/config_tests.yaml similarity index 100% rename from helm-chart/eoapi/tests/config_tests.yaml rename to charts/eoapi/tests/config_tests.yaml diff --git a/helm-chart/eoapi/tests/deploy_tests.yaml b/charts/eoapi/tests/deploy_tests.yaml similarity index 100% rename from helm-chart/eoapi/tests/deploy_tests.yaml rename to charts/eoapi/tests/deploy_tests.yaml diff --git a/helm-chart/eoapi/tests/hpa_tests.yaml b/charts/eoapi/tests/hpa_tests.yaml similarity index 100% rename from helm-chart/eoapi/tests/hpa_tests.yaml rename to charts/eoapi/tests/hpa_tests.yaml diff --git a/helm-chart/eoapi/tests/ingress_tests.yaml b/charts/eoapi/tests/ingress_tests.yaml similarity index 100% rename from helm-chart/eoapi/tests/ingress_tests.yaml rename to charts/eoapi/tests/ingress_tests.yaml diff --git a/helm-chart/eoapi/tests/multidim_tests.yaml b/charts/eoapi/tests/multidim_tests.yaml similarity index 100% rename from helm-chart/eoapi/tests/multidim_tests.yaml rename to charts/eoapi/tests/multidim_tests.yaml diff --git a/helm-chart/eoapi/tests/postgres_tests.yaml b/charts/eoapi/tests/postgres_tests.yaml similarity index 100% rename from helm-chart/eoapi/tests/postgres_tests.yaml rename to charts/eoapi/tests/postgres_tests.yaml diff --git a/helm-chart/eoapi/tests/raster_tests.yaml b/charts/eoapi/tests/raster_tests.yaml similarity index 100% rename from helm-chart/eoapi/tests/raster_tests.yaml rename to charts/eoapi/tests/raster_tests.yaml diff --git a/helm-chart/eoapi/tests/stac_tests.yaml b/charts/eoapi/tests/stac_tests.yaml similarity index 100% rename from helm-chart/eoapi/tests/stac_tests.yaml rename to charts/eoapi/tests/stac_tests.yaml diff --git a/helm-chart/eoapi/tests/vector_tests.yaml b/charts/eoapi/tests/vector_tests.yaml similarity index 100% rename from helm-chart/eoapi/tests/vector_tests.yaml rename to charts/eoapi/tests/vector_tests.yaml diff --git a/helm-chart/eoapi/values.schema.json b/charts/eoapi/values.schema.json similarity index 100% rename from helm-chart/eoapi/values.schema.json rename to charts/eoapi/values.schema.json diff --git a/helm-chart/eoapi/values.yaml b/charts/eoapi/values.yaml similarity index 99% rename from helm-chart/eoapi/values.yaml rename to charts/eoapi/values.yaml index 6a7e0eeb..0c72af0f 100644 --- a/helm-chart/eoapi/values.yaml +++ b/charts/eoapi/values.yaml @@ -95,7 +95,7 @@ postgresql: port: "port" database: "database" -# this is declared as a dependency of eoapi in helm-chart/eoapi/Chart.yaml +# this is declared as a dependency of eoapi in charts/eoapi/Chart.yaml postgrescluster: enabled: true # The name of the postgres cluster diff --git a/helm-chart/postgrescluster/Chart.yaml b/charts/postgrescluster/Chart.yaml similarity index 100% rename from helm-chart/postgrescluster/Chart.yaml rename to charts/postgrescluster/Chart.yaml diff --git a/helm-chart/postgrescluster/templates/NOTES.txt b/charts/postgrescluster/templates/NOTES.txt similarity index 100% rename from helm-chart/postgrescluster/templates/NOTES.txt rename to charts/postgrescluster/templates/NOTES.txt diff --git a/helm-chart/postgrescluster/templates/_azure.tpl b/charts/postgrescluster/templates/_azure.tpl similarity index 100% rename from helm-chart/postgrescluster/templates/_azure.tpl rename to charts/postgrescluster/templates/_azure.tpl diff --git a/helm-chart/postgrescluster/templates/_gcs.tpl b/charts/postgrescluster/templates/_gcs.tpl similarity index 100% rename from helm-chart/postgrescluster/templates/_gcs.tpl rename to charts/postgrescluster/templates/_gcs.tpl diff --git a/helm-chart/postgrescluster/templates/_s3.tpl b/charts/postgrescluster/templates/_s3.tpl similarity index 100% rename from helm-chart/postgrescluster/templates/_s3.tpl rename to charts/postgrescluster/templates/_s3.tpl diff --git a/helm-chart/postgrescluster/templates/pgbackrest-secret.yaml b/charts/postgrescluster/templates/pgbackrest-secret.yaml similarity index 100% rename from helm-chart/postgrescluster/templates/pgbackrest-secret.yaml rename to charts/postgrescluster/templates/pgbackrest-secret.yaml diff --git a/helm-chart/postgrescluster/templates/postgres.yaml b/charts/postgrescluster/templates/postgres.yaml similarity index 100% rename from helm-chart/postgrescluster/templates/postgres.yaml rename to charts/postgrescluster/templates/postgres.yaml diff --git a/helm-chart/postgrescluster/values.yaml b/charts/postgrescluster/values.yaml similarity index 100% rename from helm-chart/postgrescluster/values.yaml rename to charts/postgrescluster/values.yaml diff --git a/docs/autoscaling.md b/docs/autoscaling.md index 3c019e5a..8702441d 100644 --- a/docs/autoscaling.md +++ b/docs/autoscaling.md @@ -1,13 +1,13 @@ # Autoscaling / Monitoring / Observability Autoscaling is both art and science. To test out your application's autoscaling requirements you often need to consider -your data volume, data usage patterns, bottlenecks (such as the database) among many, many other things. Load testing, -metrics, monitoring and observability will help you explore what those needs are. +your data volume, data usage patterns, bottlenecks (such as the database) among many, many other things. Load testing, +metrics, monitoring and observability will help you explore what those needs are. -> ⓘ The `eoapi-support` chart in this repository (see `../helm-chart/eoapi-support`) is required to be installed to -enable any of the eoAPI service autoscaling. It cannot be listed as a dependecy of `eoapi` chart -b/c of the limitations in `prometheus-adapter` and `grafana` for constructing the Prometheus internal +> ⓘ The `eoapi-support` chart in this repository (see `../charts/eoapi-support`) is required to be installed to +enable any of the eoAPI service autoscaling. It cannot be listed as a dependecy of `eoapi` chart +b/c of the limitations in `prometheus-adapter` and `grafana` for constructing the Prometheus internal service domains dynamically. If you are comfortable with k8s you probably only need to `helm install` the support chart and be on your way. Other folks @@ -21,17 +21,17 @@ The following instructions assume you've gone through the [AWS](./docs/aws-eks.m and installed the `eoapi` chart. -1. Go to the [releases section](https://github.com/developmentseed/eoapi-k8s/releases) of this repository and find the latest +1. Go to the [releases section](https://github.com/developmentseed/eoapi-k8s/releases) of this repository and find the latest `eoapi-support-` version to install. The example below assumes we're working with `eoapi-support-0.1.4` -2. Decide on a release name and `namespace` for your support chart. The next steps assume we've +2. Decide on a release name and `namespace` for your support chart. The next steps assume we've chosen a release name of `eoapi-support` and a similar namespace of `eoapi-support` 3. Then do a normal `helm install` but you'll want to parameterize and pass overrides for the prometheus URL to include -the release name and namespace chosen above. This allows other third-party dependencies used in the chart -(`prometheus-adpater` and `grafana`) know where to find the prometheus service internally. This is unfortunately a +the release name and namespace chosen above. This allows other third-party dependencies used in the chart +(`prometheus-adpater` and `grafana`) know where to find the prometheus service internally. This is unfortunately a manual step that cannot be automated ```bash @@ -60,9 +60,9 @@ manual step that cannot be automated service/eoapi-support-kube-state-metrics ClusterIP 10.123.241.247 8080/TCP 79s service/eoapi-support-prometheus-adapter ClusterIP 10.123.249.21 443/TCP 79s service/eoapi-support-prometheus-node-exporter ClusterIP 10.123.249.90 9100/TCP 79s - service/eoapi-support-prometheus-server ClusterIP 10.123.247.255 80/TCP 79s + service/eoapi-support-prometheus-server ClusterIP 10.123.247.255 80/TCP 79s ``` - + 5. If anything in steps 1 through 3 seems confusing then here is a quick bash script to clear it up: @@ -158,16 +158,16 @@ based on the nginx ingress controller's request rate under the `prometheus-adpat metricsQuery: round(sum(rate(<<.Series>>{service="stac",path=~"/stac.*",<<.LabelMatchers>>}[5m])) by (<<.GroupBy>>), 0.001) ``` -Prometheus adapter is a bridge for metrics between Prometheus (which scrapes nginx) and the k8s metrics server so it can autoscale deployments using these custom metrics. +Prometheus adapter is a bridge for metrics between Prometheus (which scrapes nginx) and the k8s metrics server so it can autoscale deployments using these custom metrics. If you've chosen `both` or `requestRate` as a autoscaling `type:` for those values then these custom metrics are used to template an `hpa.yaml` for each service ### Log into Grafana When you `helm install` the support chart you by default get a Grafana dashboard set up with different default metrics charts -to help you load test and explore your service autoscaling. Grafana creates a new username `admin` and password for you +to help you load test and explore your service autoscaling. Grafana creates a new username `admin` and password for you that you'll have to retrieve to login. -> ⓘ Note that the `service/eoapi-support-grafana` has an EXTERNAL-IP that we can use to view it. +> ⓘ Note that the `service/eoapi-support-grafana` has an EXTERNAL-IP that we can use to view it. This is just a quick way to work with it. You'll want to set it up with an ingress in the future @@ -180,17 +180,17 @@ with the `release` name we installed the chart with below `-grafan kubectl get secret eoapi-support-grafana --template='{{index .data "admin-password"}}' -n eoapi | base64 -d # ``` - + 2. To find the URL for the load balancer for where to log in with Grafana you can query the services: ```sh kubectl get svc -n eoapi-support ``` - + 3. Login and you should be default be able to see the eoapi-k8s grafana dashboard ![](./images/gfdashboard.png) - + ### Install or Upgrade Autoscaling Changes to `eoapi` Chart 1. If you haven't already decide which services (`vector` || `raster` || `stac`) you want to enable `autoscaling` on change your values yaml for these and redeploy @@ -227,7 +227,7 @@ with the `release` name we installed the chart with below `-grafan cpu: "256m" memory: "1024Mi" ``` - + 2. Review what the heck the unit `m` means for your [autoscaling values in the k8s docs](https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/#quantities) @@ -257,7 +257,7 @@ to set up a simple host ```sh kubectl edit ingress nginx-service-ingress-shared-eoapi -n eoapi ``` - + ```yaml # BEFORE spec: @@ -288,4 +288,4 @@ And then finally roll out the deployment. --- -### Now move onto the [Load Testing](loadtesting.md) document \ No newline at end of file +### Now move onto the [Load Testing](loadtesting.md) document diff --git a/docs/health.md b/docs/health.md index 71ddb3d2..c7c185e0 100644 --- a/docs/health.md +++ b/docs/health.md @@ -1,8 +1,8 @@ # Health checks and liveness probes -All services in eoAPI have endpoints for basic health checks. -The deployment template includes instructions for these checks to get pinged on a regular basis - look for `livenessProbe` -in https://github.com/developmentseed/eoapi-k8s/blob/main/helm-chart/eoapi/templates/services/deployment.yaml +All services in eoAPI have endpoints for basic health checks. +The deployment template includes instructions for these checks to get pinged on a regular basis - look for `livenessProbe` +in https://github.com/developmentseed/eoapi-k8s/blob/main/charts/eoapi/templates/services/deployment.yaml If you are using the default ingress setup, the health endpoints are: diff --git a/docs/helm-install.md b/docs/helm-install.md index 08ffd420..aa1c0faa 100644 --- a/docs/helm-install.md +++ b/docs/helm-install.md @@ -40,7 +40,7 @@ $ helm install -n eoapi --create-namespace eoapi eoapi/eoapi --version 0.1.2 -f config.yaml ``` -5. or check out this repo and `helm install` from this repo's `helm-chart/` folder: +5. or check out this repo and `helm install` from this repo's `charts/` folder: ```bash ###################################################### @@ -48,7 +48,7 @@ ###################################################### $ export GITSHA=$(git rev-parse HEAD | cut -c1-10) - $ cd ./helm-chart + $ cd ./charts $ helm install \ --namespace eoapi \ diff --git a/docs/release.md b/docs/release.md index edf4d74c..017dbbcd 100644 --- a/docs/release.md +++ b/docs/release.md @@ -1,7 +1,7 @@ ### Release Workflow -1. PRs that include changes in the `helm-chart/ || || ` charts are manually required to consider -whether their changes are major, minor or patch (in terms of semantic versioning) and bump the appropriate +1. PRs that include changes in the `charts/ || || ` charts are manually required to consider +whether their changes are major, minor or patch (in terms of semantic versioning) and bump the appropriate chart `version: ` (which follows semver) and `appVersion: ` (which does not follow semver) for each affected chart 3. The releaser then merges the above PR @@ -9,17 +9,17 @@ chart `version: ` (which follows semver) and `appVersion: ` (which does not foll 4. Then the releaser should go to the Github release UI/UX and kick off a new release by doing the following: 1. click "Draft New Release" - + 2. create a new tag increment based on the last one that matches the pattern `v..`. This does not have to match any of the chart versions you changed in the above PR. This repository is one-to-many with charts. So in terms of GH release we are saying, "we've release one of the three charts above" and the commit message will reflect that - + 3. click the "Generate release notes" - + 4. review the release notes and clean up and makes sure talk about which chart you released - + 5. click the "Publish release" 5. This last step then kicks off another GH Actions workflow called "release.yaml" which publishes any helm charts -that had version bumps since the last time +that had version bumps since the last time 6. Verify the release is all good by running `helm repo update && helm search repo eoapi --versions` diff --git a/scripts/release.sh b/scripts/release.sh index f8466815..9a4cb5cb 100644 --- a/scripts/release.sh +++ b/scripts/release.sh @@ -11,11 +11,9 @@ helm upgrade --install \ eoapi/eoapi-support --version 0.1.5 \ --set prometheus-adapter.prometheus.url=$PROMETHEUS_SERVER \ --set grafana.datasources.datasources\\.yaml.datasources[0].url=$PROMETHEUS_SERVER \ - -f /Users/ranchodeluxe/apps/eoapi-k8s/helm-chart/eoapi-support/values.yaml + -f ./charts/eoapi-support/values.yaml helm upgrade --install \ -n $RELEASE_NS --create-namespace $RELEASE_NAME \ eoapi/eoapi --version 0.4.8 \ - -f /Users/ranchodeluxe/apps/eoapi-k8s/helm-chart/eoapi/values.yaml - - + -f ./charts/eoapi/values.yaml From 873fc9af04edb1f69af8e5dc2e786e4b5d5633d4 Mon Sep 17 00:00:00 2001 From: Felix Delattre Date: Fri, 25 Jul 2025 15:02:11 +0200 Subject: [PATCH 6/9] Removed obsolete 0.7.0 upgrade instructions. --- README.md | 2 - docs/upgrade.md | 130 ------------------------------------------------ 2 files changed, 132 deletions(-) delete mode 100644 docs/upgrade.md diff --git a/README.md b/README.md index 8b343c1b..766d3828 100644 --- a/README.md +++ b/README.md @@ -106,8 +106,6 @@ For cloud-based deployments, refer to our detailed setup guides: * [Unified Ingress Configuration](./docs/unified-ingress.md) * [Upgrade Guide](./docs/upgrade.md) -> **Important Notice**: If you're upgrading from a version prior to 0.7.0, please read the [upgrade guide](./docs/upgrade.md) for important database permission changes. - ## Contributing We welcome contributions! See our [contributing guide](./CONTRIBUTING.md) for details. diff --git a/docs/upgrade.md b/docs/upgrade.md deleted file mode 100644 index 94e9b33d..00000000 --- a/docs/upgrade.md +++ /dev/null @@ -1,130 +0,0 @@ -# Upgrading eoAPI - -## General Upgrade Process - -To upgrade your eoAPI installation, use the standard Helm upgrade command: - -```bash -helm upgrade eoapi devseed/eoapi -``` - -### Notable Changes in 0.7.1 - -#### Ingress Configuration Changes -- Removed `pathType` and `pathSuffix` configurations in favor of controller-specific defaults -- Added separate ingress configuration for STAC browser -- Improved Nginx and Traefik support with controller-specific rewrites - -#### PostgreSQL Cluster Updates -- Added ability to specify cluster name via `postgrescluster.name` -- Improved handling of database secrets with custom cluster names -- Job retry limit increased to 3 attempts for better reliability - -For example, to use a custom cluster name: -```bash -helm upgrade eoapi devseed/eoapi --set postgrescluster.name=my-pgstac -``` - -## Special Considerations for Pre-0.7.0 Versions - -### Database Permission Changes - -When upgrading from a version prior to 0.7.0, there are important database permission changes that need to be handled. In versions before 0.7.0, database schema updates were run with superuser privileges. Starting from 0.7.0, these operations are performed with the eoapi user account. - -### Using the PostgreSQL Subchart - -If you're using the built-in PostgreSQL cluster (default setup), follow these steps: - -1. Specify your current version during the upgrade: -```bash -helm upgrade eoapi devseed/eoapi --set previousVersion=0.6.0 -``` - -This will trigger a special upgrade job that: -- Runs with superuser privileges -- Grants necessary permissions to the eoapi user -- Ensures database schema permissions are properly configured - -### Using an External Database - -If you're using an external PostgreSQL database (postgresql.type set to "external-plaintext" or "external-secret"), you'll need to apply the permission changes manually. Connect to your database with superuser privileges and execute the following SQL: - -```sql -\c your_database_name -CREATE EXTENSION IF NOT EXISTS postgis; -CREATE EXTENSION IF NOT EXISTS btree_gist; -CREATE EXTENSION IF NOT EXISTS unaccent; -CREATE ROLE pgstac_admin; -CREATE ROLE pgstac_read; -CREATE ROLE pgstac_ingest; -ALTER DATABASE your_database_name OWNER TO your_eoapi_user; -ALTER USER your_eoapi_user SET search_path TO pgstac, public; -ALTER DATABASE your_database_name set search_path to pgstac, public; -GRANT CONNECT ON DATABASE your_database_name TO your_eoapi_user; -GRANT ALL PRIVILEGES ON TABLES TO your_eoapi_user; -GRANT ALL PRIVILEGES ON SEQUENCES TO your_eoapi_user; -GRANT pgstac_read TO your_eoapi_user WITH ADMIN OPTION; -GRANT pgstac_ingest TO your_eoapi_user WITH ADMIN OPTION; -GRANT pgstac_admin TO your_eoapi_user WITH ADMIN OPTION; -``` - -Replace: -- `your_database_name` with your database name (default: eoapi) -- `your_eoapi_user` with your eoapi user name (default: eoapi) - -### Upgrade Steps - -1. First, check your current version: -```bash -helm list -n eoapi -``` - -2. If you're running a version earlier than 0.7.0: - - For subchart users: - ```bash - export CURRENT_VERSION=$(helm list -n eoapi -o json | jq -r '.[].app_version') - helm upgrade eoapi devseed/eoapi \ - --set previousVersion=$CURRENT_VERSION \ - --namespace eoapi - ``` - - For external database users: - Execute the SQL script shown above with superuser privileges. - -3. Verify the upgrade: -```bash -# Check that all pods are running -kubectl get pods -n eoapi - -# For subchart users, check the upgrade job status: -kubectl get jobs -n eoapi | grep eoapi-superuser-init-db -``` - -### Troubleshooting - -If you encounter issues during the upgrade: - -1. For subchart users, check the upgrade job logs: -```bash -kubectl logs -n eoapi -l app=pgstac-eoapi-superuser-init-db -``` - -2. Verify database permissions: -```bash -# Connect to your database (method varies based on setup) -psql -U your_superuser -d your_database_name - -# Check role permissions -\du - -# Verify extensions -\dx - -# Check database owner -\l -``` - -For external databases, ensure: -- You have superuser privileges when executing the permission script -- All extensions are properly installed -- The database owner is correctly set -- The eoapi user has all necessary role memberships From 21aae09fedbd1422e5945506e22227a9890608b3 Mon Sep 17 00:00:00 2001 From: Felix Delattre Date: Fri, 25 Jul 2025 15:06:18 +0200 Subject: [PATCH 7/9] Updated some versions in docs. --- docs/helm-install.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/helm-install.md b/docs/helm-install.md index aa1c0faa..91a152da 100644 --- a/docs/helm-install.md +++ b/docs/helm-install.md @@ -17,8 +17,8 @@ ```bash $ helm search repo eoapi --versions NAME CHART VERSION APP VERSION DESCRIPTION - eoapi/eoapi 0.2.14 0.3.1 Create a full Earth Observation API with Metada... - eoapi/eoapi 0.1.13 0.2.11 Create a full Earth Observation API with Metada... + eoapi/eoapi 0.7.5 5.0.2 Create a full Earth Observation API with Metada... + eoapi/eoapi 0.7.4 5.0.2 Create a full Earth Observation API with Metada... ``` 3. Optionally override keys/values in the default `values.yaml` with a custom `config.yaml` like below: @@ -37,7 +37,7 @@ 4. Then `helm install` with those `config.yaml` values: ```bash - $ helm install -n eoapi --create-namespace eoapi eoapi/eoapi --version 0.1.2 -f config.yaml + $ helm install -n eoapi --create-namespace eoapi eoapi/eoapi --version 0.7.5 -f config.yaml ``` 5. or check out this repo and `helm install` from this repo's `charts/` folder: From a331e91d55c1653a533ad527da6248a9a20ca9aa Mon Sep 17 00:00:00 2001 From: Felix Delattre Date: Fri, 25 Jul 2025 15:09:23 +0200 Subject: [PATCH 8/9] Moved helm related scripts to scripts folder. --- {charts/eoapi => scripts}/helm-template.sh | 0 {charts/eoapi => scripts}/rm-ci-releases.sh | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename {charts/eoapi => scripts}/helm-template.sh (100%) rename {charts/eoapi => scripts}/rm-ci-releases.sh (100%) diff --git a/charts/eoapi/helm-template.sh b/scripts/helm-template.sh similarity index 100% rename from charts/eoapi/helm-template.sh rename to scripts/helm-template.sh diff --git a/charts/eoapi/rm-ci-releases.sh b/scripts/rm-ci-releases.sh similarity index 100% rename from charts/eoapi/rm-ci-releases.sh rename to scripts/rm-ci-releases.sh From ec1a6aa9ca8fb313f86afbbb152a1eeb174eed2d Mon Sep 17 00:00:00 2001 From: Felix Delattre Date: Fri, 25 Jul 2025 15:12:36 +0200 Subject: [PATCH 9/9] Removed old logo. --- charts/eoapi/README.md | 2 +- charts/eoapi/logo.png | Bin 9087 -> 0 bytes 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 charts/eoapi/logo.png diff --git a/charts/eoapi/README.md b/charts/eoapi/README.md index 8fb8a92c..7d05c59b 100644 --- a/charts/eoapi/README.md +++ b/charts/eoapi/README.md @@ -1,6 +1,6 @@ # eoAPI Helm Chart -![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) +![Version: 0.7.5](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) A Helm chart for deploying Earth Observation APIs with integrated STAC, raster, vector, and multidimensional services. diff --git a/charts/eoapi/logo.png b/charts/eoapi/logo.png deleted file mode 100644 index d65eb5a46ae1bc53afd5b799488b07a1a3a465dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9087 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