ADR 0263 (accepted), research 038, design 52: a share is a provision, a node mounts it on demand #221

Merged
mesh-admin merged 5 commits from feat/mounts-module into main 2026-10-08 18:40:00 +00:00
Contributor

The operator found two failed fstab mounts on the workstation on 2026-10-08 and asked the mesh to handle shares and mounts. This opens research 038 and proposes a decision and a design. Nothing here is decided yet: ADR 0263 is proposed, to-be 52 is proposed, research 038 stays active until the operator answers the open questions.

What was measured (research 038, evidence)

  • The library mount times out because the home server's packet filter drops NFS. The export exists and nfs-server runs, but no module listens on 2049/111/445 (ADR 0045), so the mesh's table drops them. The server's NFS counters read zero I/O since its boot on 2026-10-04. This is the closure issue 169 predicted.
  • The gaming device's SMB mount fails because the device is off. No nofail, no automount, and the share's password sits in a world-readable fstab.
  • The export comes from a ZFS sharenfs property, not /etc/exports; the library is a child dataset, so exporting the pool's root needs crossmnt.
  • With sec=sys, the operator's id 1000 on a client is a different account on the home server, which owns the backup repository. A plain export of the pool's root would expose it.
  • Eight containers bind the pool's paths locally; an export changes none of their paths or owners.
  • No module exports or mounts; no tool read fstab, mount units or exports. A read-only mounts module is proposed in mesh-catalog on the same branch name.

Proposed (ADR 0263, to-be 52)

  • nfs-server holds node seat nfs-share, provides the provision, writes its own /etc/exports.d file, NFS v4 only, port 2049 from the private network only, all_squash to the share's owner.
  • One share per folder (library, downloads); the backup repository and archive are not exported. The pool's root with crossmnt is the named alternative.
  • mounts holds node seat node-mounts and writes a .mount + .automount per share: nothing mounts or fails at boot; idle and mount timeouts.
  • Only nodes that ask get a share (workstation, laptop; not the control-node); "every node" is a mesh-wide setting.
  • Occasional sources (the gaming device, a USB disk): absence is a state, not a fault; credential via secret accept (ADR 0092).
  • share-unreachable condition for shares that should be there; nothing for an absent occasional source.
  • adopt acts take over the hand-written fstab lines and the ZFS property, only on a person's word.

Checks

records.py, index.py, cycle.py, words.py pass locally (merge-check.sh).

Do not merge before the operator has answered the open questions in 02-options.md.

The operator found two failed fstab mounts on the workstation on 2026-10-08 and asked the mesh to handle shares and mounts. This opens research 038 and proposes a decision and a design. **Nothing here is decided yet: ADR 0263 is `proposed`, to-be 52 is `proposed`, research 038 stays `active` until the operator answers the open questions.** ## What was measured (research 038, evidence) - **The library mount times out because the home server's packet filter drops NFS.** The export exists and nfs-server runs, but no module listens on 2049/111/445 (ADR 0045), so the mesh's table drops them. The server's NFS counters read zero I/O since its boot on 2026-10-04. This is the closure issue 169 predicted. - **The gaming device's SMB mount fails because the device is off.** No `nofail`, no automount, and the share's password sits in a world-readable fstab. - The export comes from a ZFS `sharenfs` property, not `/etc/exports`; the library is a child dataset, so exporting the pool's root needs `crossmnt`. - With `sec=sys`, the operator's id 1000 on a client is a different account on the home server, which owns the backup repository. A plain export of the pool's root would expose it. - Eight containers bind the pool's paths locally; an export changes none of their paths or owners. - No module exports or mounts; no tool read fstab, mount units or exports. A read-only `mounts` module is proposed in mesh-catalog on the same branch name. ## Proposed (ADR 0263, to-be 52) - `nfs-server` holds node seat `nfs-share`, provides the provision, writes its own `/etc/exports.d` file, NFS v4 only, port 2049 from the private network only, `all_squash` to the share's owner. - One share per folder (library, downloads); the backup repository and archive are not exported. The pool's root with `crossmnt` is the named alternative. - `mounts` holds node seat `node-mounts` and writes a `.mount` + `.automount` per share: nothing mounts or fails at boot; idle and mount timeouts. - Only nodes that ask get a share (workstation, laptop; not the control-node); "every node" is a mesh-wide setting. - Occasional sources (the gaming device, a USB disk): absence is a state, not a fault; credential via `secret accept` (ADR 0092). - `share-unreachable` condition for shares that should be there; nothing for an absent occasional source. - `adopt` acts take over the hand-written fstab lines and the ZFS property, only on a person's word. ## Checks `records.py`, `index.py`, `cycle.py`, `words.py` pass locally (`merge-check.sh`). Do not merge before the operator has answered the open questions in `02-options.md`.
mesh-admin added 1 commit 2026-10-08 15:24:13 +00:00
Research 038, ADR 0263 and to-be 52: let the mesh own shares and mounts, so no node depends on a hand-written export or fstab line
mesh/merge-gate pass: the change touches no module of the mesh's graph
mesh/repo-check pass: its merge-check.sh passed
mesh/delivery-group group feat/mounts-module rejected: a member's own check failed
mesh/delivery superseded: a newer head of the same pull request
3edafd78ab
Author
Contributor

