From 7f65cf02523ff8065047f0cfb00481f904fff231 Mon Sep 17 00:00:00 2001 From: Frank Date: Mon, 19 Oct 2026 21:27:07 -0700 Subject: [PATCH] docs(vault): the pasta endpoint has no address an app container can use The 2026-10-19 legs table blamed the frank-dragoon refusal on a root/rootless netavark rule-set split. It is not that: the container is rootless (the root unit's User=dank runs podman run), it is on pasta, and pasta installs no DNAT for rootless-bridge traffic while refusing a second network outright. The gateway alias does reach it (200) and is link-local, which is the same dead end the Open Notebook URL guard hit. Measured with the move onto the bridge now in the deployer, including the /proc/net/tcp line that shows 8730 is loopback-bound and so stays private after the move. Co-Authored-By: omp --- .../Container Network Namespaces.md | 25 +++++++++++++++---- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/serverAppConfigs-docs/Architecture/Container Network Namespaces.md b/serverAppConfigs-docs/Architecture/Container Network Namespaces.md index 954686d..eaa574e 100644 --- a/serverAppConfigs-docs/Architecture/Container Network Namespaces.md +++ b/serverAppConfigs-docs/Architecture/Container Network Namespaces.md @@ -99,7 +99,8 @@ private `systemd-open-notebook`), each address aimed at a live listener: | Dial | Result | Mechanism | |---|---|---| | `192.168.0.143:3000` (Gitea) | **200** | published by a **rootless** container — rootless egress crosses the host netfilter where netavark installed that DNAT | -| `192.168.0.143:7770` (`frank-dragoon`) | refused | published by a **root** container. Root and rootless Podman carry separate netavark rule sets, so a rootless container's traffic never crosses root's and a root-published port is invisible to it | +| `192.168.0.143:7770` (`frank-dragoon`) | refused | the container is **rootless on podman's default `pasta` netns** (the root unit's `User=dank` runs `podman run`, so it lands in dank's storage). Pasta forwards the published port in the host netns — the host and the LAN both answer 200 — but installs no netavark DNAT for traffic arriving from a rootless bridge, so the same address is refused from a container. This is NOT a root/rootless rule-set split: `podman ps` as `dank` lists it | +| `host.containers.internal:7770` (`169.254.1.2`) | **200** | the pasta forwarder is bound `0.0.0.0` on the host, so the gateway alias reaches it — and the alias is link-local, which is the dead end below | | `192.168.0.143:7771` (`frank-zealot`) | refused | host-netns listener, unpublished — the rule above, reconfirmed | | `10.89.1.1:7771` | refused | the bridge gateway address belongs to the rootlesskit netns, not to the host | | `host.containers.internal:7771` (`169.254.1.2`) | **200** | the gateway alias is the one address that carries a rootless container to a host-netns listener. Why `hermes-dashboard` timed out on this alias in 2026-09-02 while `open-notebook` answers today is **not established**; the difference to check first is the second network and where the default route lands | @@ -107,10 +108,24 @@ private `systemd-open-notebook`), each address aimed at a live listener: The consequence that changes designs: **a rootless container's menu of local model endpoints is `frank-tts` (container DNS, same network) and `frank-archon` (LAN -address on another host).** Both Dankclaw endpoints are out of reach — -`frank-dragoon` behind root's publish, `frank-zealot` behind the host netns — and -the only address that does reach them, `169.254.1.2`, is link-local, which some -applications refuse to store at all ([[Open Notebook]] meets exactly that refusal). +address on another host).** A `pasta` endpoint has no address an app container can +use: the LAN address is refused, and the one alias that answers is link-local, +which some applications refuse to store at all ([[Open Notebook]] meets exactly +that refusal). Pasta cannot be *added to* either — + +``` +podman run --network pasta --network dankclaw_default … +Error: cannot set multiple networks without bridge network mode, selected mode pasta +``` + +so the only shape that makes such an endpoint nameable is **moving it onto +`dankclaw_default`** (`FRANK_DRAGOON_NETWORK` in `scripts/frank-dragoon.env`, +2026-10-19). For frank-dragoon that is not an exposure change: the engine's +unauthenticated token port binds the container's **own loopback** +(`/proc/net/tcp` on 2026-10-19: `127.0.0.1:8730`, `0.0.0.0:8731`), so only the +API port becomes name-resolvable, which is the same trust the published 7770 +already carries on the LAN. `frank-zealot` (7771) stays a host-netns binary and +remains unreachable except through the link-local alias. ## Operational rules