Countly
Product analytics platform for mobile, web, and desktop applications. Countly provides event tracking, crash reporting, push notifications, A/B testing, funnel analysis, and a plugin system with 41+ optional modules — all backed by a MongoDB database.
Key Features
- Event and session tracking — capture user actions across mobile, web, and desktop
- Crash reporting — collect and analyze application errors
- Push notifications — send targeted messages via the built-in notification service
- A/B testing and funnels — experiment and analyze user conversion flows
- Plugin system — 41+ configurable feature plugins
- Dual-port architecture — separate API (3001) and Dashboard (6001) endpoints
- MongoDB backend — bundled subchart or external connection
- S3 backup — scheduled
mongodumpCronJob to S3-compatible storage
Installation
HTTPS repository:
helm repo add helmforge https://repo.helmforge.dev
helm repo update
helm install countly helmforge/countly -f values.yaml
OCI registry:
helm install countly oci://ghcr.io/helmforgedev/helm/countly -f values.yaml
Architecture: Dual Ports
API and Dashboard run on separate ports in the same container
Countly exposes two endpoints from a single container pod:
- Port 3001 (API) — receives analytics events from your application SDKs. Mobile apps, websites, and desktop clients send data here.
- Port 6001 (Dashboard) — the web UI for viewing analytics, configuring apps, and managing users.
The Ingress typically exposes only the Dashboard (port 6001) for internal access. If your SDKs run outside the cluster, you must also expose port 3001 externally — either via a separate Ingress or a LoadBalancer Service.
Deployment Examples
# values.yaml — Countly with bundled MongoDB, dashboard only exposed
countly:
apiWorkers: 4
timezone: UTC
mongodb:
enabled: true
auth:
rootPassword: 'mongo-root-password'
ingress:
enabled: true
ingressClassName: traefik
hosts:
- host: countly.example.com
paths:
- path: /
pathType: Prefix# values.yaml — Production Countly with TLS and daily MongoDB backup
countly:
apiWorkers: 4
timezone: America/Sao_Paulo
mongodb:
enabled: true
auth:
rootPassword: 'mongo-root-password'
backup:
enabled: true
schedule: '0 3 * * *'
s3:
endpoint: https://s3.amazonaws.com
bucket: my-countly-backups
prefix: countly
existingSecret: countly-s3-credentials
resources:
requests:
memory: 256Mi
cpu: 100m
limits:
memory: 1Gi
cpu: 1000m
ingress:
enabled: true
ingressClassName: traefik
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
hosts:
- host: countly.example.com
paths:
- path: /
pathType: Prefix
tls:
- secretName: countly-tls
hosts:
- countly.example.com# values.yaml — Countly with external managed MongoDB
externalMongodb:
enabled: true
existingSecret: countly-mongodb-uri
existingSecretUriKey: mongodb-uri
mongodb:
enabled: false
countly:
apiWorkers: 4
ingress:
enabled: true
ingressClassName: traefik
hosts:
- host: countly.example.com
paths:
- path: /
pathType: Prefix# values.yaml — Expose both Dashboard (6001) and SDK API (3001) externally
# When application SDKs run outside the cluster, port 3001 must be reachable.
countly:
apiWorkers: 4
mongodb:
enabled: true
auth:
rootPassword: 'mongo-root-password'
# Dashboard ingress
ingress:
enabled: true
ingressClassName: traefik
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
hosts:
- host: countly.example.com
paths:
- path: /
pathType: Prefix
tls:
- secretName: countly-tls
hosts:
- countly.example.com
# Expose SDK API as a LoadBalancer service via extraManifests
extraManifests:
- apiVersion: v1
kind: Service
metadata:
name: countly-api
spec:
type: LoadBalancer
selector:
app.kubernetes.io/name: countly
ports:
- name: api
port: 3001
targetPort: 3001Configuration Reference
Core
| Parameter | Type | Default | Description |
|---|---|---|---|
nameOverride | string | "" | Override the chart name. |
fullnameOverride | string | "" | Override the full release name. |
commonLabels | object | {} | Extra labels added to all resources. |
Image
| Parameter | Type | Default | Description |
|---|---|---|---|
image.repository | string | docker.io/countly/countly-server | Countly container image. |
image.tag | string | "25.03.41" | Image tag. |
image.pullPolicy | string | IfNotPresent | Image pull policy. |
imagePullSecrets | array | [] | Pull secrets for private registries. |
Countly Configuration
| Parameter | Type | Default | Description |
|---|---|---|---|
countly.apiPort | integer | 3001 | Internal API port for SDK event ingestion. |
countly.dashboardPort | integer | 6001 | Internal Dashboard port for the web UI. |
countly.apiWorkers | integer | 4 | Number of API worker processes. Reduce to 1–2 for low-traffic instances. |
countly.timezone | string | UTC | Server timezone. Affects how events and sessions are grouped in the dashboard. |
countly.plugins | string | "" | Comma-separated plugin list. Empty string uses Countly defaults. |
countly.extraEnv | array | [] | Extra environment variables for advanced configuration. |
Database — External MongoDB
Used when mongodb.enabled: false.
| Parameter | Type | Default | Description |
|---|---|---|---|
externalMongodb.enabled | boolean | false | Use external MongoDB instead of the bundled subchart. |
externalMongodb.uri | string | "" | MongoDB connection URI. |
externalMongodb.existingSecret | string | "" | Existing secret containing the MongoDB URI. |
externalMongodb.existingSecretUriKey | string | mongodb-uri | Key inside the existing secret for the URI. |
Database — MongoDB Subchart
| Parameter | Type | Default | Description |
|---|---|---|---|
mongodb.enabled | boolean | true | Deploy the bundled MongoDB subchart. |
mongodb.architecture | string | standalone | MongoDB architecture. |
mongodb.auth.enabled | boolean | true | Enable MongoDB authentication. |
mongodb.auth.rootUser | string | root | MongoDB root username. |
mongodb.auth.rootPassword | string | "" | MongoDB root password. Auto-generated if empty. |
Backup
| Parameter | Type | Default | Description |
|---|---|---|---|
backup.enabled | boolean | false | Enable scheduled MongoDB S3 backup CronJob. |
backup.schedule | string | "0 3 * * *" | Cron schedule for backups. |
backup.suspend | boolean | false | Suspend the CronJob without deleting it. |
backup.concurrencyPolicy | string | Forbid | CronJob concurrency policy. |
backup.successfulJobsHistoryLimit | integer | 3 | Number of successful Job records to keep. |
backup.failedJobsHistoryLimit | integer | 3 | Number of failed Job records to keep. |
backup.backoffLimit | integer | 1 | Job retry limit. |
backup.archivePrefix | string | countly | Prefix for backup archive filenames. |
backup.images.mongodb | string | docker.io/library/mongo:8.0 | Image for mongodump. |
backup.images.uploader | string | docker.io/helmforge/mc:1.0.0 | Image for S3 upload. |
backup.resources | object | {} | Resources for backup containers. |
backup.database.uri | string | "" | Override MongoDB URI for backup (uses app URI if empty). |
backup.database.mongodumpArgs | string | "" | Extra arguments passed to mongodump. |
backup.s3.endpoint | string | "" | S3-compatible endpoint URL. |
backup.s3.bucket | string | "" | Target bucket name. |
backup.s3.prefix | string | countly | Key prefix within the bucket. |
backup.s3.createBucketIfNotExists | boolean | true | Create the bucket automatically if it does not exist. |
backup.s3.existingSecret | string | "" | Existing secret with S3 access and secret keys. |
backup.s3.existingSecretAccessKeyKey | string | access-key | Key in the existing secret for the S3 access key. |
backup.s3.existingSecretSecretKeyKey | string | secret-key | Key in the existing secret for the S3 secret key. |
backup.s3.accessKey | string | "" | Inline S3 access key (ignored when existingSecret is set). |
backup.s3.secretKey | string | "" | Inline S3 secret key (ignored when existingSecret is set). |
Service
| Parameter | Type | Default | Description |
|---|---|---|---|
service.type | string | ClusterIP | Kubernetes service type. |
service.port | integer | 80 | Dashboard service port (maps to 6001). |
service.apiPort | integer | 3001 | SDK API service port. |
service.annotations | object | {} | Annotations for the Service. |
Ingress
| Parameter | Type | Default | Description |
|---|---|---|---|
ingress.enabled | boolean | false | Enable an Ingress resource for the Dashboard. |
ingress.ingressClassName | string | traefik | Ingress class name. |
ingress.annotations | object | {} | Annotations for the Ingress (e.g. cert-manager). |
ingress.hosts | array | [] | Ingress host and path rules. |
ingress.tls | array | [] | TLS configuration (secret name and hosts). |
Probes
| Parameter | Type | Default | Description |
|---|---|---|---|
probes.startup.enabled | boolean | true | Enable startup probe. |
probes.startup.initialDelaySeconds | integer | 20 | Startup probe initial delay. |
probes.startup.periodSeconds | integer | 5 | Startup probe period. |
probes.startup.timeoutSeconds | integer | 3 | Startup probe timeout. |
probes.startup.failureThreshold | integer | 30 | Startup probe failure threshold. |
probes.liveness.enabled | boolean | true | Enable liveness probe. |
probes.liveness.initialDelaySeconds | integer | 0 | Liveness probe initial delay. |
probes.liveness.periodSeconds | integer | 15 | Liveness probe period. |
probes.liveness.timeoutSeconds | integer | 5 | Liveness probe timeout. |
probes.liveness.failureThreshold | integer | 3 | Liveness probe failure threshold. |
probes.readiness.enabled | boolean | true | Enable readiness probe. |
probes.readiness.initialDelaySeconds | integer | 0 | Readiness probe initial delay. |
probes.readiness.periodSeconds | integer | 10 | Readiness probe period. |
probes.readiness.timeoutSeconds | integer | 5 | Readiness probe timeout. |
probes.readiness.failureThreshold | integer | 3 | Readiness probe failure threshold. |
Resources and Security
| Parameter | Type | Default | Description |
|---|---|---|---|
resources | object | {} | CPU and memory requests and limits. |
podSecurityContext | object | {} | Pod-level security context. |
securityContext | object | {} | Container-level security context. |
Service Account
| Parameter | Type | Default | Description |
|---|---|---|---|
serviceAccount.create | boolean | false | Create a dedicated ServiceAccount. |
serviceAccount.name | string | "" | Override the ServiceAccount name. |
serviceAccount.annotations | object | {} | Annotations for the ServiceAccount. |
Scheduling
| Parameter | Type | Default | Description |
|---|---|---|---|
nodeSelector | object | {} | Node selector for scheduling. |
tolerations | array | [] | Tolerations for scheduling. |
affinity | object | {} | Affinity rules. |
topologySpreadConstraints | array | [] | Topology spread constraints. |
priorityClassName | string | "" | PriorityClass for the pod. |
terminationGracePeriodSeconds | integer | 30 | Termination grace period. |
podLabels | object | {} | Extra labels for the pod. |
podAnnotations | object | {} | Extra annotations for the pod. |
Extra
| Parameter | Type | Default | Description |
|---|---|---|---|
extraVolumes | array | [] | Extra volumes to attach to the pod. |
extraVolumeMounts | array | [] | Extra volume mounts for the container. |
extraManifests | array | [] | Extra Kubernetes manifests deployed alongside the chart. |