release(v1.7.32-alpha): fix frontend tarball layout + mDNS shutdown hang
Some checks failed
Build Archipelago ISO (dev) / build-iso (push) Has been cancelled
Some checks failed
Build Archipelago ISO (dev) / build-iso (push) Has been cancelled
- HOTFIX: v1.7.31-alpha's frontend tarball was packaged with a `neode-ui/` top-level directory instead of the flat layout v1.7.30 and earlier used. Nodes that applied v1.7.31 ended up with `/opt/archipelago/web-ui/neode-ui/index.html` instead of `/opt/archipelago/web-ui/index.html`, and nginx returned 403/500. v1.7.32's tarball is built with `tar -C web/dist/neode-ui .` so files land directly at web-ui root. Broken nodes auto-heal on this update (web-ui dir is replaced). - transport/lan.rs: add Drop impl that calls ServiceDaemon::shutdown() on the mdns_sd daemon. Without this the OS thread it spawns, plus the blocking `receiver.recv()` task, keep the tokio runtime alive past SIGTERM — long enough for systemd's TimeoutStopSec to SIGKILL the service and mark it Failed. Was visible on every update: "shut down cleanly" logged, then 15s later systemd forcibly kills. - main.rs: after logging "Archipelago shut down cleanly", call `std::process::exit(0)` explicitly. Belt-and-suspenders against any future non-daemon thread creeping in (reqwest resolver pool, etc.) and causing the same SIGKILL regression. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
fdaa5646b2
commit
fd3f5d2701
2
core/Cargo.lock
generated
2
core/Cargo.lock
generated
@ -80,7 +80,7 @@ checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "archipelago"
|
name = "archipelago"
|
||||||
version = "1.7.31-alpha"
|
version = "1.7.32-alpha"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"archipelago-container",
|
"archipelago-container",
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "archipelago"
|
name = "archipelago"
|
||||||
version = "1.7.31-alpha"
|
version = "1.7.32-alpha"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
description = "Archipelago Bitcoin Node OS - Native backend"
|
description = "Archipelago Bitcoin Node OS - Native backend"
|
||||||
authors = ["Archipelago Team"]
|
authors = ["Archipelago Team"]
|
||||||
|
|||||||
@ -229,5 +229,14 @@ async fn main() -> Result<()> {
|
|||||||
crash_recovery::remove_pid_marker(&config.data_dir).await;
|
crash_recovery::remove_pid_marker(&config.data_dir).await;
|
||||||
|
|
||||||
info!("Archipelago shut down cleanly");
|
info!("Archipelago shut down cleanly");
|
||||||
Ok(())
|
|
||||||
|
// Hard-exit after logging. All business state is persisted by now
|
||||||
|
// (connections drained, PID marker removed, disk flushes done via
|
||||||
|
// tokio::fs awaits). Letting tokio try to drop the runtime instead
|
||||||
|
// can stall for 15s+ on non-daemon OS threads we don't directly
|
||||||
|
// own (mdns_sd daemon, reqwest resolver pool, etc.) — long enough
|
||||||
|
// for systemd's TimeoutStopSec to SIGKILL us and mark the service
|
||||||
|
// Failed, which makes an otherwise-successful update look like a
|
||||||
|
// crash in `systemctl status`.
|
||||||
|
std::process::exit(0);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -160,6 +160,18 @@ impl LanTransport {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Drop for LanTransport {
|
||||||
|
// The mdns_sd daemon runs on its own OS thread and the browse
|
||||||
|
// listener task blocks on a sync channel. Without this call both
|
||||||
|
// keep the process alive past SIGTERM, long enough for systemd to
|
||||||
|
// SIGKILL us — which makes a normal update look like a crash.
|
||||||
|
fn drop(&mut self) {
|
||||||
|
if let Some(daemon) = self.daemon.take() {
|
||||||
|
let _ = daemon.shutdown();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl NodeTransport for LanTransport {
|
impl NodeTransport for LanTransport {
|
||||||
fn kind(&self) -> TransportKind {
|
fn kind(&self) -> TransportKind {
|
||||||
TransportKind::Lan
|
TransportKind::Lan
|
||||||
|
|||||||
@ -1,28 +1,26 @@
|
|||||||
{
|
{
|
||||||
"version": "1.7.31-alpha",
|
"version": "1.7.32-alpha",
|
||||||
"release_date": "2026-04-22",
|
"release_date": "2026-04-22",
|
||||||
"changelog": [
|
"changelog": [
|
||||||
"Installing IndeedHub is now fully self-healing — if a previous install was interrupted, re-running from the App Store automatically cleans up the leftover containers and tries again instead of failing with a 'name already in use' error.",
|
"Critical fix: the v1.7.31-alpha frontend package shipped with the wrong archive layout, which caused the web UI to return 403/500 after the update landed. v1.7.32-alpha ships the frontend correctly — nodes that got stuck on the 403 page will auto-recover on this update.",
|
||||||
"New default app registries and update mirrors now appear automatically on existing nodes after an update — no more needing to manually add Server 3 (OVH) from the settings page. Anything you've explicitly removed stays removed.",
|
"Shutdown fix: updates no longer briefly show the archipelago service as 'Failed' in systemd. The old version was logging 'shut down cleanly' but leaving a background mDNS thread alive, so systemd would force-kill it 15 seconds later and mark the unit failed. The process now exits promptly after saving its state."
|
||||||
"Fixed the 'Test' button on registries that protect their API endpoint — it used to falsely report those registries as unreachable. It now correctly recognizes a protected-but-alive registry as reachable.",
|
|
||||||
"First-boot cleanup: removed an old IndeedHub stub from the first-boot script that used to race the main installer and occasionally leave a half-installed IndeedHub behind."
|
|
||||||
],
|
],
|
||||||
"components": [
|
"components": [
|
||||||
{
|
{
|
||||||
"name": "archipelago",
|
"name": "archipelago",
|
||||||
"current_version": "1.7.30-alpha",
|
"current_version": "1.7.31-alpha",
|
||||||
"new_version": "1.7.31-alpha",
|
"new_version": "1.7.32-alpha",
|
||||||
"download_url": "https://git.tx1138.com/lfg2025/archy/raw/branch/main/releases/v1.7.31-alpha/archipelago",
|
"download_url": "https://git.tx1138.com/lfg2025/archy/raw/branch/main/releases/v1.7.32-alpha/archipelago",
|
||||||
"sha256": "ce2f899d3c4b615136223ae6295ee4b5de4009d1db926f7648a788c0ad3c84b8",
|
"sha256": "f5c0d51a3235b7619ac5b71140abd07b04cc90555205a4c0416c8c8c4a9a4588",
|
||||||
"size_bytes": 40786728
|
"size_bytes": 40791792
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "archipelago-frontend-1.7.31-alpha.tar.gz",
|
"name": "archipelago-frontend-1.7.32-alpha.tar.gz",
|
||||||
"current_version": "1.7.30-alpha",
|
"current_version": "1.7.31-alpha",
|
||||||
"new_version": "1.7.31-alpha",
|
"new_version": "1.7.32-alpha",
|
||||||
"download_url": "https://git.tx1138.com/lfg2025/archy/raw/branch/main/releases/v1.7.31-alpha/archipelago-frontend-1.7.31-alpha.tar.gz",
|
"download_url": "https://git.tx1138.com/lfg2025/archy/raw/branch/main/releases/v1.7.32-alpha/archipelago-frontend-1.7.32-alpha.tar.gz",
|
||||||
"sha256": "00f474725edaf14dc41d0c02abd3afcff1b30fa50846adec9e11b3c5b2188564",
|
"sha256": "1eb1deaf479538f0552f395fc1aea67b1a247ddef6bfbf436353ba1997eac1be",
|
||||||
"size_bytes": 77008771
|
"size_bytes": 77008678
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
BIN
releases/v1.7.32-alpha/archipelago
Executable file
BIN
releases/v1.7.32-alpha/archipelago
Executable file
Binary file not shown.
BIN
releases/v1.7.32-alpha/archipelago-frontend-1.7.32-alpha.tar.gz
Normal file
BIN
releases/v1.7.32-alpha/archipelago-frontend-1.7.32-alpha.tar.gz
Normal file
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user