Commit graph

7,191 commits

Author SHA1 Message Date
b5d26d633e deploy(k8s): R2D2 Ops board as front door over a Kuma backend
Self-contained manifests + ops image Dockerfile to run the ops console as the
public entry point (ops.r2d2.office.ilab.zone / VIP 192.168.3.153) in the
r2d2-status-kuma namespace on the RAID cluster, fronting an Uptime Kuma backend.

- ops-server (git.office.ilab.zone/raid/r2d2-ops) serves the FMV/telemetry UI and
  logs into Kuma over socket.io on localhost; Service/LB/Ingress target it (4013).
- Kuma (git.office.ilab.zone/raid/r2d2-status-kuma:2.4.0) is a private backend
  on a MariaDB sidecar.
- Ordered native sidecars mariadb -> netbird -> kuma -> wait-kuma-login gate, so
  the DB, the mesh, and a working Kuma socket-login are all ready before
  ops-server starts. Fixes the boot-time login hang (timeout-less emitWithAck in
  serve.mjs) and the mesh EHOSTUNREACH false-downs.
- Secrets (db creds, netbird setup key, admin/ops creds) live only in-cluster,
  referenced by secretKeyRef; nothing sensitive in the manifest.
2026-07-08 09:24:43 -04:00
7a3d8dcb66 docs(features): F11 drone MQTT discovery & video-node association plan
Plan + shared mqtt.config.json for subscribing to the office broker's
retained node/description topics: live registry of announced UXVs with
standard-identity/liveness, manual rescan, and a bidirectional alias link
between a drone node and its video feed. Planning only; no consumer code.
2026-07-08 08:59:17 -04:00
c8fe9796ff feat(ops): SPA detail view — HLS player, capture controls, page tabs
Native media detail modal with in-browser HLS playback, in-detail record
/ snapshot controls wired to the capture summary, a source-URL inspector,
group/subgroup-aware facets, and tag-driven Page tabs.
2026-07-08 08:59:17 -04:00
708f99e418 feat(ops): group/subgroup facets, non-blocking clip index, capture summary
- Split the region breadcrumb into group (theatre) + subgroup (country)
  facets on rows, /api/monitor, and recorder session sidecars.
- Make listClips() a stale-while-revalidate async fs scan so the heavy
  tuf8tb disk walk never blocks the event loop on a request path.
- Add a per-asset capture summary (clips/snapshot sessions/live state)
  to /api/monitor to drive the in-detail record controls.
2026-07-08 08:59:06 -04:00
04cc03ae00 feat(ops): keep HLS memfs sessions warm to kill cold-segment stalls
datarhei Core mints a fresh ?session= per master GET and generates .ts
segments lazily per session; the session re-cools within ~1s, so hls.js
stalls on a cold fragment. Register a background keep-alive per session
(warm poll < memfs idle expiry), warm it before returning the master
playlist, and idle it out when the browser stops polling.
2026-07-08 08:58:49 -04:00
0d4308d792 feat(ops): serve TFX crest as media-panel watermark
Add a /tfx-logo.png endpoint (cached) plus the TFXLOGO asset resolver so
empty media panels (no snapshot yet) can show the Task Force X crest.
2026-07-08 08:58:32 -04:00
a2f4b11f14 docs(seed): drop Gatus naming from converter + docs
Reword the seed toolchain to 'legacy endpoint config' now that the product is
standalone Uptime Kuma + Ops console: convert.mjs comments, seed/README,
seed/package.json description, .old-config.yml header, and features/02. The
converter only reads `endpoints`, so output (monitors.json) is unchanged.