Delivery novox/hq@d05c9d7ca4c7 — delivered since 2026-10-08T18:40:29Z

Delivery plan — builds nothing: the change touches no module of the mesh's graph

Group feat/mounts-module, in order: novox/hq@d05c9d7ca4 → novox/mesh-controller@d7fab82a89 → novox/mesh-catalog@29ac6ee16a

Transitions

  • 2026-10-08 18:22 (new) → proposed (announced): novox/hq#221's head announced
  • 2026-10-08 18:22 proposed → checked (checked): the verdict names this commit
  • 2026-10-08 18:22 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail
  • 2026-10-08 18:40 ready → published (merged): on the trunk its modules follow: merged there, and its walk opened — or nothing for a walk to move
  • 2026-10-08 18:40 published → delivered (done): nothing for a walk to move

The commit's note under refs/notes/mesh-plan keeps every transition: git log --notes=mesh-plan.

<!-- mesh-delivery:view --> **Delivery** `novox/hq@d05c9d7ca4c7` — **delivered** since 2026-10-08T18:40:29Z **Delivery plan** — builds nothing: the change touches no module of the mesh's graph **Group** `feat/mounts-module`, in order: novox/hq@d05c9d7ca4c7 → novox/mesh-controller@d7fab82a8980 → novox/mesh-catalog@29ac6ee16a35 - novox/mesh-controller@d7fab82a8980 before novox/mesh-catalog@29ac6ee16a35: version skew **Transitions** - 2026-10-08 18:22 (new) → proposed (announced): novox/hq#221's head announced - 2026-10-08 18:22 proposed → checked (checked): the verdict names this commit - 2026-10-08 18:22 checked → ready (accepted): the gate passed or warned, and the repository's own check did not fail - 2026-10-08 18:40 ready → published (merged): on the trunk its modules follow: merged there, and its walk opened — or nothing for a walk to move - 2026-10-08 18:40 published → delivered (done): nothing for a walk to move The commit's note under `refs/notes/mesh-plan` keeps every transition: `git log --notes=mesh-plan`.
jschoubben added 2 commits 2026-10-08 16:37:17 +00:00
Design 52 says how the modules were built: the server's bucket carries each share's path, two root processes, settings default to none
mesh/merge-gate pass: the change touches no module of the mesh's graph
mesh/repo-check pass: its merge-check.sh passed
mesh/delivery-group group feat/mounts-module checking: 2 of 3 member(s) ready
mesh/delivery superseded: a newer head of the same pull request
f4b79ba7c2
mesh-admin changed title from Research 038, ADR 0263 (proposed) and to-be 52: shares and mounts the mesh manages to ADR 0263 (accepted), research 038, design 52: a share is a provision, a node mounts it on demand 2026-10-08 16:42:57 +00:00
jschoubben added 1 commit 2026-10-08 18:21:51 +00:00
jschoubben added 1 commit 2026-10-08 18:22:07 +00:00
Name the safe order of taking shares into use without the retired word
mesh/merge-gate pass: the change touches no module of the mesh's graph
mesh/repo-check pass: its merge-check.sh passed
mesh/delivery delivered
mesh/delivery-group group feat/mounts-module merged: every member is merged
d05c9d7ca4
mesh-admin merged commit 4eb8be9e66 into main 2026-10-08 18:40:00 +00:00
mesh-admin deleted branch feat/mounts-module 2026-10-08 18:40:00 +00:00
Sign in to join this conversation.
No Reviewers
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: novox/hq#221