Commit Graph
1 Commits
Author SHA1 Message Date
Claude 625273d83c feat(admin): cluster settings with server-side checks and a Cluster tab (Phase 1)
Core\Cluster\ClusterSettings owns the defaults and bounds of the 19
cluster settings. normalize() clamps numbers, falls back to the default
for an unknown enum, and refuses rather than clamps where clamping would
change what the admin meant:

- a cluster_api_port outside 1024–65535, or one MAIN already uses
  (broadcast, extra and RTMP ports) or that is reserved (31210, 31290,
  3306, 6379);
- a cluster_main_host that is not a DNS name;
- scan roots that are not absolute paths free of '..';
- https_required, unless MAIN's own HTTPS verifies (httpsSelfProbe: a
  non-IP domain and a certificate with more than 7 days left) and no
  active node blocks it (every active node blocks until Phase 3
  telemetry reports HTTPS);
- enabling the LB API without xcvm_core's cluster API
  (ClusterCryptoFactory);
- API mode for new nodes before the cutover phase.

SettingsService::edit() runs these checks. A refusal fails the whole
save, and its translated message is shown on the settings page. It lives
in Core/Cluster, which ships to LBs, so nodes apply the same bounds.

The settings page gets a Cluster tab after Streaming. It shows every
field, and a status line: the extension and its API range, whether HTTPS
is available, and the derived token grace. The strings come in all 8
languages.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Es8UhyPS8MNjuYTagqfGWi
2026-09-25 10:28:53 +00:00