feat(registry): deliver app manifests via the signed catalog (embed by default)
Turn on registry-distributed manifests for all apps: generate-app-catalog.sh now embeds each apps/<id>/manifest.yml by default (EMBED_MANIFESTS opt-out), so nodes install from the signed catalog (origin-wins overlay, disk = fallback) with no OTA-shipped disk manifest. main.rs awaits a bounded (25s) refresh_catalog before load_manifests so a fresh boot overlays the latest embedded catalog instead of a restart later; offline/ISO boot falls through to disk and never hangs. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
a8b9b0f5e8
commit
9670af62b6
@@ -198,6 +198,24 @@ async fn main() -> Result<()> {
|
||||
(Some(trait_obj), Some(dev))
|
||||
} else {
|
||||
let prod = Arc::new(ProdContainerOrchestrator::new(config.clone()).await?);
|
||||
// Pull the freshest signed app-catalog BEFORE loading manifests, so any
|
||||
// registry-embedded manifest (the origin-wins overlay in load_manifests)
|
||||
// is in place on THIS boot — not a restart later. Without this the boot
|
||||
// would overlay the previous run's cached catalog and a newly-published
|
||||
// app (e.g. a registry-only install) wouldn't appear until the next
|
||||
// restart. Bounded + best-effort: on timeout/unreachable origin the
|
||||
// last-cached catalog (or the disk manifests) still load — registry is
|
||||
// an overlay on top of disk, never a hard dependency.
|
||||
match tokio::time::timeout(
|
||||
std::time::Duration::from_secs(25),
|
||||
crate::container::app_catalog::refresh_catalog(&config.data_dir),
|
||||
)
|
||||
.await
|
||||
{
|
||||
Ok(Ok(n)) => info!("🛰️ app-catalog refreshed before manifest load ({n} apps)"),
|
||||
Ok(Err(e)) => tracing::debug!("app-catalog pre-load refresh failed (using cache): {e}"),
|
||||
Err(_) => tracing::debug!("app-catalog pre-load refresh timed out (using cache)"),
|
||||
}
|
||||
// Best-effort manifest load; a missing /opt/archipelago/apps is
|
||||
// logged inside load_manifests and not fatal.
|
||||
match prod.load_manifests().await {
|
||||
|
||||
Reference in New Issue
Block a user