Skip to content

Commit b16b8a4

Browse files
baditaflorinclaude
andauthored
[release] Bump to 0.179.48 — 0mcp migration, uptime-kuma provisioning, status bare-root fix (#19)
* [domain] Migrate platform domain from 0mpc.com to 0mcp.com 0mcp.com (Model Context Protocol) is the live registered domain with Hetzner Robot NS already propagated. 0mpc.com had stuck NS propagation at expirationwarning.net; 0mcp.com is fully functional. Changes: - .local/identity.yml: platform_domain, hetzner_dns_zone_name, cert overrides - Generated configs: dns-declarations.yaml, nginx-upstreams, sso-clients, platform_tls_certs.yml - Templates, RELEASE.md, changelog, platform-manifest.json, workstreams Keycloak realm stays named '0mpc' (live Keycloak config, requires separate migration step via Ansible converge). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(uptime-kuma): add uptime_kuma_provision role and fix status-page bare-root proxy Add the lv3.platform.uptime_kuma_provision role (monitors + public status page) wired into playbooks/uptime-kuma.yml behind a new provision-uptime-kuma Make target. Fix the bare-root https://status.<domain>/ 404: the edge proxy's root_proxy_path was a stale literal (/status/lv3-platform). Derive it the same way the role derives uptime_kuma_provision_status_slug ("<domain-first-label>-platform") so it tracks platform_domain instead of drifting. Updated in host_vars source of truth and the regenerated platform.yml + subdomain-exposure-registry.json. Regenerated platform.yml also reflects the 0mcp.com domain migration and the current mail DNS source state; generate_platform_vars.py now computes mail_platform_dkim_dns_value so DKIM/DNS records resolve at generation time. * [release] Bump to 0.179.48 — complete 0mcp migration, uptime-kuma provisioning, status bare-root fix Release artifacts for the 0mpc.com -> 0mcp.com migration completion, the new lv3.platform.uptime_kuma_provision role, and the status-page bare-root proxy fix. Regenerated release notes, platform manifest, and ADR index. --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 84c47f8 commit b16b8a4

58 files changed

Lines changed: 2225 additions & 838 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

Makefile

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -166,8 +166,8 @@ ANSIBLE_TRACE_ARGS := -e platform_trace_id=$(PLATFORM_TRACE_ID) $(if $(PLATFORM_
166166
.PHONY: backup-coverage-ledger dr-runbook runbook-executor post-merge-gate integration-tests nightly-integration-tests scheduler-watchdog-loop intent-queue-dispatcher platform-observation-loop fault-injection triage-alert triage-calibration search-index-rebuild scan-published-artifacts setup preflight syntax-check syntax-check-monitoring syntax-check-ntfy syntax-check-ntopng syntax-check-falco syntax-check-api-gateway syntax-check-ops-portal syntax-check-dify syntax-check-gitea syntax-check-browser-runner syntax-check-guest-network-policy syntax-check-docker-runtime syntax-check-backup-vm syntax-check-artifact-cache-vm syntax-check-control-plane-recovery syntax-check-uptime-kuma syntax-check-mail-platform syntax-check-mailpit syntax-check-livekit syntax-check-paperless syntax-check-redpanda syntax-check-openbao syntax-check-openfga syntax-check-step-ca syntax-check-temporal syntax-check-headscale syntax-check-semaphore syntax-check-woodpecker syntax-check-windmill syntax-check-restic-config-backup syntax-check-keycloak syntax-check-langfuse syntax-check-glitchtip syntax-check-minio syntax-check-netbox syntax-check-searxng syntax-check-typesense syntax-check-flagsmith syntax-check-crawl4ai
167167
.PHONY: syntax-check-ollama syntax-check-piper syntax-check-n8n syntax-check-mattermost syntax-check-portainer syntax-check-vaultwarden syntax-check-rag-context syntax-check-secret-rotation syntax-check-dozzle syntax-check-excalidraw collection-sync collection-build collection-publish collection-install check-platform-drift drift-report subdomain-exposure-audit list-services diff-services list-service-deployments security-posture-report security-headers-audit public-surface-security-scan open-maintenance-window close-maintenance-window ensure-resource-lock-registry resource-locks resource-lock-acquire resource-lock-release resource-lock-heartbeat operator-onboard operator-offboard sync-operators quarterly-access-review install-proxmox configure-network configure-staging-bridge configure-ingress configure-edge-publication configure-tailscale configure-host-control-loops provision-guests
168168
.PHONY: harden-access harden-guest-access harden-security provision-api-access converge-all-services converge-site-parallel converge-guest-network-policy converge-monitoring converge-ntfy converge-ntopng converge-falco converge-identity-core-watchdog converge-api-gateway converge-ops-portal converge-repo-intake converge-dify converge-gitea converge-browser-runner converge-docker-runtime converge-postgres-vm converge-mail-platform converge-mailpit converge-livekit converge-neko converge-paperless converge-redpanda converge-openbao converge-openfga converge-step-ca converge-temporal converge-headscale converge-semaphore converge-woodpecker converge-windmill converge-restic-config-backup converge-control-plane-recovery converge-keycloak converge-langfuse converge-glitchtip converge-minio converge-netbox converge-searxng converge-typesense converge-crawl4ai converge-ollama converge-piper converge-label-studio converge-n8n converge-mattermost converge-portainer converge-vaultwarden converge-rag-context converge-dozzle converge-excalidraw converge-flagsmith rotate-secret token-inventory-audit token-exposure-response rotate-keycloak-client-secret
169-
.PHONY: rotate-windmill-token rotate-grafana-service-token rotate-platform-cli-token deploy-uptime-kuma uptime-kuma-manage uptime-robot-manage portainer-manage semaphore-manage woodpecker-manage configure-backups configure-backup-vm configure-artifact-cache-vm database-dns route-dns-assertion-ledger provision-subdomain start-workstream capacity-report weekly-capacity-report disk-space-monitor k6-smoke k6-load k6-soak immutable-guest-replacement-plan synthetic-transaction-replay check-nats-streams apply-nats-streams promote live-apply-group live-apply-service live-apply-site live-apply-waves live-apply-train-status live-apply-train-queue live-apply-train-plan live-apply-train-bundle live-apply-train-run live-apply-train-rollback build-check-runners push-check-runners run-checks warm-cache cache-status fixture-up fixture-down fixture-list fixture-pool-status restic-config-backup restic-config-restore-verify
170-
.PHONY: rotate-windmill-token rotate-grafana-service-token rotate-platform-cli-token deploy-uptime-kuma uptime-kuma-manage uptime-robot-manage portainer-manage semaphore-manage woodpecker-manage configure-backups configure-backup-vm configure-artifact-cache-vm database-dns route-dns-assertion-ledger provision-subdomain start-workstream capacity-report weekly-capacity-report disk-space-monitor k6-smoke k6-load k6-soak immutable-guest-replacement-plan synthetic-transaction-replay check-nats-streams apply-nats-streams promote live-apply-group live-apply-service live-apply-site live-apply-waves live-apply-train-status live-apply-train-queue live-apply-train-plan live-apply-train-bundle live-apply-train-run live-apply-train-rollback build-check-runners push-check-runners run-checks warm-cache cache-status fixture-up fixture-down fixture-list fixture-pool-status restic-config-backup restic-config-restore-verify
169+
.PHONY: rotate-windmill-token rotate-grafana-service-token rotate-platform-cli-token deploy-uptime-kuma provision-uptime-kuma uptime-kuma-manage uptime-robot-manage portainer-manage semaphore-manage woodpecker-manage configure-backups configure-backup-vm configure-artifact-cache-vm database-dns route-dns-assertion-ledger provision-subdomain start-workstream capacity-report weekly-capacity-report disk-space-monitor k6-smoke k6-load k6-soak immutable-guest-replacement-plan synthetic-transaction-replay check-nats-streams apply-nats-streams promote live-apply-group live-apply-service live-apply-site live-apply-waves live-apply-train-status live-apply-train-queue live-apply-train-plan live-apply-train-bundle live-apply-train-run live-apply-train-rollback build-check-runners push-check-runners run-checks warm-cache cache-status fixture-up fixture-down fixture-list fixture-pool-status restic-config-backup restic-config-restore-verify
170+
.PHONY: rotate-windmill-token rotate-grafana-service-token rotate-platform-cli-token deploy-uptime-kuma provision-uptime-kuma uptime-kuma-manage uptime-robot-manage portainer-manage semaphore-manage woodpecker-manage configure-backups configure-backup-vm configure-artifact-cache-vm database-dns route-dns-assertion-ledger provision-subdomain start-workstream capacity-report weekly-capacity-report disk-space-monitor k6-smoke k6-load k6-soak immutable-guest-replacement-plan synthetic-transaction-replay check-nats-streams apply-nats-streams promote live-apply-group live-apply-service live-apply-site live-apply-waves live-apply-train-status live-apply-train-queue live-apply-train-plan live-apply-train-bundle live-apply-train-run live-apply-train-rollback build-check-runners push-check-runners run-checks warm-cache cache-status fixture-up fixture-down fixture-list fixture-pool-status restic-config-backup restic-config-restore-verify
171171
.PHONY: validate-certificates fixture-pool-reconcile fixture-reaper install-cli update-cli validate-packer remote-packer-validate packer-template-rebuild remote-tofu-plan remote-tofu-apply tofu-drift tofu-import syntax-check-matrix-synapse converge-matrix-synapse syntax-check-nomad converge-nomad remote-lint remote-validate remote-pre-push remote-packer-build remote-image-build remote-exec check-build-server apply-gate-tools syntax-check-changedetection converge-changedetection syntax-check-gotenberg converge-gotenberg
172172
.PHONY: syntax-check-tika converge-tika syntax-check-directus converge-directus syntax-check-label-studio converge-label-studio syntax-check-superset converge-superset syntax-check-sftpgo converge-sftpgo syntax-check-neko
173173
.PHONY: syntax-check-tesseract-ocr converge-tesseract-ocr
@@ -1733,6 +1733,10 @@ deploy-uptime-kuma:
17331733
HETZNER_DNS_API_TOKEN=$${HETZNER_DNS_API_TOKEN:?set HETZNER_DNS_API_TOKEN} \
17341734
ANSIBLE_HOST_KEY_CHECKING=False $(ANSIBLE_ENV) $(ANSIBLE_SCOPED_RUN) --playbook $(REPO_ROOT)/playbooks/uptime-kuma.yml --env $(env) -- --private-key $(BOOTSTRAP_KEY) -e proxmox_guest_ssh_connection_mode=proxmox_host_jump
17351735

1736+
provision-uptime-kuma:
1737+
$(MAKE) preflight WORKFLOW=provision-uptime-kuma
1738+
ANSIBLE_HOST_KEY_CHECKING=False $(ANSIBLE_ENV) $(ANSIBLE_SCOPED_RUN) --playbook $(REPO_ROOT)/playbooks/uptime-kuma.yml --env $(env) --tags service-uptime-kuma-provision -- --private-key $(BOOTSTRAP_KEY) -e proxmox_guest_ssh_connection_mode=proxmox_host_jump
1739+
17361740
uptime-kuma-manage:
17371741
$(MAKE) preflight WORKFLOW=uptime-kuma-manage
17381742
@test -n "$(ACTION)" || (echo "set ACTION=<bootstrap|ensure-monitors|ensure-status-page|list-monitors|list-maintenances>"; exit 1)

RELEASE.md

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1-
# Release 0.179.47
1+
# Release 0.179.48
22

3-
- Date: 2026-05-21
3+
- Date: 2026-05-31
44

55
## Summary
6-
- Deploy Woodpecker CI (ci.0mpc.com): fix OpenBao remote address for docker-runtime, add port 3003 Proxmox firewall rule for docker-runtime → runtime-control, bootstrap Gitea OAuth and seed repository
6+
- Complete the 0mpc.com → 0mcp.com operator-apex migration: regenerate platform.yml and discovery artifacts against the renamed domain, update the sanitization BLOCKED list, and refresh the subdomain exposure registry
7+
- Add the `lv3.platform.uptime_kuma_provision` role (monitors + public status page) with a `provision-uptime-kuma` Make target and playbook wiring
8+
- Fix the bare-root `https://status.<domain>/` 404 by deriving the edge `root_proxy_path` status slug from `platform_domain` instead of a stale literal
9+
- Deploy Woodpecker CI (ci.0mcp.com): fix OpenBao remote address for docker-runtime, add port 3003 Proxmox firewall rule for docker-runtime → runtime-control, bootstrap Gitea OAuth and seed repository
710

811
## Platform Impact
912
- no live platform version bump; this release updates repository automation, release metadata, and operator tooling only

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
0.179.47
1+
0.179.48

build/platform-manifest.json

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
{
22
"$schema": "docs/schema/platform-manifest.schema.json",
33
"manifest_version": "1.0.0",
4-
"repo_version": "0.179.47",
5-
"platform_version": "0.179.46",
6-
"generated_at": "2026-05-21T18:52:52Z",
7-
"next_refresh_at": "2026-05-21T19:52:52Z",
4+
"repo_version": "0.179.48",
5+
"platform_version": "0.179.47",
6+
"generated_at": "2026-05-31T11:46:00Z",
7+
"next_refresh_at": "2026-05-31T12:46:00Z",
88
"environment": "production",
99
"identity": {
10-
"platform_name": "0mpc.com",
11-
"operator": "0mpc Operator",
10+
"platform_name": "0mcp.com",
11+
"operator": "0mcp Operator",
1212
"description": "Single-node Proxmox homelab with repository-managed agentic operations automation.",
1313
"host_id": "proxmox-host",
1414
"provider": "hetzner-dedicated"
@@ -6358,10 +6358,10 @@
63586358
]
63596359
},
63606360
"recent_changes": {
6361-
"last_version": "0.179.46",
6362-
"deployed_at": "2026-05-21",
6363-
"summary": "Deploy Woodpecker CI (ci.0mpc.com): fix OpenBao remote address for docker-runtime, add port 3003 Proxmox firewall rule for docker-runtime \u2192 runtime-control, bootstrap Gitea OAuth and seed repository",
6364-
"release_notes_url": "docs/release-notes/0.179.47.md"
6361+
"last_version": "0.179.47",
6362+
"deployed_at": "2026-05-31",
6363+
"summary": "Complete the 0mpc.com \u2192 0mcp.com operator-apex migration: regenerate platform.yml and discovery artifacts against the renamed domain, update the sanitization BLOCKED list, and refresh the subdomain exposure registry Add the `lv3.platform.uptime_kuma_provision` role (monitors + public status page) with a `provision-uptime-kuma` Make target and playbook wiring",
6364+
"release_notes_url": "docs/release-notes/0.179.48.md"
63656365
},
63666366
"agentic_architecture": {
63676367
"overview": "Intent-driven repository automation with validation, approval, release metadata, and runtime convergence routed through governed workflows.",
@@ -6373,17 +6373,17 @@
63736373
},
63746374
{
63756375
"component": "Ops portal",
6376-
"endpoint": "https://ops.0mpc.com",
6376+
"endpoint": "https://ops.0mcp.com",
63776377
"adr": "0093"
63786378
},
63796379
{
63806380
"component": "Windmill workflows",
6381-
"endpoint": "https://windmill.0mpc.com",
6381+
"endpoint": "https://windmill.0mcp.com",
63826382
"adr": "0044"
63836383
},
63846384
{
63856385
"component": "API gateway",
6386-
"endpoint": "https://api.0mpc.com",
6386+
"endpoint": "https://api.0mcp.com",
63876387
"adr": "0092"
63886388
}
63896389
],

changelog.md

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,18 @@ Versioned release notes live under [docs/release-notes/README.md](docs/release-n
1212

1313
## Unreleased
1414

15-
- Deploy Woodpecker CI (ci.0mpc.com): fix OpenBao remote address for docker-runtime, add port 3003 Proxmox firewall rule for docker-runtime → runtime-control, bootstrap Gitea OAuth and seed repository
15+
- Complete the 0mpc.com → 0mcp.com operator-apex migration: regenerate platform.yml and discovery artifacts against the renamed domain, update the sanitization BLOCKED list, and refresh the subdomain exposure registry
16+
- Add the `lv3.platform.uptime_kuma_provision` role (monitors + public status page) with a `provision-uptime-kuma` Make target and playbook wiring
17+
- Fix the bare-root `https://status.<domain>/` 404 by deriving the edge `root_proxy_path` status slug from `platform_domain` instead of a stale literal
18+
- Deploy Woodpecker CI (ci.0mcp.com): fix OpenBao remote address for docker-runtime, add port 3003 Proxmox firewall rule for docker-runtime → runtime-control, bootstrap Gitea OAuth and seed repository
1619

1720
## Latest Release
1821

19-
- [0.179.47 release notes](docs/release-notes/0.179.47.md)
22+
- [0.179.48 release notes](docs/release-notes/0.179.48.md)
2023

2124
## Previous Releases
2225

26+
- [0.179.47 release notes](docs/release-notes/0.179.47.md)
2327
- [0.179.46 release notes](docs/release-notes/0.179.46.md)
2428
- [0.179.45 release notes](docs/release-notes/0.179.45.md)
2529
- [0.179.44 release notes](docs/release-notes/0.179.44.md)
@@ -31,7 +35,6 @@ Versioned release notes live under [docs/release-notes/README.md](docs/release-n
3135
- [0.179.38 release notes](docs/release-notes/0.179.38.md)
3236
- [0.179.37 release notes](docs/release-notes/0.179.37.md)
3337
- [0.179.36 release notes](docs/release-notes/0.179.36.md)
34-
- [0.179.35 release notes](docs/release-notes/0.179.35.md)
3538
- [0.179.31 release notes](docs/release-notes/0.179.31.md)
3639
- [0.179.30 release notes](docs/release-notes/0.179.30.md)
3740
- [0.179.29 release notes](docs/release-notes/0.179.29.md)
@@ -40,4 +43,4 @@ Versioned release notes live under [docs/release-notes/README.md](docs/release-n
4043
## Release Archives
4144

4245
- [Release note archives](docs/release-notes/index/README.md)
43-
- [2026 (558 releases)](docs/release-notes/index/2026.md)
46+
- [2026 (559 releases)](docs/release-notes/index/2026.md)
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
# uptime_kuma_provision
2+
3+
Generic, registry-driven provisioning of Uptime Kuma **monitors** and the
4+
public **status page**. This role configures a *running* Uptime Kuma instance;
5+
the container itself is deployed by `uptime_kuma_runtime`.
6+
7+
## Why this exists
8+
9+
Deploying the Uptime Kuma container leaves it empty — no monitors, no status
10+
page, no admin account. The previous workflow required a manual
11+
`make uptime-kuma-manage ACTION=…` ritual run from the controller, which only
12+
works if the operator's machine can reach the instance (the public edge is
13+
behind oauth2-proxy/SSO, which blocks the socket.io API).
14+
15+
This role makes provisioning a first-class, idempotent part of the converge.
16+
17+
## How it is generic
18+
19+
Nothing about the deployment is hardcoded:
20+
21+
| Concern | Source |
22+
|--------------------|--------|
23+
| API base URL | `http://127.0.0.1:{{ internal_port }}` — port from `platform_service_registry`. The agent runs **on the VM**, so no IP and no SSH tunnel are needed. |
24+
| Which services | Every service in `config/health-probe-catalog.json` with `uptime_kuma.enabled == true` becomes a monitor. Add a service to the catalog → it appears automatically. |
25+
| Monitor URLs | The catalog's `example.com` / `lv3` placeholders are substituted with `platform_domain` and the Keycloak realm at runtime. |
26+
| Status page | Auto-built: a single "Platform Services" group covering every monitor, titled and domained from `platform_domain` (`status.<domain>`). |
27+
28+
## What it does (idempotent)
29+
30+
1. Derives the internal port from the service registry.
31+
2. Installs a minimal venv (`requests`, `python-socketio`) on the VM.
32+
3. Copies a **self-contained** agent (`files/uptime_kuma_agent.py`) and the
33+
health-probe catalog to the VM.
34+
4. Seeds the VM with any existing controller-side admin session so the stored
35+
token is reused.
36+
5. Runs the agent's `provision` command: bootstrap the admin (first run only),
37+
reconcile monitors, reconcile the status page.
38+
6. Fetches the admin session back to `.local/uptime-kuma/admin-session.json`.
39+
40+
## Key variables
41+
42+
See `defaults/main.yml`. Most are registry/identity-derived. The one you may
43+
need to override:
44+
45+
- `uptime_kuma_provision_keycloak_realm` — defaults to `keycloak_realm_name`
46+
(the domain's first label). If the **live** realm name differs (e.g. the
47+
domain is `0mcp.com` but the realm is still named `0mpc`), override it:
48+
49+
```
50+
-e uptime_kuma_provision_keycloak_realm=0mpc
51+
```
52+
53+
## Running it
54+
55+
It runs automatically as the final play of `playbooks/uptime-kuma.yml`
56+
(`make deploy-uptime-kuma env=production`). To run only the provisioning step:
57+
58+
```
59+
make provision-uptime-kuma env=production
60+
```

0 commit comments

Comments
 (0)