Skip to content

Uptime Kuma

Self-hosted uptime monitoring with a modern web UI. Uptime Kuma checks HTTP, TCP, DNS, Ping, Docker, WebSocket, and 20+ other monitor types on configurable intervals, sends alerts via 90+ notification services (Telegram, Discord, Slack, email, and more), and publishes customizable public status pages.

Single instance only — no horizontal scaling

Uptime Kuma manages WebSocket connections and monitor state in-process. Running multiple replicas causes monitor duplication and inconsistent alerts. Keep the deployment at 1 replica regardless of the database backend used.

Key Features

  • 20+ monitor types — HTTP(s), TCP, Ping, DNS, Docker, WebSocket, Steam, MQTT, and more
  • 90+ notification services — Telegram, Discord, Slack, Email, Pushover, Gotify, and more
  • Public status pages — customizable status pages with custom domains
  • Two-factor authentication — built-in 2FA for the admin account
  • SQLite or MariaDB — embedded SQLite (default) or MariaDB-compatible subchart
  • External database — connect to an existing MariaDB/MySQL instance
  • Smart S3 backuptar for SQLite mode, mysqldump for MariaDB mode
  • Custom CA certificates — monitor internal HTTPS services with private CA

Installation

HTTPS repository:

helm repo add helmforge https://repo.helmforge.dev
helm repo update
helm install uptime-kuma helmforge/uptime-kuma -f values.yaml

OCI registry:

helm install uptime-kuma oci://ghcr.io/helmforgedev/helm/uptime-kuma -f values.yaml

After deploying with default values, access the setup wizard to create the admin account:

kubectl port-forward svc/<release>-uptime-kuma 3001:80
# Open http://localhost:3001 in your browser

Deployment Examples

# values.yaml — Uptime Kuma with SQLite (default, no database configuration needed)
persistence:
  enabled: true
  size: 2Gi

ingress:
  enabled: true
  ingressClassName: traefik
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-prod
  hosts:
    - host: status.example.com
      paths:
        - path: /
          pathType: Prefix
  tls:
    - secretName: uptime-kuma-tls
      hosts:
        - status.example.com
# values.yaml — Uptime Kuma with bundled MariaDB subchart
database:
  type: mariadb

mysql:
  enabled: true
  auth:
    password: 'mariadb-password'

persistence:
  enabled: true
  size: 2Gi

ingress:
  enabled: true
  ingressClassName: traefik
  hosts:
    - host: status.example.com
      paths:
        - path: /
          pathType: Prefix
# values.yaml — Uptime Kuma with external MariaDB/MySQL
database:
  type: mariadb
  external:
    host: mariadb.database.svc.cluster.local
    port: '3306'
    name: uptime_kuma
    username: uptime_kuma
    existingSecret: uptime-kuma-db-credentials
    existingSecretPasswordKey: password

mysql:
  enabled: false

persistence:
  enabled: true
  size: 2Gi

ingress:
  enabled: true
  ingressClassName: traefik
  hosts:
    - host: status.example.com
      paths:
        - path: /
          pathType: Prefix
# values.yaml — Monitor internal HTTPS services with a private CA certificate
# The CA certificate must be stored in the /app/data PVC at /app/data/ca.pem
uptimeKuma:
  extraEnv:
    - name: NODE_EXTRA_CA_CERTS
      value: /app/data/ca.pem

persistence:
  enabled: true
  size: 2Gi

ingress:
  enabled: true
  ingressClassName: traefik
  hosts:
    - host: status.example.com
      paths:
        - path: /
          pathType: Prefix
# values.yaml — Daily S3 backup
# Backup strategy is automatic: tar for SQLite mode, mysqldump for MariaDB mode
backup:
  enabled: true
  schedule: '0 2 * * *'
  s3:
    endpoint: https://s3.amazonaws.com
    bucket: my-uptime-kuma-backups
    prefix: uptime-kuma
    existingSecret: uptime-kuma-s3-credentials

persistence:
  enabled: true
  size: 2Gi

ingress:
  enabled: true
  ingressClassName: traefik
  hosts:
    - host: status.example.com
      paths:
        - path: /
          pathType: Prefix

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/louislam/uptime-kumaUptime Kuma container image.
image.tagstring"2.2.1"Image tag.
image.pullPolicystringIfNotPresentImage pull policy.
imagePullSecretsarray[]Pull secrets for private registries.

