docs(ops): fix runbook/hotfix/troubleshooting against reality + redact committed sudo password

- operations-runbook: redact the plaintext sudo password (rotate it — it
  stays in git history); replace the nonexistent test-cross-node.sh /
  test-reboot-survival.sh with the real entry points (lifecycle gate,
  multinode smoke, e2e/post-install scripts)
- hotfix-process: de-hardcode the v1.0.x framing, point releases at
  create-release.sh + primary Gitea, correct the rollback backup paths
  (/opt/archipelago/rollback + updater backup dir, not /usr/local/bin)
- troubleshooting: connectivity probe start9.com -> debian.org
- INSTALL.sh: drop removed endurain app, point at developer-guide.md
  (development-setup.md never existed)
- tests/lifecycle/TESTING.md: replace the stale 2026-06-21 mid-session
  resume block with a resolved note; release-gate item 8 reflects the
  2026-07-08 version decision (1.8.0-alpha)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
archipelago 2026-07-08 18:46:51 -04:00
parent 9ce8a0df05
commit 1394994e0c
5 changed files with 34 additions and 78 deletions

View File

@ -122,7 +122,7 @@ echo ""
# Install custom app dependencies
echo "Installing custom app dependencies..."
for app in did-wallet endurain morphos-server router; do
for app in did-wallet morphos-server router; do
if [ -d "apps/$app" ]; then
echo " - Installing $app dependencies..."
cd "apps/$app"
@ -161,6 +161,6 @@ echo " http://localhost:8100"
echo ""
echo "For more information, see:"
echo " - README.md"
echo " - docs/development-setup.md"
echo " - docs/developer-guide.md"
echo " - apps/QUICKSTART.md"
echo ""

View File

@ -1,6 +1,6 @@
# Hotfix Process
For critical bugs discovered after v1.0.0 release.
For critical bugs discovered after a tagged release.
## Severity Classification
@ -16,10 +16,10 @@ For critical bugs discovered after v1.0.0 release.
### 1. Triage
- Reproduce the issue on dev server (192.168.1.228)
- Classify severity (P0-P3)
- P0/P1: proceed immediately. P2/P3: add to v1.1 roadmap.
- P0/P1: proceed immediately. P2/P3: add to the next release (`docs/UNIFIED-TASK-TRACKER.md`).
### 2. Fix
- Create branch: `hotfix/v1.0.1-description`
- Create branch: `hotfix/vX.Y.Z-description`
- Fix the issue with minimal code changes
- Run full test suite: `cd neode-ui && npm test && npm run type-check`
- Deploy to dev server: `./scripts/deploy-to-target.sh --live`
@ -27,9 +27,10 @@ For critical bugs discovered after v1.0.0 release.
### 3. Release
- Merge hotfix branch to `main`
- Tag: `v1.0.1` (increment patch version)
- Update release manifest for OTA updates (`releases/manifest.json`)
- Push to both Gitea mirrors so nodes can pull via `self-update.sh`
- Tag: `vX.Y.Z` (increment patch version)
- Cut the release with `./scripts/create-release.sh X.Y.Z` (updates
`releases/manifest.json` and signs it)
- Push `main` + tags to the primary Gitea release server so nodes pick it up OTA
### 4. Communicate
- Update RELEASE-NOTES with hotfix details
@ -44,6 +45,8 @@ For critical bugs discovered after v1.0.0 release.
## Rollback
If a hotfix causes regressions:
1. OTA system supports rollback to previous version (`scripts/self-update.sh --rollback`)
2. Point `releases/manifest.json` back at the last-known-good version and push to mirrors
3. Backend binary backup at `/usr/local/bin/archipelago.bak`
1. The updater self-verifies after applying (health check on restart) and rolls the
binary back automatically if the new one fails to come up
2. Point `releases/manifest.json` back at the last-known-good version and push
3. Backend binary backups: `/opt/archipelago/rollback/archipelago.bak` (deploy script)
and `/var/lib/archipelago/update-backup/archipelago.bak` (`self-update.sh`)

View File

