feat: Add Scaleway Instance Template (#449)

Co-authored-by: DevCats <christofer@coder.com>
Co-authored-by: Atif Ali <atif@coder.com>
This commit is contained in:
Mossy 2025-12-31 11:39:08 +00:00 committed by GitHub
parent 678c3e631e
commit 24dc52fb17
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 997 additions and 0 deletions

2
.icons/scaleway.svg Normal file
View File

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg fill="#000000" width="800px" height="800px" viewBox="0 0 24 24" role="img" xmlns="http://www.w3.org/2000/svg"><title>Scaleway icon</title><path d="M16.61 11.11v5.72a1.77 1.77 0 0 1-1.54 1.69h-4a1.43 1.43 0 0 1-1.31-1.22 1.09 1.09 0 0 1 0-.18 1.37 1.37 0 0 1 1.37-1.36h1.74a1 1 0 0 0 1-1v-3.62a1.4 1.4 0 0 1 1.18-1.39h.17a1.37 1.37 0 0 1 1.39 1.36zm-6.46 1.74V9.26a1 1 0 0 1 1-1H13a1.37 1.37 0 0 0 1.37-1.37 1 1 0 0 0 0-.17 1.45 1.45 0 0 0-1.41-1.2H9a1.81 1.81 0 0 0-1.58 1.66v5.7a1.37 1.37 0 0 0 1.37 1.37H9a1.4 1.4 0 0 0 1.15-1.4zm12-4.29V20A4.53 4.53 0 0 1 18 24h-7.58a8.57 8.57 0 0 1-8.56-8.57V4.54A4.54 4.54 0 0 1 6.4 0h7.18a8.56 8.56 0 0 1 8.56 8.56zm-2.74 0a5.83 5.83 0 0 0-5.82-5.82H6.4a1.79 1.79 0 0 0-1.8 1.8v10.89a5.83 5.83 0 0 0 5.82 5.8h7.44a1.79 1.79 0 0 0 1.54-1.48z"/></svg>

After

Width:  |  Height:  |  Size: 913 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

View File

@ -0,0 +1,15 @@
---
display_name: "Mossy Lion"
bio: "Tinkerer, exploring European cloud providers"
avatar: "./.images/avatar.png"
github: "mossylion"
status: "community"
---
# Mossy Lion
Exploring European cloud providers. Usually find me outdoors but if not, somewhere deep in Kubernetes and infra
## Templates
- **scaleway-instance**: Scaleway workspace instance with persistent home directory

View File

@ -0,0 +1,156 @@
---
display_name: "Scaleway Instance"
description: "A workspace spun up on a Scaleway Instance"
icon: "../../../../.icons/scaleway.svg"
verified: false
tags: ["scaleway", "vm", "linux"]
---
# Scaleway Instance Template
This template provisions Coder workspaces on [Scaleway](https://www.scaleway.com/) cloud instances with full customization options for regions, instance types, operating systems, and storage configurations.
## Features
- **Multi-region support**: Choose from France (Paris), Netherlands (Amsterdam), or Poland (Warsaw)
- **Flexible instance sizing**: Wide range of instance types from development to high-performance computing
- **Multiple OS options**: Debian 12/13, Ubuntu 24.04, and Fedora 41
- **Customizable storage**: Adjustable disk size with configurable IOPS
- **IPv4 and IPv6 networking**: Dual-stack IP configuration for enhanced connectivity
## Prerequisites
### Scaleway Account Setup
1. Create a [Scaleway account](https://console.scaleway.com/)
2. Create a new project or use an existing one
3. Generate API credentials:
- Go to **IAM** > **API Keys** in the Scaleway Console
- Create a new API key
- Note down the **Access Key** and **Secret Key**
- Copy your **Project ID** from the project settings
- Give permissions for **BlockStorageFullAccess**, **ProjectReadOnly**, **InstancesFullAccess** as a starting point
## Architecture
This template creates the following resources for each workspace:
### Persistent Resources
- **Block Volume**: Mounted as user's home directory (preserves all data, configs, and projects)
### Ephemeral Resources (destroyed when workspace stops)
- **Scaleway Instance**: Virtual machine created fresh on each workspace start
- **IPv4 Address**: Routed IPv4 address assigned dynamically
- **IPv6 Address**: Routed IPv6 address assigned dynamically
- **Cloud-init Configuration**: Automated setup of the Coder agent and persistent storage mounting
## Configuration Options
### Region Selection
Choose from three available regions:
- **France - Paris (fr-par)**: Default, lowest latency for European users
- **Netherlands - Amsterdam (nl-ams)**: Alternative European location
- **Poland - Warsaw (pl-waw)**: Eastern European option
### Instance Types
The template supports a comprehensive range of Scaleway instance types:
#### Development Instances
- **STARDUST1-S**: 1 CPU, 1GB RAM - Basic development
- **DEV1-S/M/L/XL**: 2-4 CPUs, 2-12GB RAM - Standard development
#### Production Instances
- **ENT1 Series**: 2-96 CPUs, 8-384GB RAM - Enterprise workloads
- **GP1 Series**: 4-48 CPUs, 16-256GB RAM - General purpose
- **PRO2 Series**: 2-32 CPUs, 8-128GB RAM - Professional workloads
#### Specialized Instances
- **L4 Series**: GPU-enabled instances for AI/ML workloads
- **COPARM1 Series**: ARM64 architecture for specific use cases
### Operating System Options
- **Debian 13 (Trixie)**: Latest Debian release
- **Debian 12 (Bookworm)**: Stable Debian LTS
- **Ubuntu 24.04 (Noble)**: Latest Ubuntu LTS
- **Fedora 41**: Cutting-edge features and packages
### Storage Configuration
- **Home Directory Size**: 10-500GB adjustable via slider (your entire home directory)
- **IOPS**: 5,000 or 15,000 IOPS options for performance tuning
## Template Components
### Included Tools
- **VS Code Server**: Browser-based IDE with full extension support
- **System Monitoring**: CPU, RAM, and disk usage metrics
- **Dotfiles Support**: Automatic dotfiles synchronization on workspace start
- **Custom Environment Variables**: Pre-configured welcome message
### Cloud-init Setup
The template uses cloud-init for:
- Automatic Coder agent installation and configuration
- User account setup with proper permissions
- Persistent home directory mounting (automatic disk partitioning and filesystem creation)
- Development tools initialization
## Usage
### Creating a Workspace
1. **Select Template**: Choose "Scaleway Instance" from your Coder templates
2. **Configure Region**: Pick your preferred Scaleway region
3. **Choose Instance**: Select instance type based on your performance needs
4. **Select OS**: Pick your preferred operating system
5. **Set Home Directory Size**: Adjust storage size (10-500GB) for your persistent home directory
6. **Create**: Launch your workspace
### Managing Costs
- **VM instances are destroyed** when workspace stops (zero compute costs when not in use)
- **IP addresses are released** when workspace stops (no static IP charges)
- **Home directory persists** on dedicated block volume (small storage cost only)
- **Fresh OS** on each workspace start with persistent user data
- Choose appropriate instance sizes for your workload requirements
## Customization
### Extending the Template
You can customize this template by:
1. **Adding Software**: Modify cloud-init scripts to install additional tools
2. **Custom Modules**: Include additional Coder modules from the registry
3. **Network Configuration**: Adjust security groups or network settings
4. **Startup Scripts**: Add custom initialization logic
## Maintenance
### Updating Instance Types
To update the available instance types, regenerate the `scaleway-config.json` file:
```bash
scw instance server-type list -o json | jq 'map({name, cpu, gpu, ram, arch})' > scaleway-config.json.json
```
This pulls the latest instance types from Scaleway and formats them for use in the template.
## References
- [Scaleway Documentation](https://www.scaleway.com/en/docs/)
- [Scaleway Instance Types](https://www.scaleway.com/en/pricing/#instances)
- [Coder Templates Documentation](https://coder.com/docs/templates)
- [Terraform Scaleway Provider](https://registry.terraform.io/providers/scaleway/scaleway/latest/docs)

View File

@ -0,0 +1,35 @@
#cloud-config
cloud_final_modules:
- [scripts-user, always]
hostname: ${hostname}
users:
- name: ${linux_user}
sudo: ALL=(ALL) NOPASSWD:ALL
shell: /bin/bash
# Setup persistent storage disk
disk_setup:
/dev/sdb:
table_type: gpt
layout: true
overwrite: false
fs_setup:
- label: persistent-home
filesystem: ext4
device: /dev/sdb1
partition: auto
mounts:
- ["/dev/sdb1", "/home/${linux_user}", "ext4", "defaults", "0", "2"]
# Fix ownership after mounting
runcmd:
- chown -R ${linux_user}:${linux_user} /home/${linux_user}
- chmod 755 /home/${linux_user}
# Automatically grow the partition
growpart:
mode: auto
devices: ['/']
ignore_growroot_disabled: false

View File

@ -0,0 +1,2 @@
#!/bin/bash
sudo -u '${linux_user}' sh -c 'export CODER_AGENT_TOKEN="${coder_agent_token}"; ${init_script}'

View File

@ -0,0 +1,337 @@
terraform {
required_providers {
coder = {
source = "coder/coder"
version = "~> 2"
}
scaleway = {
source = "scaleway/scaleway"
version = "~> 2"
}
cloudinit = {
source = "hashicorp/cloudinit"
version = "~> 2"
}
}
required_version = ">= 1.0"
}
provider "scaleway" {
access_key = var.access_key
secret_key = var.secret_key
region = data.coder_parameter.region.value
}
locals {
hostname = lower(data.coder_workspace.me.name)
linux_user = "coder"
}
data "cloudinit_config" "user_data" {
gzip = false
base64_encode = false
boundary = "//"
part {
filename = "cloud-config.yaml"
content_type = "text/cloud-config"
content = templatefile("${path.module}/cloud-init/cloud-config.yaml.tftpl", {
hostname = local.hostname
linux_user = local.linux_user
})
}
part {
filename = "userdata.sh"
content_type = "text/x-shellscript"
content = templatefile("${path.module}/cloud-init/userdata.sh.tftpl", {
linux_user = local.linux_user
init_script = coder_agent.main.init_script
coder_agent_token = coder_agent.main.token
})
}
}
data "coder_provisioner" "me" {}
data "coder_workspace" "me" {}
data "coder_workspace_owner" "me" {}
resource "coder_agent" "main" {
arch = local.selected_arch
os = data.coder_provisioner.me.os
auth = "token"
startup_script = <<-EOT
set -e
# Install additional tools or run commands at workspace startup
# Uncomment and customize as needed:
# sudo apt-get update
# sudo apt-get install -y build-essential
EOT
metadata {
display_name = "CPU Usage"
key = "0_cpu_usage"
script = "coder stat cpu"
interval = 10
timeout = 1
}
metadata {
display_name = "RAM Usage"
key = "1_ram_usage"
script = "coder stat mem"
interval = 10
timeout = 1
}
metadata {
display_name = "Disk Usage"
key = "1_disk_usage"
script = "coder stat disk --path /home/${local.linux_user}"
interval = 600
timeout = 30
}
}
module "code-server" {
source = "registry.coder.com/modules/code-server/coder"
version = "1.3.1"
agent_id = coder_agent.main.id
order = 1
folder = "/home/${local.linux_user}"
}
# Runs a script at workspace start/stop or on a cron schedule
# details: https://registry.terraform.io/providers/coder/coder/latest/docs/resources/script
module "dotfiles" {
count = data.coder_workspace.me.start_count
source = "registry.coder.com/coder/dotfiles/coder"
version = "1.2.1"
agent_id = coder_agent.main.id
}
resource "coder_metadata" "workspace_info" {
count = data.coder_workspace.me.start_count
resource_id = scaleway_instance_server.workspace[0].id
item {
key = "region"
value = data.coder_parameter.region.value
}
item {
key = "instance type"
value = scaleway_instance_server.workspace[0].type
}
item {
key = "image"
value = data.coder_parameter.base_image.value
}
}
resource "coder_metadata" "volume_info" {
resource_id = scaleway_block_volume.persistent_storage.id
item {
key = "size"
value = "${scaleway_block_volume.persistent_storage.size_in_gb} GiB"
}
item {
key = "iops"
value = scaleway_block_volume.persistent_storage.iops
}
}
data "coder_parameter" "region" {
name = "Scaleway Region"
description = "Region to deploy server into"
type = "string"
default = "fr-par"
option {
name = "France - Paris (fr-par)"
value = "fr-par"
icon = "/emojis/1f1eb-1f1f7.png"
}
option {
name = "Netherlands - Amsterdam (nl-ams)"
value = "nl-ams"
icon = "/emojis/1f1f3-1f1f1.png"
}
option {
name = "Poland - Warsaw (pl-waw)"
value = "pl-waw"
icon = "/emojis/1f1f5-1f1f1.png"
}
}
data "coder_parameter" "base_image" {
name = "Image"
description = "Which base image would you like to use?"
type = "string"
form_type = "radio"
default = "debian_trixie"
option {
name = "Debian 13 (Trixie)"
value = "debian_trixie"
icon = "/icon/debian.svg"
}
option {
name = "Debian 12 (Bookworm)"
value = "debian_bookworm"
icon = "/icon/debian.svg"
}
option {
name = "Ubuntu 24.04 (Noble)"
value = "ubuntu_noble"
icon = "/icon/ubuntu.svg"
}
option {
name = "Fedora 41"
value = "fedora_41"
icon = "/icon/fedora.svg"
}
}
data "coder_parameter" "root_volume_size" {
name = "Root Volume Size"
description = "Size of the OS/boot disk in GB"
type = "number"
form_type = "slider"
default = "20"
order = 7
validation {
min = 10
max = 1000
monotonic = "increasing"
}
}
data "coder_parameter" "disk_size" {
name = "Persistent Storage Size"
description = "Size of the additional persistent storage volume in GB"
type = "number"
form_type = "slider"
default = "10"
order = 8
validation {
min = 10
max = 500
monotonic = "increasing"
}
}
locals {
scaleway_config_raw = jsondecode(file("${path.module}/scaleway-config.json"))
scaleway_instance_options = {
for instance in local.scaleway_config_raw :
instance.name => {
name = "${instance.name} (${instance.cpu} CPU, ${instance.gpu} GPU, ${floor(instance.ram / 1073741824)} GB RAM)"
value = instance.name
}
}
instance_arch_map = {
for instance in local.scaleway_config_raw :
instance.name => instance.arch
}
# Convert Scaleway arch format to Coder arch format
selected_arch = local.instance_arch_map[data.coder_parameter.instance_size.value] == "x86_64" ? "amd64" : local.instance_arch_map[data.coder_parameter.instance_size.value]
}
data "coder_parameter" "instance_size" {
name = "instance_size"
display_name = "Instance Size"
description = "Which Instance Size should be used?"
default = "DEV1-M"
type = "string"
icon = "/icon/memory.svg"
mutable = false
form_type = "dropdown"
dynamic "option" {
for_each = local.scaleway_instance_options
content {
name = option.value.name
value = option.value.value
}
}
}
data "coder_parameter" "volume_iops" {
name = "Volume IOPS"
description = "IOPS to provision for disk"
type = "number"
default = 5000
option {
name = "5000"
value = 5000
}
option {
name = "15000"
value = 15000
}
}
resource "scaleway_instance_server" "workspace" {
count = data.coder_workspace.me.start_count
name = "coder-${lower(data.coder_workspace_owner.me.name)}-${lower(data.coder_workspace.me.name)}"
type = data.coder_parameter.instance_size.value
image = data.coder_parameter.base_image.value
ip_ids = [scaleway_instance_ip.server_ip[0].id, scaleway_instance_ip.v4_server_ip[0].id]
project_id = var.project_id
user_data = {
cloud-init = data.cloudinit_config.user_data.rendered
}
additional_volume_ids = [scaleway_block_volume.persistent_storage.id]
root_volume {
size_in_gb = data.coder_parameter.root_volume_size.value
}
}
resource "scaleway_block_volume" "persistent_storage" {
iops = data.coder_parameter.volume_iops.value
name = "coder-${lower(data.coder_workspace_owner.me.name)}-${lower(data.coder_workspace.me.name)}-home"
size_in_gb = data.coder_parameter.disk_size.value
project_id = var.project_id
}
resource "scaleway_instance_ip" "server_ip" {
count = data.coder_workspace.me.start_count
type = "routed_ipv6"
project_id = var.project_id
}
resource "scaleway_instance_ip" "v4_server_ip" {
count = data.coder_workspace.me.start_count
type = "routed_ipv4"
project_id = var.project_id
}
variable "project_id" {
type = string
description = "ID of the project to deploy into"
}
variable "access_key" {
type = string
description = "Access key to use to deploy"
}
variable "secret_key" {
type = string
description = "Secret key to use to deploy"
}

View File

@ -0,0 +1,450 @@
[
{
"name": "COPARM1-2C-8G",
"cpu": 2,
"gpu": 0,
"ram": 8589934592,
"arch": "arm64"
},
{
"name": "COPARM1-4C-16G",
"cpu": 4,
"gpu": 0,
"ram": 17179869184,
"arch": "arm64"
},
{
"name": "COPARM1-8C-32G",
"cpu": 8,
"gpu": 0,
"ram": 34359738368,
"arch": "arm64"
},
{
"name": "COPARM1-16C-64G",
"cpu": 16,
"gpu": 0,
"ram": 68719476736,
"arch": "arm64"
},
{
"name": "COPARM1-32C-128G",
"cpu": 32,
"gpu": 0,
"ram": 137438953472,
"arch": "arm64"
},
{
"name": "DEV1-S",
"cpu": 2,
"gpu": 0,
"ram": 2147483648,
"arch": "x86_64"
},
{
"name": "DEV1-M",
"cpu": 3,
"gpu": 0,
"ram": 4294967296,
"arch": "x86_64"
},
{
"name": "DEV1-L",
"cpu": 4,
"gpu": 0,
"ram": 8589934592,
"arch": "x86_64"
},
{
"name": "DEV1-XL",
"cpu": 4,
"gpu": 0,
"ram": 12884901888,
"arch": "x86_64"
},
{
"name": "ENT1-XXS",
"cpu": 2,
"gpu": 0,
"ram": 8589934592,
"arch": "x86_64"
},
{
"name": "ENT1-XS",
"cpu": 4,
"gpu": 0,
"ram": 17179869184,
"arch": "x86_64"
},
{
"name": "ENT1-S",
"cpu": 8,
"gpu": 0,
"ram": 34359738368,
"arch": "x86_64"
},
{
"name": "ENT1-M",
"cpu": 16,
"gpu": 0,
"ram": 68719476736,
"arch": "x86_64"
},
{
"name": "ENT1-L",
"cpu": 32,
"gpu": 0,
"ram": 137438953472,
"arch": "x86_64"
},
{
"name": "ENT1-XL",
"cpu": 64,
"gpu": 0,
"ram": 274877906944,
"arch": "x86_64"
},
{
"name": "ENT1-2XL",
"cpu": 96,
"gpu": 0,
"ram": 412316860416,
"arch": "x86_64"
},
{
"name": "GP1-XS",
"cpu": 4,
"gpu": 0,
"ram": 17179869184,
"arch": "x86_64"
},
{
"name": "GP1-S",
"cpu": 8,
"gpu": 0,
"ram": 34359738368,
"arch": "x86_64"
},
{
"name": "GP1-M",
"cpu": 16,
"gpu": 0,
"ram": 68719476736,
"arch": "x86_64"
},
{
"name": "GP1-L",
"cpu": 32,
"gpu": 0,
"ram": 137438953472,
"arch": "x86_64"
},
{
"name": "GP1-XL",
"cpu": 48,
"gpu": 0,
"ram": 274877906944,
"arch": "x86_64"
},
{
"name": "L4-1-24G",
"cpu": 8,
"gpu": 1,
"ram": 51539607552,
"arch": "x86_64"
},
{
"name": "L4-2-24G",
"cpu": 16,
"gpu": 2,
"ram": 103079215104,
"arch": "x86_64"
},
{
"name": "L4-4-24G",
"cpu": 32,
"gpu": 4,
"ram": 206158430208,
"arch": "x86_64"
},
{
"name": "L4-8-24G",
"cpu": 64,
"gpu": 8,
"ram": 412316860416,
"arch": "x86_64"
},
{
"name": "PLAY2-PICO",
"cpu": 1,
"gpu": 0,
"ram": 2147483648,
"arch": "x86_64"
},
{
"name": "PLAY2-NANO",
"cpu": 2,
"gpu": 0,
"ram": 4294967296,
"arch": "x86_64"
},
{
"name": "PLAY2-MICRO",
"cpu": 4,
"gpu": 0,
"ram": 8589934592,
"arch": "x86_64"
},
{
"name": "POP2-HC-2C-4G",
"cpu": 2,
"gpu": 0,
"ram": 4294967296,
"arch": "x86_64"
},
{
"name": "POP2-2C-8G",
"cpu": 2,
"gpu": 0,
"ram": 8589934592,
"arch": "x86_64"
},
{
"name": "POP2-HM-2C-16G",
"cpu": 2,
"gpu": 0,
"ram": 17179869184,
"arch": "x86_64"
},
{
"name": "POP2-HC-4C-8G",
"cpu": 4,
"gpu": 0,
"ram": 8589934592,
"arch": "x86_64"
},
{
"name": "POP2-4C-16G",
"cpu": 4,
"gpu": 0,
"ram": 17179869184,
"arch": "x86_64"
},
{
"name": "POP2-2C-8G-WIN",
"cpu": 2,
"gpu": 0,
"ram": 8589934592,
"arch": "x86_64"
},
{
"name": "POP2-HM-4C-32G",
"cpu": 4,
"gpu": 0,
"ram": 34359738368,
"arch": "x86_64"
},
{
"name": "POP2-HC-8C-16G",
"cpu": 8,
"gpu": 0,
"ram": 17179869184,
"arch": "x86_64"
},
{
"name": "POP2-HN-3",
"cpu": 2,
"gpu": 0,
"ram": 4294967296,
"arch": "x86_64"
},
{
"name": "POP2-8C-32G",
"cpu": 8,
"gpu": 0,
"ram": 34359738368,
"arch": "x86_64"
},
{
"name": "POP2-4C-16G-WIN",
"cpu": 4,
"gpu": 0,
"ram": 17179869184,
"arch": "x86_64"
},
{
"name": "POP2-HM-8C-64G",
"cpu": 8,
"gpu": 0,
"ram": 68719476736,
"arch": "x86_64"
},
{
"name": "POP2-HC-16C-32G",
"cpu": 16,
"gpu": 0,
"ram": 34359738368,
"arch": "x86_64"
},
{
"name": "POP2-HN-5",
"cpu": 4,
"gpu": 0,
"ram": 8589934592,
"arch": "x86_64"
},
{
"name": "POP2-16C-64G",
"cpu": 16,
"gpu": 0,
"ram": 68719476736,
"arch": "x86_64"
},
{
"name": "POP2-8C-32G-WIN",
"cpu": 8,
"gpu": 0,
"ram": 34359738368,
"arch": "x86_64"
},
{
"name": "POP2-HN-10",
"cpu": 4,
"gpu": 0,
"ram": 8589934592,
"arch": "x86_64"
},
{
"name": "POP2-HM-16C-128G",
"cpu": 16,
"gpu": 0,
"ram": 137438953472,
"arch": "x86_64"
},
{
"name": "POP2-HC-32C-64G",
"cpu": 32,
"gpu": 0,
"ram": 68719476736,
"arch": "x86_64"
},
{
"name": "POP2-32C-128G",
"cpu": 32,
"gpu": 0,
"ram": 137438953472,
"arch": "x86_64"
},
{
"name": "POP2-HC-48C-96G",
"cpu": 48,
"gpu": 0,
"ram": 103079215104,
"arch": "x86_64"
},
{
"name": "POP2-16C-64G-WIN",
"cpu": 16,
"gpu": 0,
"ram": 68719476736,
"arch": "x86_64"
},
{
"name": "POP2-HM-32C-256G",
"cpu": 32,
"gpu": 0,
"ram": 274877906944,
"arch": "x86_64"
},
{
"name": "POP2-HC-64C-128G",
"cpu": 64,
"gpu": 0,
"ram": 137438953472,
"arch": "x86_64"
},
{
"name": "POP2-48C-192G",
"cpu": 48,
"gpu": 0,
"ram": 206158430208,
"arch": "x86_64"
},
{
"name": "POP2-64C-256G",
"cpu": 64,
"gpu": 0,
"ram": 274877906944,
"arch": "x86_64"
},
{
"name": "POP2-HM-48C-384G",
"cpu": 48,
"gpu": 0,
"ram": 412316860416,
"arch": "x86_64"
},
{
"name": "POP2-32C-128G-WIN",
"cpu": 32,
"gpu": 0,
"ram": 137438953472,
"arch": "x86_64"
},
{
"name": "POP2-HM-64C-512G",
"cpu": 64,
"gpu": 0,
"ram": 549755813888,
"arch": "x86_64"
},
{
"name": "PRO2-XXS",
"cpu": 2,
"gpu": 0,
"ram": 8589934592,
"arch": "x86_64"
},
{
"name": "PRO2-XS",
"cpu": 4,
"gpu": 0,
"ram": 17179869184,
"arch": "x86_64"
},
{
"name": "PRO2-S",
"cpu": 8,
"gpu": 0,
"ram": 34359738368,
"arch": "x86_64"
},
{
"name": "PRO2-M",
"cpu": 16,
"gpu": 0,
"ram": 68719476736,
"arch": "x86_64"
},
{
"name": "PRO2-L",
"cpu": 32,
"gpu": 0,
"ram": 137438953472,
"arch": "x86_64"
},
{
"name": "RENDER-S",
"cpu": 10,
"gpu": 1,
"ram": 45097156608,
"arch": "x86_64"
},
{
"name": "STARDUST1-S",
"cpu": 1,
"gpu": 0,
"ram": 1073741824,
"arch": "x86_64"
}
]