docs(gateway): describe what is, not what changed

Per review: docs represent current state. Every "used to" / "no longer"
clause this branch introduced is gone — including the History section in
network.md, which was a whole subsection about a sync mechanism that
doesn't exist.

Where the removed clause was carrying a real constraint, the constraint
stays and is stated in the present tense instead of as a delta: nothing
narrows what the gateway's nginx can reach except the directory
permissions in front of a socket, and nothing bounds `ReloadGatewayNginx`
except the hard-coded unit name. Those read as rules now rather than as
the story of how they came to be rules.
This commit is contained in:
atlas 2026-08-11 18:09:51 +02:00
commit 98d895cf9e
15 changed files with 77 additions and 146 deletions

View file

@ -1,10 +1,9 @@
# Single nginx in front of every hyperhive web surface — dashboard,
# per-agent UIs (sub-path), forge + matrix (sub-domain), .well-known
# delegations — plus the hive-internal dnsmasq resolver. Both run on the
# HOST, next to hive-c0re. They used to live in a `hive-gateway`
# container that shared the host netns anyway, so the boundary bought no
# network isolation and cost a resolv.conf sync, a reload that had to
# cross the machine bus, and four bind mounts.
# HOST, next to hive-c0re: nginx binds the host's :80/:443 and dnsmasq
# answers on the hive bridge, so neither can be confined to a network
# namespace of its own.
# Full vhost map + discovery flow + design rationale in
# `docs/gateway.md`. Layout: ./options.nix (option declarations),
# ./vhosts.nix (the nginx virtual-host tree), ./error-pages.nix
@ -106,11 +105,9 @@ in
];
# Ensure the gateway state dirs exist at host boot, before anything
# reads or writes them. They used to double as bind-mount sources
# for the container (nspawn would auto-create a missing one); the
# rules stay because they still cover the fresh-boot window before
# c0re has run, and they pin owner + mode rather than leaving it to
# whoever creates the path first.
# reads or writes them: these rules cover the fresh-boot window
# before c0re has run, and pin owner + mode rather than leaving it
# to whoever creates the path first.
#
# /run/hive-agent — per-agent UDS socket dir, written by c0re's
# set_nspawn_flags when agents start. Owned by `hive-core` (the
@ -273,11 +270,8 @@ in
# unprivileged and cannot act on a system unit).
#
# It stays an explicit trigger rather than a systemd path unit
# watching the file. That used to be impossible — an IN_MOVED_TO
# from the atomic rename did not cross the nspawn mount-namespace
# boundary — and with one machine it would now work. It is still
# not wanted: the write and the reload belong in one causal chain
# c0re can retry and report on (see RELOAD_PENDING), not two
# watching the file: the write and the reload belong in one causal
# chain c0re can retry and report on (see RELOAD_PENDING), not two
# independent units racing on an inotify event.
services.nginx = {
@ -289,10 +283,9 @@ in
inherit (nginxTree) appendHttpConfig virtualHosts;
};
# dnsmasq moves with nginx rather than staying behind: it was only in
# the container because nginx was, and leaving it there would keep the
# whole resolv.conf sync machine alive for a resolver that no longer
# needs it. Host-side it reads the one /etc/resolv.conf directly.
# dnsmasq is a host service alongside nginx, so it reads the host's
# /etc/resolv.conf directly and picks up network changes as they
# happen — no copy to keep in sync.
services.dnsmasq = import ./dnsmasq.nix {
inherit
lib