feat(3149): deliver the client secret between the two containers
The all-local case from the delivery ruling: when one host runs both the forge and the swarm's authelia, nothing should need an operator. Two containers, one secret, and the awkward part is that they share this host's network namespace but not its filesystem. They reach each other on 127.0.0.1, which makes them feel co-located — the forge still cannot open a path inside authelia's tree. The host is the only place both are addressable, so the copy runs there, and `hostClientSecretDir` publishes the outside view of the inside path exactly as `hostUsersFile` already does for the users database. Deliberately a copy rather than a `bindMounts` entry. nixos-container refuses to start when a bind source is missing, and this secret does not exist until authelia's first boot has minted it — binding it would make the forge wait on a file that waits on a container that starts after it. On a fresh hive that is a permanent stall presenting as "the forge is broken", several layers from its cause. The owning uid is discovered from the forge container's own state dir rather than assumed. Whatever uid maps to forgejo inside that container already owns the directory it was created with; writing a number here would be a second place for it to be wrong. The client entry is contributed to authelia's list by the forge module itself, from the same source-name constant the registration uses, so the redirect URI authelia allows and the one forgejo sends cannot drift. A mismatch there is a rejected login with no error text worth reading.
This commit is contained in:
parent
daa8a2eb4b
commit
cdb3c612b2
2 changed files with 114 additions and 1 deletions
|
|
@ -351,6 +351,28 @@ in
|
|||
'';
|
||||
};
|
||||
|
||||
hostClientSecretDir = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
readOnly = true;
|
||||
default = "/var/lib/nixos-containers/${cfg.machine}${clientsDir}";
|
||||
description = ''
|
||||
Where the minted client secrets sit **as seen from the host** —
|
||||
`<id>.secret` holds a plaintext, `<id>.digest` the hash authelia
|
||||
itself reads.
|
||||
|
||||
Published for the same reason as `hostUsersFile`: the plaintext's
|
||||
other reader lives in a **different container**, and containers
|
||||
that share this host's network namespace still have separate
|
||||
filesystem roots. The host is the only place both trees are
|
||||
addressable, so the host is where a delivery step has to run.
|
||||
|
||||
⚠️ Nothing here exists until authelia's **first boot** has run.
|
||||
A consumer must wait for it — it cannot be a `bindMounts` source,
|
||||
because nixos-container refuses to start when a bind source is
|
||||
missing, and that turns a fresh hive into a boot-order deadlock.
|
||||
'';
|
||||
};
|
||||
|
||||
hostUsersFile = lib.mkOption {
|
||||
type = lib.types.str;
|
||||
readOnly = true;
|
||||
|
|
|
|||
Loading…
Reference in a new issue