{"id":13413817,"url":"https://github.com/blind-oracle/cortex-tenant","last_synced_at":"2025-09-02T16:58:35.512Z","repository":{"id":38221251,"uuid":"301794968","full_name":"blind-oracle/cortex-tenant","owner":"blind-oracle","description":"Prometheus remote write proxy that adds Cortex/Mimir tenant ID based on metric labels","archived":false,"fork":false,"pushed_at":"2025-06-04T09:08:56.000Z","size":377,"stargazers_count":121,"open_issues_count":1,"forks_count":64,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-06-04T13:16:07.748Z","etag":null,"topics":["cortex","cortex-tenant","kubernetes","labels","metrics","mimir","prometheus","proxy","tenant","timeseries"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/blind-oracle.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-10-06T16:52:25.000Z","updated_at":"2025-06-04T06:24:06.000Z","dependencies_parsed_at":"2023-01-30T08:31:30.210Z","dependency_job_id":"8be7be2d-ca3c-470e-80fa-87f10c49eb69","html_url":"https://github.com/blind-oracle/cortex-tenant","commit_stats":null,"previous_names":[],"tags_count":30,"template":false,"template_full_name":null,"purl":"pkg:github/blind-oracle/cortex-tenant","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/blind-oracle%2Fcortex-tenant","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/blind-oracle%2Fcortex-tenant/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/blind-oracle%2Fcortex-tenant/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/blind-oracle%2Fcortex-tenant/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/blind-oracle","download_url":"https://codeload.github.com/blind-oracle/cortex-tenant/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/blind-oracle%2Fcortex-tenant/sbom","scorecard":{"id":243391,"data":{"date":"2025-08-11","repo":{"name":"github.com/blind-oracle/cortex-tenant","commit":"66c79d47062816f310016877767b1241118c7fa0"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.2,"checks":[{"name":"Code-Review","score":4,"reason":"Found 9/19 approved changesets -- score normalized to 4","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":5,"reason":"6 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 5","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Info: jobLevel 'contents' permission set to 'read': .github/workflows/release.yml:92","Warn: no topLevel permission defined: .github/workflows/release.yml:1","Warn: no topLevel permission defined: .github/workflows/test.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/blind-oracle/cortex-tenant/release.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/blind-oracle/cortex-tenant/release.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:63: update your workflow using https://app.stepsecurity.io/secureworkflow/blind-oracle/cortex-tenant/release.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:73: update your workflow using https://app.stepsecurity.io/secureworkflow/blind-oracle/cortex-tenant/release.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:82: update your workflow using https://app.stepsecurity.io/secureworkflow/blind-oracle/cortex-tenant/release.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:99: update your workflow using https://app.stepsecurity.io/secureworkflow/blind-oracle/cortex-tenant/release.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:102: update your workflow using https://app.stepsecurity.io/secureworkflow/blind-oracle/cortex-tenant/release.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:110: update your workflow using https://app.stepsecurity.io/secureworkflow/blind-oracle/cortex-tenant/release.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:115: update your workflow using https://app.stepsecurity.io/secureworkflow/blind-oracle/cortex-tenant/release.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:118: update your workflow using https://app.stepsecurity.io/secureworkflow/blind-oracle/cortex-tenant/release.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:122: update your workflow using https://app.stepsecurity.io/secureworkflow/blind-oracle/cortex-tenant/release.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:131: update your workflow using https://app.stepsecurity.io/secureworkflow/blind-oracle/cortex-tenant/release.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/blind-oracle/cortex-tenant/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/blind-oracle/cortex-tenant/test.yml/main?enable=pin","Warn: containerImage not pinned by hash: Dockerfile:1","Warn: goCommand not pinned by hash: .github/workflows/test.yml:31","Info:   0 out of   6 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   8 third-party GitHubAction dependencies pinned","Info:   0 out of   1 containerImage dependencies pinned","Info:   0 out of   1 goCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Mozilla Public License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v1.15.7 not signed: https://api.github.com/repos/blind-oracle/cortex-tenant/releases/223000984","Warn: release artifact v1.15.6 not signed: https://api.github.com/repos/blind-oracle/cortex-tenant/releases/196029914","Warn: release artifact v1.15.5 not signed: https://api.github.com/repos/blind-oracle/cortex-tenant/releases/195805821","Warn: release artifact v1.15.4 not signed: https://api.github.com/repos/blind-oracle/cortex-tenant/releases/195802030","Warn: release artifact v1.15.3 not signed: https://api.github.com/repos/blind-oracle/cortex-tenant/releases/194886990","Warn: release artifact v1.15.7 does not have provenance: https://api.github.com/repos/blind-oracle/cortex-tenant/releases/223000984","Warn: release artifact v1.15.6 does not have provenance: https://api.github.com/repos/blind-oracle/cortex-tenant/releases/196029914","Warn: release artifact v1.15.5 does not have provenance: https://api.github.com/repos/blind-oracle/cortex-tenant/releases/195805821","Warn: release artifact v1.15.4 does not have provenance: https://api.github.com/repos/blind-oracle/cortex-tenant/releases/195802030","Warn: release artifact v1.15.3 does not have provenance: https://api.github.com/repos/blind-oracle/cortex-tenant/releases/194886990"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/release.yml:88"],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 20 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-17T07:02:57.317Z","repository_id":38221251,"created_at":"2025-08-17T07:02:57.317Z","updated_at":"2025-08-17T07:02:57.317Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":273317757,"owners_count":25084037,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-02T02:00:09.530Z","response_time":77,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cortex","cortex-tenant","kubernetes","labels","metrics","mimir","prometheus","proxy","tenant","timeseries"],"created_at":"2024-07-30T20:01:50.167Z","updated_at":"2025-09-02T16:58:35.499Z","avatar_url":"https://github.com/blind-oracle.png","language":"Go","readme":"# cortex-tenant\n\n[![Go Report Card](https://goreportcard.com/badge/github.com/blind-oracle/cortex-tenant)](https://goreportcard.com/report/github.com/blind-oracle/cortex-tenant)\n[![Coverage Status](https://coveralls.io/repos/github/blind-oracle/cortex-tenant/badge.svg?branch=main)](https://coveralls.io/github/blind-oracle/cortex-tenant?branch=main)\n[![Artifact Hub](https://img.shields.io/endpoint?url=https://artifacthub.io/badge/repository/cortex-tenant)](https://artifacthub.io/packages/helm/cortex-tenant/cortex-tenant)\n\nPrometheus remote write proxy which marks timeseries with a Cortex/Mimir tenant ID based on labels.\n\n## Status\n\nThe project is stable and (hopefully) almost bug-free. I will accept PRs, but probably will not do any active work on it for now since I don't work with Cortex/Mimir currently.\n\n## Architecture\n\n![Architecture](architecture.svg)\n\n## Overview\n\nCortex/Mimir tenants (separate namespaces where metrics are stored to and queried from) are identified by `X-Scope-OrgID` HTTP header on both writes and queries.\n\n~~Problem is that Prometheus can't be configured to send this header~~ Actually in some recent version (year 2021 onwards) this functionality was added, but the tenant is the same for all jobs. This makes it impossible to use a single Prometheus (or an HA pair) to write to multiple tenants.\n\nThis software solves the problem using the following logic:\n\n- Receive Prometheus remote write\n- Search each timeseries for a specific label name and extract a tenant ID from its value.\n  If the label wasn't found then it can fall back to a configurable default ID.\n  If none is configured then the write request will be rejected with HTTP code 400\n- Optionally removes this label from the timeseries\n- Groups timeseries by tenant\n- Issues a number of parallel per-tenant HTTP requests to Cortex/Mimir with the relevant tenant HTTP header (`X-Scope-OrgID` by default)\n\n## Usage\n\n- Get `rpm` or `deb` for amd64 from the Releases page. For building see below.\n\n### HTTP Endpoints\n\n- GET `/alive` returns 200 by default and 503 if the service is shutting down (if `timeout_shutdown` setting is \u003e 0)\n- POST `/push` receives metrics from Prometheus - configure remote write to send here\n\n### Configuration\n\nThe service can be configured by a config file and/or environment variables. Config file may be specified by passing `-config` CLI argument.\n\nIf both are used then the env vars have precedence (i.e. they override values from config).\nSee below for config file format and corresponding env vars.\n\n```yaml\n# Where to listen for incoming write requests from Prometheus\n# env: CT_LISTEN\nlisten: 0.0.0.0:8080\n\n# Profiling API, remove to disable\n# env: CT_LISTEN_PPROF\nlisten_pprof: 0.0.0.0:7008\n\n# Where to send the modified requests (Cortex/Mimir)\n# env: CT_TARGET\ntarget: http://127.0.0.1:9091/receive\n\n# Whether to enable querying for IPv6 records\n# env: CT_ENABLE_IPV6\nenable_ipv6: false\n\n# This parameter sets the limit for the count of outgoing concurrent connections to Cortex / Mimir.\n# By default it's 64 and if all of these connections are busy you will get errors when pushing from Prometheus.\n# If your `target` is a DNS name that resolves to several IPs then this will be a per-IP limit.\n# env: CT_MAX_CONNS_PER_HOST\nmax_conns_per_host: 0\n\n# Authentication (optional)\nauth:\n  # Egress HTTP basic auth -\u003e add `Authentication` header to outgoing requests\n  egress:\n    # env: CT_AUTH_EGRESS_USERNAME\n    username: foo\n    # env: CT_AUTH_EGRESS_PASSWORD\n    password: bar\n\n# Log level\n# env: CT_LOG_LEVEL\nlog_level: warn\n\n# HTTP request timeout\n# env: CT_TIMEOUT\ntimeout: 10s\n\n# HTTP request idle timeout\n# env: CT_IDLE_TIMEOUT\nidle_timeout: 60s\n\n# Timeout to wait on shutdown to allow load balancers detect that we're going away.\n# During this period after the shutdown command the /alive endpoint will reply with HTTP 503.\n# Set to 0s to disable.\n# env: CT_TIMEOUT_SHUTDOWN\ntimeout_shutdown: 10s\n\n# Max number of parallel incoming HTTP requests to handle\n# env: CT_CONCURRENCY\nconcurrency: 10\n\n# Whether to forward metrics metadata from Prometheus to Cortex/Mimir\n# Since metadata requests have no timeseries in them - we cannot divide them into tenants\n# So the metadata requests will be sent to the default tenant only, if one is not defined - they will be dropped\n# env: CT_METADATA\nmetadata: false\n\n# If true response codes from metrics backend will be logged to stdout. This setting can be used to suppress errors\n# which can be quite verbose like 400 code - out-of-order samples or 429 on hitting ingestion limits\n# Also, those are already reported by other services like Cortex/Mimir distributors and ingesters\n# env: CT_LOG_RESPONSE_ERRORS\nlog_response_errors: true\n\n# Maximum duration to keep outgoing connections alive (to Cortex/Mimir)\n# Useful for resetting L4 load-balancer state\n# Use 0 to keep them indefinitely\n# env: CT_MAX_CONN_DURATION\nmax_connection_duration: 0s\n\n# Address where metrics are available\n# env: CT_LISTEN_METRICS_ADDRESS\nlisten_metrics_address: 0.0.0.0:9090\n\n# If true, then a label with the tenant’s name will be added to the metrics\n# env: CT_METRICS_INCLUDE_TENANT\nmetrics_include_tenant: true\n\ntenant:\n  # Which label to look for the tenant information\n  # env: CT_TENANT_LABEL\n  label: tenant\n\n  # List of labels examined for tenant information. If set takes precedent over `label`\n  # env: CT_TENANT_LABEL_LIST\n  label_list:\n    - tenant\n    - other_tenant\n\n  # Whether to remove the tenant label from the request\n  # env: CT_TENANT_LABEL_REMOVE\n  label_remove: true\n  \n  # To which header to add the tenant ID\n  # env: CT_TENANT_HEADER\n  header: X-Scope-OrgID\n\n  # Which tenant ID to use if the label is missing in any of the timeseries\n  # If this is not set or empty then the write request with missing tenant label\n  # will be rejected with HTTP code 400\n  # env: CT_TENANT_DEFAULT\n  default: foobar\n\n  # Enable if you want all metrics from Prometheus to be accepted with a 204 HTTP code\n  # regardless of the response from upstream. This can lose metrics if Cortex/Mimir is\n  # throwing rejections.\n  # env: CT_TENANT_ACCEPT_ALL\n  accept_all: false\n\n  # Optional prefix to be added to a tenant header before sending it to Cortex/Mimir.\n  # Make sure to use only allowed characters:\n  # https://grafana.com/docs/mimir/latest/configure/about-tenant-ids/\n  # env: CT_TENANT_PREFIX\n  prefix: foobar-\n\n  # If true will use the tenant ID of the inbound request as the prefix of the new tenant id.\n  # Will be automatically suffixed with a `-` character.\n  # Example:\n  #   Prometheus forwards metrics with `X-Scope-OrgID: Prom-A` set in the inbound request.\n  #   This would result in the tenant prefix being set to `Prom-A-`.\n  # https://grafana.com/docs/mimir/latest/configure/about-tenant-ids/\n  # env: CT_TENANT_PREFIX_PREFER_SOURCE\n  prefix_prefer_source: false\n```\n\n### Prometheus configuration example\n\n```yaml\nremote_write:\n  - name: cortex_tenant\n    url: http://127.0.0.1:8080/push\n\nscrape_configs:\n  - job_name: job1\n    scrape_interval: 60s\n    static_configs:\n      - targets:\n          - target1:9090\n        labels:\n          tenant: foobar\n\n  - job_name: job2\n    scrape_interval: 60s\n    static_configs:\n      - targets:\n          - target2:9090\n        labels:\n          tenant: deadbeef\n```\n\nThis would result in `job1` metrics ending up in the `foobar` tenant in Cortex/Mimir and `job2` in `deadbeef`.\n\n## Building\n\n`make build` should create you an _amd64_ binary.\n\nIf you want `deb` or `rpm` packages then install [FPM](https://fpm.readthedocs.io) and then run `make rpm` or `make deb` to create the packages.\n\n## Containerization\n\nTo use the current container you need to overwrite the default configuration file, mount your configuration into to `/data/cortex-tenant.yml`.\n\nYou can overwrite the default config by starting the container with:\n\n```bash\ndocker container run \\\n-v \u003cCONFIG_LOCATION\u003e:/data/cortex-tenant.yml \\\nghcr.io/blind-oracle/cortex-tenant:1.6.1\n```\n\n... or build your own Docker image:\n\n```Dockerfile\nFROM ghcr.io/blind-oracle/cortex-tenant:1.6.1\nADD my-config.yml /data/cortex-tenant.yml\n```\n\n### Deploy on Kubernetes\n\n#### Using manifests\n\n[`deploy/k8s/manifests`](deploy/k8s/manifests) directory contains the deployment, service and configmap manifest files for deploying this on Kubernetes. You can overwrite the default config by editing the configuration parameters in the configmap manifest.\n\n```bash\nkubectl apply -f deploy/k8s/manifests/cortex-tenant-deployment.yaml\nkubectl apply -f deploy/k8s/manifests/cortex-tenant-service.yaml\nkubectl apply -f deploy/k8s/manifests/config-file-configmap.yml\n```\n\n#### Using a Helm Chart\n\n[`deploy/k8s/chart`](deploy/k8s/chart) directory contains a chart for deploying this on Kubernetes.\n\n```bash\nhelm repo add cortex-tenant https://blind-oracle.github.io/cortex-tenant\nhelm install cortex-tenant cortex-tenant/cortex-tenant\n```\n\nYou can use [`deploy/k8s/chart/testing`](deploy/k8s/chart/testing) directory to test the deployment using helmfile.\n\n```bash\nhelmfile -f deploy/k8s/chart/testing/helmfile.yaml template\nhelmfile -f deploy/k8s/chart/testing/helmfile.yaml apply\n```\n\n#### Updating chart version\n\n```bash\nhelm package ./deploy/k8s/chart -d docs\nTZ=UTC helm repo index ./docs\n```\n","funding_links":[],"categories":["Server Applications","服务器应用程序","Relational Databases"],"sub_categories":["HTTP Clients","HTTP客户端"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fblind-oracle%2Fcortex-tenant","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fblind-oracle%2Fcortex-tenant","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fblind-oracle%2Fcortex-tenant/lists"}