From a97128bfd2fae69ea57702e7c471b5e84a042825 Mon Sep 17 00:00:00 2001 From: Dorian Date: Sun, 12 Apr 2026 06:38:34 -0400 Subject: [PATCH] feat: fallback container registry at 23.182.128.160:3000 When primary registry (git.tx1138.com) fails, image pull automatically retries from Gitea registry at 23.182.128.160:3000. Tags pulled image with original name so install continues seamlessly. Gitea added as external app in app session config. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../src/api/rpc/package/install.rs | 25 ++++++++++++++++++- .../src/views/appSession/appSessionConfig.ts | 1 + scripts/image-versions.sh | 3 ++- 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/core/archipelago/src/api/rpc/package/install.rs b/core/archipelago/src/api/rpc/package/install.rs index 4d2bafca..12ed32ce 100644 --- a/core/archipelago/src/api/rpc/package/install.rs +++ b/core/archipelago/src/api/rpc/package/install.rs @@ -603,7 +603,30 @@ impl RpcHandler { .await .context("Failed to wait for image pull")?; if !status.success() { - return Err(anyhow::anyhow!("podman pull exited with non-zero status")); + // Try fallback registry if primary fails + let fallback = docker_image.replace("git.tx1138.com/lfg2025/", "23.182.128.160:3000/lfg2025/"); + if fallback != docker_image { + tracing::info!("Primary registry failed, trying fallback: {}", fallback); + let fb_status = tokio::process::Command::new("podman") + .args(["pull", &fallback, "--tls-verify=false"]) + .env("TMPDIR", &user_tmp) + .stdout(std::process::Stdio::null()) + .stderr(std::process::Stdio::null()) + .status() + .await; + if fb_status.map(|s| s.success()).unwrap_or(false) { + // Tag as the original name so the rest of the install works + let _ = tokio::process::Command::new("podman") + .args(["tag", &fallback, docker_image]) + .status() + .await; + tracing::info!("Fallback pull succeeded: {}", fallback); + } else { + return Err(anyhow::anyhow!("Image pull failed from both registries")); + } + } else { + return Err(anyhow::anyhow!("podman pull exited with non-zero status")); + } } // Verify image exists locally after pull diff --git a/neode-ui/src/views/appSession/appSessionConfig.ts b/neode-ui/src/views/appSession/appSessionConfig.ts index 43086509..8eab5884 100644 --- a/neode-ui/src/views/appSession/appSessionConfig.ts +++ b/neode-ui/src/views/appSession/appSessionConfig.ts @@ -97,6 +97,7 @@ export const HTTPS_PROXY_PATHS: Record = { /** External HTTPS apps -- always loaded directly */ export const EXTERNAL_URLS: Record = { + 'gitea': 'http://23.182.128.160:3000', 'nwnn': 'https://nwnn.l484.com', '484-kitchen': 'https://484.kitchen', 'call-the-operator': 'https://cta.tx1138.com', diff --git a/scripts/image-versions.sh b/scripts/image-versions.sh index e4748c7f..da217634 100644 --- a/scripts/image-versions.sh +++ b/scripts/image-versions.sh @@ -9,8 +9,9 @@ # Run: podman images --format '{{.Repository}}:{{.Tag}}' | grep 'git.tx1138' | sort # to verify against the registry. -# Archipelago app registry +# Archipelago app registries (primary + fallback) ARCHY_REGISTRY="git.tx1138.com/lfg2025" +ARCHY_REGISTRY_FALLBACK="23.182.128.160:3000/lfg2025" # Bitcoin stack BITCOIN_KNOTS_IMAGE="$ARCHY_REGISTRY/bitcoin-knots:latest"