gitea's forge-account reads the forge's own host key file before scanning its sshd, so a forge restart no longer refuses every forge account (issue 1939)
#472
Merged
mesh-toolsmerged 1 commits from fix/1939-forge-host-key into main2026-10-24 20:05:39 +00:00
Issue 1939: forge-account ran ssh-keyscan against the forge's sshd; while the forge restarts that fails for every node and module pair ('the forge's ssh host key cannot be read: ssh-keyscan: exit status 1'). Met twice, the second time at 13:23:15 today on novox right after gitea was redelivered.
forge-account now reads ${dir:data}/ssh/ssh_host_ed25519_key.pub (public key only) first, then scans the sshd, then keeps the key it read before; it errors only when none gives a key. Tests: a failing scan still gets the key from the file; a missing file falls back to the scan; a restarting forge keeps the earlier key. Hardening notes (logging the fallbacks, an unparseable file) are on issue 1939, note 3.
Reviewed-by: review-1939@shanks at 75156fce00
Pushed-by: lead-47@shanks
Issue 1939: forge-account ran ssh-keyscan against the forge's sshd; while the forge restarts that fails for every node and module pair ('the forge's ssh host key cannot be read: ssh-keyscan: exit status 1'). Met twice, the second time at 13:23:15 today on novox right after gitea was redelivered.
forge-account now reads ${dir:data}/ssh/ssh_host_ed25519_key.pub (public key only) first, then scans the sshd, then keeps the key it read before; it errors only when none gives a key. Tests: a failing scan still gets the key from the file; a missing file falls back to the scan; a restarting forge keeps the earlier key. Hardening notes (logging the fallbacks, an unparseable file) are on issue 1939, note 3.
Reviewed-by: review-1939@shanks at 75156fce007e15536f7f706b430cba5d367b2d39
Pushed-by: lead-47@shanks
mesh/check pass 75156fce007e on c65116178720 | unit 246 run, 4192 kept | integration 228 run, 4252 kept | over bound: unit, integration (slowest unit …
Deliverynovox/mesh-catalog@75156fce007e — delivered since 2026-10-24T20:07:33Z
Delivery plan — builds gitea → novox; no bus step
tier 0: gitea
novox: receives gitea
gitea provides npm-package-registry, git, gitea-read, forge-account: its consumers are sent again after it
gitea keeps data (ADR 0233): what it holds is backed up before it moves
Machines
gitea on every machine running it: sent
Transitions
2026-10-24 11:26 (new) → proposed (announced): novox/mesh-catalog#472's head announced
2026-10-24 11:28 proposed → checked (checked): a verdict names this commit and the trunk's head as its trunk commit
2026-10-24 11:28 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
2026-10-24 19:47 ready → proposed (trunk moved): out of date: judged against trunk 25176e1ccd, the trunk is now ee216e4e63f1; judged again on a recheck or when it is merged
2026-10-24 20:05 proposed → checked (checked): a verdict names this commit and the trunk's head as its trunk commit
2026-10-24 20:05 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
2026-10-24 20:05 ready → published (merged): on the trunk its modules follow: merged there, and its walk opened — or nothing for a walk to move
2026-10-24 20:05 published → delivering (go): its walk started: let go by this owner in its group's order, by a person, or on the controller's own path — not a failed walk that carried a later commit for it, after which it waits for a walk of its own commit
2026-10-24 20:07 delivering → delivered (done): its walk is done, carrying its own commit: every machine of its deploy plan passed, or was left as its policy says
The commit's note under refs/notes/mesh-plan keeps every transition: git log --notes=mesh-plan.
<!-- mesh-delivery:view -->
**Delivery** `novox/mesh-catalog@75156fce007e` — **delivered** since 2026-10-24T20:07:33Z
**Delivery plan** — builds gitea → novox; no bus step
- tier 0: gitea
- novox: receives gitea
- gitea provides npm-package-registry, git, gitea-read, forge-account: its consumers are sent again after it
- gitea keeps data (ADR 0233): what it holds is backed up before it moves
**Machines**
- gitea on every machine running it: sent
**Transitions**
- 2026-10-24 11:26 (new) → proposed (announced): novox/mesh-catalog#472's head announced
- 2026-10-24 11:28 proposed → checked (checked): a verdict names this commit and the trunk's head as its trunk commit
- 2026-10-24 11:28 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
- 2026-10-24 19:47 ready → proposed (trunk moved): out of date: judged against trunk 25176e1ccdb3, the trunk is now ee216e4e63f1; judged again on a recheck or when it is merged
- 2026-10-24 20:05 proposed → checked (checked): a verdict names this commit and the trunk's head as its trunk commit
- 2026-10-24 20:05 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
- 2026-10-24 20:05 ready → published (merged): on the trunk its modules follow: merged there, and its walk opened — or nothing for a walk to move
- 2026-10-24 20:05 published → delivering (go): its walk started: let go by this owner in its group's order, by a person, or on the controller's own path — not a failed walk that carried a later commit for it, after which it waits for a walk of its own commit
- 2026-10-24 20:07 delivering → delivered (done): its walk is done, carrying its own commit: every machine of its deploy plan passed, or was left as its policy says
The commit's note under `refs/notes/mesh-plan` keeps every transition: `git log --notes=mesh-plan`.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Issue 1939: forge-account ran ssh-keyscan against the forge's sshd; while the forge restarts that fails for every node and module pair ('the forge's ssh host key cannot be read: ssh-keyscan: exit status 1'). Met twice, the second time at 13:23:15 today on novox right after gitea was redelivered.
forge-account now reads ${dir:data}/ssh/ssh_host_ed25519_key.pub (public key only) first, then scans the sshd, then keeps the key it read before; it errors only when none gives a key. Tests: a failing scan still gets the key from the file; a missing file falls back to the scan; a restarting forge keeps the earlier key. Hardening notes (logging the fallbacks, an unparseable file) are on issue 1939, note 3.
Reviewed-by: review-1939@shanks at
75156fce00Pushed-by: lead-47@shanks
Delivery
novox/mesh-catalog@75156fce007e— delivered since 2026-10-24T20:07:33ZDelivery plan — builds gitea → novox; no bus step
Machines
Transitions
25176e1ccd, the trunk is now ee216e4e63f1; judged again on a recheck or when it is mergedThe commit's note under
refs/notes/mesh-plankeeps every transition:git log --notes=mesh-plan.