@ -5,7 +5,7 @@ Quick reference for common operational tasks on Archipelago nodes.
**Primary node**: `192.168.1.228` (Arch 1)
**Secondary node**: `192.168.1.198` (Arch 2)
**SSH**: `ssh -i ~/.ssh/archipelago-deploy archipelago@{IP}`
**Sudo**: `echo 'EwPDR8q45l0Upx@' | sudo -S {command}`
**Sudo**: use the node's sudo password (kept out of this doc — never commit credentials)
---
@ -350,15 +350,17 @@ If a node responds to ping but SSH/HTTP are down:
podman image prune -a
```
## 17. Run Cross-Node Tests
## 17. Run Tests
```bash
# Full test suite (all features, 10 iterations)
./scripts/test-cross-node.sh --iterations 10
# Production lifecycle gate — run ON the node (uses local podman/systemctl):
tests/lifecycle/run-gate.sh # see tests/lifecycle/TESTING.md
ARCHY_ITERATIONS=5 tests/lifecycle/run-gate.sh
# Skip reboot tests
./scripts/test-cross-node.sh --iterations 10 --skip-reboot
# Cross-node suites (federation/mesh):
tests/multinode/smoke.sh # see docs/multinode-testing-plan.md
# Reboot survival test (single node)
./scripts/test-reboot-survival.sh --node 192.168.1.228 --iterations 3
# E2E / post-install:
./scripts/run-e2e-tests.sh
./scripts/run-post-install-tests.sh
```

View File

@ -236,7 +236,7 @@ sudo journalctl -u archipelago -f
**Diagnosis**:
```bash
# Check internet connectivity
curl -s https://start9.com > /dev/null && echo "Internet OK" || echo "No internet"
curl -s https://debian.org > /dev/null && echo "Internet OK" || echo "No internet"
# Check backend logs
sudo journalctl -u archipelago --since "15 minutes ago" | grep -i update

View File

