Skip to content

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 mongodump CronJob 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: 3001

Configuration Reference

Core

ParameterTypeDefaultDescription
nameOverridestring""Override the chart name.
fullnameOverridestring""Override the full release name.
commonLabelsobject{}Extra labels added to all resources.

Image

ParameterTypeDefaultDescription
image.repositorystringdocker.io/countly/countly-serverCountly container image.
image.tagstring"25.03.41"Image tag.
image.pullPolicystringIfNotPresentImage pull policy.
imagePullSecretsarray[]Pull secrets for private registries.

Countly Configuration

ParameterTypeDefaultDescription
countly.apiPortinteger3001Internal API port for SDK event ingestion.
countly.dashboardPortinteger6001Internal Dashboard port for the web UI.
countly.apiWorkersinteger4Number of API worker processes. Reduce to 12 for low-traffic instances.
countly.timezonestringUTCServer timezone. Affects how events and sessions are grouped in the dashboard.
countly.pluginsstring""Comma-separated plugin list. Empty string uses Countly defaults.
countly.extraEnvarray[]Extra environment variables for advanced configuration.

Database — External MongoDB

Used when mongodb.enabled: false.

ParameterTypeDefaultDescription
externalMongodb.enabledbooleanfalseUse external MongoDB instead of the bundled subchart.
externalMongodb.uristring""MongoDB connection URI.
externalMongodb.existingSecretstring""Existing secret containing the MongoDB URI.
externalMongodb.existingSecretUriKeystringmongodb-uriKey inside the existing secret for the URI.

Database — MongoDB Subchart

ParameterTypeDefaultDescription
mongodb.enabledbooleantrueDeploy the bundled MongoDB subchart.
mongodb.architecturestringstandaloneMongoDB architecture.
mongodb.auth.enabledbooleantrueEnable MongoDB authentication.
mongodb.auth.rootUserstringrootMongoDB root username.
mongodb.auth.rootPasswordstring""MongoDB root password. Auto-generated if empty.

Backup

ParameterTypeDefaultDescription
backup.enabledbooleanfalseEnable scheduled MongoDB S3 backup CronJob.
backup.schedulestring"0 3 * * *"Cron schedule for backups.
backup.suspendbooleanfalseSuspend the CronJob without deleting it.
backup.concurrencyPolicystringForbidCronJob concurrency policy.
backup.successfulJobsHistoryLimitinteger3Number of successful Job records to keep.
backup.failedJobsHistoryLimitinteger3Number of failed Job records to keep.
backup.backoffLimitinteger1Job retry limit.
backup.archivePrefixstringcountlyPrefix for backup archive filenames.
backup.images.mongodbstringdocker.io/library/mongo:8.0Image for mongodump.
backup.images.uploaderstringdocker.io/helmforge/mc:1.0.0Image for S3 upload.
backup.resourcesobject{}Resources for backup containers.
backup.database.uristring""Override MongoDB URI for backup (uses app URI if empty).
backup.database.mongodumpArgsstring""Extra arguments passed to mongodump.
backup.s3.endpointstring""S3-compatible endpoint URL.
backup.s3.bucketstring""Target bucket name.
backup.s3.prefixstringcountlyKey prefix within the bucket.
backup.s3.createBucketIfNotExistsbooleantrueCreate the bucket automatically if it does not exist.
backup.s3.existingSecretstring""Existing secret with S3 access and secret keys.
backup.s3.existingSecretAccessKeyKeystringaccess-keyKey in the existing secret for the S3 access key.
backup.s3.existingSecretSecretKeyKeystringsecret-keyKey in the existing secret for the S3 secret key.
backup.s3.accessKeystring""Inline S3 access key (ignored when existingSecret is set).
backup.s3.secretKeystring""Inline S3 secret key (ignored when existingSecret is set).

Service

ParameterTypeDefaultDescription
service.typestringClusterIPKubernetes service type.
service.portinteger80Dashboard service port (maps to 6001).
service.apiPortinteger3001SDK API service port.
service.annotationsobject{}Annotations for the Service.

Ingress

ParameterTypeDefaultDescription
ingress.enabledbooleanfalseEnable an Ingress resource for the Dashboard.
ingress.ingressClassNamestringtraefikIngress class name.
ingress.annotationsobject{}Annotations for the Ingress (e.g. cert-manager).
ingress.hostsarray[]Ingress host and path rules.
ingress.tlsarray[]TLS configuration (secret name and hosts).

Probes

ParameterTypeDefaultDescription
probes.startup.enabledbooleantrueEnable startup probe.
probes.startup.initialDelaySecondsinteger20Startup probe initial delay.
probes.startup.periodSecondsinteger5Startup probe period.
probes.startup.timeoutSecondsinteger3Startup probe timeout.
probes.startup.failureThresholdinteger30Startup probe failure threshold.
probes.liveness.enabledbooleantrueEnable liveness probe.
probes.liveness.initialDelaySecondsinteger0Liveness probe initial delay.
probes.liveness.periodSecondsinteger15Liveness probe period.
probes.liveness.timeoutSecondsinteger5Liveness probe timeout.
probes.liveness.failureThresholdinteger3Liveness probe failure threshold.
probes.readiness.enabledbooleantrueEnable readiness probe.
probes.readiness.initialDelaySecondsinteger0Readiness probe initial delay.
probes.readiness.periodSecondsinteger10Readiness probe period.
probes.readiness.timeoutSecondsinteger5Readiness probe timeout.
probes.readiness.failureThresholdinteger3Readiness probe failure threshold.

Resources and Security

ParameterTypeDefaultDescription
resourcesobject{}CPU and memory requests and limits.
podSecurityContextobject{}Pod-level security context.
securityContextobject{}Container-level security context.

Service Account

ParameterTypeDefaultDescription
serviceAccount.createbooleanfalseCreate a dedicated ServiceAccount.
serviceAccount.namestring""Override the ServiceAccount name.
serviceAccount.annotationsobject{}Annotations for the ServiceAccount.

Scheduling

ParameterTypeDefaultDescription
nodeSelectorobject{}Node selector for scheduling.
tolerationsarray[]Tolerations for scheduling.
affinityobject{}Affinity rules.
topologySpreadConstraintsarray[]Topology spread constraints.
priorityClassNamestring""PriorityClass for the pod.
terminationGracePeriodSecondsinteger30Termination grace period.
podLabelsobject{}Extra labels for the pod.
podAnnotationsobject{}Extra annotations for the pod.

Extra

ParameterTypeDefaultDescription
extraVolumesarray[]Extra volumes to attach to the pod.
extraVolumeMountsarray[]Extra volume mounts for the container.
extraManifestsarray[]Extra Kubernetes manifests deployed alongside the chart.

More Information