diff --git a/.gitea/workflows/build-iso-dev.yml b/.gitea/workflows/build-iso-dev.yml index 5ffa8324..9fa87689 100644 --- a/.gitea/workflows/build-iso-dev.yml +++ b/.gitea/workflows/build-iso-dev.yml @@ -74,12 +74,38 @@ jobs: - name: Include AIUI if available run: | - if [ -d "/opt/archipelago/web-ui/aiui" ] && [ -f "/opt/archipelago/web-ui/aiui/index.html" ]; then - mkdir -p web/dist/neode-ui/aiui - cp -r /opt/archipelago/web-ui/aiui/* web/dist/neode-ui/aiui/ - echo "AIUI included from /opt/archipelago/web-ui/aiui/" + # AIUI (the Claude chat sidebar) lives outside the Vue build + # and must be copied into the frontend dist BEFORE packaging, + # otherwise OTA-tarball upgrades silently strip it from nodes + # in the field. Try in order: cached on runner, then the + # newest release tarball in this repo's releases/ dir as a + # fallback so a freshly-provisioned runner still gets AIUI. + AIUI_SRC="" + if [ -f "/opt/archipelago/web-ui/aiui/index.html" ]; then + AIUI_SRC="/opt/archipelago/web-ui/aiui" + elif [ -f "$HOME/archy/web/dist/neode-ui/aiui/index.html" ]; then + AIUI_SRC="$HOME/archy/web/dist/neode-ui/aiui" else - echo "WARNING: AIUI not found on build server — ISO will not include AIUI" + LATEST_FRONTEND=$(ls -t releases/v*/archipelago-frontend-*.tar.gz 2>/dev/null | head -1) + if [ -n "$LATEST_FRONTEND" ]; then + echo "Extracting AIUI from $LATEST_FRONTEND (runner cache miss)" + TMP=$(mktemp -d) + tar xzf "$LATEST_FRONTEND" -C "$TMP" ./aiui 2>/dev/null || true + if [ -f "$TMP/aiui/index.html" ]; then + AIUI_SRC="$TMP/aiui" + fi + fi + fi + if [ -n "$AIUI_SRC" ]; then + mkdir -p web/dist/neode-ui/aiui + cp -r "$AIUI_SRC/"* web/dist/neode-ui/aiui/ + echo "AIUI included from $AIUI_SRC ($(du -sh web/dist/neode-ui/aiui | cut -f1))" + else + echo "FAIL: AIUI not found anywhere (runner cache + release tarballs)" + echo " checked: /opt/archipelago/web-ui/aiui" + echo " \$HOME/archy/web/dist/neode-ui/aiui" + echo " releases/v*/archipelago-frontend-*.tar.gz" + exit 1 fi - name: Configure root podman for insecure registry @@ -93,7 +119,15 @@ jobs: run: | cd image-recipe export ARCHIPELAGO_BIN="$(pwd)/../core/target/release/archipelago" - ls -la "$ARCHIPELAGO_BIN" || echo "WARNING: binary not found" + if [ ! -x "$ARCHIPELAGO_BIN" ]; then + echo "FAIL: backend binary missing or not executable at $ARCHIPELAGO_BIN" + exit 1 + fi + BIN_VERSION=$(strings "$ARCHIPELAGO_BIN" | grep -oE 'archipelago [0-9]+\.[0-9]+\.[0-9]+(-[a-z]+)?' | head -1 || true) + EXPECTED=$(grep '^version' ../core/archipelago/Cargo.toml | head -1 | sed 's/.*"\(.*\)".*/\1/') + echo "Binary: $ARCHIPELAGO_BIN ($(du -h "$ARCHIPELAGO_BIN" | cut -f1))" + echo "Embedded version string: ${BIN_VERSION:-unknown}" + echo "Expected version (Cargo.toml): $EXPECTED" sudo -E UNBUNDLED=1 DEV_SERVER=localhost BUILD_FROM_SOURCE=0 \ ARCHIPELAGO_BIN="$ARCHIPELAGO_BIN" \ ./build-auto-installer-iso.sh diff --git a/core/Cargo.lock b/core/Cargo.lock index e2f3c62b..ff8173fd 100644 --- a/core/Cargo.lock +++ b/core/Cargo.lock @@ -80,7 +80,7 @@ checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" [[package]] name = "archipelago" -version = "1.7.19-alpha" +version = "1.7.20-alpha" dependencies = [ "anyhow", "archipelago-container", diff --git a/core/archipelago/Cargo.toml b/core/archipelago/Cargo.toml index 297c6fd7..20582544 100644 --- a/core/archipelago/Cargo.toml +++ b/core/archipelago/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "archipelago" -version = "1.7.19-alpha" +version = "1.7.20-alpha" edition = "2021" description = "Archipelago Bitcoin Node OS - Native backend" authors = ["Archipelago Team"] diff --git a/core/archipelago/src/update.rs b/core/archipelago/src/update.rs index 00619f9a..87cbc11f 100644 --- a/core/archipelago/src/update.rs +++ b/core/archipelago/src/update.rs @@ -882,9 +882,15 @@ pub async fn run_update_scheduler(data_dir: std::path::PathBuf) { debug!("Update scheduler: apply failed: {}", e); continue; } - info!("Update scheduler: update applied, restart needed"); - // Signal for service restart (systemd will handle via exit code) - std::process::exit(0); + info!("Update scheduler: update applied, restart scheduled by apply_update"); + // apply_update has already spawned a 2s-delayed + // `systemctl restart archipelago`. Don't call + // std::process::exit here — that kills the runtime + // before the spawned restart task runs, and since + // the unit is Restart=on-failure a clean exit(0) + // leaves the service dead. Fall through; the + // scheduled restart will bring us back cleanly. + return; } Ok(_) => { debug!("Update scheduler: no update available"); diff --git a/neode-ui/src/views/settings/AccountInfoSection.vue b/neode-ui/src/views/settings/AccountInfoSection.vue index 932006bc..8a082742 100644 --- a/neode-ui/src/views/settings/AccountInfoSection.vue +++ b/neode-ui/src/views/settings/AccountInfoSection.vue @@ -180,6 +180,17 @@ init()
+ +
+
+ v1.7.20-alpha + Apr 21, 2026 +
+
+

