Skip to content

About

Self-hosted uptime monitoring tool with a beautiful dashboard, status pages, and multi-channel notifications.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

Uptime Kuma

Build Status Last Commit OCI Pulls

Self-hosted uptime monitoring tool with a beautiful dashboard, status pages, and multi-channel notifications.

Port 3001
Registry ghcr.io/daemonless/uptime-kuma
Source https://github.com/louislam/uptime-kuma
Website https://uptime.kuma.pet/

Version Tags

Tag Description Best For
latest Upstream Binary. Built from official release. Most users — recommended.

Prerequisites

Before deploying, ensure your host environment is ready. See the Quick Start Guide for host setup instructions.

Deployment

Podman Compose

Database. Where the app keeps its data. The default needs nothing else running.

SQLite (default)

A file in the app's config folder. Right for one person, nothing extra to run.

Save as compose.yaml:

name: uptime-kuma

services:
  uptime-kuma:
    image: ghcr.io/daemonless/uptime-kuma:latest
    container_name: uptime-kuma
    restart: unless-stopped

    annotations:
      org.freebsd.jail.allow.raw_sockets: "true"

    environment:
      - PUID=1000
      - PGID=1000
      - TZ=UTC
      - UPTIME_KUMA_IS_CONTAINER=1
      - UPTIME_KUMA_ALLOW_ALL_CHROME_EXEC=1
      - PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1
      - DATA_DIR=/config
      - UPTIME_KUMA_DB_TYPE=${UPTIME_KUMA_DB_TYPE:-}
      - UPTIME_KUMA_DB_HOSTNAME=${UPTIME_KUMA_DB_HOSTNAME:-}
      - UPTIME_KUMA_DB_PORT=${UPTIME_KUMA_DB_PORT:-3306}
      - UPTIME_KUMA_DB_USERNAME=${UPTIME_KUMA_DB_USERNAME:-}
      - UPTIME_KUMA_DB_PASSWORD=${UPTIME_KUMA_DB_PASSWORD:-}
      - UPTIME_KUMA_DB_NAME=${UPTIME_KUMA_DB_NAME:-}

    volumes:
      - /path/to/containers/uptime-kuma:/config

    ports:
      - "3001:3001"

Then run podman-compose up -d.

MariaDB

One more container, its data in its own folder. If you already know MariaDB, or the app prefers it.

1. Save as .env and fill in what is empty:

# Database: MariaDB
UPTIME_KUMA_DB_TYPE=mariadb
UPTIME_KUMA_DB_HOSTNAME=mariadb
UPTIME_KUMA_DB_PORT=3306
UPTIME_KUMA_DB_USERNAME=uptime-kuma
UPTIME_KUMA_DB_PASSWORD=  # set one
UPTIME_KUMA_DB_NAME=uptime-kuma
DATABASE_LOCATION=/containers/uptime-kuma/mariadb

2. Save as compose.yaml:

name: uptime-kuma

services:
  uptime-kuma:
    depends_on: [mariadb]
    image: ghcr.io/daemonless/uptime-kuma:latest
    container_name: uptime-kuma
    restart: unless-stopped

    annotations:
      org.freebsd.jail.allow.raw_sockets: "true"

    environment:
      - PUID=1000
      - PGID=1000
      - TZ=UTC
      - UPTIME_KUMA_IS_CONTAINER=1
      - UPTIME_KUMA_ALLOW_ALL_CHROME_EXEC=1
      - PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1
      - DATA_DIR=/config
      - UPTIME_KUMA_DB_TYPE=${UPTIME_KUMA_DB_TYPE:-}
      - UPTIME_KUMA_DB_HOSTNAME=${UPTIME_KUMA_DB_HOSTNAME:-}
      - UPTIME_KUMA_DB_PORT=${UPTIME_KUMA_DB_PORT:-3306}
      - UPTIME_KUMA_DB_USERNAME=${UPTIME_KUMA_DB_USERNAME:-}
      - UPTIME_KUMA_DB_PASSWORD=${UPTIME_KUMA_DB_PASSWORD:-}
      - UPTIME_KUMA_DB_NAME=${UPTIME_KUMA_DB_NAME:-}

    volumes:
      - /path/to/containers/uptime-kuma:/config

    ports:
      - "3001:3001"
  mariadb:
    image: ghcr.io/daemonless/mariadb:11.4
    restart: always
    environment:
      - MYSQL_USER=${UPTIME_KUMA_DB_USERNAME}
      - MYSQL_PASSWORD=${UPTIME_KUMA_DB_PASSWORD}
      - MYSQL_DATABASE=${UPTIME_KUMA_DB_NAME}
      - MYSQL_ROOT_PASSWORD=${UPTIME_KUMA_DB_PASSWORD}
    volumes:
      - "${DATABASE_LOCATION}:/config"

