From fcdff04b23515f8c9ef45dc711da2a5ca00242d6 Mon Sep 17 00:00:00 2001 From: atlas Date: Wed, 5 Aug 2026 10:57:19 +0200 Subject: [PATCH] refactor(nix): move the matrix host options under services.hyperhive.swarm Second slice of the swarm-global service consolidation, same shape as the forge move: the operator-facing host options become services.hyperhive.swarm.matrix.*, and one mkRenamedOptionModule on the namespace carries the whole subtree (nested gui.* included), so there is no leaf list to forget an entry from. The rename lives in hive-matrix.nix, the module that declares the options, so each service's migration stays independent of its siblings. The per-agent hyperhive.matrix.{enable,url} and hyperhive.matrixAccounts are a different namespace -- a client pointer at the service, not the service -- and deliberately do not move. --- nix/docs/default.nix | 2 +- nix/host-modules/hive-c0re/environment.nix | 20 ++++++++++------- nix/host-modules/hive-gateway/default.nix | 2 +- nix/host-modules/hive-matrix.nix | 26 +++++++++++++++------- nix/host-modules/hyperhive.nix | 2 +- 5 files changed, 33 insertions(+), 19 deletions(-) diff --git a/nix/docs/default.nix b/nix/docs/default.nix index 4f7a1144..5b4b7f95 100644 --- a/nix/docs/default.nix +++ b/nix/docs/default.nix @@ -44,7 +44,7 @@ let boot.loader.grub.enable = false; system.stateVersion = "25.11"; services.hyperhive.enable = lib.mkForce false; - services.hyperhive.matrix.enable = lib.mkForce false; + services.hyperhive.swarm.matrix.enable = lib.mkForce false; } ) ]; diff --git a/nix/host-modules/hive-c0re/environment.nix b/nix/host-modules/hive-c0re/environment.nix index 03309b30..5d4caad5 100644 --- a/nix/host-modules/hive-c0re/environment.nix +++ b/nix/host-modules/hive-c0re/environment.nix @@ -102,7 +102,10 @@ in } // lib.optionalAttrs - (config.services.hyperhive.matrix.enable && config.services.hyperhive.matrix.gatewayHost != null) + ( + config.services.hyperhive.swarm.matrix.enable + && config.services.hyperhive.swarm.matrix.gatewayHost != null + ) { # In-cluster matrix homeserver URL for each agent's # hive-matrix-daemon — the gateway vhost (`matrix.`). @@ -117,12 +120,12 @@ in # forward leaves `hyperhive.matrix.url` null and the daemon no-ops; # that is the honest answer when the hive has no matrix vhost to point # at. - HIVE_MATRIX_URL = "http://${config.services.hyperhive.matrix.gatewayHost}"; + HIVE_MATRIX_URL = "http://${config.services.hyperhive.swarm.matrix.gatewayHost}"; } -// lib.optionalAttrs (config.services.hyperhive.matrix.apiUrl != null) { +// lib.optionalAttrs (config.services.hyperhive.swarm.matrix.apiUrl != null) { # Client-server API base hive-c0re uses to provision matrix (register # agent users, create the hive space + chat room, invite members). - # Supplied by `services.hyperhive.matrix.apiUrl`, which the matrix + # Supplied by `services.hyperhive.swarm.matrix.apiUrl`, which the matrix # module fills in with its own loopback listener when it is the thing # running tuwunel — and which the operator sets by hand when the # homeserver lives on another machine. @@ -131,9 +134,9 @@ in # vhost, and it is absent whenever there is no vhost. Reusing it here # would silently stop provisioning on a hive that runs matrix without # one. - HIVE_MATRIX_API_URL = config.services.hyperhive.matrix.apiUrl; + HIVE_MATRIX_API_URL = config.services.hyperhive.swarm.matrix.apiUrl; } -// lib.optionalAttrs config.services.hyperhive.matrix.gui.enable { +// lib.optionalAttrs config.services.hyperhive.swarm.matrix.gui.enable { # Availability flags read by the dashboard's `/api/state`. # Matrix GUI lives entirely on the gateway nginx (matrix tab # only shows when both flags are on). Gateway routing detail: @@ -162,14 +165,15 @@ in // lib.optionalAttrs ( - config.services.hyperhive.matrix.gui.enable && config.services.hyperhive.matrix.gatewayHost != null + config.services.hyperhive.swarm.matrix.gui.enable + && config.services.hyperhive.swarm.matrix.gatewayHost != null ) { # Browser-facing matrix GUI (fluffychat) URL — the gateway # vhost (`matrix.`). Surfaced via the daemon's `Urls` # request for `hivectl open matrix`. Absent when the GUI is off # or no gatewayHost is set (no browser-reachable matrix vhost). - HIVE_MATRIX_PUBLIC_URL = "https://${config.services.hyperhive.matrix.gatewayHost}/"; + HIVE_MATRIX_PUBLIC_URL = "https://${config.services.hyperhive.swarm.matrix.gatewayHost}/"; } // lib.optionalAttrs (config.services.hyperhive.swarm.snapshotStore.address != null) { # `host:port` of the swarm's single snapshot store, for pushing agent diff --git a/nix/host-modules/hive-gateway/default.nix b/nix/host-modules/hive-gateway/default.nix index 327c27ce..ba9d7b37 100644 --- a/nix/host-modules/hive-gateway/default.nix +++ b/nix/host-modules/hive-gateway/default.nix @@ -15,7 +15,7 @@ let cfg = config.services.hyperhive.gateway; hyperhiveDomain = config.services.hyperhive.domain; - matrixCfg = config.services.hyperhive.matrix; + matrixCfg = config.services.hyperhive.swarm.matrix; forgeCfg = config.services.hyperhive.swarm.forge; networkCfg = config.services.hyperhive.network; diff --git a/nix/host-modules/hive-matrix.nix b/nix/host-modules/hive-matrix.nix index 0f973ea9..419d5376 100644 --- a/nix/host-modules/hive-matrix.nix +++ b/nix/host-modules/hive-matrix.nix @@ -5,7 +5,7 @@ ... }: let - cfg = config.services.hyperhive.matrix; + cfg = config.services.hyperhive.swarm.matrix; networkCfg = config.services.hyperhive.network; hyperhiveDomain = config.services.hyperhive.domain; effectiveServerName = if cfg.serverName != null then cfg.serverName else hyperhiveDomain; @@ -86,7 +86,17 @@ in # settings: docs/matrix.md. Vhost map + discovery flow + tuning # knobs: docs/gateway.md. - options.services.hyperhive.matrix = { + # Matrix moved under `swarm` when the swarm-global services were + # consolidated. One rename for the namespace: the subtree comes with it, + # so existing hives keep evaluating and get one warning naming both paths. + imports = [ + (lib.mkRenamedOptionModule + [ "services" "hyperhive" "matrix" ] + [ "services" "hyperhive" "swarm" "matrix" ] + ) + ]; + + options.services.hyperhive.swarm.matrix = { enable = lib.mkOption { type = lib.types.bool; default = false; @@ -129,7 +139,7 @@ in **Breaking change**: this used to default to `matrix.''${services.hyperhive.domain}`. matrix IDs embed the server_name irrevocably, so existing homeservers must - set `services.hyperhive.matrix.serverName = "matrix.''${services.hyperhive.domain}";` + set `services.hyperhive.swarm.matrix.serverName = "matrix.''${services.hyperhive.domain}";` explicitly to preserve their existing user / room IDs before rebuilding. ''; @@ -151,8 +161,8 @@ in type = lib.types.nullOr lib.types.str; default = if cfg.enable then "http://127.0.0.1:${toString cfg.httpPort}" else null; defaultText = lib.literalExpression '' - if services.hyperhive.matrix.enable - then "http://127.0.0.1:''${toString services.hyperhive.matrix.httpPort}" + if services.hyperhive.swarm.matrix.enable + then "http://127.0.0.1:''${toString services.hyperhive.swarm.matrix.httpPort}" else null ''; example = "https://matrix.example.com"; @@ -213,7 +223,7 @@ in **Breaking change**: this used to default to `true`. If you relied on the old default for external reach, add - `services.hyperhive.matrix.openFirewall = true;` to your host + `services.hyperhive.swarm.matrix.openFirewall = true;` to your host config before rebuilding. Note: federation (the matrix-spec well-known port 8448) is @@ -290,7 +300,7 @@ in enable = lib.mkOption { type = lib.types.bool; default = cfg.enable; - defaultText = lib.literalExpression "config.services.hyperhive.matrix.enable"; + defaultText = lib.literalExpression "config.services.hyperhive.swarm.matrix.enable"; description = '' Serve a matrix web client at `matrix.''${services.hyperhive.domain}/`. Requires `matrix.gatewayHost != null` (default `matrix.` @@ -330,7 +340,7 @@ in { assertion = cfg.gatewayHost == null || cfg.gatewayHost != ""; message = '' - services.hyperhive.matrix.gatewayHost = "" is rejected. The + services.hyperhive.swarm.matrix.gatewayHost = "" is rejected. The rendered URLs would be invalid (nginx wildcard catch-all for an empty server_name, /etc/hosts rejects empty entries). Use `null` to disable the gateway vhost entirely (tuwunel diff --git a/nix/host-modules/hyperhive.nix b/nix/host-modules/hyperhive.nix index 79b40777..9ea5b35e 100644 --- a/nix/host-modules/hyperhive.nix +++ b/nix/host-modules/hyperhive.nix @@ -36,7 +36,7 @@ example = "darkest.space"; description = '' Canonical host domain for hyperhive subsystems that need a - stable name (currently: `services.hyperhive.matrix.serverName` + stable name (currently: `services.hyperhive.swarm.matrix.serverName` derives from this, defaulting to `matrix.''${services.hyperhive.domain}` when `serverName` is null). **Required** when `services.hyperhive.enable` — eval fails