> ## Documentation Index
> Fetch the complete documentation index at: https://docs.siderolabs.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Scaleway

> Creating a single-instance cluster via the CLI (scw) on scaleway.com.

export const version_v1_13 = 'v1.13';

export const release_v1_13 = 'v1.13.0';

export const VersionWarningBanner = () => {
  const latestVersion = "v1.13";
  const [latestUrl, setLatestUrl] = useState(null);
  const [currentVersion, setCurrentVersion] = useState(null);
  const [isBeta, setIsBeta] = useState(false);
  const parseVersion = v => v.replace("v", "").split(".").map(Number);
  const isGreaterVersion = (a, b) => {
    const [aMajor, aMinor] = parseVersion(a);
    const [bMajor, bMinor] = parseVersion(b);
    if (aMajor > bMajor) return true;
    if (aMajor === bMajor && aMinor > bMinor) return true;
    return false;
  };
  useEffect(() => {
    if (typeof window === "undefined") return;
    const {pathname, hash, search} = window.location;
    const match = pathname.match(/\/talos\/(v\d+\.\d+)\//);
    if (!match) return;
    const detectedVersion = match[1];
    if (detectedVersion === latestVersion) return;
    setCurrentVersion(detectedVersion);
    if (isGreaterVersion(detectedVersion, latestVersion)) {
      setIsBeta(true);
    }
    const newPath = pathname.replace(`/talos/${detectedVersion}/`, `/talos/${latestVersion}/`);
    setLatestUrl(`${newPath}${search}${hash}`);
  }, []);
  if (!latestUrl || !currentVersion) return null;
  return <div className="not-prose sticky top-6 z-50 my-6">
      <div className="border border-yellow-500/30 bg-yellow-500/10 px-4 py-3 rounded-xl">
        <div className="text-sm">
          {isBeta ? <>
              ⚠️ You are viewing a <strong>beta version</strong> of Talos ({currentVersion}).
              This version may be unstable.
              <a href={latestUrl} className="ml-2 underline text-yellow-400 hover:text-yellow-300 font-medium">
                View latest stable version {latestVersion} →
              </a>
            </> : <>
              ⚠️ You are viewing an older version of Talos ({currentVersion}).
              <a href={latestUrl} className="ml-2 underline text-yellow-400 hover:text-yellow-300 font-medium">
                View the latest version {latestVersion} →
              </a>
            </>}
        </div>
      </div>
    </div>;
};

<VersionWarningBanner />

The process to run a Talos cluster, on a single node in Scaleway is as follows:

## Prerequisites

* Enable block storage on your Scaleway account (Scaleway will only allow snapshots from their block storage, not URLs)
* Configure the `scw` CLI to access your account (optional - you can use the console instead)
* Have `qemu-img` and `wget` installed for image conversion

## Image preparation

1. **Download the image disk** of the Talos version you wish to run:

<CodeBlock lang="sh">
  {`
     wget "https://factory.talos.dev/image/18d0321d7fb289f707a76e1deeaa5c97e62209722cbf4bc533a5d51eb666885f/v{ release_v1_13 }/scaleway-amd64.raw.zst"
     `}
</CodeBlock>

> You can create your own brew on [Talos Factory](https://factory.talos.dev) if you need a custom image.
> A working extra kernel command line arguments is as follow : `-console talos.platform=scaleway console=ttyS0,115200 talos.dashboard.disabled=0`

2. **Decompress and convert the image**:

   ```bash theme={null}
   zstd --decompress scaleway-amd64.raw.zst
   qemu-img convert -O qcow2 scaleway-amd64.raw scaleway-amd64.qcow2
   ```

3. **Create an S3 bucket** (if it doesn't exist):
   Go to Object Storage in the Scaleway console and create a new bucket.

<img src="https://mintcdn.com/siderolabs-fe86397c/hVMyOt-W9fmKR5ik/talos/v1.13/platform-specific-installations/cloud-platforms/images/scaleway-create-bucket-01.png?fit=max&auto=format&n=hVMyOt-W9fmKR5ik&q=85&s=ceb563f97f02a897b157af4701c3e9fe" alt="Scaleway Console Create Bucket" width="1664" height="853" data-path="talos/v1.13/platform-specific-installations/cloud-platforms/images/scaleway-create-bucket-01.png" />

<img src="https://mintcdn.com/siderolabs-fe86397c/hVMyOt-W9fmKR5ik/talos/v1.13/platform-specific-installations/cloud-platforms/images/scaleway-create-bucket-02.png?fit=max&auto=format&n=hVMyOt-W9fmKR5ik&q=85&s=b4380ad6b5a7045437571a40471727a2" alt="Scaleway Console Create Bucket" width="1661" height="993" data-path="talos/v1.13/platform-specific-installations/cloud-platforms/images/scaleway-create-bucket-02.png" />

4. **Upload to S3-compatible object storage**:
   Use the Scaleway console Object Storage interface to upload the QCOW2 file directly.

## Snapshot creation

1. Go to the Scaleway Web console.

2. Go to the QCOW2 object in your S3 bucket.

3. Click on the extra action *Import object as snapshot*.

<img src="https://mintcdn.com/siderolabs-fe86397c/hVMyOt-W9fmKR5ik/talos/v1.13/platform-specific-installations/cloud-platforms/images/scaleway-import-as-snapshot.png?fit=max&auto=format&n=hVMyOt-W9fmKR5ik&q=85&s=3f48c2b6059902f9108f1d8bb911a2d0" alt="Scaleway Console Import As Snapshot" width="1658" height="948" data-path="talos/v1.13/platform-specific-installations/cloud-platforms/images/scaleway-import-as-snapshot.png" />

4. Name the snapshot *scaleway-amd64-v{ release_v1_13 }*, and use a Local Storage snapshot type.

## Instance deployment

1. Create instance using the snapshot/image via GUI, CLI, or Infrastructure as Code tools.

2. Open the Security Group in order to open `TCP/50000` and `TCP/6443`.

3. The Talos disk image used to boot is 4.5GB, and is not enough for the EPHEMERAL partition.

4. Add an extra Disk of 25GB (Local Storage) for Talos EPHEMERAL partition. The Talos OS (4.5GB) will be on `/dev/vda` and the extra disk for EPHEMERAL partition will be on `/dev/vdb`. At this point, you can debug and communicate with the instance on --insecure mode :

```
VM_IP=<instance_public_ip>
talosctl -n $VM_IP version --insecure
talosctl -n $VM_IP get disks --insecure
talosctl -n $VM_IP get links --insecure
```

## Talos configuration

As any other Talos instance, generate the Talos machineconfig, with the following patch :

```
# controlplane.patch.yaml
machine:
    install:
        disk: /dev/vdb
        wipe: true
    network:
        interfaces:
            - interface: eth0
              dhcp: true

cluster:
  allowSchedulingOnControlPlanes: true
  apiServer:
    extraArgs:
      "advertise-address": "0.0.0.0"
    apiServer:
        certSANs:
            - 127.0.0.1
            - <public_ip>
```

Generate the Talos config :

```
talosctl gen config talos-cluster https://$VM_IP:6443 --config-patch=@controlplane.patch.yaml --output-dir _out/ --with-docs=false --with-examples=false
```

Also add a VolumeConfig for the EPHEMERAL partition of Talos :

```
---
apiVersion: v1alpha1
kind: VolumeConfig
name: EPHEMERAL
provisioning:
  diskSelector:
    match: disk.dev_path == '/dev/vdb'
  minSize: 2GB
  maxSize: 40GB
  grow: false
```

Apply the machineconfig + the VolumeConfig on your Talos Scaleway instance.

```
talosctl --nodes $VM_IP apply-config --file _out/controlplane.yaml --insecure
```

At this point, you should be able to communicate with your Talos instance with the right certificates, and debug the Talos instance :

```
talosctl --talosconfig=./_out/talosconfig --nodes $VM_IP -e $VM_IP version
talosctl --talosconfig=./_out/talosconfig --nodes $VM_IP -e $VM_IP dashboard
```

## Talos cluster bootstrap

One last command to bootstrap your Talos Cluster :

```
talosctl --talosconfig=./_out/talosconfig -e $VM_IP -n $VM_IP bootstrap
```

You can follow the logs with the dashboard, and after couple of minutes, your first Talos standalone single instance cluster on Scaleway will be ready to use.

## Notes

* Because the STATE partition will be written to `/dev/vda` during the installation, the instance works correctly with Scaleway's reboot functionality
* `talosctl reset` performs the reset operation but don't start the maintenance mode automatically
* If you give a bigger disk (let's say 25GB) for the Talos disk image for the Scaleway Instance, unfortunately Talos won't be able to expand its volume to 25GB and still see 4.5GB which is not enough for the EPHEMERAL partition
