mirror of
https://github.com/mulgadc/spinifex.git
synced 2026-10-15 09:01:31 +00:00
feat: ubuntu 26.04 image
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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:**
|
||||
|
||||
|
||||
@@ -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" \
|
||||
|
||||
@@ -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 |
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -96,7 +96,7 @@ data "aws_ami" "ubuntu" {
|
||||
|
||||
filter {
|
||||
name = "name"
|
||||
values = ["*ubuntu-24.04*"]
|
||||
values = ["*ubuntu-26.04*"]
|
||||
}
|
||||
|
||||
filter {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -102,7 +102,7 @@ data "aws_ami" "ubuntu" {
|
||||
|
||||
filter {
|
||||
name = "name"
|
||||
values = ["*ubuntu-24.04*"]
|
||||
values = ["*ubuntu-26.04*"]
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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" {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -132,7 +132,7 @@ data "aws_ami" "ubuntu" {
|
||||
|
||||
filter {
|
||||
name = "name"
|
||||
values = ["*ubuntu-24.04*"]
|
||||
values = ["*ubuntu-26.04*"]
|
||||
}
|
||||
|
||||
filter {
|
||||
|
||||
@@ -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 |
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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 \
|
||||
|
||||
+14
-14
@@ -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,
|
||||
|
||||
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user