The self-hosted distribution works two ways: full stack on a single host (everything included, zero external services), or bring your own managed Postgres (you handle the DB, we run the rest). Pick what fits.
Best for: small teams, on-prem, air-gapped, learning the codebase, evaluating before paying.
git clone https://github.com/vikasswaminh/observe24.git && cd observe24cat > .env <<EOF
JWT_SECRET=$(openssl rand -hex 32)
ENCRYPTION_KEY=$(openssl rand -hex 16)
POSTGRES_PASSWORD=$(openssl rand -hex 20)
CLICKHOUSE_PASSWORD=$(openssl rand -hex 20)
EOF
chmod 600 .env docker compose build && docker compose up -ddocker compose run --rm --entrypoint "" -w /app/packages/db api node dist/migrate.js curl -X POST http://localhost/api/v1/auth/register \
-H 'content-type: application/json' \
-d '{"email":"[email protected]","password":"secretLongEnough"}' Total time: ~5 minutes on a fresh host. Container resource ceilings are baked into compose — runs comfortably on a 4-core / 8 GB instance.
Best for: teams who already have a managed-DB story, want PITR / branching / read-replicas out of the box, or don't want to operate Postgres themselves. The compose stack drops the bundled Postgres + backup containers; everything else stays.
for f in packages/db/drizzle/*.sql; do
psql "$DATABASE_URL_DIRECT" -f "$f"
done echo "DATABASE_URL=$YOUR_POOLED_CONNECTION_STRING" >> .envdocker compose up -d api worker scheduler redis clickhouse caddy prometheus grafana loki promtail postgres and postgres_backup — your provider handles both.
Note: when using a transaction-pooled connection (e.g. Neon's -pooler
endpoint or PgBouncer), the application client is configured to disable prepared
statements, which is required for transaction pooling to work correctly.
OpenAPI spec at /openapi.json, Swagger UI at /docs, Prometheus metrics at /metrics.
Grafana on :3002, Prometheus on :9090, Loki on :3100. Datasources pre-wired.
Postgres for entities, ClickHouse for time-series check results, Redis for queues + sessions. (Bundled in Path A; you provide Postgres in Path B.)
Automated with a tiny cron container. In Path B your provider handles PITR — usually better.
Your database, your backups, your domain — no vendor lock-in, and monitoring that runs entirely on your own infrastructure.