diff --git a/docs/getting-started/install-source/README.md b/docs/getting-started/install-source/README.md index fddc21004..515493cdb 100644 --- a/docs/getting-started/install-source/README.md +++ b/docs/getting-started/install-source/README.md @@ -31,7 +31,7 @@ This guide builds Spinifex from source. For production deployments, the [binary **Requirements:** -- Ubuntu 22.04+ / Debian 12+ +- Ubuntu 26.04 / Debian 13 - Go 1.26.2+ - GCC, make, pkg-config - QEMU/KVM, OVN/Open vSwitch, AWS CLI v2, dhcpcd-base diff --git a/docs/getting-started/install/README.md b/docs/getting-started/install/README.md index 7824d248a..7a92e560b 100644 --- a/docs/getting-started/install/README.md +++ b/docs/getting-started/install/README.md @@ -36,8 +36,8 @@ This guide installs Spinifex on a single server using the binary installer. For **Supported Operating Systems:** -- Ubuntu 22.04 / 24.04 / 25.10 -- Debian 12 / 13 +- Ubuntu 26.04 +- Debian 13 **What Gets Installed:** diff --git a/docs/getting-started/setting-up-your-cluster/README.md b/docs/getting-started/setting-up-your-cluster/README.md index 030a23e7d..62eba5bd9 100644 --- a/docs/getting-started/setting-up-your-cluster/README.md +++ b/docs/getting-started/setting-up-your-cluster/README.md @@ -61,20 +61,20 @@ NAME | DISTRO | VERSION | ARCH | BOOT debian-13-arm64 | debian | 13 | arm64 | bios debian-13-x86_64 | debian | 13 | x86_64 | bios lb-alpine-3.21.6-x86_64 | alpine | 3.21.6 | x86_64 | bios -ubuntu-24.04-arm64 | ubuntu | 24.04 | arm64 | bios -ubuntu-24.04-x86_64 | ubuntu | 24.04 | x86_64 | bios +ubuntu-26.04-arm64 | ubuntu | 26.04 | arm64 | bios +ubuntu-26.04-x86_64 | ubuntu | 26.04 | x86_64 | bios ``` Import an image: ```bash -spx admin images import --name ubuntu-24.04-x86_64 +spx admin images import --name ubuntu-26.04-x86_64 ``` Or import a local image file: ```bash -spx admin images import --file ~/images/ubuntu-24.04.img --distro ubuntu --version 24.04 --arch x86_64 +spx admin images import --file ~/images/ubuntu-26.04.img --distro ubuntu --version 26.04 --arch x86_64 ``` Verify the import and note the AMI ID: @@ -173,7 +173,7 @@ Launch an instance in the public subnet, note this will select an instance type > **Note:** Replace `AMI_NAME` with the previously imported image above with the `ami-` prefix. ```bash -AMI_NAME="ami-ubuntu-24.04-x86_64" +AMI_NAME="ami-ubuntu-26.04-x86_64" AMI_ID=$(aws ec2 describe-images \ --filters "Name=name,Values=$AMI_NAME" \ diff --git a/docs/security/network-connections/README.md b/docs/security/network-connections/README.md index 8f0347dc2..57e943f56 100644 --- a/docs/security/network-connections/README.md +++ b/docs/security/network-connections/README.md @@ -106,7 +106,7 @@ Spinifex nodes initiate a small, fixed set of outbound connections. | Destination | Purpose | Protocol | Verification | |-------------|---------|----------|--------------| | `https://cloud.debian.org/images/cloud/trixie/20260501-2465` | Debian 13 cloud image download | HTTPS | TLS + checksum verification | -| `https://cloud-images.ubuntu.com/noble/current` | Ubuntu 24.04 LTS cloud image download | HTTPS | TLS + checksum verification | +| `https://cloud-images.ubuntu.com/resolute/current` | Ubuntu 26.04 LTS cloud image download | HTTPS | TLS + checksum verification | | `https://d2yp8ipz5jfqcw.cloudfront.net` | Alpine image for managed HAProxy load-balancer | HTTPS | TLS + checksum verification | | `https://install.mulgadc.com/install` | One-shot install telemetry POST on `spx admin init` / `join`. | HTTPS | TLS | diff --git a/docs/terraform-workbooks/bastion-private-subnet/README.md b/docs/terraform-workbooks/bastion-private-subnet/README.md index 51e40dade..95c0a01e7 100644 --- a/docs/terraform-workbooks/bastion-private-subnet/README.md +++ b/docs/terraform-workbooks/bastion-private-subnet/README.md @@ -56,7 +56,7 @@ Deploy a VPC with public and private subnets where the private subnet has no int **Prerequisites:** - Spinifex installed and running (see [Installing Spinifex](/docs/install)) -- An Ubuntu 24.04 AMI imported (see [Setting Up Your Cluster](/docs/setting-up-your-cluster)) +- An Ubuntu 26.04 AMI imported (see [Setting Up Your Cluster](/docs/setting-up-your-cluster)) - OpenTofu or Terraform installed ## Instructions @@ -149,7 +149,7 @@ The private route table should have no `0.0.0.0/0` route. Also verify the privat ### AMI Not Found -Ensure you have imported an Ubuntu 24.04 image: +Ensure you have imported an Ubuntu 26.04 image: ```bash aws ec2 describe-images --owners 000000000000 --profile spinifex diff --git a/docs/terraform-workbooks/bastion-private-subnet/main.tf b/docs/terraform-workbooks/bastion-private-subnet/main.tf index 7ba0fcedd..69efa3581 100644 --- a/docs/terraform-workbooks/bastion-private-subnet/main.tf +++ b/docs/terraform-workbooks/bastion-private-subnet/main.tf @@ -96,7 +96,7 @@ data "aws_ami" "ubuntu" { filter { name = "name" - values = ["*ubuntu-24.04*"] + values = ["*ubuntu-26.04*"] } filter { diff --git a/docs/terraform-workbooks/nginx-alb/README.md b/docs/terraform-workbooks/nginx-alb/README.md index d335b0c19..185dadb89 100644 --- a/docs/terraform-workbooks/nginx-alb/README.md +++ b/docs/terraform-workbooks/nginx-alb/README.md @@ -58,7 +58,7 @@ Deploy two Nginx web servers behind an internet-facing Application Load Balancer | Elastic IP | `nginx-alb-nat-eip` | Public address for the NAT Gateway | | NAT Gateway | `nginx-alb-nat` | Outbound internet for the private subnets (cloud-init apt bootstrap) | | Security Group | `nginx-alb-sg` | Allows SSH (22) and HTTP (80) inbound | -| EC2 Instances | `nginx-alb-1`, `nginx-alb-2` | Ubuntu 24.04 with Nginx via cloud-init (private subnets) | +| EC2 Instances | `nginx-alb-1`, `nginx-alb-2` | Ubuntu 26.04 with Nginx via cloud-init (private subnets) | | ALB | `nginx-alb` | Internet-facing Application Load Balancer on port 80 | | Target Group | `nginx-alb-tg` | HTTP health-checked group for both instances | | Listener | HTTP :80 | Forwards traffic to the target group | @@ -66,7 +66,7 @@ Deploy two Nginx web servers behind an internet-facing Application Load Balancer **Prerequisites:** - Spinifex installed and running (see [Installing Spinifex](/docs/install)) -- An Ubuntu 24.04 AMI imported (see [Setting Up Your Cluster](/docs/setting-up-your-cluster)) +- An Ubuntu 26.04 AMI imported (see [Setting Up Your Cluster](/docs/setting-up-your-cluster)) - OpenTofu or Terraform installed ## Instructions @@ -184,7 +184,7 @@ tofu destroy ### AMI Not Found -Ensure you have imported an Ubuntu 24.04 image. Check available AMIs: +Ensure you have imported an Ubuntu 26.04 image. Check available AMIs: ```bash aws ec2 describe-images --owners 000000000000 --profile spinifex @@ -193,7 +193,7 @@ aws ec2 describe-images --owners 000000000000 --profile spinifex If missing import: ```bash -spx admin images import --name ubuntu-24.04-x86_64 +spx admin images import --name ubuntu-26.04-x86_64 ``` ### Provider Connection Refused diff --git a/docs/terraform-workbooks/nginx-alb/main.tf b/docs/terraform-workbooks/nginx-alb/main.tf index c35699249..44099464c 100644 --- a/docs/terraform-workbooks/nginx-alb/main.tf +++ b/docs/terraform-workbooks/nginx-alb/main.tf @@ -102,7 +102,7 @@ data "aws_ami" "ubuntu" { filter { name = "name" - values = ["*ubuntu-24.04*"] + values = ["*ubuntu-26.04*"] } } diff --git a/docs/terraform-workbooks/nginx-webserver/README.md b/docs/terraform-workbooks/nginx-webserver/README.md index 5a287e170..7035329a0 100644 --- a/docs/terraform-workbooks/nginx-webserver/README.md +++ b/docs/terraform-workbooks/nginx-webserver/README.md @@ -43,7 +43,7 @@ Deploy a complete Nginx web server on Spinifex using Terraform/OpenTofu. This wo **Prerequisites:** - Spinifex installed and running (see [Installing Spinifex](/docs/install)) -- An Ubuntu 24.04 AMI imported (see [Setting Up Your Cluster](/docs/setting-up-your-cluster)) +- An Ubuntu 26.04 AMI imported (see [Setting Up Your Cluster](/docs/setting-up-your-cluster)) - OpenTofu or Terraform installed ## Instructions @@ -96,7 +96,7 @@ tofu destroy ### AMI Not Found -Ensure you have imported an Ubuntu 24.04 image. Check available AMIs: +Ensure you have imported an Ubuntu 26.04 image. Check available AMIs: ```bash aws ec2 describe-images --owners 000000000000 --profile spinifex diff --git a/docs/terraform-workbooks/nginx-webserver/main.tf b/docs/terraform-workbooks/nginx-webserver/main.tf index 4f6e8900f..1da8b52ed 100644 --- a/docs/terraform-workbooks/nginx-webserver/main.tf +++ b/docs/terraform-workbooks/nginx-webserver/main.tf @@ -85,7 +85,7 @@ data "aws_ami" "ubuntu" { filter { name = "name" - values = ["*ubuntu-24.04*"] + values = ["*ubuntu-26.04*"] } filter { @@ -220,7 +220,7 @@ resource "aws_security_group" "web" { } # --------------------------------------------------------------------------- -# EC2 Instance — Ubuntu 24.04 with Nginx installed via cloud-init +# EC2 Instance — Ubuntu 26.04 with Nginx installed via cloud-init # --------------------------------------------------------------------------- resource "aws_instance" "nginx" { diff --git a/docs/terraform-workbooks/s3-webapp/README.md b/docs/terraform-workbooks/s3-webapp/README.md index 4fc6491f3..13a43d852 100644 --- a/docs/terraform-workbooks/s3-webapp/README.md +++ b/docs/terraform-workbooks/s3-webapp/README.md @@ -53,7 +53,7 @@ Deploy an EC2 instance running a Flask file-sharing web application backed by S3 - Spinifex installed and running (see [Installing Spinifex](/docs/install)) - Predastore running (S3 API on port 8443) -- An Ubuntu 24.04 AMI imported (see [Setting Up Your Cluster](/docs/setting-up-your-cluster)) +- An Ubuntu 26.04 AMI imported (see [Setting Up Your Cluster](/docs/setting-up-your-cluster)) - OpenTofu or Terraform installed - The EC2 instance must be able to reach Predastore — use the host's br-wan IP, not localhost @@ -153,7 +153,7 @@ cat /opt/webapp/.env ### AMI Not Found -Ensure you have imported an Ubuntu 24.04 image: +Ensure you have imported an Ubuntu 26.04 image: ```bash aws ec2 describe-images --owners 000000000000 --profile spinifex diff --git a/docs/terraform-workbooks/s3-webapp/main.tf b/docs/terraform-workbooks/s3-webapp/main.tf index 0c7f40db9..f72c9912c 100644 --- a/docs/terraform-workbooks/s3-webapp/main.tf +++ b/docs/terraform-workbooks/s3-webapp/main.tf @@ -132,7 +132,7 @@ data "aws_ami" "ubuntu" { filter { name = "name" - values = ["*ubuntu-24.04*"] + values = ["*ubuntu-26.04*"] } filter { diff --git a/scripts/iac/proxmox-template/README.md b/scripts/iac/proxmox-template/README.md index ccd63d8d8..3da7c932a 100644 --- a/scripts/iac/proxmox-template/README.md +++ b/scripts/iac/proxmox-template/README.md @@ -11,7 +11,7 @@ Builds a Proxmox VM template with all Spinifex dependencies pre-installed. Cloni | AWS CLI | v2 (`make install-aws`) | | Repositories | spinifex, viperblock, predastore (with `go.work` configured) | | Module cache | `go mod download` completed for all repos | -| Cloud images | Ubuntu 24.04 for nested VMs (`~/images/ubuntu-24.04.img`) | +| Cloud images | Ubuntu 26.04 for nested VMs (`~/images/ubuntu-26.04.img`) | | Tuning | sysctl (rmem_max/wmem_max), kvm group, ufw disabled | | Generalized | Clean machine-id, SSH host keys, cloud-init — each clone boots fresh | diff --git a/scripts/iac/proxmox-template/scripts/provision.sh b/scripts/iac/proxmox-template/scripts/provision.sh index 77b0797ad..e8924e052 100755 --- a/scripts/iac/proxmox-template/scripts/provision.sh +++ b/scripts/iac/proxmox-template/scripts/provision.sh @@ -92,15 +92,15 @@ mkdir -p "$HOME/images" ARCH=$(dpkg --print-architecture) IMAGE_URL="" if [ "$ARCH" = "amd64" ]; then - IMAGE_URL="https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img" + IMAGE_URL="https://cloud-images.ubuntu.com/resolute/current/resolute-server-cloudimg-amd64.img" elif [ "$ARCH" = "arm64" ]; then - IMAGE_URL="https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-arm64.img" + IMAGE_URL="https://cloud-images.ubuntu.com/resolute/current/resolute-server-cloudimg-arm64.img" fi if [ -n "$IMAGE_URL" ]; then - echo " Downloading Ubuntu 24.04 cloud image ($ARCH)..." - curl -L -o "$HOME/images/ubuntu-24.04.img" "$IMAGE_URL" - echo " Saved to ~/images/ubuntu-24.04.img" + echo " Downloading Ubuntu 26.04 cloud image ($ARCH)..." + curl -L -o "$HOME/images/ubuntu-26.04.img" "$IMAGE_URL" + echo " Saved to ~/images/ubuntu-26.04.img" else echo " Unknown arch ($ARCH), skipping cloud image download" fi diff --git a/scripts/run-bench.sh b/scripts/run-bench.sh index d203ed8ae..c8b10e9a0 100755 --- a/scripts/run-bench.sh +++ b/scripts/run-bench.sh @@ -12,11 +12,11 @@ if [ -z "$SPINIFEX_AMI" ]; then echo "SPINIFEX_AMI not set, attempting to detect..." ARCH=$(uname -m) if [ "$ARCH" = "x86_64" ]; then - IMAGE_NAME="ami-ubuntu-24.04-x86_64" + IMAGE_NAME="ami-ubuntu-26.04-x86_64" elif [ "$ARCH" = "aarch64" ] || [ "$ARCH" = "arm64" ]; then - IMAGE_NAME="ami-ubuntu-24.04-arm64" + IMAGE_NAME="ami-ubuntu-26.04-arm64" else - IMAGE_NAME="ami-ubuntu-24.04-x86_64" + IMAGE_NAME="ami-ubuntu-26.04-x86_64" fi SPINIFEX_AMI=$(aws ec2 describe-images --query "Images[?Name=='$IMAGE_NAME'].ImageId" --output text) if [ -z "$SPINIFEX_AMI" ]; then diff --git a/scripts/run-instance.sh b/scripts/run-instance.sh index 71ccb29d7..4158b864f 100755 --- a/scripts/run-instance.sh +++ b/scripts/run-instance.sh @@ -6,12 +6,12 @@ export AWS_PROFILE=spinifex # Detect architecture ARCH=$(uname -m) if [ "$ARCH" = "x86_64" ]; then - IMAGE_NAME="ami-ubuntu-24.04-x86_64" + IMAGE_NAME="ami-ubuntu-26.04-x86_64" elif [ "$ARCH" = "aarch64" ] || [ "$ARCH" = "arm64" ]; then - IMAGE_NAME="ami-ubuntu-24.04-arm64" + IMAGE_NAME="ami-ubuntu-26.04-arm64" else echo "Warning: Unknown architecture $ARCH, defaulting to x86_64" - IMAGE_NAME="ami-ubuntu-24.04-x86_64" + IMAGE_NAME="ami-ubuntu-26.04-x86_64" fi # Query available instance types from Spinifex and pick the first micro type diff --git a/scripts/smoke-test.sh b/scripts/smoke-test.sh index df99f6fd7..e48212def 100755 --- a/scripts/smoke-test.sh +++ b/scripts/smoke-test.sh @@ -46,15 +46,15 @@ aws ec2 describe-key-pairs # --- Import AMI --- echo "==> Importing AMI" -LOCAL_IMAGE="$HOME/images/ubuntu-24.04.img" +LOCAL_IMAGE="$HOME/images/ubuntu-26.04.img" ARCH=$(uname -m) case "$ARCH" in - x86_64) IMG_ARCH="x86_64"; IMAGE_NAME="ubuntu-24.04-x86_64" ;; - aarch64|arm64) IMG_ARCH="arm64"; IMAGE_NAME="ubuntu-24.04-arm64" ;; + x86_64) IMG_ARCH="x86_64"; IMAGE_NAME="ubuntu-26.04-x86_64" ;; + aarch64|arm64) IMG_ARCH="arm64"; IMAGE_NAME="ubuntu-26.04-arm64" ;; *) echo " Warning: unknown arch $ARCH, defaulting to x86_64" - IMG_ARCH="x86_64"; IMAGE_NAME="ubuntu-24.04-x86_64" + IMG_ARCH="x86_64"; IMAGE_NAME="ubuntu-26.04-x86_64" ;; esac @@ -70,7 +70,7 @@ else if [ -f "$LOCAL_IMAGE" ]; then echo " Using local image: $LOCAL_IMAGE" sudo /usr/local/bin/spx admin images import \ - --file "$LOCAL_IMAGE" --distro ubuntu --version 24.04 --arch "$IMG_ARCH" + --file "$LOCAL_IMAGE" --distro ubuntu --version 26.04 --arch "$IMG_ARCH" else echo " Downloading image: $IMAGE_NAME" sudo /usr/local/bin/spx admin images import --name "$IMAGE_NAME" diff --git a/scripts/start-then-terminate-pending.sh b/scripts/start-then-terminate-pending.sh index ff7feac99..4853c621a 100755 --- a/scripts/start-then-terminate-pending.sh +++ b/scripts/start-then-terminate-pending.sh @@ -7,9 +7,9 @@ export AWS_PROFILE=spinifex ARCH=$(uname -m) case "$ARCH" in - x86_64) IMAGE_NAME="ami-ubuntu-24.04-x86_64" ;; - aarch64|arm64) IMAGE_NAME="ami-ubuntu-24.04-arm64" ;; - *) echo "Unknown arch $ARCH, default x86_64"; IMAGE_NAME="ami-ubuntu-24.04-x86_64" ;; + x86_64) IMAGE_NAME="ami-ubuntu-26.04-x86_64" ;; + aarch64|arm64) IMAGE_NAME="ami-ubuntu-26.04-arm64" ;; + *) echo "Unknown arch $ARCH, default x86_64"; IMAGE_NAME="ami-ubuntu-26.04-x86_64" ;; esac INSTANCE_TYPE=$(aws ec2 describe-instance-types \ diff --git a/spinifex/utils/images.go b/spinifex/utils/images.go index 32b4b7838..9894739cf 100644 --- a/spinifex/utils/images.go +++ b/spinifex/utils/images.go @@ -305,31 +305,31 @@ var AvailableImages = map[string]Images{ Starred: true, }, - "ubuntu-24.04-x86_64": { - Name: "ubuntu-24.04-x86_64", - Description: "Ubuntu 24.04 LTS (Noble Numbat) x86_64 cloud image", + "ubuntu-26.04-x86_64": { + Name: "ubuntu-26.04-x86_64", + Description: "Ubuntu 26.04 LTS (Resolute Reindeer) x86_64 cloud image", Distro: "ubuntu", - Version: "24.04", + Version: "26.04", Arch: "x86_64", Platform: "Linux/UNIX", - CreatedAt: time.Date(2025, 10, 6, 0, 0, 0, 0, time.UTC), - URL: "https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img", - Checksum: "https://cloud-images.ubuntu.com/noble/current/SHA256SUMS", + CreatedAt: time.Date(2026, 5, 1, 0, 0, 0, 0, time.UTC), + URL: "https://cloud-images.ubuntu.com/resolute/current/resolute-server-cloudimg-amd64.img", + Checksum: "https://cloud-images.ubuntu.com/resolute/current/SHA256SUMS", ChecksumType: "sha256", BootMode: "bios", Starred: false, }, - "ubuntu-24.04-arm64": { - Name: "ubuntu-24.04-arm64", - Description: "Ubuntu 24.04 LTS (Noble Numbat) arm64 cloud image", + "ubuntu-26.04-arm64": { + Name: "ubuntu-26.04-arm64", + Description: "Ubuntu 26.04 LTS (Resolute Reindeer) arm64 cloud image", Distro: "ubuntu", - Version: "24.04", + Version: "26.04", Arch: "arm64", Platform: "Linux/UNIX", - CreatedAt: time.Date(2025, 10, 6, 0, 0, 0, 0, time.UTC), - URL: "https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-arm64.img", - Checksum: "https://cloud-images.ubuntu.com/noble/current/SHA256SUMS", + CreatedAt: time.Date(2026, 5, 1, 0, 0, 0, 0, time.UTC), + URL: "https://cloud-images.ubuntu.com/resolute/current/resolute-server-cloudimg-arm64.img", + Checksum: "https://cloud-images.ubuntu.com/resolute/current/SHA256SUMS", ChecksumType: "sha256", BootMode: "bios", Starred: false, diff --git a/spinifex/utils/utils_test.go b/spinifex/utils/utils_test.go index 357f14199..d9ac0c37d 100644 --- a/spinifex/utils/utils_test.go +++ b/spinifex/utils/utils_test.go @@ -1111,7 +1111,7 @@ func trustTestServer(t *testing.T, srv *httptest.Server) { func TestVerifyImageChecksum(t *testing.T) { const debianName = "debian-13-genericcloud-amd64-20260501-2465.tar.xz" - const ubuntuName = "noble-server-cloudimg-amd64.img" + const ubuntuName = "resolute-server-cloudimg-amd64.img" const alpineName = "alb-alpine-3.21.6-x86_64.raw" debianBytes := []byte("debian-image-bytes-fixture")