{"id":18853075,"url":"https://github.com/featbit/featbit-charts","last_synced_at":"2026-04-23T06:02:24.559Z","repository":{"id":169514265,"uuid":"636134573","full_name":"featbit/featbit-charts","owner":"featbit","description":"Helm Charts for FeatBit","archived":false,"fork":false,"pushed_at":"2026-02-10T14:04:24.000Z","size":500,"stargazers_count":9,"open_issues_count":2,"forks_count":7,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-02-10T18:33:27.483Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go Template","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/featbit.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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2023-05-04T07:42:47.000Z","updated_at":"2026-02-10T13:53:35.000Z","dependencies_parsed_at":"2023-12-01T08:38:35.150Z","dependency_job_id":"853b557c-c11a-41a9-bf03-a61b96ffdbee","html_url":"https://github.com/featbit/featbit-charts","commit_stats":null,"previous_names":["featbit/charts","featbit/featbit-charts"],"tags_count":33,"template":false,"template_full_name":null,"purl":"pkg:github/featbit/featbit-charts","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/featbit%2Ffeatbit-charts","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/featbit%2Ffeatbit-charts/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/featbit%2Ffeatbit-charts/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/featbit%2Ffeatbit-charts/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/featbit","download_url":"https://codeload.github.com/featbit/featbit-charts/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/featbit%2Ffeatbit-charts/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29449369,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-14T15:52:44.973Z","status":"ssl_error","status_checked_at":"2026-02-14T15:52:11.208Z","response_time":53,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":[],"created_at":"2024-11-08T03:42:51.301Z","updated_at":"2026-04-23T06:02:24.539Z","avatar_url":"https://github.com/featbit.png","language":"Go Template","funding_links":[],"categories":[],"sub_categories":[],"readme":"# FeatBit Helm Chart\n\n[FeatBit](https://github.com/featbit/featbit) is an open-source feature flags management tool, which supported self-hosted deployment.\nThis Helm chart bootstraps a [FeatBit](https://github.com/featbit/featbit) installation on a [Kubernetes](https://kubernetes.io/) cluster using the [Helm](https://helm.sh/) package manager.\n\n## Prerequisites\n* Kubernetes \u003e=1.23\n* Helm \u003e= 3.7.0\n\n## Usage \n\n[Helm](https://helm.sh) must be installed to use the charts.  Please refer to\nHelm's [documentation](https://helm.sh/docs) to get started.\n\nOnce Helm has been set up correctly, add the repo as follows:\n\n```\nhelm repo add featbit https://featbit.github.io/featbit-charts/\n```\n\nIf you had already added this repo earlier, run `helm repo update` to retrieve\nthe latest versions of the packages.  You can then run `helm search repo\nfeatbit` to see the charts.\n\nTo install the featbit chart:\n```\nhelm install \u003cyour-release-name\u003e featbit/featbit [-f \u003cyour-values-file\u003e]\n```\n\nTo simply upgrade your current release to the latest version of featbit chart:\n\n```\nhelm repo update [featbit]\n    \nhelm upgrade \u003cyour-release-name\u003e featbit/featbit [-f \u003cyour-values-file\u003e]\n```\n\nTo uninstall the chart:\n\n```\nhelm delete \u003cyour-realease-name\u003e\n```\n\nTo get the more details of using helm to deploy or maintain your featbit release in the k8s, please refer to\nHelm's [documentation](https://helm.sh/docs)\n\nNote that if your device is based on the arm64 architecture, please use version 0.2.1 and above.\n\n## Configuration\n\nBeyond the chart's `values.yaml` parameters (architecture, external URLs, infrastructure, replicas, etc.), FeatBit services have many application-level settings that are **not** exposed in the chart by default. You can activate these capabilities by injecting environment variables via the `env` field on each service in your values file — for example `api.env` for the API server or `els.env` for the evaluation server:\n\n```yaml\n# in your values.yaml or -f override file\nels:\n  env:\n    - name: SOME_ENV_VAR\n      value: \"some-value\"\n```\n\n### Example: CORS for Evaluation Server\n\n**Problem**: Your frontend app is hosted on a different domain than the evaluation server, and the browser blocks SDK requests due to CORS policy.\n\nBy default, CORS is enabled with wildcard `*` for all origins, headers, and methods. If you need to restrict allowed origins for security:\n\n```yaml\nels:\n  env:\n    - name: Cors__AllowedOrigins\n      value: \"https://app.example.com;https://staging.example.com\"\n    - name: Cors__AllowCredentials\n      value: \"true\"\n```\n\n\u003e **Note**: `Cors__AllowCredentials: true` cannot be used with wildcard `*` origin — you must specify explicit origins.\n\nSee full CORS options: [evaluation-server README — CORS](https://github.com/featbit/featbit/tree/main/modules/evaluation-server#cors)\n\n### Example: Rate Limiting for Evaluation Server\n\n**Problem**: Your evaluation server is publicly exposed and you want to protect it from excessive traffic or abuse. By default, rate limiting is **disabled**.\n\nEnable rate limiting with a fixed window of 100 requests per 60 seconds per environment:\n\n```yaml\nels:\n  env:\n    - name: RateLimiting__Enabled\n      value: \"true\"\n    - name: RateLimiting__Type\n      value: \"FixedWindow\"\n    - name: RateLimiting__PermitLimit\n      value: \"100\"\n    - name: RateLimiting__WindowSeconds\n      value: \"60\"\n```\n\nFor multi-instance deployments, enable distributed rate limiting backed by Redis:\n\n```yaml\nels:\n  env:\n    - name: RateLimiting__Enabled\n      value: \"true\"\n    - name: RateLimiting__Distributed\n      value: \"true\"\n    - name: CacheProvider\n      value: \"Redis\"\n```\n\nYou can also override limits per endpoint (e.g. `RateLimiting__Endpoints__Sdk__PermitLimit`). See full options: [evaluation-server README — Rate Limiting](https://github.com/featbit/featbit/tree/main/modules/evaluation-server#rate-limiting)\n\n### Full Environment Variable Reference\n\n- **API Server** (`api.env`): [modules/back-end/README.md](https://github.com/featbit/featbit/blob/main/modules/back-end/README.md) — JWT, Logging, OLAP, and more\n- **Evaluation Server** (`els.env`): [modules/evaluation-server/README.md](https://github.com/featbit/featbit/blob/main/modules/evaluation-server/README.md) — Streaming, CORS, Rate Limiting, and more\n\n## Expose self-hosted deployment\n\nTo use FeatBit, three services must be exposed from the internal network of Kubernetes:\n\n* ui: FeatBit frontend\n* api: FeatBit api server\n* evaluation server(els): FeatBit data synchronization and data evaluation server\n\nIf you cannot access the services using localhost and their default ports, `apiExternalUrl` and `evaluationServerExternalUrl` **_SHOULD_** be reset in the [values.yaml or your own values file with -f flag](https://helm.sh/docs/chart_template_guide/values_files/)\n\n**All the examples here are tested on Minikube base on the embedding postgresql and redis If you need to deploy them to a public cloud or your own private cloud in the production, please contact us.**\n\n### Ingress\n\nIngress exposes HTTP and HTTPS routes from outside the cluster to services within the cluster. Traffic routing is controlled by rules defined on the Ingress resource.\n\nAn Ingress may be configured to give Services externally-reachable URLs, load balance traffic, terminate SSL / TLS, and offer name-based virtual hosting. \n\nAn Ingress controller is responsible for fulfilling the Ingress, usually with a load balancer, though it may also configure your edge router or additional frontends to help handle the traffic.\n\n#### Prerequisites\nYou must have an Ingress controller to satisfy an Ingress. Only creating an Ingress resource has no effect.\n\nYou may need to deploy an Ingress controller such as ingress-nginx. You can choose from a number of [Ingress controllers](https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/).\n\nIdeally, all Ingress controllers should fit the reference specification. In reality, the various Ingress controllers operate slightly differently.\n\nMinikube supports ingress-nginx via addons, you can activate the ingress controller via:\n\n```bash\nminikube addons enable ingress\n```\n\n#### Example for Ingress\n\nHere is a simple [example](./charts/featbit/examples/standard/expose-services-via-ingress.yaml) that show how to use ingress to expose services:\n```yaml\n\napiExternalUrl: \"http:/{API host name}\"\nevaluationServerExternalUrl: \"http://{Evaluation Server host name}\"\n\nui:\n  ingress:\n    enabled: true\n    host: {UI host name}\n\n\napi:\n  ingress:\n    enabled: true\n    host: {API host name}\n\n\nels:\n  ingress:\n    enabled: true\n    host: {Evaluation Server host name}\n\n\n```\n\nNote that:\n* you should bind the host names that can be resolved by DNS server or map the IPs and host names in the dns hosts file(/etc/hosts in linux and macox) in your local cluster.\n* the default ingress class is nginx, set your value in `global.ingressClassName` if needed\n* set the annotations in the `\u003cservice\u003e.ingress.annotations`, if needed\n    for example:\n    ``` yaml\n    ... \n    ui:\n      ingress:\n          enabled: true\n          host: {UI host name}\n          annotations:\n              nginx.ingress.kubernetes.io/use-regex: \"true\"\n              nginx.ingress.kubernetes.io/rewrite-target: /$2\n              kubernetes.io/tls-acme: \"true\"\n    ...\n      \n    ```\n#### Example for Ingress with TLS\n\nHere is a simple [example](./charts/featbit/examples/standard/expose-services-via-ingress-tls.yaml) that show how to use ingress to expose services with TLS:\n```yaml\napiExternalUrl: \"https://{API host name, ex: api.featbit.com}\"\nevaluationServerExternalUrl: \"https://{Evaluation Server host name, ex: api.featbit.com}\"\n\nui:\n  ingress:\n    enabled: true\n    host: {UI host name, ex: ui.featbit.com}\n    tls:\n      enabled: true\n      secretName: {your domain cert secret name, ex: \"featbit-com-tls-secret\"}\n\napi:\n  ingress:\n    enabled: true\n    host: {API host name, ex: api.featbit.com}\n    tls:\n      enabled: true\n      secretName: {your domain cert secret name, ex: \"featbit-com-tls-secret\"}\n\n\nels:\n  ingress:\n    enabled: true\n    host: {Evaluation Server host name, ex: els.featbit.com}\n    tls:\n      enabled: true\n      secretName: {your domain cert secret name, ex: \"featbit-com-tls-secret\"}\n```\n\nTo create a secret for tls, we suggest you to use cert-manager to manage your auto-renewing ssl certificates, you can refer to [cert-manager](https://cert-manager.io/docs/) to get more details.\n\nIf you are using a self-signed certificate, you can create a secret with the following command:\n\n```bash\nkubectl create secret tls featbit-com-tls-secret --key /path/to/tls.key --cert /path/to/tls.crt\n```\n\n### LoadBalancer\nExposes the Service externally using an external load balancer. K8s does not directly offer a load balancing component; you must provide one, or you can integrate your Kubernetes cluster with a cloud provider.\nThe 3 services must be assigned an IP before deployment. Especially, we **_MUST_** know the IPs of api and evaluation server in advance.\nIf the load balancer randomly assigns external IP addresses to services, it can make it difficult to preconfigure parameters. Therefore, we currently **_DO NOT_** recommend to use this approach.\n\n#### Prerequisites\n\nMinikube supports MetalLB to access the service with the external IP address\n\n```bash\n# get external ip binding to minikube\nminikube ip\n# enable the MetalLB minikube add-on.\nminikube addons enable metallb\n# Configure the external IPs ranges that can be used by MetalLB for the LoadBalancer services.\nminikube addons configure metallb\n```\n\n#### Static IP\nTo expose service, we recommend you to bind static external IPs to services, as the following [example](./charts/featbit/examples/standard/expose-services-via-lb-static-ip.yaml)\n\n```yaml\n\napiExternalUrl: \"http://API_EXTERNAL_IP:5000\"\nevaluationServerExternalUrl: \"http://ELS_EXTERNAL_IP:5100\"\n\nui:\n  service:\n    type: LoadBalancer\n    staticIP: {UI_EXTERNAL_IP}\n\napi:\n  service:\n    type: LoadBalancer\n    staticIP: {API_EXTERNAL_IP}\n\nels:\n  service:\n    type: LoadBalancer\n    staticIP: {ELS_EXTERNAL_IP}\n```\n\n#### IP Auto Discovery\n\nWe also provide a support to discovery automatically Load Balancer service IPs, as the following [example](./charts/featbit/examples/standard/expose-services-via-lb-auto-discovery-ip.yaml):\n\n```yaml\n\napiExternalUrl: \"\"\nevaluationServerExternalUrl: \"\"\nautoDiscovery: true\n\nui:\n  service:\n    type: LoadBalancer\n\napi:\n  service:\n    type: LoadBalancer\n\nels:\n  service:\n    type: LoadBalancer\n```\nUse `kubectl get svc` to obtain the IP addresses.\n\n### NodePort\nExposes the Services on each k8s cluster Node's IP at a static port:\n\n* ui: http://NODE_IP:30025\n* api: http://NODE_IP:30050\n* evaluation server(els): http://NODE_IP:30100\n\nSet your configurations as the following [example](./charts/featbit/examples/standard/expose-services-via-nodeport.yaml)\n\n```yaml\n\napiExternalUrl: \"http://NODE_IP:30050\"\nevaluationServerExternalUrl: \"http://NODE_IP:30100\"\n\nui:\n  service:\n    type: NodePort\n#    nodePort: 30025\n\napi:\n  service:\n    type: NodePort\n#    nodePort: 30050\n\nels:\n  service:\n    type: NodePort\n#    nodePort: 30100\n```\n\n\nIt is generally advisable not to modify the default `nodePort` value unless it conflicts with your k8s node.\n\n#### Get node's IP\n\nMinikube: `minikube ip`\n\n\n### ClusterIP\n\nIf you deployed the FeatBit chart in your cluster using the command `helm install featbit featbit/featbit`\n\nBy default, these three services are started using ClusterIP, which means they can only be accessed within the internal network of Kubernetes.\n\nIf you are using a single-node installation of Kubernetes cluster such as [Minikube](https://github.com/kubernetes/minikube) or [K3D](https://k3d.io/),\n\nPlease use the following command to expose the services, then visit ui in `http://localhost:8081`, set your [client sdk](https://docs.featbit.co/docs/getting-started/4.-connect-an-sdk) with `http://localhost:5100`\n\n```\n// ui\nkubectl port-forward service/featbit-ui 8081:8081  [--namespace \u003cyour-name-space\u003e]\n// api\nkubectl port-forward service/featbit-api 5000:5000 [--namespace \u003cyour-name-space\u003e]\n// evaluation server\nkubectl port-forward service/featbit-els 5100:5100 [--namespace \u003cyour-name-space\u003e]\n```\n\n## Migration and Upgrades\n\n🔄 **Starting from Helm Chart v0.9.0 (FeatBit v5.2.0)**\n\nEach release includes migration scripts in the [`migration/`](./migration/) folder. **Database migrations are NOT executed automatically by Helm** - they must be reviewed and executed manually by your DBA or database team before upgrading.\n\n**For external databases**: Always check `migration/RELEASE-v{version}.md` for required database schema changes before running `helm upgrade`.\n\n## ⚠️ Dependencies Notice\n\n🚨 **CRITICAL: Bitnami Image Repository Changes (Effective August 2025)**\n\nThis chart includes infrastructure dependencies (PostgreSQL/MongoDB, Redis, Kafka, ClickHouse) which are **strictly for testing and development purposes** using bitnami legacy images with no updates.\n\n**For local testing/development**, use the provided example configurations:\n- [`featbit-standard-local-pg.yaml`](./charts/featbit/examples/standard/featbit-standard-local-pg.yaml) - PostgreSQL + Redis configuration for local Docker Desktop Kubernetes\n- [`featbit-standard-local-mongo.yaml`](./charts/featbit/examples/standard/featbit-standard-local-mongo.yaml) - MongoDB + Redis configuration for local Docker Desktop Kubernetes\n\n**For production environments**, we HIGHLY recommend external managed services:\n- **PostgreSQL/MongoDB**: Configure `externalPostgresql` or `externalMongodb` with managed database services (Azure Database for PostgreSQL, AWS RDS, Google Cloud SQL, etc.)\n- **Redis**: Configure `externalRedis` with managed Redis services (Azure Cache for Redis, AWS ElastiCache, Google Cloud Memorystore, etc.)\n- **Kafka**: Configure `externalKafka` with managed Kafka services (Confluent Cloud, AWS MSK, Azure Event Hubs, etc.)\n- **ClickHouse**: Configure `externalClickhouse` with managed ClickHouse services (ClickHouse Cloud, Altinity.Cloud, etc.)\n\n## Conclusion\nWe understand that not all service deployment methods may be compatible with your cluster. If you encounter any issues or need further assistance in exposing the services, please feel free to reach out to us for support. \nWe'll be happy to help you with the specific configuration required for your cluster.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffeatbit%2Ffeatbit-charts","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffeatbit%2Ffeatbit-charts","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffeatbit%2Ffeatbit-charts/lists"}