Then run podman-compose up -d.

Your own

A database you already run, here or on another machine. Nothing extra runs; you give the address and the account.

1. Save as .env and fill in Kind, Host, Port, User, Password, Database:

# Database: Your own
UPTIME_KUMA_DB_TYPE=  # Kind: mariadb
UPTIME_KUMA_DB_HOSTNAME=  # Host
UPTIME_KUMA_DB_PORT=  # Port
UPTIME_KUMA_DB_USERNAME=  # User
UPTIME_KUMA_DB_PASSWORD=  # Password
UPTIME_KUMA_DB_NAME=  # Database

2. Save as compose.yaml:

name: uptime-kuma

services:
  uptime-kuma:
    image: ghcr.io/daemonless/uptime-kuma:latest
    container_name: uptime-kuma
    restart: unless-stopped

    annotations:
      org.freebsd.jail.allow.raw_sockets: "true"

    environment:
      - PUID=1000
      - PGID=1000
      - TZ=UTC
      - UPTIME_KUMA_IS_CONTAINER=1
      - UPTIME_KUMA_ALLOW_ALL_CHROME_EXEC=1
      - PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1
      - DATA_DIR=/config
      - UPTIME_KUMA_DB_TYPE=${UPTIME_KUMA_DB_TYPE:-}
      - UPTIME_KUMA_DB_HOSTNAME=${UPTIME_KUMA_DB_HOSTNAME:-}
      - UPTIME_KUMA_DB_PORT=${UPTIME_KUMA_DB_PORT:-3306}
      - UPTIME_KUMA_DB_USERNAME=${UPTIME_KUMA_DB_USERNAME:-}
      - UPTIME_KUMA_DB_PASSWORD=${UPTIME_KUMA_DB_PASSWORD:-}
      - UPTIME_KUMA_DB_NAME=${UPTIME_KUMA_DB_NAME:-}

    volumes:
      - /path/to/containers/uptime-kuma:/config

    ports:
      - "3001:3001"

Then run podman-compose up -d.

AppJail Director

SQLite (default)

.env:

# .env

DIRECTOR_PROJECT=uptime-kuma
PUID=1000
PGID=1000
TZ=UTC
UPTIME_KUMA_IS_CONTAINER=1
UPTIME_KUMA_ALLOW_ALL_CHROME_EXEC=1
PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1
DATA_DIR=/config
UPTIME_KUMA_DB_TYPE=sqlite
UPTIME_KUMA_DB_HOSTNAME=
UPTIME_KUMA_DB_PORT=3306
UPTIME_KUMA_DB_USERNAME=
UPTIME_KUMA_DB_PASSWORD=<UPTIME_KUMA_DB_PASSWORD>
UPTIME_KUMA_DB_NAME=

appjail-director.yml:

# appjail-director.yml

options:
  - virtualnet: ':<random> default'
  - nat:
services:
  uptime-kuma:
    name: uptime_kuma
    options:
      - container: 'args:--pull'
      - expose: '3001:3001 proto:tcp'
      - template: !ENV '${PWD}/template.conf'
    oci:
      user: root
      environment:
        - PUID: !ENV '${PUID}'
        - PGID: !ENV '${PGID}'
        - TZ: !ENV '${TZ}'
        - UPTIME_KUMA_IS_CONTAINER: !ENV '${UPTIME_KUMA_IS_CONTAINER}'
        - UPTIME_KUMA_ALLOW_ALL_CHROME_EXEC: !ENV '${UPTIME_KUMA_ALLOW_ALL_CHROME_EXEC}'
        - PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: !ENV '${PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD}'
        - DATA_DIR: !ENV '${DATA_DIR}'
        - UPTIME_KUMA_DB_TYPE: !ENV '${UPTIME_KUMA_DB_TYPE}'
        - UPTIME_KUMA_DB_HOSTNAME: !ENV '${UPTIME_KUMA_DB_HOSTNAME}'
        - UPTIME_KUMA_DB_PORT: !ENV '${UPTIME_KUMA_DB_PORT}'
        - UPTIME_KUMA_DB_USERNAME: !ENV '${UPTIME_KUMA_DB_USERNAME}'
        - UPTIME_KUMA_DB_PASSWORD: !ENV '${UPTIME_KUMA_DB_PASSWORD}'
        - UPTIME_KUMA_DB_NAME: !ENV '${UPTIME_KUMA_DB_NAME}'
    volumes:
      - uptime-kuma: /config
