fix(install): ship app manifests where the backend loads them + self-heal existing nodes

Fresh ISO installs had ZERO disk manifests: auto-install.sh copied
apps/ to /etc/archipelago/apps but the backend/orchestrator loads
/opt/archipelago/apps — so any app not overlaid by the signed catalog
(netbird: 'manifests not available on this node') could never install.

- installer now also populates /mnt/target/opt/archipelago/apps
- bootstrap gains run_apps_dir_repair(): when /opt/archipelago/apps is
  empty and the installer copy exists, populate it at startup — heals
  already-deployed ISO nodes via OTA without reinstalling
- bootstrap's bitcoin.conf repair now also ensures rpcbind=0.0.0.0
  (same fix as install.rs; duplicate rpcbind with a manifest command
  line is harmless — bitcoind binds the first and logs the rest)

Verified live on the framework node: /opt populated (56 dirs), backend
restart loaded '50 app manifest(s) (disk + registry catalog)', all
containers kept running (they live in user.slice, not the service
cgroup).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
archipelago
2026-07-14 07:44:26 -04:00
co-authored by Claude Fable 5
parent f2a94548ab
commit c014c4b3ee
2 changed files with 50 additions and 0 deletions
@@ -2482,6 +2482,12 @@ fi
if [ -d "$BOOT_MEDIA/archipelago/apps" ]; then
cp -r "$BOOT_MEDIA/archipelago/apps" /mnt/target/etc/archipelago/
# The backend loads disk manifests from /opt/archipelago/apps — copying
# only to /etc/archipelago/apps left fresh installs with ZERO manifests,
# so any app not covered by the signed catalog (e.g. netbird) could not
# install at all. Ship them where the orchestrator actually looks.
mkdir -p /mnt/target/opt/archipelago/apps
cp -r "$BOOT_MEDIA/archipelago/apps/." /mnt/target/opt/archipelago/apps/
fi
# Copy pre-bundled container images