Watch
0
0
Fork
You've already forked hyperhive
0

Compare commits

..
Author SHA1 Message Date
atlas
1948e7ad23 module-eval: read the services-leaf narrowing off a forge host
`checks.module-eval-core-toggle` is red on main: "a gateway's services
leaf asks for only the swarm names that host fronts" read its leaf
request off `bare`, on the premise that `bare` fronts forge. That was
true where the property was written, before 978164dc (#4705) defaulted
`deploy.forgejo.enable` to false. The two merged in sequence, and on main
`bare` renders only the `_` and `h1.t.local` vhosts, so its
`localServiceDomains` is [] and the script carries `alt_names=''`,
never `alt_names=forge.t.local`.

The narrowing itself is right: a host that runs no forge fronts no
swarm name and asks for no services leaf. Only the fixture was stale.
The property now reads a hive with `deploy.forgejo.enable = true`,
whose request is `common_name=forge.t.local alt_names=forge.t.local`
while `auth.t.local` stays in the swarm-wide set.

The renewal timer from 0649673e is not involved: the check's derivation
is identical at 0649673e and at its parent, and ed2ec52f replayed onto
978164dc^ holds while replayed onto 978164dc it fails.

Refs #4587
2026-09-26 01:39:22 +02:00
atlas
3202cde704 nix: gate hive-c0re on deploy.hive-controller.enable, drop hyperhive.enable
`services.hyperhive.enable` and `services.hyperhive.c0re.enable` are gone.
One switch, `services.hyperhive.deploy.hive-controller.enable` (default
false, as the old toggle was), now gates hive-c0re and hive-priv. Both old
paths are `mkRenamedOptionModule` shims in deploy.nix, so a host config
that still sets either evaluates as before and gets a rename warning.

Every other read of the old toggle is resolved, including the 29 made
through the `hyperhiveCfg`/`hiveCfg` aliases:

- Dropped: each swarm service and its glue keeps only its own deploy
  toggle (authelia, bao and its PKI glue, grafana, victorialogs,
  victoriametrics, the secret publisher, swarm-ca, the OIDC client rows,
  the controller/nats/matrix-ctl/publisher/services-issuer identities),
  the forge, and the `domain` deprecation warning.
- To deploy.hive-controller.enable: the queue-agent credential reader and
  its assertion, which feed hive-c0re and write under its state dir, plus
  their policy-order entry; the network identity assertions; hive-tls's
  two writes into hive-c0re's environment.
- hive-tls runs where the gateway runs self-signed
  (`gateway.enable && useSelfSigned`), not on every host.
- The matrix appservice-token reader and its assertion stay on
  `deploy.matrix.enable` plus their client-identity checks. They read
  deploy.matrix's token file and registration script; their deploy.bao
  inputs are the client-half options a hive sets to read a store it does
  not run, so gating on deploy.bao.enable would drop the tested
  remote-reader case.
- The `hiveName` assertion moves from hive-network.nix to hyperhive.nix
  and fires wherever the hive, the store or the homeserver runs: each
  turns the name into an identifier with no fallback.

On a host with `deploy.allSwarmServices` and no hive, the documented
services-host recipe, authelia, bao, grafana, victorialogs,
victoriametrics, the OIDC client rows and the hive CA now render; before,
the old toggle being off left them out.

Refs #4500
2026-09-26 01:19:49 +02:00
43 changed files with 299 additions and 168 deletions

View file

@ -77,7 +77,7 @@ Minimal `flake.nix` for a host that runs hive-c0re:
modules = [ modules = [
hyperhive.nixosModules.default # hive-c0re + hive-forge + hive-gateway in one import hyperhive.nixosModules.default # hive-c0re + hive-forge + hive-gateway in one import
({ ... }: { ({ ... }: {
services.hyperhive.enable = true; services.hyperhive.deploy.hive-controller.enable = true;
# services.hyperhive.c0re.operatorPronouns = "they/them"; # default: "she/her" # services.hyperhive.c0re.operatorPronouns = "they/them"; # default: "she/her"
# ... rest of your host config # ... rest of your host config

View file

@ -90,7 +90,7 @@ listener on `bridgeIp` is on the host's bridge interface.
```nix ```nix
{ {
services.hyperhive = { services.hyperhive = {
enable = true; deploy.hive-controller.enable = true;
hiveName = "pr1ma"; hiveName = "pr1ma";
swarm.domain = "darkest.space"; swarm.domain = "darkest.space";
swarm.hives.pr1ma = { }; # -> domain = pr1ma.darkest.space swarm.hives.pr1ma = { }; # -> domain = pr1ma.darkest.space

View file

@ -38,7 +38,7 @@ The store host is a swarm member like any other: it gets an entry in
[swarm/](../swarm/README.md) for the mesh itself. [swarm/](../swarm/README.md) for the mesh itself.
Note that `deploy.wireguard.enable` gates the mesh, **not** Note that `deploy.wireguard.enable` gates the mesh, **not**
`c0re.enable` --- a store host runs no hive and would otherwise get no `deploy.hive-controller.enable` --- a store host runs no hive and would otherwise get no
`wg-hive` interface at all. `wg-hive` interface at all.
## Pointing a hive at it ## Pointing a hive at it

View file

@ -299,9 +299,9 @@ migrating agent keeps one unbroken incremental chain. See
`services.hyperhive.deploy.swarm-controller.enable` runs the `swarm-controller` `services.hyperhive.deploy.swarm-controller.enable` runs the `swarm-controller`
daemon on this host. **Off by default and deliberately not derived from daemon on this host. **Off by default and deliberately not derived from
`services.hyperhive.enable`**: a swarm has one controller, so enabling it `services.hyperhive.deploy.hive-controller.enable`**: a swarm has one
is a statement about swarm topology, not about whether the operator has controller, so enabling it states a fact about swarm topology, not about
installed hyperhive. Every hive runs `hive-c0re` (the agents on that host); one whether this host runs a hive. Every hive runs `hive-c0re` (the agents on that host); one
hive additionally runs this (what's true across hives). hive additionally runs this (what's true across hives).
What it serves, why it's a unix socket rather than a port, and the What it serves, why it's a unix socket rather than a port, and the

View file

@ -119,7 +119,7 @@
# an operator override still wins. Intended usage: # an operator override still wins. Intended usage:
# #
# imports = [ hyperhive.nixosModules.default ]; # imports = [ hyperhive.nixosModules.default ];
# services.hyperhive.enable = true; # services.hyperhive.deploy.hive-controller.enable = true;
# #
default = default =
{ lib, pkgs, ... }: { lib, pkgs, ... }:

View file

@ -54,7 +54,7 @@ let
}; };
boot.loader.grub.enable = false; boot.loader.grub.enable = false;
system.stateVersion = "25.11"; system.stateVersion = "25.11";
services.hyperhive.enable = lib.mkForce false; services.hyperhive.deploy.hive-controller.enable = lib.mkForce false;
services.hyperhive.deploy.matrix.enable = lib.mkForce false; services.hyperhive.deploy.matrix.enable = lib.mkForce false;
} }
) )

View file

@ -1,7 +1,8 @@
# The full hyperhive host stack, pulled together in one place — this # The full hyperhive host stack, pulled together in one place — this
# is what the flake exports as `nixosModules.default` (wrapped with # is what the flake exports as `nixosModules.default` (wrapped with
# the package/source wiring; see flake.nix). One import covers # the package/source wiring; see flake.nix). One import covers
# everything; `services.hyperhive.enable = true` turns the stack on. # everything; `services.hyperhive.deploy.hive-controller.enable = true`
# runs a hive on this host.
# #
# Every swarm needs the forge — hive-c0re mirrors every agent's applied # Every swarm needs the forge — hive-c0re mirrors every agent's applied
# config repo into it and it's the canonical store for the meta flake # config repo into it and it's the canonical store for the meta flake
@ -9,7 +10,7 @@
# runs it (derived from `deploy.allSwarmServices`, see # runs it (derived from `deploy.allSwarmServices`, see
# ./swarm-required-services.nix). hive-matrix is opt-in (off by default). All # ./swarm-required-services.nix). hive-matrix is opt-in (off by default). All
# subsystems rely on `services.hyperhive.domain`, which is required # subsystems rely on `services.hyperhive.domain`, which is required
# (asserted in hive-network.nix) whenever hyperhive is enabled. # (asserted in hive-network.nix) wherever this host runs a hive.
{ {
imports = [ imports = [
./hyperhive.nix ./hyperhive.nix

View file

@ -119,6 +119,15 @@ in
[ "services" "hyperhive" "swarm" "statusPublish" "clientSecretFile" ] [ "services" "hyperhive" "swarm" "statusPublish" "clientSecretFile" ]
[ "services" "hyperhive" "deploy" "hive-controller" "statusPublish" "clientSecretFile" ] [ "services" "hyperhive" "deploy" "hive-controller" "statusPublish" "clientSecretFile" ]
) )
# Both old spellings of "run a hive here" forward to the one switch.
(lib.mkRenamedOptionModule
[ "services" "hyperhive" "enable" ]
[ "services" "hyperhive" "deploy" "hive-controller" "enable" ]
)
(lib.mkRenamedOptionModule
[ "services" "hyperhive" "c0re" "enable" ]
[ "services" "hyperhive" "deploy" "hive-controller" "enable" ]
)
(lib.mkRenamedOptionModule (lib.mkRenamedOptionModule
[ "services" "hyperhive" "swarm" "otel" "enable" ] [ "services" "hyperhive" "swarm" "otel" "enable" ]
[ "services" "hyperhive" "deploy" "swarm-otel" "enable" ] [ "services" "hyperhive" "deploy" "swarm-otel" "enable" ]
@ -452,9 +461,9 @@ in
Run the swarm's metrics UI on this host. Run the swarm's metrics UI on this host.
Off by default and not derived from Off by default and not derived from
{option}`services.hyperhive.enable`: a swarm has one Grafana, so {option}`services.hyperhive.deploy.hive-controller.enable`: a swarm
running it is a decision about this host rather than about has one Grafana, so running it is a decision about this host rather
whether hyperhive is installed. than about whether it runs a hive.
''; '';
}; };
@ -570,6 +579,21 @@ in
''; '';
}; };
hive-controller.enable = lib.mkOption {
type = lib.types.bool;
default = false;
example = true;
description = ''
Run a hive on this host: the `hive-c0re` coordinator that owns every
agent container here, its `hive-priv` helper, and the bridge,
resolver and gateway the agents hang off.
Every hive turns this on. A host that only runs the swarm's shared
services ({option}`services.hyperhive.deploy.allSwarmServices`)
leaves it off.
'';
};
swarm-controller.enable = lib.mkOption { swarm-controller.enable = lib.mkOption {
type = lib.types.bool; type = lib.types.bool;
default = false; default = false;
@ -577,9 +601,9 @@ in
Run the swarm-controller daemon on this host. Run the swarm-controller daemon on this host.
Off by default and deliberately not derived from Off by default and deliberately not derived from
{option}`services.hyperhive.enable`: a swarm has one controller, {option}`services.hyperhive.deploy.hive-controller.enable`: a swarm
so running it is a decision about this host rather than about has one controller, so running it is a decision about this host
whether hyperhive is installed. rather than about whether it runs a hive.
''; '';
}; };

View file

@ -31,22 +31,21 @@ let
readersHere = { readersHere = {
# ./glue-matrix-bao-token.nix # ./glue-matrix-bao-token.nix
swarm-bao-matrix-token = swarm-bao-matrix-token =
hyperhiveCfg.enable havePair baoDeploy.matrixTokenClientCertFile baoDeploy.matrixTokenClientKeyFile
&& havePair baoDeploy.matrixTokenClientCertFile baoDeploy.matrixTokenClientKeyFile
&& deployCfg.matrix.enable; && deployCfg.matrix.enable;
# ./glue-queue-agent-credential.nix # ./glue-queue-agent-credential.nix
swarm-bao-queue-agent = swarm-bao-queue-agent =
hyperhiveCfg.enable deployCfg.hive-controller.enable
&& havePair baoDeploy.queueAgentClientCertFile baoDeploy.queueAgentClientKeyFile; && havePair baoDeploy.queueAgentClientCertFile baoDeploy.queueAgentClientKeyFile;
# ./swarm-grafana.nix # ./swarm-grafana.nix
swarm-bao-grafana-oidc = hyperhiveCfg.enable && deployCfg.grafana.enable; swarm-bao-grafana-oidc = deployCfg.grafana.enable;
# ./swarm-otel.nix # ./swarm-otel.nix
swarm-bao-otel-oidc = swarm-bao-otel-oidc =
deployCfg.swarm-otel.enable deployCfg.swarm-otel.enable
&& havePair baoDeploy.otelOidcClientCertFile baoDeploy.otelOidcClientKeyFile; && havePair baoDeploy.otelOidcClientCertFile baoDeploy.otelOidcClientKeyFile;
# ./swarm-bao.nix: its block is gated on the store, which `orderAfterPolicy` # ./swarm-bao.nix: its block is gated on the store, which `orderAfterPolicy`
# already checks. # already checks.
swarm-bao-forwarder-oidc = hyperhiveCfg.enable; swarm-bao-forwarder-oidc = true;
# ./swarm-nats.nix: the queue's TLS leaf, not a secret, but the same wait. # ./swarm-nats.nix: the queue's TLS leaf, not a secret, but the same wait.
swarm-bao-nats-tls = deployCfg.nats.enable; swarm-bao-nats-tls = deployCfg.nats.enable;
}; };

View file

@ -43,9 +43,10 @@ let
# What a reader calls itself to the store. The hive's name, because a bao # What a reader calls itself to the store. The hive's name, because a bao
# cert-auth role matches on the CN — this is an interface, not a label. # cert-auth role matches on the CN — this is an interface, not a label.
# No fallback: `hiveName` is asserted set for every hyperhive host, which is # No fallback: `hiveName` is asserted set wherever `deploy.bao.enable` is
# the same condition this file's `config` is gated on. A fallback here reads # (./hyperhive.nix), the same condition this file's `config` is gated on. A
# as a second supported spelling and there is no such thing. # fallback here reads as a second supported spelling and there is no such
# thing.
clientCn = hyperhiveCfg.hiveName; clientCn = hyperhiveCfg.hiveName;
# $1 dir $2 basename $3 CN $4 SAN or "" $5 EKU # $1 dir $2 basename $3 CN $4 SAN or "" $5 EKU
@ -71,7 +72,7 @@ let
''; '';
in in
{ {
config = lib.mkIf (hyperhiveCfg.enable && deployCfg.bao.enable) { config = lib.mkIf deployCfg.bao.enable {
services.hyperhive.deploy.bao = { services.hyperhive.deploy.bao = {
serverCertFile = lib.mkDefault "${pkiDir}/server.pem"; serverCertFile = lib.mkDefault "${pkiDir}/server.pem";
serverKeyFile = lib.mkDefault "${pkiDir}/server-key.pem"; serverKeyFile = lib.mkDefault "${pkiDir}/server-key.pem";

View file

@ -32,7 +32,7 @@ let
pkiDir = if haveMintedPki then builtins.dirOf baoDeploy.clientCertFile else null; pkiDir = if haveMintedPki then builtins.dirOf baoDeploy.clientCertFile else null;
in in
{ {
config = lib.mkIf (hyperhiveCfg.enable && deployCfg.swarm-controller.enable && haveMintedPki) { config = lib.mkIf (deployCfg.swarm-controller.enable && haveMintedPki) {
services.hyperhive.deploy.swarm-controller = { services.hyperhive.deploy.swarm-controller = {
baoClientCertFile = lib.mkDefault "${pkiDir}/controller.pem"; baoClientCertFile = lib.mkDefault "${pkiDir}/controller.pem";
baoClientKeyFile = lib.mkDefault "${pkiDir}/controller-key.pem"; baoClientKeyFile = lib.mkDefault "${pkiDir}/controller-key.pem";

View file

@ -24,7 +24,7 @@ let
forgeCfg = hyperhiveCfg.swarm.forge; forgeCfg = hyperhiveCfg.swarm.forge;
in in
{ {
config = lib.mkIf (hyperhiveCfg.enable && deployCfg.authelia.enable) { config = lib.mkIf deployCfg.authelia.enable {
# One declaration, two readers. The forge knows its own callback URL; # One declaration, two readers. The forge knows its own callback URL;
# making the operator restate it in authelia's client list would be a # making the operator restate it in authelia's client list would be a
# second source of truth for a string whose mismatch is a silent # second source of truth for a string whose mismatch is a silent

View file

@ -32,7 +32,7 @@ let
grafanaCfg = hyperhiveCfg.swarm.grafana; grafanaCfg = hyperhiveCfg.swarm.grafana;
in in
{ {
config = lib.mkIf (hyperhiveCfg.enable && deployCfg.authelia.enable) { config = lib.mkIf deployCfg.authelia.enable {
# One declaration, two readers. Grafana's callback URL is format-locked to # One declaration, two readers. Grafana's callback URL is format-locked to
# its own root URL, and the read-only option it is taken from is where that # its own root URL, and the read-only option it is taken from is where that
# format is spelled — restating it here would be a second source of truth # format is spelled — restating it here would be a second source of truth

View file

@ -69,7 +69,8 @@ let
# pieces; this literal is the nix half of that one agreement. # pieces; this literal is the nix half of that one agreement.
# #
# `hiveName` has no fallback here for the reason ./glue-bao-tls.nix gives at # `hiveName` has no fallback here for the reason ./glue-bao-tls.nix gives at
# its own use of it: it is asserted set for every hyperhive host. # its own use of it: it is asserted set on every host that runs the
# homeserver.
tokenPath = "secret/swarm/hives/${hyperhiveCfg.hiveName}/matrix/appservice-token"; tokenPath = "secret/swarm/hives/${hyperhiveCfg.hiveName}/matrix/appservice-token";
# A literal, not an option — ./hive-matrix.nix names its container # A literal, not an option — ./hive-matrix.nix names its container
@ -94,7 +95,7 @@ in
# is a hive that has no store, which is supported. So this one additionally # is a hive that has no store, which is supported. So this one additionally
# requires `hiveReaderIdentity`: the host demonstrably reads the store, and # requires `hiveReaderIdentity`: the host demonstrably reads the store, and
# named every option but this pair. # named every option but this pair.
(lib.mkIf (hyperhiveCfg.enable && deployCfg.matrix.enable && hiveReaderIdentity) { (lib.mkIf (deployCfg.matrix.enable && hiveReaderIdentity) {
assertions = [ assertions = [
{ {
assertion = haveClientIdentity; assertion = haveClientIdentity;
@ -124,7 +125,7 @@ in
]; ];
}) })
(lib.mkIf (hyperhiveCfg.enable && haveClientIdentity && deployCfg.matrix.enable) { (lib.mkIf (haveClientIdentity && deployCfg.matrix.enable) {
# Same rule as the unit's own gate: this reader exists on a host that has a # Same rule as the unit's own gate: this reader exists on a host that has a
# client identity and a homeserver, which is not every host that runs the # client identity and a homeserver, which is not every host that runs the
# store, so the store's module cannot name it. # store, so the store's module cannot name it.

View file

@ -31,7 +31,7 @@ let
pkiDir = if haveMintedPki then builtins.dirOf baoDeploy.clientCertFile else null; pkiDir = if haveMintedPki then builtins.dirOf baoDeploy.clientCertFile else null;
in in
{ {
config = lib.mkIf (hyperhiveCfg.enable && deployCfg.matrix.enable && haveMintedPki) { config = lib.mkIf (deployCfg.matrix.enable && haveMintedPki) {
services.hyperhive.deploy.matrix = { services.hyperhive.deploy.matrix = {
ctlBaoClientCertFile = lib.mkDefault "${pkiDir}/matrix-ctl.pem"; ctlBaoClientCertFile = lib.mkDefault "${pkiDir}/matrix-ctl.pem";
ctlBaoClientKeyFile = lib.mkDefault "${pkiDir}/matrix-ctl-key.pem"; ctlBaoClientKeyFile = lib.mkDefault "${pkiDir}/matrix-ctl-key.pem";

View file

@ -31,7 +31,7 @@ let
pkiDir = if haveMintedPki then builtins.dirOf baoDeploy.clientCertFile else null; pkiDir = if haveMintedPki then builtins.dirOf baoDeploy.clientCertFile else null;
in in
{ {
config = lib.mkIf (hyperhiveCfg.enable && deployCfg.nats.enable && haveMintedPki) { config = lib.mkIf (deployCfg.nats.enable && haveMintedPki) {
services.hyperhive.deploy.nats = { services.hyperhive.deploy.nats = {
baoClientCertFile = lib.mkDefault "${pkiDir}/nats.pem"; baoClientCertFile = lib.mkDefault "${pkiDir}/nats.pem";
baoClientKeyFile = lib.mkDefault "${pkiDir}/nats-key.pem"; baoClientKeyFile = lib.mkDefault "${pkiDir}/nats-key.pem";

View file

@ -20,10 +20,10 @@
# into one that is refused, which reaches the agent as a timeout. # into one that is refused, which reaches the agent as a timeout.
# #
# 📌 This runs wherever a client identity is configured, NOT only where the # 📌 This runs wherever a client identity is configured, NOT only where the
# store is — the rule ./glue-matrix-bao-token.nix states in full. There is no # store is — the rule ./glue-matrix-bao-token.nix states in full — and
# "this hive runs agents" condition to gate it on as well: agent containers # wherever this host runs a hive (`deploy.hive-controller.enable`): the
# are created at runtime by hive-c0re, so every hyperhive host is a host that # credential is for the agents hive-c0re creates here at runtime, and the unit
# may run one. # writes under hive-c0re's own state directory.
{ {
pkgs, pkgs,
lib, lib,
@ -74,7 +74,8 @@ let
# one agreement. # one agreement.
# #
# `hiveName` has no fallback here for the reason ./glue-bao-tls.nix gives at # `hiveName` has no fallback here for the reason ./glue-bao-tls.nix gives at
# its own use of it: it is asserted set for every hyperhive host. # its own use of it: it is asserted set wherever
# `deploy.hive-controller.enable` is.
credentialPath = "secret/swarm/hives/${hyperhiveCfg.hiveName}/queue/agent"; credentialPath = "secret/swarm/hives/${hyperhiveCfg.hiveName}/queue/agent";
in in
{ {
@ -110,11 +111,11 @@ in
# #
# Shaped after ./swarm-grafana.nix's `haveClientIdentity` assertion — the # Shaped after ./swarm-grafana.nix's `haveClientIdentity` assertion — the
# same refusal, named to this principal's own pair. Where Grafana's gate # same refusal, named to this principal's own pair. Where Grafana's gate
# is `deploy.grafana.enable`, this reader has no toggle of its own to # is `deploy.grafana.enable`, this reader's is the hive's own: every hive
# check: every hive runs one for its own agents, so reading the store at # runs one for its own agents, so on a hive, reading the store at all is
# all is what asks for it. Hence `hiveReaderIdentity` alone — a host # what asks for it. Hence `hiveReaderIdentity` — a host holding no hive
# holding no hive leaf has no store to read and nothing is missing. # leaf has no store to read and nothing is missing.
(lib.mkIf (hyperhiveCfg.enable && hiveReaderIdentity) { (lib.mkIf (deployCfg.hive-controller.enable && hiveReaderIdentity) {
assertions = [ assertions = [
{ {
assertion = haveClientIdentity; assertion = haveClientIdentity;
@ -149,7 +150,7 @@ in
]; ];
}) })
(lib.mkIf (hyperhiveCfg.enable && haveClientIdentity) { (lib.mkIf (deployCfg.hive-controller.enable && haveClientIdentity) {
# Same rule as the unit's own gate: this reader exists on any host holding # Same rule as the unit's own gate: this reader exists on any host holding
# a client identity, which is not every host that runs the store, so the # a client identity, which is not every host that runs the store, so the
# store's module cannot name it. # store's module cannot name it.

View file

@ -31,9 +31,7 @@ let
pkiDir = if haveMintedPki then builtins.dirOf baoDeploy.clientCertFile else null; pkiDir = if haveMintedPki then builtins.dirOf baoDeploy.clientCertFile else null;
in in
{ {
config = config = lib.mkIf (deployCfg.swarm-secret-publisher.enable && haveMintedPki) {
lib.mkIf (hyperhiveCfg.enable && deployCfg.swarm-secret-publisher.enable && haveMintedPki)
{
services.hyperhive.deploy.swarm-secret-publisher = { services.hyperhive.deploy.swarm-secret-publisher = {
baoClientCertFile = lib.mkDefault "${pkiDir}/secret-publisher.pem"; baoClientCertFile = lib.mkDefault "${pkiDir}/secret-publisher.pem";
baoClientKeyFile = lib.mkDefault "${pkiDir}/secret-publisher-key.pem"; baoClientKeyFile = lib.mkDefault "${pkiDir}/secret-publisher-key.pem";

View file

@ -34,7 +34,7 @@ let
pkiDir = if haveMintedPki then builtins.dirOf baoDeploy.clientCertFile else null; pkiDir = if haveMintedPki then builtins.dirOf baoDeploy.clientCertFile else null;
in in
{ {
config = lib.mkIf (hyperhiveCfg.enable && haveMintedPki) { config = lib.mkIf haveMintedPki {
services.hyperhive.deploy.hive-controller.tls = { services.hyperhive.deploy.hive-controller.tls = {
baoClientCertFile = lib.mkDefault "${pkiDir}/services-issuer.pem"; baoClientCertFile = lib.mkDefault "${pkiDir}/services-issuer.pem";
baoClientKeyFile = lib.mkDefault "${pkiDir}/services-issuer-key.pem"; baoClientKeyFile = lib.mkDefault "${pkiDir}/services-issuer-key.pem";

View file

@ -29,7 +29,7 @@ let
baoCfg = hyperhiveCfg.swarm.bao; baoCfg = hyperhiveCfg.swarm.bao;
in in
{ {
config = lib.mkIf (hyperhiveCfg.enable && deployCfg.authelia.enable) { config = lib.mkIf deployCfg.authelia.enable {
# One declaration, two readers: `clientId` is a read-only option # One declaration, two readers: `clientId` is a read-only option
# ./swarm-bao.nix owns, and ./swarm-otel.nix builds this principal's # ./swarm-bao.nix owns, and ./swarm-otel.nix builds this principal's
# authenticator audience from the same option. # authenticator audience from the same option.

Some files were not shown because too many files have changed in this diff Show more