This guide explains the profile dimensions you choose when deploying Countly with Helm, and helps you pick the right combination for a local laptop, a small staging cluster, or a full production environment. Profiles are layered on top of chart defaults to control resource sizing, ingress TLS, observability footprint, Kafka Connect tuning, and network policy strictness, all from a single global.yaml file in your environment directory.
How the Configuration Layers
The Helm deployment composes values in a fixed order:
chart defaults ─▶ profiles (sizing + dimensions) ─▶ environment choices ─▶ secrets
Profiles live under profiles/ in the repository. Each dimension is a directory with one file per option. You select one option per dimension in your environment's global.yaml, and the helmfile orchestration applies the matching profile values to every chart that consumes them.
The Five Profile Dimensions
Five dimensions cover the most common deployment trade-offs. Pick exactly one option per dimension.
| Dimension | Options | What it controls |
|---|---|---|
sizing | local, small, production | CPU and memory requests, replica counts, Horizontal Pod Autoscaler bounds, Pod Disruption Budgets |
observability | disabled, full, external-grafana, external | Whether the in-cluster Prometheus, Grafana, Loki, Tempo, and Pyroscope stack runs, and where data is sent |
kafkaConnect | throughput, balanced, low-latency | Batch sizes, write frequency, and Kafka Connect worker memory for the ClickHouse sink |
tls | none, letsencrypt, provided, selfSigned | Ingress TLS configuration: no TLS, automatic Let's Encrypt issuance, your own pre-existing secret, or a generated self-signed certificate |
security | open, hardened | Network policy enforcement level between namespaces |
Picking a Sizing Profile
Sizing is the dimension that most directly drives cluster cost and capacity. Use the table below as a starting point.
| Profile | Use case | Notes |
|---|---|---|
local | Laptop or single-node development cluster | Lowest resource requests; minimal replica counts; suitable for evaluating features and running smoke tests |
small | Staging or light-traffic production | Moderate replica counts and resource requests; appropriate for non-HA workloads or low-volume tenants |
production | Full production deployment | Highest replica counts, HPAs, and Pod Disruption Budgets; designed for sustained traffic and high availability |
Sizing affects every chart
Choosing production raises resources and replica counts across the Countly application, Kafka, ClickHouse, MongoDB, and the observability stack. Confirm your cluster has node capacity and storage class capacity before applying.
Picking an Observability Profile
| Profile | Behavior |
|---|---|
disabled | No in-cluster observability backends are deployed. Use when you have an external monitoring solution. |
full | Deploys the complete in-cluster stack: Prometheus, Grafana, Loki, Tempo, Pyroscope, and Alloy collectors. |
external-grafana | Deploys collectors and backends in-cluster, but expects Grafana to live elsewhere. |
external | Deploys only the collectors. Sends metrics, logs, traces, and profiles to external backends. |
Picking a Kafka Connect Profile
The Kafka Connect ClickHouse sink trades latency for throughput depending on batch and flush settings. Choose the option that matches your data delivery expectations:
| Profile | When to choose |
|---|---|
throughput | Maximize rows-per-second to ClickHouse. Tolerates higher end-to-end delay. |
balanced | Default. Reasonable trade-off between latency and throughput for most workloads. |
low-latency | Surface events in ClickHouse as soon as possible. Trades throughput for freshness. |
Picking a TLS Profile
| Profile | What it does |
|---|---|
none | Plain HTTP at the ingress. Use only behind another TLS-terminating proxy. |
letsencrypt | cert-manager issues a certificate via the Let's Encrypt ACME flow. Requires a public DNS record. |
provided | Use a pre-existing kubernetes.io/tls secret you create or materialize from Secret Manager. |
selfSigned | cert-manager generates a self-signed certificate. Suitable for local evaluation only. |
Picking a Security Profile
| Profile | Behavior |
|---|---|
open | Permissive network policies between Countly namespaces. Easier to debug. |
hardened | Strict network policy enforcement; only required cross-namespace traffic is allowed. |
Recommended Combinations
The combinations below cover the most common deployment scenarios:
| Scenario | sizing | observability | kafkaConnect | tls | security |
|---|---|---|---|---|---|
| Laptop evaluation | local | disabled or full | balanced | selfSigned | open |
| Small staging | small | full | balanced | letsencrypt | open |
| Production | production | full or external | balanced or throughput | provided or letsencrypt | hardened |
Setting Profiles in global.yaml
All profile selections live under global: in your environment's global.yaml. A typical production block looks like this:
global:
sizing: production
observability: full
kafkaConnect: balanced
tls: provided
security: hardened
ingress:
hostname: countly.example.comOnce your global.yaml is set, deploy with helmfile from the repository root:
helmfile -e my-deployment apply
Profiles are composable
You can change one dimension at a time. For example, switch kafkaConnect from balanced to throughput and re-run helmfile apply; only the Kafka Connect resources are affected.
Changing Profiles Later
Profile changes are applied with the same helmfile apply command. Plan ahead for the following caveats:
- Increasing
sizingraises resource requests and may require additional cluster nodes before pods reschedule successfully. - Switching
tlsfromselfSignedtoletsencryptrequires DNS for the ingress hostname to resolve publicly so cert-manager can complete the ACME challenge. - Switching
securityfromopentohardenedmay break ad-hockubectl port-forwardor debugging flows that relied on permissive cross-namespace traffic.