├── .github └── workflows │ ├── lint-test.yml │ └── release.yml ├── .gitignore ├── .helmdocsignore ├── .helmignore ├── Chart.lock ├── Chart.yaml ├── Makefile ├── README.md ├── artifacthub-repo.yml ├── charts ├── agent │ ├── .helmignore │ ├── Chart.yaml │ ├── templates │ │ ├── _helpers.tpl │ │ ├── cacert-secret.yaml │ │ ├── deployment.yaml │ │ ├── hpa.yaml │ │ ├── poddisruptionbudget.yaml │ │ ├── service.yaml │ │ └── tests │ │ │ └── test-connection.yaml │ └── values.yaml └── server │ ├── .helmignore │ ├── Chart.yaml │ ├── templates │ ├── NOTES.txt │ ├── _helpers.tpl │ ├── cacert-secret.yaml │ ├── deployment.yaml │ ├── hpa.yaml │ ├── ingress.yaml │ ├── jwt-secret.yaml │ ├── poddisruptionbudget.yaml │ ├── service.yaml │ └── tests │ │ └── test-connection.yaml │ └── values.yaml ├── ct.yaml ├── index.yaml ├── scripts └── release.sh └── values.yaml /.github/workflows/lint-test.yml: -------------------------------------------------------------------------------- 1 | name: Lint and Test Charts 2 | 3 | on: pull_request 4 | 5 | jobs: 6 | lint-test: 7 | runs-on: ubuntu-latest 8 | steps: 9 | - name: Checkout 10 | uses: actions/checkout@v3 11 | with: 12 | fetch-depth: 0 13 | 14 | - name: Set up Helm 15 | uses: azure/setup-helm@v3 16 | with: 17 | version: v3.8.1 18 | 19 | - uses: actions/setup-python@v2 20 | with: 21 | python-version: 3.7 22 | 23 | - name: Set up chart-testing 24 | uses: helm/chart-testing-action@v2.2.1 25 | 26 | - name: Add Bitnami Charts Repo 27 | run: helm repo add bitnami https://charts.bitnami.com/bitnami 28 | 29 | - name: Run chart-testing (list-changed) 30 | id: list-changed 31 | run: | 32 | changed=$(ct list-changed --target-branch release-0.8) 33 | if [[ -n "$changed" ]]; then 34 | echo "::set-output name=changed::true" 35 | fi 36 | 37 | - name: Run chart-testing (lint) 38 | run: ct lint --config ct.yaml --all 39 | 40 | - name: Create kind cluster 41 | uses: helm/kind-action@v1.2.0 42 | if: steps.list-changed.outputs.changed == 'true' 43 | 44 | - name: Run chart-testing (install) 45 | run: ct install 46 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release Charts 2 | 3 | on: 4 | workflow_dispatch: 5 | inputs: 6 | name: 7 | description: "Manual workflow name" 8 | required: true 9 | push: 10 | tags: 11 | # Release binary for every tag. 12 | - v* 13 | 14 | jobs: 15 | release: 16 | runs-on: ubuntu-latest 17 | steps: 18 | - name: Checkout 19 | uses: actions/checkout@v1 20 | with: 21 | fetch-depth: 0 22 | 23 | - name: Configure Git 24 | run: | 25 | git config user.name "$GITHUB_ACTOR" 26 | git config user.email "$GITHUB_ACTOR@users.noreply.github.com" 27 | 28 | - name: Install Helm 29 | uses: azure/setup-helm@v3 30 | with: 31 | version: v3.8.1 32 | 33 | - name: Add Bitnami Charts Repo 34 | run: helm repo add bitnami https://charts.bitnami.com/bitnami 35 | 36 | - name: Add Bitnami Charts Repo 37 | run: helm dependency update . 38 | 39 | - name: Package and upload helm chart 40 | env: 41 | CR_TOKEN: ${{ secrets.PAT }} 42 | CR_VERSION: "1.5.0" 43 | run: | 44 | curl -sSLo cr.tar.gz "https://github.com/helm/chart-releaser/releases/download/v${CR_VERSION}/chart-releaser_${CR_VERSION}_linux_amd64.tar.gz" 45 | tar -xzf cr.tar.gz 46 | rm -f cr.tar.gz 47 | owner=$(cut -d '/' -f 1 <<< "$GITHUB_REPOSITORY") 48 | repo=$(cut -d '/' -f 2 <<< "$GITHUB_REPOSITORY") 49 | 50 | # package chart 51 | ./cr package . 52 | 53 | # upload chart to github relases 54 | ./cr upload \ 55 | --owner "$owner" \ 56 | --git-repo "$repo" \ 57 | --release-name-template "convoy" 58 | 59 | # update index and push to github pages 60 | git config user.email "$owner@users.noreply.github.com" 61 | git config user.name "$owner" 62 | ./cr index \ 63 | --owner "$owner" \ 64 | --git-repo "$repo" \ 65 | --release-name-template "convoy" \ 66 | --index-path ./index.yaml \ 67 | --charts-repo https://$owner.github.io/$repo \ 68 | --push 69 | 70 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # General files for the project 2 | pkg/* 3 | *.pyc 4 | bin/* 5 | .project 6 | /.bin 7 | /_test/secrets/*.json 8 | 9 | # OSX leaves these everywhere on SMB shares 10 | ._* 11 | 12 | # OSX trash 13 | .DS_Store 14 | 15 | # Files generated by JetBrains IDEs, e.g. IntelliJ IDEA 16 | .idea/ 17 | *.iml 18 | 19 | # Vscode files 20 | .vscode 21 | 22 | # Emacs save files 23 | *~ 24 | \#*\# 25 | .\#* 26 | 27 | # Vim-related files 28 | [._]*.s[a-w][a-z] 29 | [._]s[a-w][a-z] 30 | *.un~ 31 | Session.vim 32 | .netrwhist 33 | 34 | # Chart dependencies 35 | **/charts/*.tgz 36 | 37 | .history 38 | README.md.gotmpl 39 | -------------------------------------------------------------------------------- /.helmdocsignore: -------------------------------------------------------------------------------- 1 | charts 2 | -------------------------------------------------------------------------------- /.helmignore: -------------------------------------------------------------------------------- 1 | # Patterns to ignore when building packages. 2 | # This supports shell glob matching, relative path matching, and 3 | # negation (prefixed with !). Only one pattern per line. 4 | .DS_Store 5 | # Common VCS dirs 6 | .git/ 7 | .gitignore 8 | .bzr/ 9 | .bzrignore 10 | .hg/ 11 | .hgignore 12 | .svn/ 13 | # Common backup files 14 | *.swp 15 | *.bak 16 | *.tmp 17 | *.orig 18 | *~ 19 | # Various IDEs 20 | .project 21 | .idea/ 22 | *.tmproj 23 | .vscode/ 24 | -------------------------------------------------------------------------------- /Chart.lock: -------------------------------------------------------------------------------- 1 | dependencies: 2 | - name: postgresql 3 | repository: https://charts.bitnami.com/bitnami 4 | version: 12.5.6 5 | - name: redis 6 | repository: https://charts.bitnami.com/bitnami 7 | version: 17.11.3 8 | digest: sha256:2c6ff47eb9a3976dbdb1a5b762cdc4343ef1846f63a8f00a612c9da0336602b5 9 | generated: "2023-06-05T14:49:57.883606542+01:00" 10 | -------------------------------------------------------------------------------- /Chart.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v2 2 | name: convoy 3 | description: Open Source Webhooks Gateway 4 | type: application 5 | version: "3.4.0" 6 | appVersion: "25.2.4" 7 | keywords: 8 | - Webhooks 9 | - Kubernetes 10 | - Convoy 11 | maintainers: 12 | - name: Convoy Engineering Team 13 | email: engineering@getconvoy.io 14 | url: https://getconvoy.io 15 | dependencies: 16 | - name: postgresql 17 | version: 12.5.6 18 | repository: https://charts.bitnami.com/bitnami 19 | condition: postgresql.enabled 20 | 21 | - name: redis 22 | version: 17.11.3 23 | repository: https://charts.bitnami.com/bitnami 24 | condition: redis.enabled 25 | 26 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | ct: 2 | ct lint --config ct.yaml --all 3 | 4 | .PHONY: ct 5 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # convoy 2 | 3 | ![Version: 3.4.0](https://img.shields.io/badge/Version-3.4.0-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 25.2.4](https://img.shields.io/badge/AppVersion-25.2.4-informational?style=flat-square) 4 | 5 | Open Source Webhooks Gateway 6 | 7 | ## Maintainers 8 | 9 | | Name | Email | Url | 10 | | ---- | ------ | --- | 11 | | Convoy Engineering Team | | | 12 | 13 | ## Requirements 14 | 15 | | Repository | Name | Version | 16 | |------------|------|---------| 17 | | https://charts.bitnami.com/bitnami | postgresql | 12.5.6 | 18 | | https://charts.bitnami.com/bitnami | redis | 17.11.3 | 19 | 20 | ## Values 21 | 22 | | Key | Type | Default | Description | 23 | |-----|------|---------|-------------| 24 | | agent.app.replicaCount | int | `1` | | 25 | | agent.app.resources | object | `{}` | | 26 | | agent.autoscaling.enabled | bool | `false` | Enable autoscaling for the agent | 27 | | agent.autoscaling.maxReplicas | int | `10` | | 28 | | agent.autoscaling.minReplicas | int | `2` | | 29 | | agent.autoscaling.targetCPUUtilizationPercentage | int | `80` | | 30 | | agent.autoscaling.targetMemoryUtilizationPercentage | int | `80` | | 31 | | agent.env.analytics_enabled | bool | `true` | | 32 | | agent.env.consumer_pool_size | int | `100` | | 33 | | agent.env.dispatcher.allow_list[0] | string | `"0.0.0.0/0"` | | 34 | | agent.env.dispatcher.deny_list[0] | string | `"127.0.0.1/8"` | | 35 | | agent.env.dispatcher.deny_list[1] | string | `"169.254.169.254/32"` | | 36 | | agent.env.dispatcher.insecure_skip_verify | bool | `false` | | 37 | | agent.env.enable_feature_flag | list | `[]` | | 38 | | agent.env.enable_profiling | bool | `false` | | 39 | | agent.env.environment | string | `"oss"` | | 40 | | agent.env.instance_ingest_rate | int | `100` | | 41 | | agent.env.license_key | string | `""` | | 42 | | agent.env.log_level | string | `"error"` | | 43 | | agent.env.max_retry_seconds | int | `7200` | | 44 | | agent.env.metrics.enabled | bool | `false` | | 45 | | agent.env.metrics.metrics_backend | string | `"prometheus"` | | 46 | | agent.env.metrics.prometheus_metrics.sample_time | int | `5` | | 47 | | agent.env.proxy | string | `""` | | 48 | | agent.env.pyroscope.enabled | bool | `false` | | 49 | | agent.env.pyroscope.password | string | `""` | | 50 | | agent.env.pyroscope.profile_id | string | `""` | | 51 | | agent.env.pyroscope.url | string | `""` | | 52 | | agent.env.pyroscope.username | string | `""` | | 53 | | agent.env.retention_policy.enabled | bool | `false` | | 54 | | agent.env.retention_policy.policy | string | `"720h"` | | 55 | | agent.env.sign_up_enabled | bool | `false` | | 56 | | agent.env.smtp.enabled | bool | `false` | | 57 | | agent.env.smtp.from | string | `""` | | 58 | | agent.env.smtp.password | string | `""` | Ignored in case of secret parameter with non-empty value | 59 | | agent.env.smtp.port | int | `0` | | 60 | | agent.env.smtp.provider | string | `""` | | 61 | | agent.env.smtp.reply_to | string | `""` | | 62 | | agent.env.smtp.secret | string | `""` | If this secret parameter is not empty, password value will be ignored. The password in the secret should be in the 'password' key | 63 | | agent.env.smtp.ssl | bool | `false` | | 64 | | agent.env.smtp.url | string | `""` | | 65 | | agent.env.smtp.username | string | `""` | | 66 | | agent.env.storage.enabled | bool | `false` | | 67 | | agent.env.storage.on_prem.path | string | `""` | | 68 | | agent.env.storage.s3.accessKey | string | `""` | | 69 | | agent.env.storage.s3.bucket | string | `""` | | 70 | | agent.env.storage.s3.endpoint | string | `""` | | 71 | | agent.env.storage.s3.region | string | `""` | | 72 | | agent.env.storage.s3.secret | string | `""` | If this secret parameter is not empty, secretKey value will be ignored. The password in the secret should be in the 'secretKey' key | 73 | | agent.env.storage.s3.secretKey | string | `""` | Ignored in case of secret parameter with non-empty value | 74 | | agent.env.storage.s3.session_token | string | `""` | | 75 | | agent.env.storage.type | string | `""` | | 76 | | agent.env.worker_execution_mode | string | `"default"` | | 77 | | agent.image.pullPolicy | string | `"IfNotPresent"` | Pull policy for the agent image | 78 | | agent.image.repository | string | `"getconvoy/convoy"` | Repository to be used by the agent. The latest tag is used by default | 79 | | agent.podDisruptionBudget | object | `{}` | | 80 | | agent.service.port | int | `80` | Port for the agent service | 81 | | agent.service.type | string | `"ClusterIP"` | Type of service for the agent | 82 | | global.convoy.api_version | string | `"2024-01-01"` | API version | 83 | | global.convoy.cacert_content | string | `""` | Dispatcher CA Certificate content. If provided, a secret will be created with this content | 84 | | global.convoy.cacert_secret_name | string | `""` | Dispatcher CA Certificate configuration. If provided, it will use the content of the secret | 85 | | global.convoy.enable_usage_analytics | bool | `true` | Enable usage analytics | 86 | | global.convoy.environment | string | `"oss"` | Convoy Environment | 87 | | global.convoy.image | string | `"getconvoy/convoy"` | Docker image tags for all convoy components | 88 | | global.convoy.jwt_refresh_secret | string | `"convoy-refresh-secret"` | JWT Refresh Secret key | 89 | | global.convoy.jwt_secret | string | `"convoy-secret"` | JWT Secret key | 90 | | global.convoy.jwt_secret_name | string | `""` | If this secret parameter is not empty, JWT secret values will be ignored. The secrets should be in the 'jwt_secret' and 'jwt_refresh_secret' keys | 91 | | global.convoy.license_key | string | `""` | License Key | 92 | | global.convoy.log_level | string | `"error"` | Logger Level for all convoy components | 93 | | global.convoy.otel_auth_header_name | string | `""` | Open Telemetry auth header name | 94 | | global.convoy.otel_auth_header_value | string | `""` | Open Telemetry auth header value | 95 | | global.convoy.otel_collector_url | string | `""` | Open Telemetry collector url | 96 | | global.convoy.otel_insecure_skip_verify | bool | `true` | Open Telemetry insecure skip verify | 97 | | global.convoy.otel_sample_rate | int | `1` | Open Telemetry sample rate | 98 | | global.convoy.retention_policy_duration | string | `"720h"` | Retention policy duration | 99 | | global.convoy.retention_policy_enabled | bool | `false` | Retention policy enabled | 100 | | global.convoy.sentry_dsn | string | `""` | Sentry DSN | 101 | | global.convoy.tag | string | `"v25.3.4"` | Docker image tags for all convoy components | 102 | | global.convoy.tracer_enabled | bool | `false` | Tracing config for all convoy services | 103 | | global.convoy.tracer_type | string | `"otel"` | Tracing provider type | 104 | | global.externalDatabase.database | string | `"convoy"` | Database name for the external database | 105 | | global.externalDatabase.enabled | bool | `true` | Enable an external database; This will use postgresql chart, Change values if you use an external database | 106 | | global.externalDatabase.host | string | `"postgresql"` | Host for the external database | 107 | | global.externalDatabase.options | string | `"sslmode=disable&connect_timeout=30"` | Query params for the external database | 108 | | global.externalDatabase.password | string | `"postgres"` | Password for the external database, ignored in case of secret parameter with non-empty value | 109 | | global.externalDatabase.port | int | `5432` | Port for the external database | 110 | | global.externalDatabase.postgresPassword | string | `"postgres"` | Password for the external database | 111 | | global.externalDatabase.secret | string | `""` | If this secret parameter is not empty, password value will be ignored. The password in the secret should be in the 'password' key | 112 | | global.externalDatabase.username | string | `"postgres"` | Username for the external database | 113 | | global.externalRedis.addresses | string | `""` | redis cluster addresses, if set the other values won't be used | 114 | | global.externalRedis.database | string | `""` | Database name for the external redis. | 115 | | global.externalRedis.enabled | bool | `false` | Enable external redis, Enable this if you use an external redis and disable Native redis | 116 | | global.externalRedis.host | string | `""` | Host for the external redis | 117 | | global.externalRedis.password | string | `""` | password for the external redis, ignored in case of secret parameter with non-empty value | 118 | | global.externalRedis.port | string | `""` | Port for the external redis | 119 | | global.externalRedis.scheme | string | `""` | Scheme for the external redis. This can be redis, rediss, redis-socket or redis-sentinel | 120 | | global.externalRedis.secret | string | `""` | If this secret parameter is not empty, password value will be ignored. The password in the secret should be in the 'password' key | 121 | | global.externalRedis.username | string | `""` | username for the external redis. | 122 | | global.nativeRedis.enabled | bool | `true` | Enable redis; This will use redis chart, Disable if you use an external redis | 123 | | global.nativeRedis.host | string | `"redis-master"` | Host for the redis | 124 | | global.nativeRedis.password | string | `"convoy"` | password for the redis, ignored in case of secret parameter with non-empty value | 125 | | global.nativeRedis.port | int | `6379` | Port for the redis | 126 | | global.nativeRedis.secret | string | `""` | If this secret parameter is not empty, password value will be ignored. The password in the secret should be in the 'password' key | 127 | | server.app.replicaCount | int | `1` | | 128 | | server.app.resources | object | `{}` | | 129 | | server.autoscaling.enabled | bool | `false` | Enable autoscaling for the server | 130 | | server.autoscaling.maxReplicas | int | `10` | | 131 | | server.autoscaling.minReplicas | int | `2` | | 132 | | server.autoscaling.targetCPUUtilizationPercentage | int | `80` | | 133 | | server.autoscaling.targetMemoryUtilizationPercentage | int | `80` | | 134 | | server.env.analytics.enabled | bool | `true` | | 135 | | server.env.analytics_enabled | bool | `true` | | 136 | | server.env.api_version | string | `"2024-01-01"` | | 137 | | server.env.auth.jwt.enabled | bool | `true` | | 138 | | server.env.auth.jwt.refresh_secret | string | `"convoy-refresh-secret"` | | 139 | | server.env.auth.jwt.secret | string | `"convoy-secret"` | | 140 | | server.env.auth.native.enabled | bool | `true` | | 141 | | server.env.enable_feature_flag | list | `[]` | | 142 | | server.env.enable_profiling | bool | `false` | | 143 | | server.env.environment | string | `"oss"` | | 144 | | server.env.host | string | `""` | | 145 | | server.env.instance_ingest_rate | int | `100` | | 146 | | server.env.license_key | string | `""` | | 147 | | server.env.log_level | string | `"error"` | | 148 | | server.env.max_response_size | int | `50` | Max response body when ingesting webhooks (might be renamed). Defaults to 50KB | 149 | | server.env.max_retry_seconds | int | `7200` | | 150 | | server.env.metrics.enabled | bool | `false` | | 151 | | server.env.metrics.metrics_backend | string | `"prometheus"` | | 152 | | server.env.metrics.prometheus_metrics.sample_time | int | `5` | | 153 | | server.env.pyroscope.enabled | bool | `false` | | 154 | | server.env.pyroscope.password | string | `""` | | 155 | | server.env.pyroscope.profile_id | string | `""` | | 156 | | server.env.pyroscope.url | string | `""` | | 157 | | server.env.pyroscope.username | string | `""` | | 158 | | server.env.retention_policy.enabled | bool | `false` | | 159 | | server.env.retention_policy.policy | string | `"720h"` | | 160 | | server.env.sign_up_enabled | bool | `false` | | 161 | | server.env.storage.enabled | bool | `false` | | 162 | | server.env.storage.on_prem.path | string | `""` | | 163 | | server.env.storage.s3.accessKey | string | `""` | | 164 | | server.env.storage.s3.bucket | string | `""` | | 165 | | server.env.storage.s3.endpoint | string | `""` | | 166 | | server.env.storage.s3.prefix | string | `""` | | 167 | | server.env.storage.s3.region | string | `""` | | 168 | | server.env.storage.s3.secret | string | `""` | If this secret parameter is not empty, secretKey value will be ignored. The password in the secret should be in the 'secretKey' key | 169 | | server.env.storage.s3.secretKey | string | `""` | Ignored in case of secret parameter with non-empty value | 170 | | server.env.storage.s3.session_token | string | `""` | | 171 | | server.env.storage.type | string | `""` | | 172 | | server.image.pullPolicy | string | `"IfNotPresent"` | Pull policy for the server image | 173 | | server.image.repository | string | `"getconvoy/convoy"` | Repository to be used by the server. The latest tag is used by default | 174 | | server.ingress.annotations | object | `{}` | | 175 | | server.ingress.enabled | bool | `true` | Enable ingress for the server | 176 | | server.ingress.hosts[0].host | string | `"test.com"` | | 177 | | server.ingress.hosts[0].http.paths[0].path | string | `"/"` | | 178 | | server.ingress.hosts[0].http.paths[0].pathType | string | `"Prefix"` | | 179 | | server.ingress.ingressClassName | string | `""` | | 180 | | server.ingress.tls[0].hosts[0] | string | `"test.com"` | | 181 | | server.ingress.tls[0].secretName | string | `"test-tls-secret"` | | 182 | | server.podDisruptionBudget | object | `{}` | | 183 | | server.service.port | int | `80` | Port for the server service | 184 | | server.service.type | string | `"ClusterIP"` | Type of service for the server | 185 | 186 | ---------------------------------------------- 187 | Autogenerated from chart metadata using [helm-docs v1.14.2](https://github.com/norwoodj/helm-docs/releases/v1.14.2) 188 | -------------------------------------------------------------------------------- /artifacthub-repo.yml: -------------------------------------------------------------------------------- 1 | # Artifact Hub repository metadata file 2 | # 3 | # Some settings like the verified publisher flag or the ignored packages won't 4 | # be applied until the next time the repository is processed. Please keep in 5 | # mind that the repository won't be processed if it has not changed since the 6 | # last time it was processed. Depending on the repository kind, this is checked 7 | # in a different way. For Helm http based repositories, we consider it has 8 | # changed if the `index.yaml` file changes. For git based repositories, it does 9 | # when the hash of the last commit in the branch you set up changes. This does 10 | # NOT apply to ownership claim operations, which are processed immediately. 11 | # 12 | repositoryID: b0025483-2f00-4d0c-a3d1-49adfa229274 13 | owners: 14 | - name: Raymond Tukpe 15 | email: raymond@frain.dev 16 | - name: Convoy engineering 17 | email: engineering@getcoonvoy.io -------------------------------------------------------------------------------- /charts/agent/.helmignore: -------------------------------------------------------------------------------- 1 | # Patterns to ignore when building packages. 2 | # This supports shell glob matching, relative path matching, and 3 | # negation (prefixed with !). Only one pattern per line. 4 | .DS_Store 5 | # Common VCS dirs 6 | .git/ 7 | .gitignore 8 | .bzr/ 9 | .bzrignore 10 | .hg/ 11 | .hgignore 12 | .svn/ 13 | # Common backup files 14 | *.swp 15 | *.bak 16 | *.tmp 17 | *.orig 18 | *~ 19 | # Various IDEs 20 | .project 21 | .idea/ 22 | *.tmproj 23 | .vscode/ 24 | -------------------------------------------------------------------------------- /charts/agent/Chart.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v2 2 | name: agent 3 | description: Convoy Agent Chart 4 | 5 | 6 | type: application 7 | 8 | 9 | version: "3.3.0" 10 | 11 | 12 | appVersion: "v25.2.2" 13 | -------------------------------------------------------------------------------- /charts/agent/templates/_helpers.tpl: -------------------------------------------------------------------------------- 1 | {{/* 2 | Expand the name of the chart. 3 | */}} 4 | {{- define "convoy-agent.name" -}} 5 | {{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} 6 | {{- end }} 7 | 8 | {{/* 9 | Create a default fully qualified app name. 10 | We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). 11 | If release name contains chart name it will be used as a full name. 12 | */}} 13 | {{- define "convoy-agent.fullname" -}} 14 | {{- if .Values.fullNameOverride }} 15 | {{- .Values.fullNameOverride | trunc 63 | trimSuffix "-" }} 16 | {{- else }} 17 | {{- $name := default .Chart.Name .Values.nameOverride }} 18 | {{- if contains $name .Release.Name }} 19 | {{- .Release.Name | trunc 63 | trimSuffix "-" }} 20 | {{- else }} 21 | {{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} 22 | {{- end }} 23 | {{- end }} 24 | {{- end }} 25 | 26 | {{/* 27 | Create chart name and version as used by the chart label. 28 | */}} 29 | {{- define "convoy-agent.chart" -}} 30 | {{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} 31 | {{- end }} 32 | 33 | {{/* 34 | Common labels 35 | */}} 36 | {{- define "convoy-agent.labels" -}} 37 | helm.sh/chart: {{ include "convoy-agent.chart" . }} 38 | {{ include "convoy-agent.selectorLabels" . }} 39 | {{- if .Chart.AppVersion }} 40 | app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} 41 | {{- end }} 42 | app.kubernetes.io/managed-by: {{ .Release.Service }} 43 | {{- end }} 44 | 45 | {{/* 46 | Selector labels 47 | */}} 48 | {{- define "convoy-agent.selectorLabels" -}} 49 | app.kubernetes.io/name: {{ include "convoy-agent.name" . }} 50 | app.kubernetes.io/instance: {{ .Release.Name }} 51 | {{- end }} 52 | -------------------------------------------------------------------------------- /charts/agent/templates/cacert-secret.yaml: -------------------------------------------------------------------------------- 1 | {{- if and .Values.global.convoy.cacert_content (not .Values.global.convoy.cacert_secret_name) }} 2 | apiVersion: v1 3 | kind: Secret 4 | metadata: 5 | name: {{ include "convoy-agent.fullname" . }}-cacert 6 | labels: 7 | app.kubernetes.io/name: {{ include "convoy-agent.name" . }} 8 | helm.sh/chart: {{ include "convoy-agent.chart" . }} 9 | app.kubernetes.io/instance: {{ .Release.Name }} 10 | app.kubernetes.io/managed-by: {{ .Release.Service }} 11 | type: Opaque 12 | data: 13 | ca.crt: {{ .Values.global.convoy.cacert_content | b64enc | quote }} 14 | {{- end }} -------------------------------------------------------------------------------- /charts/agent/templates/deployment.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: {{ include "convoy-agent.fullname" . }} 5 | labels: 6 | app.kubernetes.io/name: {{ include "convoy-agent.name" . }} 7 | helm.sh/chart: {{ include "convoy-agent.chart" . }} 8 | app.kubernetes.io/instance: {{ .Release.Name }} 9 | app.kubernetes.io/managed-by: {{ .Release.Service }} 10 | spec: 11 | replicas: {{ .Values.app.replicaCount }} 12 | selector: 13 | matchLabels: 14 | app.kubernetes.io/name: {{ include "convoy-agent.name" . }} 15 | app.kubernetes.io/instance: {{ .Release.Name }} 16 | template: 17 | metadata: 18 | annotations: 19 | {{- with .Values.app.podAnnotations }} 20 | {{- tpl (toYaml . ) $ | nindent 8 }} 21 | {{- end }} 22 | updatedAt: {{ now | quote }} 23 | labels: 24 | app.kubernetes.io/name: {{ include "convoy-agent.name" . }} 25 | app.kubernetes.io/instance: {{ .Release.Name }} 26 | spec: 27 | {{- if or .Values.global.convoy.cacert_secret_name .Values.global.convoy.cacert_content }} 28 | volumes: 29 | - name: convoy-cacert 30 | secret: 31 | secretName: {{ if .Values.global.convoy.cacert_secret_name }}{{ .Values.global.convoy.cacert_secret_name }}{{ else }}{{ include "convoy-agent.fullname" . }}-cacert{{ end }} 32 | items: 33 | - key: ca.crt 34 | path: ca.crt 35 | {{- end }} 36 | initContainers: 37 | - name: wait-for-migrate 38 | image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" 39 | env: 40 | {{- if .Values.global.externalDatabase.enabled }} 41 | - name: CONVOY_DB_SCHEME 42 | value: postgresql 43 | - name: CONVOY_DB_HOST 44 | value: {{ .Values.global.externalDatabase.host | quote }} 45 | - name: CONVOY_DB_PORT 46 | value: {{ .Values.global.externalDatabase.port | quote }} 47 | - name: CONVOY_DB_USERNAME 48 | value: {{ .Values.global.externalDatabase.username | quote }} 49 | {{- if ne .Values.global.externalDatabase.secret "" }} 50 | - name: CONVOY_DB_PASSWORD 51 | valueFrom: 52 | secretKeyRef: 53 | name: "{{ .Values.global.externalDatabase.secret }}" 54 | key: password 55 | {{- else }} 56 | - name: CONVOY_DB_PASSWORD 57 | value: {{ .Values.global.externalDatabase.password | quote }} 58 | {{- end }} 59 | - name: CONVOY_DB_DATABASE 60 | value: {{ .Values.global.externalDatabase.database | quote }} 61 | - name: CONVOY_DB_OPTIONS 62 | value: {{ .Values.global.externalDatabase.options | quote }} 63 | {{- end }} 64 | command: [ "/cmd" ] 65 | args: [ "migrate", "up" ] 66 | 67 | containers: 68 | - name: {{ .Chart.Name }} 69 | image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" 70 | imagePullPolicy: {{ .Values.image.pullPolicy }} 71 | command: ["/cmd"] 72 | args: ["agent"] 73 | ports: 74 | - name: http 75 | containerPort: {{ .Values.app.port }} 76 | protocol: TCP 77 | env: 78 | - name: SERVICE_NAME 79 | value: {{ .Chart.Name }} 80 | - name: PORT 81 | value: {{ .Values.app.port | quote }} 82 | - name: HTTP_PROXY 83 | value: {{ .Values.env.proxy | quote }} 84 | - name: CONVOY_LOGGER_LEVEL 85 | value: {{ .Values.env.log_level | quote }} 86 | - name: CONVOY_ENV 87 | value: {{ .Values.env.environment | quote }} 88 | - name: CONVOY_SIGNUP_ENABLED 89 | value: {{ .Values.env.sign_up_enabled | quote }} 90 | {{- if or .Values.global.convoy.cacert_secret_name .Values.global.convoy.cacert_content }} 91 | - name: CONVOY_DISPATCHER_CACERT_PATH 92 | value: "/etc/convoy/ca.crt" 93 | {{- end }} 94 | 95 | {{- if .Values.global.externalDatabase.enabled }} 96 | - name: CONVOY_DB_SCHEME 97 | value: postgresql 98 | - name: CONVOY_DB_HOST 99 | value: {{ .Values.global.externalDatabase.host | quote }} 100 | - name: CONVOY_DB_PORT 101 | value: {{ .Values.global.externalDatabase.port | quote }} 102 | - name: CONVOY_DB_USERNAME 103 | value: {{ .Values.global.externalDatabase.username | quote }} 104 | {{- if ne .Values.global.externalDatabase.secret "" }} 105 | - name: CONVOY_DB_PASSWORD 106 | valueFrom: 107 | secretKeyRef: 108 | name: "{{ .Values.global.externalDatabase.secret }}" 109 | key: password 110 | {{- else }} 111 | - name: CONVOY_DB_PASSWORD 112 | value: {{ .Values.global.externalDatabase.password | quote }} 113 | {{- end }} 114 | - name: CONVOY_DB_DATABASE 115 | value: {{ .Values.global.externalDatabase.database | quote }} 116 | - name: CONVOY_DB_OPTIONS 117 | value: {{ .Values.global.externalDatabase.options | quote }} 118 | {{- end }} 119 | 120 | {{- if .Values.global.nativeRedis.enabled }} 121 | - name: CONVOY_REDIS_HOST 122 | value: {{ .Values.global.nativeRedis.host | quote }} 123 | {{- if ne .Values.global.nativeRedis.secret "" }} 124 | - name: CONVOY_REDIS_PASSWORD 125 | valueFrom: 126 | secretKeyRef: 127 | name: "{{ .Values.global.nativeRedis.secret }}" 128 | key: password 129 | {{- else }} 130 | - name: CONVOY_REDIS_PASSWORD 131 | value: {{ .Values.global.nativeRedis.password | quote }} 132 | {{- end }} 133 | - name: CONVOY_REDIS_PORT 134 | value: {{ .Values.global.nativeRedis.port | quote }} 135 | - name : CONVOY_REDIS_TYPE 136 | value: "NATIVE" 137 | {{- end }} 138 | 139 | {{- if .Values.global.externalRedis.enabled }} 140 | {{- if .Values.global.externalRedis.addresses }} 141 | - name: CONVOY_REDIS_CLUSTER_ADDRESSES 142 | value: {{ .Values.global.externalRedis.addresses | quote }} 143 | {{- else }} 144 | - name: CONVOY_REDIS_TYPE 145 | value: "EXTERNAL" 146 | - name: CONVOY_REDIS_HOST 147 | value: {{ .Values.global.externalRedis.host | quote }} 148 | {{- if ne .Values.global.externalRedis.secret "" }} 149 | - name: CONVOY_REDIS_PASSWORD 150 | valueFrom: 151 | secretKeyRef: 152 | name: "{{ .Values.global.externalRedis.secret }}" 153 | key: password 154 | {{- else }} 155 | - name: CONVOY_REDIS_PASSWORD 156 | value: {{ .Values.global.externalRedis.password | quote }} 157 | {{- end }} 158 | - name : CONVOY_REDIS_PORT 159 | value: {{ .Values.global.externalRedis.port | quote }} 160 | - name: CONVOY_REDIS_SCHEME 161 | value: {{ .Values.global.externalRedis.scheme | quote }} 162 | - name : CONVOY_REDIS_USERNAME 163 | value: {{ .Values.global.externalRedis.username | quote }} 164 | - name: CONVOY_REDIS_DATABASE 165 | value: {{ .Values.global.externalRedis.database | quote }} 166 | {{- end }} 167 | {{- end }} 168 | 169 | {{- if .Values.env.smtp.enabled }} 170 | - name: CONVOY_SMTP_URL 171 | value: {{ .Values.env.smtp.url | quote }} 172 | - name: CONVOY_SMTP_USERNAME 173 | value: {{ .Values.env.smtp.username | quote }} 174 | {{- if ne .Values.env.smtp.secret "" }} 175 | - name: CONVOY_SMTP_PASSWORD 176 | valueFrom: 177 | secretKeyRef: 178 | name: "{{ .Values.env.smtp.secret }}" 179 | key: password 180 | {{- else }} 181 | - name: CONVOY_SMTP_PASSWORD 182 | value: {{ .Values.env.smtp.password | quote }} 183 | {{- end }} 184 | - name: CONVOY_SMTP_FROM 185 | value: {{ .Values.env.smtp.from | quote }} 186 | - name: CONVOY_SMTP_PORT 187 | value: {{ .Values.env.smtp.port | quote }} 188 | - name: CONVOY_SMTP_REPLY_TO 189 | value: {{ .Values.env.smtp.from | quote }} 190 | - name: CONVOY_SMTP_PROVIDER 191 | value: {{ .Values.env.smtp.provider | quote }} 192 | - name: CONVOY_SMTP_SSL 193 | value: {{ .Values.env.smtp.ssl }} 194 | - name: CONVOY_SMTP_REPLY_TO 195 | value: {{ .Values.env.smtp.reply_to | quote }} 196 | {{- end }} 197 | 198 | 199 | {{- if .Values.env.tracer.enabled }} 200 | - name: CONVOY_TRACER_PROVIDER 201 | value: {{ .Values.env.tracer.type | quote }} 202 | - name: CONVOY_OTEL_SAMPLE_RATE 203 | value: {{ .Values.env.tracer.otel.sample_rate | quote }} 204 | - name: CONVOY_OTEL_COLLECTOR_URL 205 | value: {{ .Values.env.tracer.otel.collector_url | quote }} 206 | - name: CONVOY_OTEL_AUTH_HEADER_NAME 207 | value: {{ .Values.env.tracer.otel.otel_auth.header_name | quote }} 208 | - name: CONVOY_OTEL_AUTH_HEADER_VALUE 209 | value: {{ .Values.env.tracer.otel.otel_auth.header_value | quote }} 210 | - name: CONVOY_OTEL_INSECURE_SKIP_VERIFY 211 | value: {{ .Values.env.tracer.otel.insecure_skip_verify | quote }} 212 | - name: CONVOY_SENTRY_DSN 213 | value: {{ .Values.env.tracer.sentry.dsn | quote }} 214 | {{- end }} 215 | 216 | {{- if .Values.env.storage.enabled }} 217 | - name: CONVOY_STORAGE_POLICY_TYPE 218 | value: {{ .Values.env.storage.type | quote }} 219 | 220 | {{- if eq .Values.env.storage.type "on_prem"}} 221 | - name: CONVOY_STORAGE_PREM_PATH 222 | value: {{ .Values.env.storage.on_prem.path | quote }} 223 | {{- end }} 224 | 225 | {{- if eq .Values.env.storage.type "s3" }} 226 | - name: CONVOY_STORAGE_AWS_BUCKET 227 | value: {{ .Values.env.storage.s3.bucket | quote }} 228 | - name: CONVOY_STORAGE_AWS_ACCESS_KEY 229 | value: {{ .Values.env.storage.s3.accessKey | quote }} 230 | {{- if ne .Values.env.storage.s3.secret "" }} 231 | - name: CONVOY_STORAGE_AWS_SECRET_KEY 232 | valueFrom: 233 | secretKeyRef: 234 | name: "{{ .Values.env.storage.s3.secret }}" 235 | key: secretKey 236 | {{- else }} 237 | - name: CONVOY_STORAGE_AWS_SECRET_KEY 238 | value: {{ .Values.env.storage.s3.secretKey | quote }} 239 | {{- end }} 240 | - name: CONVOY_STORAGE_AWS_REGION 241 | value: {{ .Values.env.storage.s3.region | quote }} 242 | - name: CONVOY_STORAGE_AWS_SESSION_TOKEN 243 | value: {{ .Values.env.storage.s3.session_token | quote }} 244 | - name: CONVOY_STORAGE_AWS_ENDPOINT 245 | value: {{ .Values.env.storage.s3.endpoint | quote }} 246 | - name: CONVOY_STORAGE_AWS_PREFIX 247 | value: {{ .Values.env.storage.s3.prefix | quote }} 248 | {{- end }} 249 | {{- end }} 250 | 251 | - name: CONVOY_INSTANCE_INGEST_RATE 252 | value: {{ .Values.env.instance_ingest_rate | quote }} 253 | - name: CONVOY_ANALYTICS_ENABLED 254 | value: {{ .Values.env.analytics_enabled | quote }} 255 | - name: CONVOY_ENABLE_PROFILING 256 | value: {{ .Values.env.enable_profiling | quote }} 257 | 258 | {{- if .Values.env.metrics.enabled }} 259 | - name: CONVOY_METRICS_ENABLED 260 | value: {{ .Values.env.metrics.enabled | quote }} 261 | - name: CONVOY_METRICS_BACKEND 262 | value: {{ .Values.env.metrics.metrics_backend | quote }} 263 | - name: CONVOY_METRICS_SAMPLE_TIME 264 | value: {{ .Values.env.metrics.prometheus_metrics.sample_time | quote }} 265 | {{- end }} 266 | 267 | {{- if .Values.env.pyroscope.enabled }} 268 | - name: CONVOY_ENABLE_PYROSCOPE_PROFILING 269 | value: {{ .Values.env.pyroscope.enabled | quote }} 270 | - name: CONVOY_PYROSCOPE_URL 271 | value: {{ .Values.env.pyroscope.url | quote }} 272 | - name: CONVOY_PYROSCOPE_USERNAME 273 | value: {{ .Values.env.pyroscope.username | quote }} 274 | - name: CONVOY_PYROSCOPE_PASSWORD 275 | value: {{ .Values.env.pyroscope.password | quote }} 276 | - name: CONVOY_PYROSCOPE_PROFILE_ID 277 | value: {{ .Values.env.pyroscope.profile_id | quote }} 278 | {{- end }} 279 | 280 | {{- if .Values.env.retention_policy.enabled }} 281 | - name: CONVOY_RETENTION_POLICY 282 | value: {{ .Values.env.retention_policy.policy | quote }} 283 | - name: CONVOY_RETENTION_POLICY_ENABLED 284 | value: {{ .Values.env.retention_policy.enabled | quote }} 285 | {{- end}} 286 | 287 | - name: CONVOY_LICENSE_KEY 288 | value: {{ .Values.env.license_key | quote }} 289 | - name: CONVOY_ENABLE_FEATURE_FLAG 290 | value: {{ .Values.env.enable_feature_flag | quote }} 291 | - name: CONVOY_CONSUMER_POOL_SIZE 292 | value: {{ .Values.env.consumer_pool_size | quote }} 293 | - name: CONVOY_WORKER_EXECUTION_MODE 294 | value: {{ .Values.env.worker_execution_mode | quote }} 295 | - name: CONVOY_MAX_RETRY_SECONDS 296 | value: {{ .Values.env.max_retry_seconds | quote }} 297 | - name: CONVOY_DISPATCHER_INSECURE_SKIP_VERIFY 298 | value: {{ .Values.env.dispatcher.insecure_skip_verify | quote }} 299 | - name: CONVOY_DISPATCHER_ALLOW_LIST 300 | value: {{ .Values.env.dispatcher.allow_list | quote }} 301 | - name: CONVOY_DISPATCHER_DENY_LIST 302 | value: {{ .Values.env.dispatcher.deny_list | quote }} 303 | livenessProbe: 304 | httpGet: 305 | path: /health 306 | port: http 307 | initialDelaySeconds: 30 308 | readinessProbe: 309 | httpGet: 310 | path: /health 311 | port: http 312 | initialDelaySeconds: 30 313 | resources: 314 | {{- toYaml .Values.app.resources | nindent 12 }} 315 | volumeMounts: 316 | {{- if or .Values.global.convoy.cacert_secret_name .Values.global.convoy.cacert_content }} 317 | - name: convoy-cacert 318 | mountPath: /etc/convoy 319 | readOnly: true 320 | {{- end }} 321 | {{- with .Values.nodeSelector }} 322 | nodeSelector: 323 | {{- toYaml . | nindent 8 }} 324 | {{- end }} 325 | {{- with .Values.affinity }} 326 | affinity: 327 | {{- toYaml . | nindent 8 }} 328 | {{- end }} 329 | {{- with .Values.tolerations }} 330 | tolerations: 331 | {{- toYaml . | nindent 8 }} 332 | {{- end }} 333 | -------------------------------------------------------------------------------- /charts/agent/templates/hpa.yaml: -------------------------------------------------------------------------------- 1 | {{- if .Values.autoscaling.enabled }} 2 | apiVersion: autoscaling/v2 3 | kind: HorizontalPodAutoscaler 4 | metadata: 5 | name: {{ include "convoy-agent.fullname" . }} 6 | labels: 7 | {{- include "convoy-agent.labels" . | nindent 4 }} 8 | spec: 9 | scaleTargetRef: 10 | apiVersion: apps/v1 11 | kind: Deployment 12 | name: {{ include "convoy-agent.fullname" . }} 13 | minReplicas: {{ .Values.autoscaling.minReplicas }} 14 | maxReplicas: {{ .Values.autoscaling.maxReplicas }} 15 | metrics: 16 | {{- if .Values.autoscaling.targetCPUUtilizationPercentage }} 17 | - type: Resource 18 | resource: 19 | name: cpu 20 | target: 21 | type: "Utilization" 22 | averageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }} 23 | {{- end }} 24 | {{- if .Values.autoscaling.targetMemoryUtilizationPercentage }} 25 | - type: Resource 26 | resource: 27 | name: memory 28 | target: 29 | type: "Utilization" 30 | averageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }} 31 | {{- end }} 32 | {{- end }} 33 | -------------------------------------------------------------------------------- /charts/agent/templates/poddisruptionbudget.yaml: -------------------------------------------------------------------------------- 1 | {{- if .Values.podDisruptionBudget -}} 2 | {{- if .Capabilities.APIVersions.Has "policy/v1" }} 3 | apiVersion: policy/v1 4 | {{- else }} 5 | apiVersion: policy/v1 6 | {{- end }} 7 | kind: PodDisruptionBudget 8 | metadata: 9 | name: {{ include "convoy-agent.fullname" . }} 10 | labels: 11 | {{- include "convoy-agent.labels" . | nindent 4 }} 12 | spec: 13 | selector: 14 | matchLabels: 15 | {{- include "convoy-agent.selectorLabels" . | nindent 6 }} 16 | {{- toYaml .Values.podDisruptionBudget | nindent 2 }} 17 | {{- end -}} -------------------------------------------------------------------------------- /charts/agent/templates/service.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | name: {{ include "convoy-agent.fullname" . }} 5 | labels: {{ include "convoy-agent.labels" . | nindent 4 }} 6 | spec: 7 | type: {{ .Values.service.type }} 8 | ports: 9 | - port: {{ .Values.service.port }} 10 | targetPort: http 11 | protocol: TCP 12 | name: http 13 | selector: {{ include "convoy-agent.selectorLabels" . | nindent 4 }} 14 | -------------------------------------------------------------------------------- /charts/agent/templates/tests/test-connection.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Pod 3 | metadata: 4 | name: "{{ include "convoy-agent.fullname" . }}-test-connection" 5 | labels: 6 | {{- include "convoy-agent.labels" . | nindent 4 }} 7 | annotations: 8 | "helm.sh/hook": test 9 | spec: 10 | containers: 11 | - name: wget 12 | image: busybox 13 | command: ['wget'] 14 | args: ['{{ include "convoy-agent.fullname" . }}:{{ .Values.service.port }}/health'] 15 | restartPolicy: Never 16 | -------------------------------------------------------------------------------- /charts/agent/values.yaml: -------------------------------------------------------------------------------- 1 | # Default values for convoy agent. 2 | # This is a YAML-formatted file. 3 | # Declare variables to be passed into your templates. 4 | 5 | app: 6 | replicaCount: 1 7 | port: 5008 8 | resources: {} 9 | # limits: 10 | # cpu: 1000m 11 | # memory: 2000Mi 12 | # requests: 13 | # cpu: 1000m 14 | # memory: 1000Mi 15 | podAnnotations: 16 | prometheus.io/scrape: "true" 17 | prometheus.io/path: /metrics 18 | prometheus.io/port: "{{ .Values.app.port }}" 19 | 20 | env: 21 | sign_up_enabled: false 22 | environment: "" 23 | proxy: "" 24 | log_level: "error" 25 | smtp: 26 | enabled: true 27 | from: "" 28 | password: "" 29 | port: 0 30 | provider: "" 31 | url: "" 32 | username: "" 33 | ssl: false 34 | reply_to: "" 35 | tracer: 36 | enabled: false 37 | type: "" 38 | otel: 39 | otel_auth: 40 | header_name: "" 41 | header_value: "" 42 | sample_rate: 1 43 | collector_url: "" 44 | insecure_skip_verify: true 45 | sentry: 46 | dsn: "" 47 | pyroscope: 48 | enabled: false 49 | url: "" 50 | username: "" 51 | password: "" 52 | profile_id: "" 53 | enable_feature_flag: [] 54 | retention_policy: 55 | enabled: false 56 | policy: 720h 57 | analytics_enabled: true 58 | storage: 59 | enabled: false 60 | type: "" 61 | on_prem: 62 | path: "" 63 | s3: 64 | bucket: "" 65 | prefix: "" 66 | accessKey: "" 67 | secretKey: "" 68 | region: "" 69 | session_token: "" 70 | endpoint: "" 71 | consumer_pool_size: 100 72 | enable_profiling: false 73 | metrics: 74 | enabled: false 75 | metrics_backend: prometheus 76 | prometheus_metrics: 77 | sample_time: 5 78 | instance_ingest_rate: 100 79 | worker_execution_mode: default 80 | max_retry_seconds: 7200 81 | license_key: "" 82 | dispatcher: 83 | insecure_skip_verify: false 84 | allow_list: ["0.0.0.0/0"] 85 | deny_list: ["127.0.0.1/8", "169.254.169.254/32"] 86 | 87 | # These values serve as defaults for standalone deployment 88 | # When deployed as a subchart, these can be overridden by parent values: 89 | # - global.convoy.image 90 | # - global.convoy.tag 91 | image: 92 | repository: getconvoy/convoy 93 | pullPolicy: Always 94 | tag: v25.2.2 95 | 96 | nameOverride: "convoy-agent" 97 | fullNameOverride: "convoy-agent" 98 | 99 | service: 100 | type: ClusterIP 101 | port: 80 102 | 103 | autoscaling: 104 | enabled: true 105 | minReplicas: 1 106 | maxReplicas: 10 107 | targetCPUUtilizationPercentage: 80 108 | targetMemoryUtilizationPercentage: 80 109 | 110 | # Pod disruption budget 111 | podDisruptionBudget: {} 112 | # maxUnavailable: 1 113 | # minAvailable: 1 114 | 115 | nodeSelector: {} 116 | tolerations: [] 117 | affinity: {} 118 | -------------------------------------------------------------------------------- /charts/server/.helmignore: -------------------------------------------------------------------------------- 1 | # Patterns to ignore when building packages. 2 | # This supports shell glob matching, relative path matching, and 3 | # negation (prefixed with !). Only one pattern per line. 4 | .DS_Store 5 | # Common VCS dirs 6 | .git/ 7 | .gitignore 8 | .bzr/ 9 | .bzrignore 10 | .hg/ 11 | .hgignore 12 | .svn/ 13 | # Common backup files 14 | *.swp 15 | *.bak 16 | *.tmp 17 | *.orig 18 | *~ 19 | # Various IDEs 20 | .project 21 | .idea/ 22 | *.tmproj 23 | .vscode/ 24 | -------------------------------------------------------------------------------- /charts/server/Chart.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v2 2 | name: server 3 | description: Convoy Server Chart 4 | 5 | # A chart can be either an 'application' or a 'library' chart. 6 | # 7 | # Application charts are a collection of templates that can be packaged into versioned archives 8 | # to be deployed. 9 | # 10 | # Library charts provide useful utilities or functions for the chart developer. They're included as 11 | # a dependency of application charts to inject those utilities and functions into the rendering 12 | # pipeline. Library charts do not define any templates and therefore cannot be deployed. 13 | type: application 14 | 15 | # This is the chart version. This version number should be incremented each time you make changes 16 | # to the chart and its templates, including the app version. 17 | # Versions are expected to follow Semantic Versioning (https://semver.org/) 18 | version: "1.0.0" 19 | 20 | # This is the version number of the application being deployed. This version number should be 21 | # incremented each time you make changes to the application. Versions are not expected to 22 | # follow Semantic Versioning. They should reflect the version the application is using. 23 | # It is recommended to use it with quotes. 24 | appVersion: "v25.2.2" 25 | -------------------------------------------------------------------------------- /charts/server/templates/NOTES.txt: -------------------------------------------------------------------------------- 1 | 1. Get the application URL by running these commands: 2 | {{- if .Values.ingress.enabled }} 3 | {{- range $host := .Values.ingress.hosts }} 4 | {{- range .paths }} 5 | http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ .path }} 6 | {{- end }} 7 | {{- end }} 8 | {{- else if contains "NodePort" .Values.service.type }} 9 | export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "convoy-server.fullname" . }}) 10 | export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") 11 | echo http://$NODE_IP:$NODE_PORT 12 | {{- else if contains "LoadBalancer" .Values.service.type }} 13 | NOTE: It may take a few minutes for the LoadBalancer IP to be available. 14 | You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "convoy-server.fullname" . }}' 15 | export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "convoy-server.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}") 16 | echo http://$SERVICE_IP:{{ .Values.service.port }} 17 | {{- else if contains "ClusterIP" .Values.service.type }} 18 | export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "convoy-server.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") 19 | export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}") 20 | echo "Visit http://127.0.0.1:8080 to use your application" 21 | kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:$CONTAINER_PORT 22 | {{- end }} 23 | -------------------------------------------------------------------------------- /charts/server/templates/_helpers.tpl: -------------------------------------------------------------------------------- 1 | {{/* 2 | Expand the name of the chart. 3 | */}} 4 | {{- define "convoy-server.name" -}} 5 | {{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} 6 | {{- end }} 7 | 8 | {{/* 9 | Create a default fully qualified app name. 10 | We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). 11 | If release name contains chart name it will be used as a full name. 12 | */}} 13 | {{- define "convoy-server.fullname" -}} 14 | {{- if .Values.fullNameOverride }} 15 | {{- .Values.fullNameOverride | trunc 63 | trimSuffix "-" }} 16 | {{- else }} 17 | {{- $name := default .Chart.Name .Values.nameOverride }} 18 | {{- if contains $name .Release.Name }} 19 | {{- .Release.Name | trunc 63 | trimSuffix "-" }} 20 | {{- else }} 21 | {{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} 22 | {{- end }} 23 | {{- end }} 24 | {{- end }} 25 | 26 | {{/* 27 | Create chart name and version as used by the chart label. 28 | */}} 29 | {{- define "convoy-server.chart" -}} 30 | {{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} 31 | {{- end }} 32 | 33 | {{/* 34 | Common labels 35 | */}} 36 | {{- define "convoy-server.labels" -}} 37 | helm.sh/chart: {{ include "convoy-server.chart" . }} 38 | {{ include "convoy-server.selectorLabels" . }} 39 | {{- if .Chart.AppVersion }} 40 | app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} 41 | {{- end }} 42 | app.kubernetes.io/managed-by: {{ .Release.Service }} 43 | {{- end }} 44 | 45 | {{/* 46 | Selector labels 47 | */}} 48 | {{- define "convoy-server.selectorLabels" -}} 49 | app.kubernetes.io/name: {{ include "convoy-server.name" . }} 50 | app.kubernetes.io/instance: {{ .Release.Name }} 51 | {{- end }} 52 | -------------------------------------------------------------------------------- /charts/server/templates/cacert-secret.yaml: -------------------------------------------------------------------------------- 1 | {{- if and .Values.global.convoy.cacert_content (not .Values.global.convoy.cacert_secret_name) }} 2 | apiVersion: v1 3 | kind: Secret 4 | metadata: 5 | name: {{ include "convoy-server.fullname" . }}-cacert 6 | labels: 7 | app.kubernetes.io/name: {{ include "convoy-server.name" . }} 8 | helm.sh/chart: {{ include "convoy-server.chart" . }} 9 | app.kubernetes.io/instance: {{ .Release.Name }} 10 | app.kubernetes.io/managed-by: {{ .Release.Service }} 11 | type: Opaque 12 | data: 13 | ca.crt: {{ .Values.global.convoy.cacert_content | b64enc | quote }} 14 | {{- end }} -------------------------------------------------------------------------------- /charts/server/templates/deployment.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: {{ include "convoy-server.fullname" . }} 5 | labels: 6 | app.kubernetes.io/name: {{ include "convoy-server.name" . }} 7 | helm.sh/chart: {{ include "convoy-server.chart" . }} 8 | app.kubernetes.io/instance: {{ .Release.Name }} 9 | app.kubernetes.io/managed-by: {{ .Release.Service }} 10 | spec: 11 | replicas: {{ .Values.app.replicaCount }} 12 | selector: 13 | matchLabels: 14 | app.kubernetes.io/name: {{ include "convoy-server.name" . }} 15 | app.kubernetes.io/instance: {{ .Release.Name }} 16 | template: 17 | metadata: 18 | annotations: 19 | {{- with .Values.app.podAnnotations }} 20 | {{- tpl (toYaml . ) $ | nindent 8 }} 21 | {{- end }} 22 | updatedAt: {{ now | quote }} 23 | labels: 24 | app.kubernetes.io/name: {{ include "convoy-server.name" . }} 25 | app.kubernetes.io/instance: {{ .Release.Name }} 26 | spec: 27 | {{- if or .Values.global.convoy.cacert_secret_name .Values.global.convoy.cacert_content }} 28 | volumes: 29 | - name: convoy-cacert 30 | secret: 31 | secretName: {{ if .Values.global.convoy.cacert_secret_name }}{{ .Values.global.convoy.cacert_secret_name }}{{ else }}{{ include "convoy-server.fullname" . }}-cacert{{ end }} 32 | items: 33 | - key: ca.crt 34 | path: ca.crt 35 | {{- end }} 36 | initContainers: 37 | - name: wait-for-migrate 38 | image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" 39 | env: 40 | {{- if .Values.global.externalDatabase.enabled }} 41 | - name: CONVOY_DB_SCHEME 42 | value: postgresql 43 | - name: CONVOY_DB_HOST 44 | value: {{ .Values.global.externalDatabase.host | quote }} 45 | - name: CONVOY_DB_PORT 46 | value: {{ .Values.global.externalDatabase.port | quote }} 47 | - name: CONVOY_DB_USERNAME 48 | value: {{ .Values.global.externalDatabase.username | quote }} 49 | {{- if ne .Values.global.externalDatabase.secret "" }} 50 | - name: CONVOY_DB_PASSWORD 51 | valueFrom: 52 | secretKeyRef: 53 | name: "{{ .Values.global.externalDatabase.secret }}" 54 | key: password 55 | {{- else }} 56 | - name: CONVOY_DB_PASSWORD 57 | value: {{ .Values.global.externalDatabase.password | quote }} 58 | {{- end }} 59 | - name: CONVOY_DB_DATABASE 60 | value: {{ .Values.global.externalDatabase.database | quote }} 61 | - name: CONVOY_DB_OPTIONS 62 | value: {{ .Values.global.externalDatabase.options | quote }} 63 | {{- end }} 64 | command: [ "/cmd" ] 65 | args: [ "migrate", "up" ] 66 | 67 | containers: 68 | - name: {{ .Chart.Name }} 69 | image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" 70 | imagePullPolicy: {{ .Values.image.pullPolicy }} 71 | 72 | command: ["/cmd"] 73 | args: ["server"] 74 | ports: 75 | - name: http 76 | containerPort: {{ .Values.app.port }} 77 | protocol: TCP 78 | env: 79 | - name: SERVICE_NAME 80 | value: {{ .Chart.Name }} 81 | - name: PORT 82 | value: {{ .Values.app.port | quote }} 83 | - name: CONVOY_ENV 84 | value: {{ .Values.env.environment | quote }} 85 | - name: CONVOY_HOST 86 | value: {{ .Values.env.host | quote }} 87 | - name: CONVOY_LOGGER_LEVEL 88 | value: {{ .Values.env.log_level | quote }} 89 | - name: CONVOY_SIGNUP_ENABLED 90 | value: {{ .Values.env.sign_up_enabled | quote }} 91 | - name: CONVOY_MAX_RESPONSE_SIZE 92 | value: {{ .Values.env.max_response_size | quote }} 93 | {{- if or .Values.global.convoy.cacert_secret_name .Values.global.convoy.cacert_content }} 94 | - name: CONVOY_DISPATCHER_CACERT_PATH 95 | value: "/etc/convoy/ca.crt" 96 | {{- end }} 97 | {{- if .Values.global.convoy.jwt_secret_name }} 98 | - name: CONVOY_JWT_SECRET 99 | valueFrom: 100 | secretKeyRef: 101 | name: "{{ .Values.global.convoy.jwt_secret_name }}" 102 | key: jwt_secret 103 | - name: CONVOY_JWT_REFRESH_SECRET 104 | valueFrom: 105 | secretKeyRef: 106 | name: "{{ .Values.global.convoy.jwt_secret_name }}" 107 | key: jwt_refresh_secret 108 | {{- else if or .Values.global.convoy.jwt_secret .Values.global.convoy.jwt_refresh_secret }} 109 | - name: CONVOY_JWT_SECRET 110 | valueFrom: 111 | secretKeyRef: 112 | name: "{{ include "convoy-server.fullname" . }}-jwt" 113 | key: jwt_secret 114 | - name: CONVOY_JWT_REFRESH_SECRET 115 | valueFrom: 116 | secretKeyRef: 117 | name: "{{ include "convoy-server.fullname" . }}-jwt" 118 | key: jwt_refresh_secret 119 | {{- else }} 120 | - name: CONVOY_JWT_SECRET 121 | value: {{ .Values.env.auth.jwt.secret | quote }} 122 | - name: CONVOY_JWT_REFRESH_SECRET 123 | value: {{ .Values.env.auth.jwt.refresh_secret | quote }} 124 | {{- end }} 125 | - name: CONVOY_JWT_REALM_ENABLED 126 | value: {{ .Values.env.auth.jwt.enabled | quote }} 127 | 128 | {{- if .Values.global.externalDatabase.enabled }} 129 | - name: CONVOY_DB_SCHEME 130 | value: postgresql 131 | - name: CONVOY_DB_HOST 132 | value: {{ .Values.global.externalDatabase.host | quote }} 133 | - name: CONVOY_DB_PORT 134 | value: {{ .Values.global.externalDatabase.port | quote }} 135 | - name: CONVOY_DB_USERNAME 136 | value: {{ .Values.global.externalDatabase.username | quote }} 137 | {{- if ne .Values.global.externalDatabase.secret "" }} 138 | - name: CONVOY_DB_PASSWORD 139 | valueFrom: 140 | secretKeyRef: 141 | name: "{{ .Values.global.externalDatabase.secret }}" 142 | key: password 143 | {{- else }} 144 | - name: CONVOY_DB_PASSWORD 145 | value: {{ .Values.global.externalDatabase.password | quote }} 146 | {{- end }} 147 | - name: CONVOY_DB_DATABASE 148 | value: {{ .Values.global.externalDatabase.database | quote }} 149 | - name: CONVOY_DB_OPTIONS 150 | value: {{ .Values.global.externalDatabase.options | quote }} 151 | {{- end }} 152 | 153 | {{- if .Values.global.nativeRedis.enabled }} 154 | - name: CONVOY_REDIS_HOST 155 | value: {{ .Values.global.nativeRedis.host | quote }} 156 | {{- if ne .Values.global.nativeRedis.secret "" }} 157 | - name: CONVOY_REDIS_PASSWORD 158 | valueFrom: 159 | secretKeyRef: 160 | name: "{{ .Values.global.nativeRedis.secret }}" 161 | key: password 162 | {{- else }} 163 | - name: CONVOY_REDIS_PASSWORD 164 | value: {{ .Values.global.nativeRedis.password | quote }} 165 | {{- end }} 166 | - name: CONVOY_REDIS_PORT 167 | value: {{ .Values.global.nativeRedis.port | quote }} 168 | - name: CONVOY_REDIS_TYPE 169 | value: "NATIVE" 170 | {{- end }} 171 | 172 | {{- if .Values.global.externalRedis.enabled }} 173 | {{- if .Values.global.externalRedis.addresses }} 174 | - name: CONVOY_REDIS_CLUSTER_ADDRESSES 175 | value: {{ .Values.global.externalRedis.addresses | quote }} 176 | {{- else }} 177 | - name: CONVOY_REDIS_TYPE 178 | value: "EXTERNAL" 179 | - name: CONVOY_REDIS_HOST 180 | value: {{ .Values.global.externalRedis.host | quote }} 181 | {{- if ne .Values.global.externalRedis.secret "" }} 182 | - name: CONVOY_REDIS_PASSWORD 183 | valueFrom: 184 | secretKeyRef: 185 | name: "{{ .Values.global.externalRedis.secret }}" 186 | key: password 187 | {{- else }} 188 | - name: CONVOY_REDIS_PASSWORD 189 | value: {{ .Values.global.externalRedis.password | quote }} 190 | {{- end }} 191 | - name : CONVOY_REDIS_PORT 192 | value: {{ .Values.global.externalRedis.port | quote }} 193 | - name: CONVOY_REDIS_SCHEME 194 | value: {{ .Values.global.externalRedis.scheme | quote }} 195 | - name : CONVOY_REDIS_USERNAME 196 | value: {{ .Values.global.externalRedis.username | quote }} 197 | - name: CONVOY_REDIS_DATABASE 198 | value: {{ .Values.global.externalRedis.database | quote }} 199 | {{- end }} 200 | {{- end }} 201 | 202 | {{- if .Values.env.tracer.enabled }} 203 | - name: CONVOY_TRACER_PROVIDER 204 | value: {{ .Values.env.tracer.type | quote }} 205 | - name: CONVOY_OTEL_SAMPLE_RATE 206 | value: {{ .Values.env.tracer.otel.sample_rate | quote }} 207 | - name: CONVOY_OTEL_AUTH_HEADER_NAME 208 | value: {{ .Values.env.tracer.otel.otel_auth.header_name | quote }} 209 | - name: CONVOY_OTEL_AUTH_HEADER_VALUE 210 | value: {{ .Values.env.tracer.otel.otel_auth.header_value | quote }} 211 | - name: CONVOY_OTEL_COLLECTOR_URL 212 | value: {{ .Values.env.tracer.otel.collector_url | quote }} 213 | - name: CONVOY_OTEL_INSECURE_SKIP_VERIFY 214 | value: {{ .Values.env.tracer.otel.insecure_skip_verify | quote }} 215 | - name: CONVOY_SENTRY_DSN 216 | value: {{ .Values.env.tracer.sentry.dsn | quote }} 217 | {{- end }} 218 | 219 | - name: CONVOY_INSTANCE_INGEST_RATE 220 | value: {{ .Values.env.instance_ingest_rate | quote }} 221 | - name: CONVOY_ENABLE_FEATURE_FLAG 222 | value: {{ .Values.env.enable_feature_flag | quote }} 223 | - name: CONVOY_ANALYTICS_ENABLED 224 | value: {{ .Values.env.analytics_enabled | quote }} 225 | - name: CONVOY_ENABLE_PROFILING 226 | value: {{ .Values.env.enable_profiling | quote }} 227 | - name: CONVOY_API_VERSION 228 | value: {{ .Values.env.api_version | quote }} 229 | 230 | {{- if .Values.env.storage.enabled }} 231 | - name: CONVOY_STORAGE_POLICY_TYPE 232 | value: {{ .Values.env.storage.type | quote }} 233 | 234 | {{- if eq .Values.env.storage.type "on_prem"}} 235 | - name: CONVOY_STORAGE_PREM_PATH 236 | value: {{ .Values.env.storage.on_prem.path | quote }} 237 | {{- end }} 238 | 239 | {{- if eq .Values.env.storage.type "s3" }} 240 | - name: CONVOY_STORAGE_AWS_BUCKET 241 | value: {{ .Values.env.storage.s3.bucket | quote }} 242 | - name: CONVOY_STORAGE_AWS_ACCESS_KEY 243 | value: {{ .Values.env.storage.s3.accessKey | quote }} 244 | {{- if ne .Values.env.storage.s3.secret "" }} 245 | - name: CONVOY_STORAGE_AWS_SECRET_KEY 246 | valueFrom: 247 | secretKeyRef: 248 | name: "{{ .Values.env.storage.s3.secret }}" 249 | key: secretKey 250 | {{- else }} 251 | - name: CONVOY_STORAGE_AWS_SECRET_KEY 252 | value: {{ .Values.env.storage.s3.secretKey | quote }} 253 | {{- end }} 254 | - name: CONVOY_STORAGE_AWS_REGION 255 | value: {{ .Values.env.storage.s3.region | quote }} 256 | - name: CONVOY_STORAGE_AWS_SESSION_TOKEN 257 | value: {{ .Values.env.storage.s3.session_token | quote }} 258 | - name: CONVOY_STORAGE_AWS_ENDPOINT 259 | value: {{ .Values.env.storage.s3.endpoint | quote }} 260 | {{- end }} 261 | {{- end }} 262 | 263 | {{- if .Values.env.metrics.enabled }} 264 | - name: CONVOY_METRICS_ENABLED 265 | value: {{ .Values.env.metrics.enabled | quote }} 266 | - name: CONVOY_METRICS_BACKEND 267 | value: {{ .Values.env.metrics.metrics_backend | quote }} 268 | - name: CONVOY_METRICS_SAMPLE_TIME 269 | value: {{ .Values.env.metrics.prometheus_metrics.sample_time }} 270 | {{- end }} 271 | 272 | {{- if .Values.env.pyroscope.enabled | quote }} 273 | - name: CONVOY_ENABLE_PYROSCOPE_PROFILING 274 | value: {{ .Values.env.pyroscope.enabled | quote }} 275 | - name: CONVOY_PYROSCOPE_URL 276 | value: {{ .Values.env.pyroscope.url | quote }} 277 | - name: CONVOY_PYROSCOPE_USERNAME 278 | value: {{ .Values.env.pyroscope.username | quote }} 279 | - name: CONVOY_PYROSCOPE_PASSWORD 280 | value: {{ .Values.env.pyroscope.password | quote }} 281 | - name: CONVOY_PYROSCOPE_PROFILE_ID 282 | value: {{ .Values.env.pyroscope.profile_id | quote }} 283 | {{- end }} 284 | {{- if .Values.env.retention_policy.enabled }} 285 | - name: CONVOY_RETENTION_POLICY 286 | value: {{ .Values.env.retention_policy.policy | quote }} 287 | - name: CONVOY_RETENTION_POLICY_ENABLED 288 | value: {{ .Values.env.retention_policy.enabled | quote }} 289 | {{- end}} 290 | 291 | - name: CONVOY_LICENSE_KEY 292 | value: {{ .Values.env.license_key | quote }} 293 | - name: CONVOY_MAX_RETRY_SECONDS 294 | value: {{ .Values.env.max_retry_seconds | quote }} 295 | livenessProbe: 296 | httpGet: 297 | path: /health 298 | port: http 299 | initialDelaySeconds: 30 300 | readinessProbe: 301 | httpGet: 302 | path: /health 303 | port: http 304 | initialDelaySeconds: 30 305 | resources: 306 | {{- toYaml .Values.app.resources | nindent 12 }} 307 | volumeMounts: 308 | {{- if or .Values.global.convoy.cacert_secret_name .Values.global.convoy.cacert_content }} 309 | - name: convoy-cacert 310 | mountPath: /etc/convoy 311 | readOnly: true 312 | {{- end }} 313 | {{- with .Values.nodeSelector }} 314 | nodeSelector: 315 | {{- toYaml . | nindent 8 }} 316 | {{- end }} 317 | {{- with .Values.affinity }} 318 | affinity: 319 | {{- toYaml . | nindent 8 }} 320 | {{- end }} 321 | {{- with .Values.tolerations }} 322 | tolerations: 323 | {{- toYaml . | nindent 8 }} 324 | {{- end }} 325 | -------------------------------------------------------------------------------- /charts/server/templates/hpa.yaml: -------------------------------------------------------------------------------- 1 | {{- if .Values.autoscaling.enabled }} 2 | apiVersion: autoscaling/v2 3 | kind: HorizontalPodAutoscaler 4 | metadata: 5 | name: {{ include "convoy-server.fullname" . }} 6 | labels: 7 | {{- include "convoy-server.labels" . | nindent 4 }} 8 | spec: 9 | scaleTargetRef: 10 | apiVersion: apps/v1 11 | kind: Deployment 12 | name: {{ include "convoy-server.fullname" . }} 13 | minReplicas: {{ .Values.autoscaling.minReplicas }} 14 | maxReplicas: {{ .Values.autoscaling.maxReplicas }} 15 | metrics: 16 | {{- if .Values.autoscaling.targetCPUUtilizationPercentage }} 17 | - type: Resource 18 | resource: 19 | name: cpu 20 | target: 21 | type: "Utilization" 22 | averageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }} 23 | {{- end }} 24 | {{- if .Values.autoscaling.targetMemoryUtilizationPercentage }} 25 | - type: Resource 26 | resource: 27 | name: memory 28 | target: 29 | type: "Utilization" 30 | averageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }} 31 | {{- end }} 32 | {{- end }} 33 | -------------------------------------------------------------------------------- /charts/server/templates/ingress.yaml: -------------------------------------------------------------------------------- 1 | {{- if .Values.ingress.enabled -}} 2 | {{- $fullName := include "convoy-server.fullname" . -}} 3 | {{- $svcPort := .Values.service.port -}} 4 | {{- if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}} 5 | apiVersion: networking.k8s.io/v1 6 | {{- else -}} 7 | apiVersion: apiextensions.k8s.io/v1 8 | {{- end }} 9 | kind: Ingress 10 | metadata: 11 | name: {{ $fullName }} 12 | labels: 13 | {{- include "convoy-server.labels" . | nindent 4 }} 14 | {{- with .Values.ingress.annotations }} 15 | annotations: 16 | {{- toYaml . | nindent 4 }} 17 | {{- end }} 18 | spec: 19 | ingressClassName: {{ .Values.ingress.ingressClassName }} 20 | {{- if .Values.ingress.tls }} 21 | tls: 22 | {{- range .Values.ingress.tls }} 23 | - hosts: 24 | {{- range .hosts }} 25 | - {{ . | quote }} 26 | {{- end }} 27 | secretName: {{ .secretName }} 28 | {{- end }} 29 | {{- end }} 30 | rules: 31 | {{- range .Values.ingress.hosts }} 32 | - host: {{ .host | quote }} 33 | http: 34 | paths: 35 | {{- range .http.paths }} 36 | - path: {{ .path }} 37 | pathType: {{ .pathType }} 38 | backend: 39 | service: 40 | name: {{ $fullName }} 41 | port: 42 | number: {{ $svcPort }} 43 | {{- end }} 44 | {{- end }} 45 | {{- end }} -------------------------------------------------------------------------------- /charts/server/templates/jwt-secret.yaml: -------------------------------------------------------------------------------- 1 | {{- if and (not .Values.global.convoy.jwt_secret_name) (or .Values.global.convoy.jwt_secret .Values.global.convoy.jwt_refresh_secret) }} 2 | apiVersion: v1 3 | kind: Secret 4 | metadata: 5 | name: {{ include "convoy-server.fullname" . }}-jwt 6 | labels: 7 | app.kubernetes.io/name: {{ include "convoy-server.name" . }} 8 | helm.sh/chart: {{ include "convoy-server.chart" . }} 9 | app.kubernetes.io/instance: {{ .Release.Name }} 10 | app.kubernetes.io/managed-by: {{ .Release.Service }} 11 | type: Opaque 12 | data: 13 | jwt_secret: {{ .Values.global.convoy.jwt_secret | default (randAlphaNum 32) | b64enc | quote }} 14 | jwt_refresh_secret: {{ .Values.global.convoy.jwt_refresh_secret | default (randAlphaNum 32) | b64enc | quote }} 15 | {{- end }} -------------------------------------------------------------------------------- /charts/server/templates/poddisruptionbudget.yaml: -------------------------------------------------------------------------------- 1 | {{- if .Values.podDisruptionBudget -}} 2 | {{- if .Capabilities.APIVersions.Has "policy/v1" }} 3 | apiVersion: policy/v1 4 | {{- else }} 5 | apiVersion: policy/v1 6 | {{- end }} 7 | kind: PodDisruptionBudget 8 | metadata: 9 | name: {{ include "convoy-server.fullname" . }} 10 | labels: 11 | {{- include "convoy-server.labels" . | nindent 4 }} 12 | spec: 13 | selector: 14 | matchLabels: 15 | {{- include "convoy-server.selectorLabels" . | nindent 6 }} 16 | {{- toYaml .Values.podDisruptionBudget | nindent 2 }} 17 | {{- end -}} -------------------------------------------------------------------------------- /charts/server/templates/service.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | name: {{ include "convoy-server.fullname" . }} 5 | labels: {{ include "convoy-server.labels" . | nindent 4 }} 6 | spec: 7 | type: {{ .Values.service.type }} 8 | ports: 9 | - port: {{ .Values.service.port }} 10 | targetPort: http 11 | protocol: TCP 12 | name: http 13 | selector: {{ include "convoy-server.selectorLabels" . | nindent 4 }} 14 | -------------------------------------------------------------------------------- /charts/server/templates/tests/test-connection.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Pod 3 | metadata: 4 | name: "{{ include "convoy-server.fullname" . }}-test-connection" 5 | labels: 6 | {{- include "convoy-server.labels" . | nindent 4 }} 7 | annotations: 8 | "helm.sh/hook": test 9 | spec: 10 | containers: 11 | - name: wget 12 | image: busybox 13 | command: ['wget'] 14 | args: ['{{ include "convoy-server.fullname" . }}:{{ .Values.service.port }}/health'] 15 | restartPolicy: Never 16 | -------------------------------------------------------------------------------- /charts/server/values.yaml: -------------------------------------------------------------------------------- 1 | # Default values for convoy-server. 2 | # This is a YAML-formatted file. 3 | # Declare variables to be passed into your templates. 4 | 5 | app: 6 | replicaCount: 1 7 | port: 5005 8 | resources: {} 9 | # limits: 10 | # cpu: 1000m 11 | # memory: 2000Mi 12 | # requests: 13 | # cpu: 1000m 14 | # memory: 1000Mi 15 | podAnnotations: 16 | prometheus.io/scrape: "true" 17 | prometheus.io/path: /metrics 18 | prometheus.io/port: "{{ .Values.app.port }}" 19 | 20 | env: 21 | sign_up_enabled: false 22 | auth: 23 | jwt: 24 | enabled: true 25 | secret: "" 26 | refresh_secret: "" 27 | native: 28 | enabled: true 29 | log_level: "error" 30 | max_response_size: 50 31 | environment: "" 32 | host: "" 33 | tracer: 34 | enabled: false 35 | type: "" 36 | otel: 37 | otel_auth: 38 | header_name: "" 39 | header_value: "" 40 | sample_rate: 1 41 | collector_url: "" 42 | insecure_skip_verify: true 43 | sentry: 44 | dsn: "" 45 | storage: 46 | enabled: false 47 | type: "" 48 | on_prem: 49 | path: "" 50 | s3: 51 | bucket: "" 52 | prefix: "" 53 | accessKey: "" 54 | secretKey: "" 55 | region: "" 56 | session_token: "" 57 | endpoint: "" 58 | api_version: "" 59 | pyroscope: 60 | enabled: false 61 | url: "" 62 | username: "" 63 | password: "" 64 | profile_id: "" 65 | enable_feature_flag: [] 66 | retention_policy: 67 | policy: 720h 68 | enabled: false 69 | analytics: 70 | enabled: true 71 | enable_profiling: false 72 | metrics: 73 | enabled: false 74 | metrics_backend: prometheus 75 | prometheus_metrics: 76 | sample_time: 5 77 | instance_ingest_rate: 100 78 | analytics_enabled: true 79 | max_retry_seconds: 7200 80 | license_key: "" 81 | 82 | # These values serve as defaults for standalone deployment 83 | # When deployed as a subchart, these can be overridden by parent values: 84 | # - global.convoy.image 85 | # - global.convoy.tag 86 | image: 87 | repository: getconvoy/convoy 88 | pullPolicy: Always 89 | tag: v25.2.2 90 | 91 | nameOverride: "convoy-server" 92 | fullNameOverride: "convoy-server" 93 | 94 | service: 95 | type: ClusterIP 96 | port: 80 97 | 98 | ingress: 99 | enabled: false 100 | annotations: {} 101 | ingressClassName: "" 102 | tls: 103 | - hosts: 104 | - test.com 105 | secretName: test-tls-secret 106 | hosts: 107 | - host: test.com 108 | http: 109 | paths: 110 | - path: / 111 | pathType: Prefix 112 | 113 | autoscaling: 114 | enabled: true 115 | minReplicas: 1 116 | maxReplicas: 10 117 | targetCPUUtilizationPercentage: 80 118 | targetMemoryUtilizationPercentage: 80 119 | 120 | # Pod disruption budget 121 | podDisruptionBudget: {} 122 | # maxUnavailable: 1 123 | # minAvailable: 1 124 | 125 | nodeSelector: {} 126 | tolerations: [] 127 | affinity: {} 128 | -------------------------------------------------------------------------------- /ct.yaml: -------------------------------------------------------------------------------- 1 | remote: origin 2 | chart-dirs: 3 | - charts 4 | target-branch: main 5 | helm-extra-args: --timeout 8m 6 | check-version-increment: false 7 | validate-maintainers: false 8 | -------------------------------------------------------------------------------- /index.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | entries: 3 | convoy: 4 | - apiVersion: v2 5 | appVersion: 24.1.4 6 | created: "2024-03-26T13:51:05.372677+01:00" 7 | dependencies: 8 | - condition: postgresql.enabled 9 | name: postgresql 10 | repository: https://charts.bitnami.com/bitnami 11 | version: 12.5.6 12 | - condition: redis.enabled 13 | name: redis 14 | repository: https://charts.bitnami.com/bitnami 15 | version: 17.11.3 16 | description: Open Source Webhooks Gateway 17 | digest: 84b4b16b547b7477ec1f1871d88a8a4f0c1c9dbb4feb481154e0000bcb8da4c0 18 | keywords: 19 | - Webhooks 20 | - Kubernetes 21 | - Convoy 22 | maintainers: 23 | - email: engineering@getconvoy.io 24 | name: Convoy Engineering Team 25 | url: https://getconvoy.io 26 | name: convoy 27 | type: application 28 | urls: 29 | - https://frain-dev.github.io/helm-charts/convoy-2.2.1.tgz 30 | version: 2.2.1 31 | postgresql: 32 | - annotations: 33 | category: Database 34 | licenses: Apache-2.0 35 | apiVersion: v2 36 | appVersion: 15.3.0 37 | created: "2024-03-26T13:51:05.375815+01:00" 38 | dependencies: 39 | - name: common 40 | repository: oci://registry-1.docker.io/bitnamicharts 41 | tags: 42 | - bitnami-common 43 | version: 2.x.x 44 | description: PostgreSQL (Postgres) is an open source object-relational database 45 | known for reliability and data integrity. ACID-compliant, it supports foreign 46 | keys, joins, views, triggers and stored procedures. 47 | digest: 85536e44a499d7e7a3c35d176c57b7116d8659e86ff6b49b9171d0b77dc94c84 48 | home: https://bitnami.com 49 | icon: https://bitnami.com/assets/stacks/postgresql/img/postgresql-stack-220x234.png 50 | keywords: 51 | - postgresql 52 | - postgres 53 | - database 54 | - sql 55 | - replication 56 | - cluster 57 | maintainers: 58 | - name: VMware, Inc. 59 | url: https://github.com/bitnami/charts 60 | name: postgresql 61 | sources: 62 | - https://github.com/bitnami/charts/tree/main/bitnami/postgresql 63 | urls: 64 | - https://frain-dev.github.io/helm-charts/charts/postgresql-12.5.6.tgz 65 | version: 12.5.6 66 | redis: 67 | - annotations: 68 | category: Database 69 | licenses: Apache-2.0 70 | apiVersion: v2 71 | appVersion: 7.0.11 72 | created: "2024-03-26T13:51:05.379831+01:00" 73 | dependencies: 74 | - name: common 75 | repository: oci://registry-1.docker.io/bitnamicharts 76 | tags: 77 | - bitnami-common 78 | version: 2.x.x 79 | description: Redis(R) is an open source, advanced key-value store. It is often 80 | referred to as a data structure server since keys can contain strings, hashes, 81 | lists, sets and sorted sets. 82 | digest: 23c50664df2dcb5a3afbdc3ec12d19567c71b710a05318cfce449ad7c6e163af 83 | home: https://bitnami.com 84 | icon: https://bitnami.com/assets/stacks/redis/img/redis-stack-220x234.png 85 | keywords: 86 | - redis 87 | - keyvalue 88 | - database 89 | maintainers: 90 | - name: VMware, Inc. 91 | url: https://github.com/bitnami/charts 92 | name: redis 93 | sources: 94 | - https://github.com/bitnami/charts/tree/main/bitnami/redis 95 | urls: 96 | - https://frain-dev.github.io/helm-charts/charts/redis-17.11.3.tgz 97 | version: 17.11.3 98 | generated: "2024-03-26T13:51:05.362452+01:00" 99 | -------------------------------------------------------------------------------- /scripts/release.sh: -------------------------------------------------------------------------------- 1 | # Set version 2 | tag=$1 3 | 4 | # Tag & Push. 5 | git tag "$tag" 6 | git push origin "$tag" 7 | -------------------------------------------------------------------------------- /values.yaml: -------------------------------------------------------------------------------- 1 | global: 2 | convoy: 3 | # -- Docker image tags for all convoy components 4 | image: &image "getconvoy/convoy" 5 | # -- Docker image tags for all convoy components 6 | tag: &tag "v25.3.4" 7 | # -- Logger Level for all convoy components 8 | log_level: &logLevel "error" 9 | # -- Convoy Environment 10 | environment: &environment "oss" 11 | # -- JWT Secret key 12 | jwt_secret: &jwtSecret "convoy-secret" 13 | # -- JWT Refresh Secret key 14 | jwt_refresh_secret: &jwtRefreshSecret "convoy-refresh-secret" 15 | # -- If this secret parameter is not empty, JWT secret values will be ignored. The secrets should be in the 'jwt_secret' and 'jwt_refresh_secret' keys 16 | jwt_secret_name: "" 17 | # -- Tracing config for all convoy services 18 | tracer_enabled: &tracerEnabled false 19 | # -- Tracing provider type 20 | tracer_type: &tracerType "otel" 21 | # -- Open Telemetry auth header name 22 | otel_auth_header_name: &otelHeaderName "" 23 | # -- Open Telemetry auth header value 24 | otel_auth_header_value: &otelHeaderValue "" 25 | # -- Open Telemetry sample rate 26 | otel_sample_rate: &otelSampleRate 1 27 | # -- Open Telemetry collector url 28 | otel_collector_url: &otelCollectorUrl "" 29 | # -- Open Telemetry insecure skip verify 30 | otel_insecure_skip_verify: &otelInsecureSkipVerify true 31 | # -- Sentry DSN 32 | sentry_dsn: &sentryDsn "" 33 | # -- Retention policy duration 34 | retention_policy_duration: &retentionPolicyDuration 720h 35 | # -- Retention policy enabled 36 | retention_policy_enabled: &retentionPolicyEnabled false 37 | # -- Enable usage analytics 38 | enable_usage_analytics: &enabledUsageAnalytics true 39 | # -- API version 40 | api_version: &apiVersion "2024-01-01" 41 | # -- License Key 42 | license_key: &licenseKey "" 43 | # -- Dispatcher CA Certificate configuration. If provided, it will use the content of the secret 44 | cacert_secret_name: "" 45 | # -- Dispatcher CA Certificate content. If provided, a secret will be created with this content 46 | cacert_content: "" 47 | 48 | externalDatabase: 49 | # -- Enable an external database; This will use postgresql chart, Change values if you use an external database 50 | enabled: true 51 | # -- Host for the external database 52 | host: "postgresql" 53 | # -- Password for the external database 54 | postgresPassword: &postgresPassword postgres 55 | # -- Database name for the external database 56 | database: &postgresDatabase convoy 57 | # -- Password for the external database, ignored in case of secret parameter with non-empty value 58 | password: &userPassword postgres 59 | # -- If this secret parameter is not empty, password value will be ignored. The password in the secret should be in the 'password' key 60 | secret: "" 61 | # -- Username for the external database 62 | username: &username postgres 63 | # -- Query params for the external database 64 | options: "sslmode=disable&connect_timeout=30" 65 | # -- Port for the external database 66 | port: 5432 67 | 68 | nativeRedis: 69 | # -- Enable redis; This will use redis chart, Disable if you use an external redis 70 | enabled: &redisEnabled true 71 | # -- Host for the redis 72 | host: "redis-master" 73 | # -- password for the redis, ignored in case of secret parameter with non-empty value 74 | password: &redisPassword "convoy" 75 | # -- If this secret parameter is not empty, password value will be ignored. The password in the secret should be in the 'password' key 76 | secret: "" 77 | # -- Port for the redis 78 | port: 6379 79 | 80 | externalRedis: 81 | # -- Enable external redis, Enable this if you use an external redis and disable Native redis 82 | enabled: false 83 | # -- redis cluster addresses, if set the other values won't be used 84 | addresses: "" 85 | # -- Host for the external redis 86 | host: "" 87 | # -- Scheme for the external redis. This can be redis, rediss, redis-socket or redis-sentinel 88 | scheme: "" 89 | # -- username for the external redis. 90 | username: "" 91 | # -- password for the external redis, ignored in case of secret parameter with non-empty value 92 | password: "" 93 | # -- If this secret parameter is not empty, password value will be ignored. The password in the secret should be in the 'password' key 94 | secret: "" 95 | # -- Database name for the external redis. 96 | database: "" 97 | # -- Port for the external redis 98 | port: "" 99 | 100 | # @ignored, used in case of external chart 101 | postgresql: 102 | # -- Set to false if you don't want to create a postgres instance 103 | enabled: true 104 | fullnameOverride: "postgresql" 105 | global: 106 | postgresql: 107 | auth: 108 | postgresPassword: *postgresPassword 109 | username: *username 110 | password: *userPassword 111 | database: *postgresDatabase 112 | 113 | # @ignored, used in case of external chart 114 | redis: 115 | # -- Set to false if you don't want to create a redis instance 116 | enabled: true 117 | architecture: standalone 118 | fullnameOverride: "redis" 119 | auth: 120 | enabled: *redisEnabled 121 | password: *redisPassword 122 | 123 | agent: 124 | image: 125 | # -- Repository to be used by the agent. The latest tag is used by default 126 | repository: *image 127 | # -- Pull policy for the agent image 128 | pullPolicy: IfNotPresent 129 | # @ignored 130 | tag: *tag 131 | 132 | env: 133 | environment: *environment 134 | proxy: "" 135 | sign_up_enabled: false 136 | log_level: *logLevel 137 | smtp: 138 | enabled: false 139 | from: "" 140 | # -- Ignored in case of secret parameter with non-empty value 141 | password: "" 142 | # -- If this secret parameter is not empty, password value will be ignored. The password in the secret should be in the 'password' key 143 | secret: "" 144 | port: 0 145 | provider: "" 146 | url: "" 147 | username: "" 148 | ssl: false 149 | reply_to: "" 150 | # @ignored 151 | tracer: 152 | type: *tracerType 153 | enabled: *tracerEnabled 154 | otel: 155 | otel_auth: 156 | header_name: *otelHeaderName 157 | header_value: *otelHeaderValue 158 | sample_rate: *otelSampleRate 159 | collector_url: *otelCollectorUrl 160 | insecure_skip_verify: *otelInsecureSkipVerify 161 | sentry: 162 | dsn: *sentryDsn 163 | pyroscope: 164 | enabled: false 165 | url: "" 166 | username: "" 167 | password: "" 168 | profile_id: "" 169 | enable_feature_flag: [] 170 | retention_policy: 171 | policy: *retentionPolicyDuration 172 | enabled: *retentionPolicyEnabled 173 | analytics_enabled: *enabledUsageAnalytics 174 | storage: 175 | enabled: false 176 | type: "" 177 | on_prem: 178 | path: "" 179 | s3: 180 | bucket: "" 181 | accessKey: "" 182 | # -- Ignored in case of secret parameter with non-empty value 183 | secretKey: "" 184 | # -- If this secret parameter is not empty, secretKey value will be ignored. The password in the secret should be in the 'secretKey' key 185 | secret: "" 186 | region: "" 187 | session_token: "" 188 | endpoint: "" 189 | consumer_pool_size: 100 190 | enable_profiling: false 191 | metrics: 192 | enabled: false 193 | metrics_backend: prometheus 194 | prometheus_metrics: 195 | sample_time: 5 196 | instance_ingest_rate: 100 197 | worker_execution_mode: default 198 | max_retry_seconds: 7200 199 | license_key: *licenseKey 200 | dispatcher: 201 | insecure_skip_verify: false 202 | allow_list: ["0.0.0.0/0"] 203 | deny_list: ["127.0.0.1/8", "169.254.169.254/32"] 204 | app: 205 | replicaCount: 1 206 | resources: {} 207 | # limits: 208 | # cpu: 1000m 209 | # memory: 2000Mi 210 | # requests: 211 | # cpu: 1000m 212 | # memory: 1000Mi 213 | 214 | service: 215 | # -- Type of service for the agent 216 | type: ClusterIP 217 | # -- Port for the agent service 218 | port: 80 219 | 220 | autoscaling: 221 | # -- Enable autoscaling for the agent 222 | enabled: false 223 | minReplicas: 2 224 | maxReplicas: 10 225 | targetCPUUtilizationPercentage: 80 226 | targetMemoryUtilizationPercentage: 80 227 | 228 | podDisruptionBudget: 229 | {} 230 | # -- Pod disruption budget 231 | # maxUnavailable: 1 232 | # minAvailable: 1 233 | 234 | server: 235 | image: 236 | # -- Repository to be used by the server. The latest tag is used by default 237 | repository: *image 238 | # -- Pull policy for the server image 239 | pullPolicy: IfNotPresent 240 | # @ignored 241 | tag: *tag 242 | 243 | env: 244 | environment: *environment 245 | log_level: *logLevel 246 | host: "" 247 | sign_up_enabled: false 248 | # -- Max response body when ingesting webhooks (might be renamed). Defaults to 50KB 249 | max_response_size: 50 250 | auth: 251 | jwt: 252 | enabled: true 253 | secret: *jwtSecret 254 | refresh_secret: *jwtRefreshSecret 255 | native: 256 | enabled: true 257 | # @ignored 258 | tracer: 259 | type: *tracerType 260 | enabled: *tracerEnabled 261 | otel: 262 | otel_auth: 263 | header_name: *otelHeaderName 264 | header_value: *otelHeaderValue 265 | sample_rate: *otelSampleRate 266 | collector_url: *otelCollectorUrl 267 | insecure_skip_verify: *otelInsecureSkipVerify 268 | sentry: 269 | dsn: *sentryDsn 270 | pyroscope: 271 | enabled: false 272 | url: "" 273 | username: "" 274 | password: "" 275 | profile_id: "" 276 | enable_feature_flag: [] 277 | retention_policy: 278 | policy: *retentionPolicyDuration 279 | enabled: *retentionPolicyEnabled 280 | analytics_enabled: *enabledUsageAnalytics 281 | storage: 282 | enabled: false 283 | type: "" 284 | on_prem: 285 | path: "" 286 | s3: 287 | bucket: "" 288 | accessKey: "" 289 | # -- Ignored in case of secret parameter with non-empty value 290 | secretKey: "" 291 | # -- If this secret parameter is not empty, secretKey value will be ignored. The password in the secret should be in the 'secretKey' key 292 | secret: "" 293 | prefix: "" 294 | region: "" 295 | session_token: "" 296 | endpoint: "" 297 | api_version: *apiVersion 298 | analytics: 299 | enabled: true 300 | enable_profiling: false 301 | metrics: 302 | enabled: false 303 | metrics_backend: prometheus 304 | prometheus_metrics: 305 | sample_time: 5 306 | instance_ingest_rate: 100 307 | max_retry_seconds: 7200 308 | license_key: *licenseKey 309 | app: 310 | replicaCount: 1 311 | resources: {} 312 | # limits: 313 | # cpu: 1000m 314 | # memory: 2000Mi 315 | # requests: 316 | # cpu: 1000m 317 | # memory: 1000Mi 318 | 319 | ingress: 320 | # -- Enable ingress for the server 321 | enabled: true 322 | annotations: {} 323 | ingressClassName: "" 324 | tls: 325 | - hosts: 326 | - test.com 327 | secretName: test-tls-secret 328 | hosts: 329 | - host: test.com 330 | http: 331 | paths: 332 | - path: / 333 | pathType: Prefix 334 | 335 | service: 336 | # -- Type of service for the server 337 | type: ClusterIP 338 | # -- Port for the server service 339 | port: 80 340 | 341 | autoscaling: 342 | # -- Enable autoscaling for the server 343 | enabled: false 344 | minReplicas: 2 345 | maxReplicas: 10 346 | targetCPUUtilizationPercentage: 80 347 | targetMemoryUtilizationPercentage: 80 348 | 349 | podDisruptionBudget: 350 | {} 351 | # -- Pod disruption budget 352 | # maxUnavailable: 1 353 | # minAvailable: 1 354 | --------------------------------------------------------------------------------