(Also carries an incidental .beads/issues.jsonl export.)
2026-07-08 08:54:59 -04:00
00ae555710 Helm update 2026-07-08 07:36:35 -04:00
767421c3b6 docs(readme): rewrite for TFX FMV console + k8s deployment
Replace the stock Uptime Kuma README with one describing the actual
app: the R2D2/Task Force X ops console, its architecture, local dev,
configuration/security model, and the standalone k8s deployment at
ops.r2d2.office.ilab.zone. Drops upstream badges/sponsors/live-demo.
2026-07-08 05:44:23 -04:00
6d71f2af57 config(seed): reconfigure ITA.Predator monitor to port 5070 2026-07-08 05:39:55 -04:00
f4967232eb docs(report): mark R-005/R-008/R-010b fixed in resolution log 2026-07-08 00:45:34 -04:00
238ba47fc1 docs(recorder): fix phantom env vars in F07 doc
R-010b: the F07 doc referenced REC_LIVENESS_MS and DISK_POLL_MS, neither
of which exists in recorder.mjs, and cited the record-set path as
ops/recordset.json. Corrected to reality: the liveness sample cadence is
hardcoded (5s for the hls backend, REC_FPS for snapshot), the disk floor
is DISK_STOP_GB (default 20), and the record-set persists to REC_SETFILE
(default <REC_ROOT>/.recordset.json). Every recorder var named in the doc
now resolves to real code.

Closes r2d2-236.
2026-07-08 00:45:06 -04:00
16477f742e fix(seed): refuse default creds against a non-local Kuma
R-008 (F-05): seed.mjs defaults to NATO/NATO1949 for local dev, but
nothing stopped those demo creds being baked into a production Kuma if
KUMA_URL pointed off-box. Now: if the creds are still the built-ins AND
the target host isn't localhost/127.0.0.1/::1, seed refuses unless
ALLOW_DEFAULT_CREDS=1. Local dev (the common case) is unaffected.

Verified: remote+default -> refuse (exit 1); remote+ALLOW_DEFAULT_CREDS
or real creds -> proceed; localhost+default -> proceed.

Closes r2d2-fz9.
2026-07-08 00:44:53 -04:00
4595e31393 refactor(seed): shared status-page builder; statuspage.mjs full parity
R-005 (F-04): seed.mjs and statuspage.mjs had diverging copies of the
status-page build logic — statuspage.mjs only rebuilt the link-less
master page, so re-running it after a seed dropped the other 4 pages and
every projector link.

Extract the builder into seed/statuspages.mjs as the single source of
truth. seed.mjs imports it; statuspage.mjs now joins the live Kuma
monitorList to monitors.json BY NAME (to recover tags + projector links,
which Kuma's monitorList doesn't carry) and rebuilds all 5 pages via the
same builder.

Verified offline (no live Kuma) with a dry-run harness: all 5 pages
produced, master=118, videos=73, 146 linked rows keep their projector
url, and the seed vs refresh callers yield byte-identical page shape.

