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/ |
| Tag | Description | Best For |
|---|---|---|
latest |
Upstream Binary. Built from official release. | Most users — recommended. |
Before deploying, ensure your host environment is ready. See the Quick Start Guide for host setup instructions.
Database. Where the app keeps its data. The default needs nothing else running.
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.
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/mariadb2. 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.
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= # Database2. 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.
.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.
.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.
.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).
| 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) |
| Path | Description |
|---|---|
/config |
Data directory (database, settings) |
| 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.