volumes:
  uptime-kuma:
    device: '/containers/uptime-kuma'

Makejail:

# Makejail

ARG tag=latest

OPTION container=boot
OPTION overwrite=force
OPTION from=ghcr.io/daemonless/uptime-kuma:${tag}

template.conf:

# template.conf

exec.start: "/bin/sh /etc/rc"
exec.stop: "/bin/sh /etc/rc.shutdown jail"
mount.devfs
persist
allow.raw_sockets

Save the files above, then run appjail-director up.

MariaDB

.env:

# .env

DIRECTOR_PROJECT=uptime-kuma
PUID=1000
PGID=1000
TZ=UTC
UPTIME_KUMA_IS_CONTAINER=1
UPTIME_KUMA_ALLOW_ALL_CHROME_EXEC=1
PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1
DATA_DIR=/config
UPTIME_KUMA_DB_TYPE=mariadb
UPTIME_KUMA_DB_HOSTNAME=uptime_kuma_mariadb
UPTIME_KUMA_DB_PORT=3306
UPTIME_KUMA_DB_USERNAME=uptime-kuma
UPTIME_KUMA_DB_PASSWORD=
UPTIME_KUMA_DB_NAME=uptime-kuma
DATABASE_LOCATION=/containers/uptime-kuma/mariadb

appjail-director.yml:

# appjail-director.yml

options:
  - virtualnet: ':<random> default'
  - nat:
services:
  uptime-kuma:
    name: uptime_kuma
    options:
      - container: 'args:--pull'
      - expose: '3001:3001 proto:tcp'
      - template: !ENV '${PWD}/template.conf'
    oci:
      user: root
      environment:
        - PUID: !ENV '${PUID}'
        - PGID: !ENV '${PGID}'
        - TZ: !ENV '${TZ}'
        - UPTIME_KUMA_IS_CONTAINER: !ENV '${UPTIME_KUMA_IS_CONTAINER}'
        - UPTIME_KUMA_ALLOW_ALL_CHROME_EXEC: !ENV '${UPTIME_KUMA_ALLOW_ALL_CHROME_EXEC}'
        - PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: !ENV '${PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD}'
        - DATA_DIR: !ENV '${DATA_DIR}'
        - UPTIME_KUMA_DB_TYPE: !ENV '${UPTIME_KUMA_DB_TYPE}'
        - UPTIME_KUMA_DB_HOSTNAME: !ENV '${UPTIME_KUMA_DB_HOSTNAME}'
        - UPTIME_KUMA_DB_PORT: !ENV '${UPTIME_KUMA_DB_PORT}'
        - UPTIME_KUMA_DB_USERNAME: !ENV '${UPTIME_KUMA_DB_USERNAME}'
        - UPTIME_KUMA_DB_PASSWORD: !ENV '${UPTIME_KUMA_DB_PASSWORD}'
        - UPTIME_KUMA_DB_NAME: !ENV '${UPTIME_KUMA_DB_NAME}'
    volumes:
      - uptime-kuma: /config
  mariadb:
    name: uptime_kuma_mariadb
    priority: 10
    options:
      - from: ghcr.io/daemonless/mariadb:11.4
      - template: !ENV '${PWD}/template.conf'
    oci:
      environment:
        - MYSQL_USER: !ENV '${UPTIME_KUMA_DB_USERNAME}'
        - MYSQL_PASSWORD: !ENV '${UPTIME_KUMA_DB_PASSWORD}'
        - MYSQL_DATABASE: !ENV '${UPTIME_KUMA_DB_NAME}'
        - MYSQL_ROOT_PASSWORD: !ENV '${UPTIME_KUMA_DB_PASSWORD}'
    volumes:
      - database: /config
volumes:
  uptime-kuma:
    device: '/containers/uptime-kuma'
  database:
    device: !ENV '${DATABASE_LOCATION}'

Makejail:

# Makejail

ARG tag=latest

OPTION container=boot
OPTION overwrite=force
OPTION from=ghcr.io/daemonless/uptime-kuma:${tag}

template.conf:

# template.conf