@ -50,64 +50,15 @@ separate pass → `docs/multinode-testing-plan.md`.)
`lnd` on .228 — they are synced and healthy; destructive cycles there would
cost hours of resync.
### Session work log
### Session work log (resolved)
| Date | App | Change | State |
|---|---|---|---|
| 2026-06-21 | fedimint-gateway / -clientd | **Generated-secrets system** (Pillar 4+5). New `generated_secrets:` manifest field (`hex16`/`hex32`/`bcrypt`); materialised generically at the `resolve_dynamic_env` chokepoint — atomic `0600`, rootless-owned, idempotent, and **self-healing** (recreates a wrongly `root:root`-owned secret via the service-owned dir, no chown/privilege). Removed per-app `ensure_fmcd_password` (30 LoC). Fixes gateway never starting (`resolving secret_env` → missing/unreadable `fedimint-gateway-hash`). | ◐ code complete, `cargo check` + 3 unit tests green; **not yet deployed/validated on .228** |
| 2026-06-21 | fedimint-gateway | Icon placeholder | ○ investigating: marketplace catalog has title+icon (fedimint.png, shared); `BUNDLED_APPS` frontend list omits fedimint → installed view falls back to 📦 |
### ⏯ RESUME POINT (2026-06-21, mid-session)
**Done (working tree, NOT git-committed):**
- Generated-secrets system — all files below written, `cargo check` clean, 3 unit tests green.
- Manifests declare `generated_secrets` (fmcd-password hex16; fedimint-gateway-hash bcrypt).
- Tracker refreshed with 5 pillars + this log.
**In flight:**
- Local release build RUNNING (`cd core && cargo build --release -p archipelago`,
log `/tmp/archy-local-build.log`, output `core/target/release/archipelago`).
⚠️ **.228 has NO cargo and NO rsync** — build LOCALLY on .116, ship binary + files
via **tar-over-ssh** (`tar -cf - … | ssh … 'tar -xf -'`).
**Next steps (in order):**
1. Wait for local build → `Finished`. scp/tar `core/target/release/archipelago` → .228.
2. Ship updated manifests to **`/opt/archipelago/apps/fedimint-{gateway,clientd}/`** (canonical runtime dir; cwd-relative `apps` doesn't resolve — WorkingDirectory is empty).
3. **Binary swap is SAFE for protected backends:** `archipelago.service` is
`KillMode=control-group` BUT bitcoin-knots/electrumx/lnd conmons live under
`user.slice/.../libpod-*.scope`, NOT the service cgroup. Only fedimint-clientd +
immich conmons are in-cgroup (non-protected, reconciled back). `systemctl stop
archipelago` → `cp` binary → `start`.
4. Validate: install fedimint-gateway → assert `fedimint-gateway-hash` (0600,
archipelago-owned) + `.pw` generated → container starts healthy.
5. Run `tests/lifecycle/run-gate.sh` for the gateway (do NOT touch knots/electrumx/lnd).
6. Frontend fixes (separate from binary): see icon/rename below; rebuild neode-ui,
ship `dist + catalog.json + assets` to `/opt/archipelago/web-ui` (chown 1000:1000).
**Icon / naming (frontend, user-confirmed):**
- Gateway icon = **reuse fedimint.png** (user choice). Static catalogs already map all 3
→ fedimint.png; deployed `/catalog.json` on .228 also correct; `/api/app-catalog`
(decoupled, dict form) returns no fedimint → frontend falls through to `/catalog.json`.
Placeholder is therefore a **stale deployed bundle** and/or the **hardcoded fallback gap**:
`getCuratedAppList()` in `neode-ui/src/views/discover/curatedApps.ts` omits
fedimint-gateway + fedimint-clientd entirely — add both (icon fedimint.png).
- Base **`fedimint` → display "Fedimint Guardian"** (user ask). Edit name/title in:
`apps/fedimint/manifest.yml`, `app-catalog/catalog.json`,
`neode-ui/public/catalog.json`, `web/dist/neode-ui/catalog.json`,
`curatedApps.ts:101`. (`INSTALLED_ALIASES.fedimint = ['fedimint-gateway']` in curatedApps.ts.)
**.228 access:** `sshpass -p archipelago ssh archipelago@192.168.1.228`; UI/RPC pw
`password123` (https). Binary `/usr/local/bin/archipelago` (v1.7.99-alpha).
### Generated-secrets — files touched
- `core/container/src/manifest.rs``GeneratedSecret` + `SecretGenKind` types, `ContainerConfig.generated_secrets`, validation (bare-filename, unique target files).
- `core/container/src/lib.rs` — re-export the new types.
- `core/archipelago/src/container/secrets.rs`**new** generator module (atomic write, idempotent, self-heal) + 3 unit tests.
- `core/archipelago/src/container/mod.rs` — register module.
- `core/archipelago/src/container/prod_orchestrator.rs` — call `ensure_generated_secrets` in `resolve_dynamic_env`; drop fmcd special-case.
- `core/archipelago/src/wallet/fedimint_client.rs` — delete orphaned `ensure_fmcd_password` (reader keeps `FMCD_PASSWORD_SECRET`).
- `apps/fedimint-clientd/manifest.yml`, `apps/fedimint-gateway/manifest.yml` — declare `generated_secrets`.
The 2026-06-21 mid-session resume block that lived here (generated-secrets
rollout for fedimint-gateway/-clientd, icon/naming fixes) is **done and
shipped**: the generated-secrets system is a platform primitive
(`container.generated_secrets`, see `docs/app-manifest-spec.md`), the
manifests declare it, and the single-node gate went green on .228 on
2026-06-23. Day-to-day open items live in `docs/UNIFIED-TASK-TRACKER.md`
don't add session logs here.
---
@ -302,7 +253,7 @@ priority-ordered list of what's still open across these):
7. ☑ Layman-readable changelog — `CHANGELOG.md` backfilled through v1.8.00-alpha
(per `feedback_changelog_layman.md`)
8. ☐ Tag pushed to origin + gitea-local + gitea-vps2 (per `feedback_ship_ritual.md`) —
blocked on the version-naming decision, see unified tracker Tier 3
version decided 2026-07-08 (`1.8.0-alpha`); tag once the pre-tag items above close
## How to update this document