diff --git a/core/archipelago/src/api/handler/mod.rs b/core/archipelago/src/api/handler/mod.rs index a3ab47bd..1b2bdd3f 100644 --- a/core/archipelago/src/api/handler/mod.rs +++ b/core/archipelago/src/api/handler/mod.rs @@ -146,7 +146,7 @@ impl ApiHandler { } if upstreams.is_empty() { upstreams.push( - "http://23.182.128.160:3000/lfg2025/app-catalog/raw/branch/main/catalog.json" + "http://146.59.87.168:3000/lfg2025/app-catalog/raw/branch/main/catalog.json" .to_string(), ); upstreams.push( diff --git a/core/archipelago/src/api/rpc/package/config.rs b/core/archipelago/src/api/rpc/package/config.rs index e9c2781f..a7b817b0 100644 --- a/core/archipelago/src/api/rpc/package/config.rs +++ b/core/archipelago/src/api/rpc/package/config.rs @@ -9,7 +9,7 @@ pub(super) const TRUSTED_REGISTRIES: &[&str] = &[ "ghcr.io/", "localhost/", "git.tx1138.com/", - "23.182.128.160:3000/", + "146.59.87.168:3000/", ]; /// Validate Docker image against trusted registry allowlist. @@ -29,7 +29,7 @@ pub(super) fn is_valid_docker_image(image: &str) -> bool { }; matches!( registry, - "docker.io" | "ghcr.io" | "localhost" | "git.tx1138.com" | "23.182.128.160:3000" + "docker.io" | "ghcr.io" | "localhost" | "git.tx1138.com" | "146.59.87.168:3000" ) } diff --git a/core/archipelago/src/api/rpc/package/install.rs b/core/archipelago/src/api/rpc/package/install.rs index 316a5900..8a2c903d 100644 --- a/core/archipelago/src/api/rpc/package/install.rs +++ b/core/archipelago/src/api/rpc/package/install.rs @@ -1589,7 +1589,7 @@ server { .unwrap_or(true); // Registries are configured as `host[:port]/namespace` (for - // example `23.182.128.160:3000/lfg2025`), but the Docker V2 + // example `146.59.87.168:3000/lfg2025`), but the Docker V2 // registry API lives at `/v2/` on the ROOT of the host — NOT // under the namespace. Strip the namespace before appending // `/v2/` so the reachability probe hits the correct URL. diff --git a/core/archipelago/src/container/registry.rs b/core/archipelago/src/container/registry.rs index 322a9fc8..73bde3bc 100644 --- a/core/archipelago/src/container/registry.rs +++ b/core/archipelago/src/container/registry.rs @@ -15,7 +15,7 @@ const REGISTRY_FILE: &str = "config/registries.json"; /// A single container registry. #[derive(Debug, Clone, Serialize, Deserialize)] pub struct Registry { - /// Registry URL (e.g., "git.tx1138.com/lfg2025" or "23.182.128.160:3000/lfg2025"). + /// Registry URL (e.g., "git.tx1138.com/lfg2025" or "146.59.87.168:3000/lfg2025"). pub url: String, /// Human-readable name. pub name: String, @@ -44,8 +44,8 @@ impl Default for RegistryConfig { Self { registries: vec![ Registry { - url: "23.182.128.160:3000/lfg2025".to_string(), - name: "Server 1 (VPS)".to_string(), + url: "146.59.87.168:3000/lfg2025".to_string(), + name: "Server 1 (OVH)".to_string(), tls_verify: false, enabled: true, priority: 0, @@ -57,13 +57,6 @@ impl Default for RegistryConfig { enabled: true, priority: 10, }, - Registry { - url: "146.59.87.168:3000/lfg2025".to_string(), - name: "Server 3 (OVH)".to_string(), - tls_verify: false, - enabled: true, - priority: 20, - }, ], } } @@ -78,8 +71,8 @@ impl RegistryConfig { } /// Rewrite an image reference to use a specific registry. - /// E.g., "git.tx1138.com/lfg2025/bitcoin-knots:latest" with registry "23.182.128.160:3000/lfg2025" - /// becomes "23.182.128.160:3000/lfg2025/bitcoin-knots:latest". + /// E.g., "git.tx1138.com/lfg2025/bitcoin-knots:latest" with registry "146.59.87.168:3000/lfg2025" + /// becomes "146.59.87.168:3000/lfg2025/bitcoin-knots:latest". pub fn rewrite_image(&self, image: &str, registry: &Registry) -> String { // Extract the image name (last component after the org/namespace) // Handles: "registry/org/image:tag" -> "image:tag" @@ -178,12 +171,12 @@ mod tests { #[test] fn test_rewrite_image() { let config = RegistryConfig::default(); - // Default primary is now VPS (index 0). A tx1138-hardcoded image - // rewrites to VPS when asked for the primary mirror. + // Default primary is now the OVH VPS (index 0). A tx1138-hardcoded + // image rewrites to OVH when asked for the primary mirror. let primary = &config.registries[0]; assert_eq!( config.rewrite_image("git.tx1138.com/lfg2025/bitcoin-knots:latest", primary), - "23.182.128.160:3000/lfg2025/bitcoin-knots:latest" + "146.59.87.168:3000/lfg2025/bitcoin-knots:latest" ); } @@ -191,16 +184,15 @@ mod tests { fn test_active_registries_sorted() { let config = RegistryConfig::default(); let active = config.active_registries(); - assert_eq!(active.len(), 3); + assert_eq!(active.len(), 2); assert!(active[0].priority <= active[1].priority); - assert!(active[1].priority <= active[2].priority); } #[tokio::test] async fn test_load_default() { let tmp = TempDir::new().unwrap(); let config = load_registries(tmp.path()).await.unwrap(); - assert_eq!(config.registries.len(), 3); + assert_eq!(config.registries.len(), 2); } #[tokio::test] @@ -216,6 +208,6 @@ mod tests { }); save_registries(tmp.path(), &config).await.unwrap(); let loaded = load_registries(tmp.path()).await.unwrap(); - assert_eq!(loaded.registries.len(), 4); + assert_eq!(loaded.registries.len(), 3); } } diff --git a/core/archipelago/src/update.rs b/core/archipelago/src/update.rs index 320054f5..eab30e8a 100644 --- a/core/archipelago/src/update.rs +++ b/core/archipelago/src/update.rs @@ -63,14 +63,11 @@ fn is_newer(candidate: &str, current: &str) -> bool { const DEFAULT_UPDATE_MANIFEST_URL: &str = "https://git.tx1138.com/lfg2025/archy/raw/branch/main/releases/manifest.json"; -/// Secondary mirror: same manifest, served from the VPS. Added as a -/// default mirror so nodes automatically fall through when the primary -/// is slow or unreachable. +/// Secondary mirror on an OVH VPS — independent network path so a +/// single-provider outage doesn't knock out both mirrors. Promoted to +/// primary default on 2026-04-23 after the Hetzner .160 VPS was +/// decommissioned. const DEFAULT_SECONDARY_MIRROR_URL: &str = - "http://23.182.128.160:3000/lfg2025/archy/raw/branch/main/releases/manifest.json"; -/// Tertiary mirror on a separate OVH VPS — independent network path so -/// a single-provider outage doesn't knock out all three mirrors. -const DEFAULT_TERTIARY_MIRROR_URL: &str = "http://146.59.87.168:3000/lfg2025/archy/raw/branch/main/releases/manifest.json"; const UPDATE_STATE_FILE: &str = "update_state.json"; const UPDATE_MIRRORS_FILE: &str = "update-mirrors.json"; @@ -112,16 +109,12 @@ fn default_mirrors() -> Vec { vec![ UpdateMirror { url: DEFAULT_SECONDARY_MIRROR_URL.to_string(), - label: "Server 1 (VPS)".to_string(), + label: "Server 1 (OVH)".to_string(), }, UpdateMirror { url: DEFAULT_UPDATE_MANIFEST_URL.to_string(), label: "Server 2 (tx1138)".to_string(), }, - UpdateMirror { - url: DEFAULT_TERTIARY_MIRROR_URL.to_string(), - label: "Server 3 (OVH)".to_string(), - }, ] } @@ -1473,10 +1466,9 @@ mod tests { async fn test_load_mirrors_returns_defaults_when_absent() { let dir = tempfile::tempdir().unwrap(); let list = load_mirrors(dir.path()).await.unwrap(); - assert_eq!(list.len(), 3); - assert!(list[0].url.contains("23.182.128.160")); + assert_eq!(list.len(), 2); + assert!(list[0].url.contains("146.59.87.168")); assert!(list[1].url.contains("git.tx1138.com")); - assert!(list[2].url.contains("146.59.87.168")); } #[tokio::test] diff --git a/image-recipe/build-auto-installer-iso.sh b/image-recipe/build-auto-installer-iso.sh index 28c5cb5c..e5aba26f 100755 --- a/image-recipe/build-auto-installer-iso.sh +++ b/image-recipe/build-auto-installer-iso.sh @@ -2241,7 +2241,7 @@ location = "git.tx1138.com" insecure = true [[registry]] -location = "23.182.128.160:3000" +location = "146.59.87.168:3000" insecure = true REGCONF chown -R 1000:1000 /mnt/target/home/archipelago/.config @@ -2252,7 +2252,7 @@ cat > /mnt/target/var/lib/archipelago/config/registries.json <<'DYNREG' { "registries": [ {"url": "git.tx1138.com/lfg2025", "name": "Archipelago Primary", "tls_verify": true, "enabled": true, "priority": 0}, - {"url": "23.182.128.160:3000/lfg2025", "name": "Archipelago Fallback", "tls_verify": false, "enabled": true, "priority": 10} + {"url": "146.59.87.168:3000/lfg2025", "name": "Archipelago Fallback", "tls_verify": false, "enabled": true, "priority": 10} ] } DYNREG diff --git a/neode-ui/src/views/marketplace/marketplaceData.ts b/neode-ui/src/views/marketplace/marketplaceData.ts index 8dcbb434..20a372b4 100644 --- a/neode-ui/src/views/marketplace/marketplaceData.ts +++ b/neode-ui/src/views/marketplace/marketplaceData.ts @@ -33,7 +33,7 @@ export interface InstallProgress { } /** Archipelago app registry — all app images are mirrored here */ -const REGISTRY = '23.182.128.160:3000/lfg2025' +const REGISTRY = '146.59.87.168:3000/lfg2025' /** Marketplace app ID -> backend package keys (for "Already Installed" when first-boot/deploy created them) */ export const INSTALLED_ALIASES: Record = { diff --git a/scripts/image-versions.sh b/scripts/image-versions.sh index da217634..85bc9ed1 100644 --- a/scripts/image-versions.sh +++ b/scripts/image-versions.sh @@ -11,7 +11,7 @@ # Archipelago app registries (primary + fallback) ARCHY_REGISTRY="git.tx1138.com/lfg2025" -ARCHY_REGISTRY_FALLBACK="23.182.128.160:3000/lfg2025" +ARCHY_REGISTRY_FALLBACK="146.59.87.168:3000/lfg2025" # Bitcoin stack BITCOIN_KNOTS_IMAGE="$ARCHY_REGISTRY/bitcoin-knots:latest"