Uptime Kuma Configuration

ParameterTypeDefaultDescription
uptimeKuma.portinteger3001Internal HTTP port.
uptimeKuma.disableFrameSameOriginbooleanfalseAllow embedding the status page in iframes from other origins.
uptimeKuma.extraEnvarray[]Extra environment variables. Use for NODE_EXTRA_CA_CERTS and advanced settings.
Enable iframe embedding for dashboard integration

Status pages can be embedded in dashboards such as Heimdall or Homarr. Set uptimeKuma.disableFrameSameOrigin: true to allow cross-origin iframe embedding. By default, the X-Frame-Options: SAMEORIGIN header prevents embedding from other domains.

Monitoring services with private CA certificates

To monitor internal HTTPS endpoints using a self-signed or private CA certificate, place the CA certificate file in the PVC at /app/data/ca.pem and set NODE_EXTRA_CA_CERTS via uptimeKuma.extraEnv. Node.js will then trust that CA for all outgoing HTTPS requests made by the monitor checks.

Database

ParameterTypeDefaultDescription
database.typestringsqliteDatabase backend: sqlite or mariadb.
database.external.hoststring""External MariaDB/MySQL hostname.
database.external.portstring"3306"External MariaDB/MySQL port.
database.external.namestringuptime_kumaDatabase name on the external server.
database.external.usernamestringuptime_kumaUsername for the external database.
database.external.passwordstring""Password for the external database (prefer existingSecret).
database.external.existingSecretstring""Existing secret containing the database password.
database.external.existingSecretPasswordKeystringpasswordKey inside the existing secret for the password.

Database — MySQL Subchart

The mysql subchart is MariaDB-compatible

The subchart is named mysql in the values, but Uptime Kuma uses it as a MariaDB-compatible backend. Set database.type: mariadb alongside mysql.enabled: true to activate this mode.

ParameterTypeDefaultDescription
mysql.enabledbooleanfalseDeploy a bundled MySQL/MariaDB subchart.
mysql.architecturestringstandaloneDatabase architecture.
mysql.auth.databasestringuptime_kumaDatabase name created by the subchart.
mysql.auth.usernamestringuptime_kumaDatabase user created by the subchart.
mysql.auth.passwordstring""Database password (required when using the subchart).

Persistence

ParameterTypeDefaultDescription
persistence.enabledbooleantrueEnable a PVC for /app/data (SQLite, config, and CA certificates).
persistence.sizestring2GiPVC size.
persistence.storageClassstring""StorageClass for the PVC.
persistence.accessModesarray["ReadWriteOnce"]PVC access modes.
persistence.existingClaimstring""Use an existing PVC instead of creating one.

Backup

The backup strategy adapts to the configured database mode automatically:

  • SQLite mode — archives the full /app/data directory using tar.
  • MariaDB mode — runs mysqldump against the database and uploads the SQL dump.
ParameterTypeDefaultDescription
backup.enabledbooleanfalseEnable scheduled S3 backup CronJob.
backup.schedulestring"0 2 * * *"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.archivePrefixstringuptime-kumaPrefix for backup archive filenames.
backup.resourcesobject{}Resources for backup containers.
backup.images.uploader.repositorystringdocker.io/helmforge/mcS3 uploader image repository.
backup.images.uploader.tagstring"1.0.0"S3 uploader image tag.
backup.images.mysql.repositorystringdocker.io/library/mysqlmysqldump image repository (MariaDB mode).
backup.images.mysql.tagstring"8.4"mysqldump image tag.
backup.s3.endpointstring""S3-compatible endpoint URL.
backup.s3.bucketstring""Target bucket name.
backup.s3.prefixstringuptime-kumaKey prefix within the bucket.
backup.s3.createBucketIfNotExistsbooleantrueCreate the bucket automatically if it does not exist.
backup.s3.existingSecretstring""Existing secret containing 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.portinteger80Service port exposed to the cluster.
service.annotationsobject{}Annotations for the Service.

Ingress

ParameterTypeDefaultDescription
ingress.enabledbooleanfalseEnable an Ingress resource.
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.initialDelaySecondsinteger10Startup 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