Files
archy/.planning/todos/pending/2026-08-01-archi-dev-box-as-fresh-test-node-without-iso.md
T

61 lines
3.4 KiB
Markdown
Raw Normal View History

2026-08-12 10:55:49 +00:00
---
created: 2026-08-01T04:05:00.000Z
title: Make archi-dev-box double as a fresh test node (both shapes, no ISO flash)
area: testing-infra
severity: major
files:
- core/archipelago/src/config.rs (the env seams: ARCHIPELAGO_DATA_DIR:125, ARCHIPELAGO_BIND:129, ARCHIPELAGO_PORT_OFFSET:155, ARCHIPELAGO_APPS_DIR)
- core/container/src/port_manager.rs (port_offset applied at :44)
- core/archipelago/src/auth.rs (:182 is_onboarding_complete — "fresh" is decided purely from state inside data_dir)
- tests/lifecycle/ (existing gate harness — candidate host for the new node profile)
---
## Problem
Dorian (2026-08-01): wants archi-dev-box to serve as a testing node that can be exercised
"as if it's a new node", running alongside the existing Linux desktop app install, **without
flashing the ISO**. Both shapes are wanted — this is a testing node, so it needs to cover
first-run UX *and* real app lifecycle.
Today the box runs one real production-ish node: `archipelago.service` (systemd, enabled,
`/usr/local/bin/archipelago`) against a heavily-populated `/var/lib/archipelago` (bitcoin,
btcpay, botfights, blobs, live LND/mesh state). That node must not be disturbed — it is the
dev-pair deploy target gated before every OTA.
## Solution
Two shapes, both ISO-free. Ship A first, then B.
**(A) Lightweight second instance, same Linux user.** Own empty `ARCHIPELAGO_DATA_DIR`, own
`ARCHIPELAGO_BIND` port, `ARCHIPELAGO_PORT_OFFSET` set, mesh/Reticulum disabled. Boots
un-onboarded, so it exercises the true first-run path: seed generation, password/setup,
identity keygen, node naming, onboarding UI. Cheap to create and destroy — the natural
regression harness for onboarding changes.
**(B) Second Linux user** (`useradd` + `loginctl enable-linger` + its own rootless podman
namespace + own data dir). Gives a genuinely independent node where app install / uninstall /
reinstall lifecycle is real, not shared. This is what makes it a *testing node* rather than a
first-run mock.
## Hazards (verified by grep 2026-08-01, must be designed around)
1. **Hardcoded paths defeat `ARCHIPELAGO_DATA_DIR`.** Several constants point at
`/var/lib/archipelago` literally and ignore the override: `bitcoin_rpc.rs:10`
(`SECRETS_PATH`), `container/lnd.rs:131` (`ARCHY_DATA_DIR`), `electrs_status.rs:15`,
`api/rpc/package/pine_ha.rs:34-36`, `bootstrap.rs:242` (secrets dir), `disk_monitor.rs:41`.
Under shape (A) a test instance that installs **Bitcoin, LND, electrumx, or Pine/HA would
read and write the LIVE node's files.** Those four are off-limits in (A); shape (B) fixes
this properly via a different user's paths — or the constants get plumbed through config,
which is arguably the real fix and a candidate follow-up.
2. **Rootless podman is per-Linux-user.** In (A) both instances share one container
namespace: `PORT_OFFSET` resolves port collisions, container *name* collisions it does not.
3. **Reticulum/mesh contention.** The live daemon holds `/dev/mesh-radio` and
`identity/node_key`; a second instance would fight it for the radio. Mesh must be off for
the test node (or the radio explicitly assigned to one of them).
## Notes
Raised while resuming quick task 260731-upz (entropy/seed audit) — shape (A) is also the
natural on-node harness for that audit's UNVERIFIED checklist, since fresh-seed generation is
exactly the `[ARCHY-1]` path under review. Sequence this after 260731-upz lands.