Fixed a critical bug where nodes on the automatic daily-update schedule could end up offline after their nightly update. The scheduler was killing the service a moment too early, before the built-in restart handler had a chance to bring the new version back up — leaving the node dead until someone SSH'd in and started it manually. The scheduler now hands off cleanly to the same restart path the 'Install Update' button uses, so auto-applied updates come back online on their own.

+

Applies to any node configured for 'Check & Apply Daily' — no change required on your end, the fix ships with this update.

+
+
diff --git a/releases/manifest.json b/releases/manifest.json index 8f17ac1f..6ef50f49 100644 --- a/releases/manifest.json +++ b/releases/manifest.json @@ -1,27 +1,26 @@ { - "version": "1.7.19-alpha", + "version": "1.7.20-alpha", "release_date": "2026-04-21", "changelog": [ - "Your node no longer offers a version you've already passed as an 'available update'. If you sideload or skip a release, any stored pointer to an older version is dropped on next restart — the System Update page only offers genuinely newer releases.", - "Version comparison is now numeric rather than alphabetic. 1.7.10 correctly outranks 1.7.9 (the old string-order would've got this backwards once patch numbers hit double digits), so update prompts stay accurate past the nines.", - "A stale manifest from a slow cache or proxy can no longer downgrade your node. If the manifest reports a version equal to or behind what's running, the node treats that as 'up to date' rather than offering the older version as an update." + "Fixed a critical bug where nodes on 'Check & Apply Daily' could end up offline after their nightly update. The scheduler was killing the service a moment too early, before the built-in restart handler could bring the new version back up — leaving the node dead until someone SSH'd in. The scheduler now uses the same restart path as the 'Install Update' button, so auto-applied updates come back online on their own.", + "Applies automatically — no action needed on your end beyond taking this update." ], "components": [ { "name": "archipelago", - "current_version": "1.7.18-alpha", - "new_version": "1.7.19-alpha", - "download_url": "https://git.tx1138.com/lfg2025/archy/raw/branch/main/releases/v1.7.19-alpha/archipelago", - "sha256": "c6ffb65ea999c5212e0f93201a9ad77941810c00ea91dfb7397a07358a8a464e", - "size_bytes": 40648312 + "current_version": "1.7.19-alpha", + "new_version": "1.7.20-alpha", + "download_url": "https://git.tx1138.com/lfg2025/archy/raw/branch/main/releases/v1.7.20-alpha/archipelago", + "sha256": "bf4f8b91b021cad445a868f454707e0fa005446f755604f8c3e072bb7a059e6f", + "size_bytes": 40640016 }, { - "name": "archipelago-frontend-1.7.19-alpha.tar.gz", - "current_version": "1.7.18-alpha", - "new_version": "1.7.19-alpha", - "download_url": "https://git.tx1138.com/lfg2025/archy/raw/branch/main/releases/v1.7.19-alpha/archipelago-frontend-1.7.19-alpha.tar.gz", - "sha256": "5f70534a3df7012d20ccd8b4134a84a197a082910a9cd45774af249eae9f8d6c", - "size_bytes": 162081700 + "name": "archipelago-frontend-1.7.20-alpha.tar.gz", + "current_version": "1.7.19-alpha", + "new_version": "1.7.20-alpha", + "download_url": "https://git.tx1138.com/lfg2025/archy/raw/branch/main/releases/v1.7.20-alpha/archipelago-frontend-1.7.20-alpha.tar.gz", + "sha256": "a82f187b597c51e5f3d8753529914651ab2d8e8bb3ad9c36d287b335e4d386a9", + "size_bytes": 162082209 } ] } diff --git a/releases/v1.7.20-alpha/archipelago b/releases/v1.7.20-alpha/archipelago new file mode 100755 index 00000000..dcf9e0fa Binary files /dev/null and b/releases/v1.7.20-alpha/archipelago differ diff --git a/releases/v1.7.20-alpha/archipelago-frontend-1.7.20-alpha.tar.gz b/releases/v1.7.20-alpha/archipelago-frontend-1.7.20-alpha.tar.gz new file mode 100644 index 00000000..baf46836 Binary files /dev/null and b/releases/v1.7.20-alpha/archipelago-frontend-1.7.20-alpha.tar.gz differ