diff --git a/core/archipelago/src/api/rpc/package/install.rs b/core/archipelago/src/api/rpc/package/install.rs index e11a17b6..90374800 100644 --- a/core/archipelago/src/api/rpc/package/install.rs +++ b/core/archipelago/src/api/rpc/package/install.rs @@ -611,10 +611,19 @@ impl RpcHandler { } } - let status = child - .wait() - .await - .context("Failed to wait for image pull")?; + // Timeout primary pull after 60s — if registry is down, fail fast to fallback + let status = tokio::time::timeout( + std::time::Duration::from_secs(60), + child.wait(), + ) + .await + .unwrap_or_else(|_| { + // Timeout: kill the stuck process + let _ = child.kill(); + tracing::warn!("Image pull timed out after 60s: {}", docker_image); + Ok(std::process::ExitStatus::default()) + }) + .context("Failed to wait for image pull")?; if !status.success() { // Try all configured fallback registries dynamically match crate::container::registry::pull_from_registries( diff --git a/neode-ui/src/views/appSession/appSessionConfig.ts b/neode-ui/src/views/appSession/appSessionConfig.ts index 43086509..8809b27b 100644 --- a/neode-ui/src/views/appSession/appSessionConfig.ts +++ b/neode-ui/src/views/appSession/appSessionConfig.ts @@ -43,7 +43,7 @@ export const APP_PORTS: Record = { 'routstr': 8200, 'indeedhub': 7778, 'botfights': 9100, - 'gitea': 3000, + 'gitea': 3001, 'dwn': 3100, 'endurain': 8080, }