Closes r2d2-1ga.
2026-07-08 00:44:39 -04:00
d13fda7c95 docs(report): decouple Gatus entirely from the review
Cleanse all Gatus references now that the Kuma ops console is a
standalone deployment at ops.r2d2.office.ilab.zone: removed the helm/
status-page pointers (architecture snapshot + appendix), genericized
data-source lineage to 'legacy endpoint config', and dropped the
Gatus-vs-Kuma comparison from F-03, R-007, D-006 and call-out #2. The
Gatus status page (status.r2d2) is unrelated to this review and no
longer mentioned.
2026-07-08 00:18:50 -04:00
0dcfdc73a1 docs(report): reframe deploy as additive ops.r2d2 host, not a Gatus cutover
Per operator decision (D-006, 2026-07-08): the Kuma ops console deploys
to a new, separate host ops.r2d2.office.ilab.zone; the Gatus status page
at status.r2d2.office.ilab.zone is left untouched. Removed the
cutover/migration/'Gatus is blind' conflict framing (F-03, R-007,
call-out #2, D-007); remaining Gatus mentions are neutral data-source
lineage. convert.mjs still sources the legacy Gatus YAML + holovids CSV.
2026-07-08 00:04:06 -04:00
efeaea6ab5 docs(report): add resolution log for 2026-07-07 review
Records the 6 fixes landed this session (R-001..R-004, R-006, R-010)
and the deferred/roadmap disposition of the rest. Closes epic r2d2-gxe.
2026-07-07 13:18:52 -04:00
3fe6016cbb docs(recorder): document REC_ROOT/disk/capture env vars
R-010 (F-09): recorder.mjs defaults REC_ROOT to the dev tuf8tb mount,
which fails silently on other hosts. Added a Configuration (environment)
table to features/07 covering REC_ROOT (with a machine-specific
override warning), REC_MAX, SNAP_MAX, DISK_MIN_GB, DISK_STOP_GB and the
capture-rate/dedup/persistence knobs, using the real code defaults.

Closes r2d2-bno.
2026-07-07 13:18:20 -04:00
b971ca4687 docs: refresh monitor/group counts to 118/21
R-006 (F-07): docs still said 112 monitors / 16 groups. monitors.json
now has 118 monitors and 21 group definitions (empty groups skipped at
seed). Updated seed/README.md, features/README.md, and
features/01-search-and-filter.md; kept the counter example
arithmetically consistent (103 up + 12 down + 3 degraded = 118).

Closes r2d2-evz.
2026-07-07 13:17:22 -04:00
7f1668b74a fix(ops): default-localhost bind + secret-gated mutating APIs
R-002 (F-02): serve.mjs bound 0.0.0.0 and exposed unauthenticated
mutating endpoints (delete-monitors, set-interval, record/*) that act
on Kuma as admin. Now:
  * OPS_BIND defaults to 127.0.0.1 (opt in to 0.0.0.0 for the LAN wall)
  * OPS_SECRET, when set, requires an x-ops-secret header on every
    mutating POST (403 otherwise); read endpoints stay open

R-003 (F-02): rewrote the file header — dropped the stale 'read-only
companion' claim and documented the mutating surface + auth model.

Verified: no/wrong secret -> 403, correct secret -> passes guard,
GET /api/feed.json -> 200, socket bound to 127.0.0.1 only.

Staged only the security hunks; unrelated in-flight HLS/media WIP in
this file is intentionally left in the working tree.

Closes r2d2-ahw, r2d2-6ml.
2026-07-07 13:16:02 -04:00
0fc4ec845b fix(seed): subscribe monitorList before login; default KUMA_URL 3011
R-001 (F-01): the double-seed guard attached its monitorList listener
AFTER the login ack, but Kuma pushes the list during afterLogin — the
listener raced the push and usually saw 0, silently re-seeding populated
instances. Subscribe before login (mirrors statuspage.mjs) so the guard
reads the real count.

R-004 (F-06): default KUMA_URL 3001 -> 3011 to match statuspage.mjs,
serve.mjs, docker-compose.yml and the README.

Closes r2d2-4lx, r2d2-qh0.
2026-07-07 13:11:22 -04:00
c9e1b71f72 chore: sync beads tracker export, add code-review report, gitignore ops logs 2026-07-07 10:19:31 -04:00
850fbb966c docs(features): add F06-F10 roadmap plans
Review-first implementation plans:
- 06 native media detail views & remote-server GUI integration
- 07 live-triggered stream recording to disk (emergency priority)
- 08 KLV/MISB telemetry pipeline -> MQTT (nanomq)
- 09 C2 map & global common operating picture
- 10 ReductStore media archive sidecar (20 GB FIFO)
README roadmap table updated.
2026-07-07 10:19:23 -04:00
8af48d5c08 feat(ops): media detail views, live recording, and KLV probe
Ops console upgrade — F06/F07/F08 land together because they wire through
the same serve.mjs routes and index.html render path:
- F06 native detail: expandable Kuma-style row detail (facts + heartbeat
  history + ping sparkline), /api/monitor, HLS player via vendored
  hls.min.js served at /vendor/hls.min.js (offline, no CDN)
- F07 recording: recorder.mjs per-feed state machine (idle->live->dead->cut),
  /api/record/{start,stop,status}, storage gauge + recordings panel,
  writes to tuf8tb
- F08 KLV: klv-probe.sh discovery helper for MISB ST 0601 in the source TS
- PLAN.md: umbrella C2-FMV console arc

ops-server.log (runtime) gitignored.
2026-07-07 10:19:15 -04:00
8fd3075fd7 feat(seed): refresh holovids enrichment + projector deep-links on status pages
- holovids.csv refreshed from 2026-07-07 export; convert.mjs re-derives
  channel/port/source/protocol enrichment and per-monitor descriptions
- monitors.json regenerated from the new roster
- seed.mjs: carry per-monitor link -> status-page rows use custom_url so
  video rows open in the projector instead of the raw m3u8; group
  descriptions now seeded
- add lucide dep for status-page icons
2026-07-07 10:18:57 -04:00
0c779e49b1 feat(branding): apply TFX rebrand to Kuma at container boot
Kuma ships branding baked into hashed frontend assets, so patch at boot
instead of forking the image:
- seed/branding/apply-branding.sh: swaps "Uptime Kuma" -> "R2D2 Status"
  in dist/assets and replaces icon.svg, then execs the original command
- docker-compose: entrypoint runs the branding step before server start,
  mounts branding/ read-only
- public/favicon.png: TFX favicon
2026-07-07 10:18:43 -04:00
840fb45f89 ops: 60s check cadence, region tree grouping, Up filter, export; Greece→Central Med
Ops feed (.settings/ops/index.html):
- Tree view: nest rows by region breadcrumb (Sea → Country) with per-group
  down/pending/up/total rollups, outage groups floated up, collapsible
  (per-group + collapse/expand-all), state persisted via ?group=1 + localStorage.
- Up filter chip alongside DOWN/Pending.
- Export the currently-shown rows as CSV (UTF-8 BOM) / JSON / XLS (no deps).
- 30s re-render tick so relative times stay live if SSE goes quiet.

Seed (.settings/seed/monitors.json):
- All monitor interval/retryInterval -> 60s (also pushed live to 112 monitors).
- Move Greece group under Central Med (was Eastern Med) — also re-parented live.

Also carries prior in-tree WIP in these two files (seed enrichment regen:
NATO/Arctic group, projector link/description/snapshot fields; Feature 07 UI).
2026-07-07 06:48:43 -04:00
1ac072522e chore: add R2D2 deployment config (Helm chart, seed, ops, agent settings)
Internal fork config for R2D2-Status-Kuma:
- helm/: chart for office.ilab.zone cluster (secrets referenced via existingSecret)
- .settings/: agent instructions, beads config, feature specs, seed + ops scripts
- public/tfx-logo.png: branding asset

kubeconfig excluded via .gitignore (embeds cluster credentials).
2026-07-06 11:54:10 -04:00
Mifzaal Abdul Baari
8854e00a92
feat: add Ooredoo (Maldives) SMS notification provider (#7571)
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2026-07-05 13:48:27 +00:00
zjiecode
ffa791da8b
feat: Add WxPusher SPT (WxPusher simple push token) notification provider (#7569)
Co-authored-by: wxpusher <foroutmoney@gmail.com>
2026-07-05 13:28:43 +00:00
Jacob Masse
b4ce00530e
feat: add Flowtriq DDoS detection notification provider (#7546)
Co-authored-by: Jacob <jacob@humera.io>
2026-06-28 09:08:26 +00:00
Louis Lam
584fc0761c
chore: change analytics_type to string type from enum (#7544) 2026-06-25 19:06:54 +08:00
Yumin Kim
e1937a6d25
fix: resolve Steam monitor hostnames (#7542) 2026-06-25 19:04:02 +08:00
Louis Lam
9eb7a3a751
chore: add build "pr-test" workflow, add a message for testing to new pr. (#7543) 2026-06-25 18:28:04 +08:00
Louis Lam
625564ee4e
chore: Add an ability to enable node.js inspector (#7541) 2026-06-25 03:20:24 +00:00
Louis Lam
7e358e23f1
Remove meaningless entries from en.json (#7535) 2026-06-22 13:34:15 +00:00
github-actions[bot]
040766a3e2
chore: Update dependencies (#7349) 2026-06-22 04:53:08 +00:00
Daniel Oberlechner
a57aabf8c3
feat: add tracking support on status pages for rybbit analytics (#7525) 2026-06-19 23:07:35 +00:00
Louis Lam
a2ac12fb65
chore: Translations Update from Weblate (#7477) 2026-06-18 08:08:49 +08:00
Helak
618a957d32 Translated using Weblate (Czech)
Currently translated at 100.0% (1549 of 1549 strings)

Co-authored-by: Helak <adamhavra@seznam.cz>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/cs/
Translation: Uptime Kuma/Uptime Kuma
2026-06-17 20:54:20 +00:00
kamine
6dd030ecce Translated using Weblate (Japanese)
Currently translated at 80.6% (1249 of 1549 strings)

Co-authored-by: kamine <123874176+kamine81@users.noreply.github.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/ja/
Translation: Uptime Kuma/Uptime Kuma
2026-06-17 20:54:20 +00:00
Ivan Bratović
cf32a01cc6 Translated using Weblate (Croatian)
Currently translated at 100.0% (1549 of 1549 strings)

Co-authored-by: Ivan Bratović <ivanbratovic4@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/hr/
Translation: Uptime Kuma/Uptime Kuma
2026-06-17 20:54:20 +00:00
AnnAngela
86c82177ae Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (1549 of 1549 strings)

Co-authored-by: AnnAngela <naganjue@vip.qq.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/zh_Hans/
Translation: Uptime Kuma/Uptime Kuma
2026-06-17 20:54:20 +00:00
Yoswaris Lawpaiboon
1f8ca69284 Translated using Weblate (Thai)
Currently translated at 63.6% (984 of 1547 strings)

Co-authored-by: Yoswaris Lawpaiboon <me@kiznick.me>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/th/
Translation: Uptime Kuma/Uptime Kuma
2026-06-17 20:54:20 +00:00
MP
ff5b4b99d4 Translated using Weblate (Serbian (latin))
Currently translated at 11.3% (175 of 1547 strings)

Co-authored-by: MP <cika.dzo132@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/sr_Latn/
Translation: Uptime Kuma/Uptime Kuma
2026-06-17 20:54:20 +00:00
Jozef Gaal
0fada9c994 Translated using Weblate (Slovak)
Currently translated at 100.0% (1547 of 1547 strings)

Co-authored-by: Jozef Gaal <preklady@mayday.sk>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/sk/
Translation: Uptime Kuma/Uptime Kuma
2026-06-17 20:54:20 +00:00
Aluisio
c5fd14d60d Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (1549 of 1549 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (1547 of 1547 strings)

Co-authored-by: Aluisio <aluisiodeavila@hotmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/pt_BR/
Translation: Uptime Kuma/Uptime Kuma
2026-06-17 20:54:19 +00:00
Goudarz Jafari
6ca27b8cdf Translated using Weblate (Persian)
Currently translated at 75.3% (1166 of 1547 strings)

Translated using Weblate (Persian)

Currently translated at 74.9% (1160 of 1547 strings)

Co-authored-by: Goudarz Jafari <goudarz.jafari@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/fa/
Translation: Uptime Kuma/Uptime Kuma
2026-06-17 20:54:19 +00:00
Andi Chandler
4cc46a99b8 Translated using Weblate (English (United Kingdom))
Currently translated at 100.0% (1547 of 1547 strings)

Co-authored-by: Andi Chandler <andi@gowling.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/en_GB/
Translation: Uptime Kuma/Uptime Kuma
2026-06-17 20:54:19 +00:00
Billnikdeejay
36904126f4 Translated using Weblate (Greek)
Currently translated at 47.8% (740 of 1547 strings)

Co-authored-by: Billnikdeejay <billnikolitsas@gmail.com>
Translate-URL: https://weblate.kuma.pet/projects/uptime-kuma/uptime-kuma/el/
Translation: Uptime Kuma/Uptime Kuma
2026-06-17 20:54:19 +00:00