diff --git a/blueprints/oneuptime/docker-compose.yml b/blueprints/oneuptime/docker-compose.yml
new file mode 100644
index 00000000..7bd82327
--- /dev/null
+++ b/blueprints/oneuptime/docker-compose.yml
@@ -0,0 +1,158 @@
+services:
+ oneuptime:
+ image: oneuptime/app:11.5.6
+ restart: unless-stopped
+ environment:
+ - PORT=3002
+ - NODE_ENV=production
+ - BILLING_ENABLED=false
+ - IS_ENTERPRISE_EDITION=false
+ - LOG_LEVEL=ERROR
+ - DISABLE_TELEMETRY=true
+ # Public host (domain) and protocol used to build links.
+ - HOST=${HOST}
+ - HTTP_PROTOCOL=${HTTP_PROTOCOL}
+ - ONEUPTIME_SECRET=${ONEUPTIME_SECRET}
+ - ENCRYPTION_SECRET=${ENCRYPTION_SECRET}
+ # Probes that present this key are allowed to self-register.
+ - REGISTER_PROBE_KEY=${REGISTER_PROBE_KEY}
+ - DATABASE_HOST=postgres
+ - DATABASE_PORT=5432
+ - DATABASE_USERNAME=postgres
+ - DATABASE_PASSWORD=${DATABASE_PASSWORD}
+ - DATABASE_NAME=oneuptimedb
+ - REDIS_HOST=redis
+ - REDIS_PORT=6379
+ - REDIS_USERNAME=default
+ - REDIS_PASSWORD=${REDIS_PASSWORD}
+ - REDIS_DB=0
+ - CLICKHOUSE_HOST=clickhouse
+ - CLICKHOUSE_PORT=8123
+ - CLICKHOUSE_USER=default
+ - CLICKHOUSE_PASSWORD=${CLICKHOUSE_PASSWORD}
+ - CLICKHOUSE_DATABASE=oneuptime
+ depends_on:
+ postgres:
+ condition: service_healthy
+ redis:
+ condition: service_healthy
+ clickhouse:
+ condition: service_healthy
+
+ ingress:
+ image: oneuptime/nginx:11.5.6
+ restart: unless-stopped
+ environment:
+ - NODE_ENV=production
+ - BILLING_ENABLED=false
+ - LOG_LEVEL=ERROR
+ - DISABLE_TELEMETRY=true
+ - HOST=${HOST}
+ - NGINX_LISTEN_ADDRESS=
+ - NGINX_LISTEN_OPTIONS=
+ - PROVISION_SSL=
+ # Long domains (e.g. generated *.sslip.io hosts) overflow nginx's
+ # default server_names_hash_bucket_size of 64.
+ - SERVER_NAMES_HASH_BUCKET_SIZE=128
+ # Where nginx proxies the UI/API to.
+ - SERVER_APP_HOSTNAME=oneuptime
+ - APP_PORT=3002
+ # The marketing "home" app is not deployed (only used when billing is
+ # enabled), but nginx needs the vars to render its config.
+ - SERVER_HOME_HOSTNAME=home
+ - HOME_PORT=1444
+ # The ingress sidecar (custom-domain certificate writer) connects to
+ # Postgres and Redis.
+ - ONEUPTIME_SECRET=${ONEUPTIME_SECRET}
+ - ENCRYPTION_SECRET=${ENCRYPTION_SECRET}
+ - DATABASE_HOST=postgres
+ - DATABASE_PORT=5432
+ - DATABASE_USERNAME=postgres
+ - DATABASE_PASSWORD=${DATABASE_PASSWORD}
+ - DATABASE_NAME=oneuptimedb
+ - REDIS_HOST=redis
+ - REDIS_PORT=6379
+ - REDIS_USERNAME=default
+ - REDIS_PASSWORD=${REDIS_PASSWORD}
+ - REDIS_DB=0
+ depends_on:
+ postgres:
+ condition: service_healthy
+ oneuptime:
+ condition: service_started
+
+ probe:
+ image: oneuptime/probe:11.5.6
+ restart: unless-stopped
+ environment:
+ - PORT=3874
+ - NODE_ENV=production
+ - LOG_LEVEL=ERROR
+ - DISABLE_TELEMETRY=true
+ # The probe reaches OneUptime through the ingress ("ingress" is part of
+ # nginx's server_name, so all API routes resolve correctly).
+ - ONEUPTIME_URL=http://ingress:7849
+ - PROBE_NAME=Probe-1
+ - PROBE_DESCRIPTION=Default probe for monitors
+ - PROBE_MONITORING_WORKERS=3
+ - PROBE_MONITOR_FETCH_LIMIT=10
+ - PROBE_KEY=${PROBE_KEY}
+ - REGISTER_PROBE_KEY=${REGISTER_PROBE_KEY}
+ depends_on:
+ ingress:
+ condition: service_started
+
+ postgres:
+ image: postgres:15
+ restart: unless-stopped
+ environment:
+ - POSTGRES_USER=postgres
+ - POSTGRES_PASSWORD=${DATABASE_PASSWORD}
+ - POSTGRES_DB=oneuptimedb
+ volumes:
+ - postgres-data:/var/lib/postgresql/data
+ healthcheck:
+ test: ["CMD-SHELL", "pg_isready -U postgres -d oneuptimedb"]
+ interval: 10s
+ timeout: 5s
+ retries: 5
+ start_period: 15s
+
+ redis:
+ image: redis:7.0.12
+ restart: unless-stopped
+ command: redis-server --requirepass "${REDIS_PASSWORD}" --save "" --appendonly no
+ healthcheck:
+ test: ["CMD-SHELL", "redis-cli -a \"$$REDIS_PASSWORD\" ping | grep PONG"]
+ interval: 10s
+ timeout: 5s
+ retries: 5
+ start_period: 10s
+ environment:
+ - REDIS_PASSWORD=${REDIS_PASSWORD}
+
+ clickhouse:
+ image: clickhouse/clickhouse-server:25.7
+ restart: unless-stopped
+ environment:
+ - CLICKHOUSE_USER=default
+ - CLICKHOUSE_PASSWORD=${CLICKHOUSE_PASSWORD}
+ - CLICKHOUSE_DB=oneuptime
+ - CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT=1
+ volumes:
+ - clickhouse-data:/var/lib/clickhouse
+ # Single-node cluster + embedded Keeper (OneUptime's analytics schema is
+ # always ReplicatedMergeTree + Distributed) and Distributed-insert
+ # batching, as shipped by upstream.
+ - ../files/clickhouse/cluster.xml:/etc/clickhouse-server/config.d/cluster.xml
+ - ../files/clickhouse/distributed-insert-tuning.xml:/etc/clickhouse-server/users.d/distributed-insert-tuning.xml
+ healthcheck:
+ test: ["CMD-SHELL", "clickhouse-client --password \"$$CLICKHOUSE_PASSWORD\" --query 'SELECT 1'"]
+ interval: 10s
+ timeout: 5s
+ retries: 5
+ start_period: 15s
+
+volumes:
+ postgres-data:
+ clickhouse-data:
diff --git a/blueprints/oneuptime/meta.json b/blueprints/oneuptime/meta.json
new file mode 100644
index 00000000..c2108d5c
--- /dev/null
+++ b/blueprints/oneuptime/meta.json
@@ -0,0 +1,20 @@
+{
+ "id": "oneuptime",
+ "name": "OneUptime",
+ "version": "11.5.6",
+ "description": "OneUptime is an open-source observability platform: uptime monitoring, status pages, incident management, on-call rotations, logs, traces and metrics in one place.",
+ "logo": "oneuptime.svg",
+ "links": {
+ "github": "https://github.com/OneUptime/oneuptime",
+ "website": "https://oneuptime.com/",
+ "docs": "https://oneuptime.com/docs"
+ },
+ "tags": [
+ "monitoring",
+ "observability",
+ "status-page",
+ "incident-management",
+ "on-call",
+ "alerting"
+ ]
+}
diff --git a/blueprints/oneuptime/oneuptime.svg b/blueprints/oneuptime/oneuptime.svg
new file mode 100644
index 00000000..5f2eec13
--- /dev/null
+++ b/blueprints/oneuptime/oneuptime.svg
@@ -0,0 +1,10 @@
+
+
+
diff --git a/blueprints/oneuptime/template.toml b/blueprints/oneuptime/template.toml
new file mode 100644
index 00000000..a674b269
--- /dev/null
+++ b/blueprints/oneuptime/template.toml
@@ -0,0 +1,109 @@
+[variables]
+main_domain = "${domain}"
+db_password = "${password:32}"
+redis_password = "${password:32}"
+clickhouse_password = "${password:32}"
+oneuptime_secret = "${password:64}"
+encryption_secret = "${password:64}"
+register_probe_key = "${password:32}"
+probe_key = "${password:32}"
+
+[config]
+[[config.domains]]
+serviceName = "ingress"
+port = 7849
+host = "${main_domain}"
+
+[config.env]
+# Public host OneUptime is served on. Must match the domain above.
+"HOST" = "${main_domain}"
+# Change to "https" once you serve the domain over SSL/TLS.
+"HTTP_PROTOCOL" = "http"
+"DATABASE_PASSWORD" = "${db_password}"
+"REDIS_PASSWORD" = "${redis_password}"
+"CLICKHOUSE_PASSWORD" = "${clickhouse_password}"
+"ONEUPTIME_SECRET" = "${oneuptime_secret}"
+"ENCRYPTION_SECRET" = "${encryption_secret}"
+# Shared key probes use to self-register with the server.
+"REGISTER_PROBE_KEY" = "${register_probe_key}"
+# Identity key of the bundled probe.
+"PROBE_KEY" = "${probe_key}"
+
+# Single-node ClickHouse cluster + embedded Keeper drop-in (from upstream:
+# OneUptime's analytics schema is always ReplicatedMergeTree + Distributed,
+# so a single node runs an embedded Keeper and a 1-node "oneuptime" cluster).
+[[config.mounts]]
+filePath = "/clickhouse/cluster.xml"
+content = """
+
+
+
+
+ 9181
+ 1
+ /var/lib/clickhouse/coordination/log
+ /var/lib/clickhouse/coordination/snapshots
+
+ 10000
+ 30000
+ warning
+
+
+
+ 1
+ localhost
+ 9234
+
+
+
+
+
+
+
+ localhost
+ 9181
+
+
+
+
+
+ 01
+ replica-1
+ oneuptime
+
+
+
+
+
+
+ true
+
+ localhost
+ 9000
+
+
+
+
+
+"""
+
+# Batches the background Distributed-insert sender so telemetry ingestion
+# keeps up with volume (from upstream Clickhouse/users.d).
+[[config.mounts]]
+filePath = "/clickhouse/distributed-insert-tuning.xml"
+content = """
+
+
+
+
+
+ 1
+
+ 1
+
+ 1
+
+
+
+"""