Skip to content

Docker Installation

Crit Alarm is distributed as a multi-architecture Docker container (linux/amd64 and linux/arm64) with an embedded SQLite database.

Run the container in the background with automatic restart and persistent data storage:

Terminal window
docker run -d \
--name critalarm \
--restart unless-stopped \
-p 8080:8080 \
-v critalarm_data:/data \
-e CRITALARM_BASE_URL="https://alerts.example.com" \
-e CRITALARM_RELAY_URL="https://relay.critalarm.app" \
-e CRITALARM_RELAY_CONTENT="none" \
-e CRITALARM_BEHIND_PROXY="true" \
ghcr.io/anvilnine/critalarm:latest

Create a docker-compose.yml file:

services:
critalarm:
image: ghcr.io/anvilnine/critalarm:latest
container_name: critalarm
restart: unless-stopped
ports:
- "8080:8080"
volumes:
- ./data:/data
environment:
# Required: Public URL where your server is reached (no trailing slash)
- CRITALARM_BASE_URL=https://alerts.example.com
# Default push relay service
- CRITALARM_RELAY_URL=https://relay.critalarm.app
# Privacy mode: 'none' (zero message content on relay) or 'full'
- CRITALARM_RELAY_CONTENT=none
# Host and port to bind inside the container
- CRITALARM_LISTEN=:8080
# Directory where SQLite database is stored
- CRITALARM_DATA_DIR=/data
# Set to true when running behind Caddy, Traefik, or Nginx
- CRITALARM_BEHIND_PROXY=true

Start the service:

Terminal window
docker compose up -d

On first start, Crit Alarm generates an admin token (ad_...) and writes it to stdout.

Inspect the container logs to find your token:

Terminal window
docker logs critalarm

Alternatively, run the embedded CLI tool inside the container:

Terminal window
docker exec -it critalarm critalarm token show

Keep this token secure. You will enter it in the Crit Alarm mobile app when connecting to your self-hosted server.

If your admin token is compromised, rotate it immediately:

Terminal window
docker exec -it critalarm critalarm token rotate

Rotating invalidates old management sessions. Topics, subscriptions and incident history stay.

Verify that the server is healthy by calling the unauthenticated info endpoint:

Terminal window
curl http://localhost:8080/v1/info

Expected output:

{
"name": "critalarm",
"version": "0.1.0",
"base_url": "https://alerts.example.com",
"relay_url": "https://relay.critalarm.app",
"relay_content": "none",
"mode": "selfhosted"
}

All topics, tokens, incidents, messages, and timers are saved in /data/critalarm.db.

To back up your installation:

Terminal window
# Safe live SQLite backup
docker exec critalarm sqlite3 /data/critalarm.db ".backup '/data/critalarm.backup.db'"
docker cp critalarm:/data/critalarm.backup.db ./critalarm.backup.db

To upgrade to the latest release:

Terminal window
docker compose pull
docker compose up -d

Database migrations apply automatically on container boot.