exec.start: "/bin/sh /etc/rc"
exec.stop: "/bin/sh /etc/rc.shutdown jail"
mount.devfs
persist
allow.raw_sockets

Save the files above, then run appjail-director up.

Your own

.env:

# .env

DIRECTOR_PROJECT=uptime-kuma
PUID=1000
PGID=1000
TZ=UTC
UPTIME_KUMA_IS_CONTAINER=1
UPTIME_KUMA_ALLOW_ALL_CHROME_EXEC=1
PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1
DATA_DIR=/config
UPTIME_KUMA_DB_TYPE=
UPTIME_KUMA_DB_HOSTNAME=
UPTIME_KUMA_DB_PORT=
UPTIME_KUMA_DB_USERNAME=
UPTIME_KUMA_DB_PASSWORD=
UPTIME_KUMA_DB_NAME=

appjail-director.yml:

# appjail-director.yml

options:
  - virtualnet: ':<random> default'
  - nat:
services:
  uptime-kuma:
    name: uptime_kuma
    options:
      - container: 'args:--pull'
      - expose: '3001:3001 proto:tcp'
      - template: !ENV '${PWD}/template.conf'
    oci:
      user: root
      environment:
        - PUID: !ENV '${PUID}'
        - PGID: !ENV '${PGID}'
        - TZ: !ENV '${TZ}'
        - UPTIME_KUMA_IS_CONTAINER: !ENV '${UPTIME_KUMA_IS_CONTAINER}'
        - UPTIME_KUMA_ALLOW_ALL_CHROME_EXEC: !ENV '${UPTIME_KUMA_ALLOW_ALL_CHROME_EXEC}'
        - PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: !ENV '${PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD}'
        - DATA_DIR: !ENV '${DATA_DIR}'
        - UPTIME_KUMA_DB_TYPE: !ENV '${UPTIME_KUMA_DB_TYPE}'
        - UPTIME_KUMA_DB_HOSTNAME: !ENV '${UPTIME_KUMA_DB_HOSTNAME}'
        - UPTIME_KUMA_DB_PORT: !ENV '${UPTIME_KUMA_DB_PORT}'
        - UPTIME_KUMA_DB_USERNAME: !ENV '${UPTIME_KUMA_DB_USERNAME}'
        - UPTIME_KUMA_DB_PASSWORD: !ENV '${UPTIME_KUMA_DB_PASSWORD}'
        - UPTIME_KUMA_DB_NAME: !ENV '${UPTIME_KUMA_DB_NAME}'
    volumes:
      - uptime-kuma: /config
volumes:
  uptime-kuma:
    device: '/containers/uptime-kuma'

Makejail:

# Makejail

ARG tag=latest

OPTION container=boot
OPTION overwrite=force
OPTION from=ghcr.io/daemonless/uptime-kuma:${tag}

template.conf:

# template.conf

exec.start: "/bin/sh /etc/rc"
exec.stop: "/bin/sh /etc/rc.shutdown jail"
mount.devfs
persist
allow.raw_sockets

Save the files above, then run appjail-director up. Open http://<server>:3001 from another machine (the server's own browser can't use a published port).

Parameters

Environment Variables

Variable Default Description
PUID 1000 User ID for the application process
PGID 1000 Group ID for the application process
TZ UTC Timezone for the container
UPTIME_KUMA_IS_CONTAINER 1
UPTIME_KUMA_ALLOW_ALL_CHROME_EXEC 1
PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD 1
DATA_DIR /config
UPTIME_KUMA_DB_TYPE `` sqlite or mariadb; set by the Database choice. Empty: uptime-kuma asks on first run
UPTIME_KUMA_DB_HOSTNAME `` MariaDB host (Database choice)
UPTIME_KUMA_DB_PORT 3306 MariaDB port (Database choice)
UPTIME_KUMA_DB_USERNAME `` MariaDB user (Database choice)
UPTIME_KUMA_DB_PASSWORD <UPTIME_KUMA_DB_PASSWORD> MariaDB password (Database choice)
UPTIME_KUMA_DB_NAME `` MariaDB database name (Database choice)

Volumes

Path Description
/config Data directory (database, settings)

Ports

Port Protocol Description
3001 TCP Web UI

Architectures: amd64 User: bsd (UID/GID via PUID/PGID, defaults to 1000:1000) Base: FreeBSD 15


Need help? Join our Discord community.

About

Self-hosted uptime monitoring tool with a beautiful dashboard, status pages, and multi-channel notifications.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages