[serve] interval_secs = 300 prune_days = 30 listen = "0.0.0.0:9100" peer_heartbeat_secs = 60 route_check_interval_secs = 300 dashboard = false # api_token loaded from POM_API_TOKEN env var [instance] name = "hetzner" [targets.mnw] label = "Makenotwork Production" expected_routes = ["/", "/discover", "/login", "/docs"] [[targets.mnw.dns]] name = "makenot.work" record_type = "A" expected = [] [[targets.mnw.dns]] name = "forums.makenot.work" record_type = "A" expected = [] [[targets.mnw.dns]] name = "git.makenot.work" record_type = "A" expected = [] [[targets.mnw.cors]] url = "https://fsn1.your-objectstorage.com/makenotwork-files/cors-probe" origin = "https://makenot.work" method = "PUT" [targets.mnw.whois] domain = "makenot.work" warn_days = 30 [targets.mnw.health] url = "https://makenot.work/api/health" timeout_secs = 10 [targets.mnw.health.expect] status_code = 200 json_fields = { "status" = "operational", "checks.database" = "true" } [targets.mnw.health.trending] baseline_window_hours = 168 spike_threshold = 2.0 [targets.mnw.tls] host = "makenot.work" [targets.mnw.tests] # Present in prod's live /etc/pom/pom.toml and previously missing here, which # made this file unsafe to deploy: installing it would have silently dropped the # remote CI check from prod. Keep the two in step. ssh = "max@100.106.221.39" command = "/home/max/staging/run-ci.sh" timeout_secs = 600 staleness_days = 7 [targets.mnw.backups] # Where the backups actually are, verified on prod 2026-07-29: the nightly job # writes /var/lib/mnw/backups/makenotwork/makenotwork-.sql.gz. This said # /opt/makenotwork/backups, a path that does not exist on that host, so the # check reported the target degraded for a directory it could not find while the # real backups went unwatched. The app lives at /opt/mnw/current, not # /opt/makenotwork; the old path looks like a pre-rename leftover. # # pom matches files by the "-" or "_" prefix inside this # directory, so the directory is the per-database one, not its parent. directory = "/var/lib/mnw/backups/makenotwork" databases = ["makenotwork"] max_age_hours = 25 interval_secs = 3600 [targets.mnw.scan_pipeline] # Polls /admin/uploads/health.json for queue depth, stuck-scan count, # held backlog, and per-layer error rates. Thresholds per # scan-pipeline-audit.md ยง 6. Localhost on the makenotwork port to # skip the Caddy + Cloudflare path (internal-only signal). base_url = "http://127.0.0.1:3000" interval_secs = 300 timeout_secs = 10 [targets.mnw.synckit_fleet] # Which SyncKit SDK versions are actually syncing. SyncKit is client-side # only, so there is no deployed version to poll; the server aggregates the # version off each sync request's User-Agent and this reads that. Authed # with alerts.alerts_ingest_token, so the check does not spawn without one. # Informational: an old version in the field never degrades the target, only # a readout PoM cannot take does. Localhost for the same reason as above. base_url = "http://127.0.0.1:3000" window_days = 30 interval_secs = 3600 timeout_secs = 10 [targets.mnw-cli] label = "MNW CLI SSH Server" [[targets.mnw-cli.dns]] name = "cli.makenot.work" record_type = "A" expected = [] [targets.mnw-cli.ssh_banner] host = "127.0.0.1" port = 22 timeout_secs = 5 [targets.mt] label = "Multithreaded Forum" expected_routes = ["/"] [targets.mt.health] url = "http://127.0.0.1:3400/api/health" timeout_secs = 5 [targets.mt.health.expect] status_code = 200 json_fields = { "status" = "operational", "database" = "true" } [targets.mt.tls] host = "forums.makenot.work" [targets.mt.tests] ssh = "max@100.106.221.39" command = "cd /home/max/staging/multithreaded && cargo test --workspace 2>&1" timeout_secs = 300 staleness_days = 7 [targets.htpy] label = "htpy.app" [[targets.htpy.dns]] name = "htpy.app" record_type = "A" expected = [] [targets.htpy.whois] domain = "htpy.app" warn_days = 30 [targets.htpy.health] # htpy-web moved twice and this URL followed neither move: it listens on 3200, # not 8080, and /archive/ now 308s to /viewer/. Checking the old # address failed on connect, so the target has been reading "unreachable" with an # open incident since 2026-03-29 while htpy.app itself served fine. Verified # 2026-07-29: this returns 200 with "htpy" in the body from fw13, astra and # hetzner, and 3200 is in the tailnet ACL's inter-server port list. url = "http://100.99.153.68:3200/viewer/S_2" timeout_secs = 10 [targets.htpy.health.expect] status_code = 200 body_contains = "htpy" [targets.htpy.tls] host = "htpy.app" [peers.astra] address = "100.106.221.39:9100" on_missing = "alert" # token = "" [peers.macbook] address = "100.100.246.136:9100" on_missing = "log" # token = "" [alerts] # postmark_token loaded from POM_POSTMARK_TOKEN env var to = "pom-alerts@makenot.work" # MNW operator-log sink: also pushes alerts to POST {mnw_url}/api/internal/alerts. # Enable once ALERTS_INGEST_TOKEN is set in MNW prod .env AND the endpoint is # reachable from this host. Confirm reachability first: /api/internal may be # restricted at the public edge, in which case use the tailnet URL instead of # the public one below. The token loads from POM_ALERTS_INGEST_TOKEN env var # (never commit it here). Both mnw_url and the token must be present, else the # sink stays disabled. # mnw_url = "https://makenot.work"