Skip to content

How to migrate from Vultr to Quake AI with OpenTofu

Migration · Updated Jun 2026

Coming from another cloud?

▸Vultr·Cloud Compute / Bare Metal Instances, Block Storage, VPC 2.0, Firewall Groups, Load Balancers

Cloud Compute / Bare Metal Instanceshigh

  • Provisioned via the Vultr API v2 (/v2/instances and /v2/bare-metals) instead of OpenStack Nova /v2.1/servers; auth is a Personal Access Token rather than a Keystone token.
  • Plan selection is fixed (Regular Performance, High Performance, High Frequency, CPU Optimized, Memory Optimized, Bare Metal) with predefined vCPU/RAM/storage; OpenStack flavors can be cloud-defined.
  • Billing is hourly with a monthly cap per plan; powered-off Vultr instances continue to bill until destroyed, unlike pause/suspend semantics common in OpenStack stop-billing setups.
  • Marketplace one-click apps and ISO library are first-class; OpenStack uses Glance images and arbitrary userdata.
Vultr docs ↗

Block Storagehigh

  • Managed via /v2/blocks on the Vultr API; OpenStack uses Cinder /v3/{project_id}/volumes.
  • Block Storage offers two performance tiers (HDD and NVMe) selected at create time; OpenStack Cinder uses volume types defined by the cloud operator.
  • Volumes are region-scoped and attach to a single instance at a time; the OpenStack multi-attach pattern is not exposed.
  • Size increases only (no shrink); same restriction exists on OpenStack but Vultr enforces it as a hard API rule.
Vultr docs ↗

VPC 2.0high

  • VPC 2.0 networks are region-scoped Layer-2 segments with customer-defined CIDR; OpenStack Neutron networks are project-scoped with explicit subnets and routers.
  • Instances attach to a VPC 2.0 by configuration interface rather than via Neutron ports; trunking is not the same model.
  • VPC 2.0 has no integrated router object; routing between VPCs requires an instance acting as a router, while OpenStack uses Neutron routers natively.
  • Legacy 'Private Network' and VPC 2.0 are distinct products on Vultr; OpenStack collapses these into Neutron network types (vlan, vxlan, geneve).
Vultr docs ↗

Firewall Groupshigh

  • Firewall Groups are managed at the account level and attached to one or more instances by reference; OpenStack security groups are per-port and project-scoped.
  • Rules apply only to inbound traffic on the public interface; outbound traffic is allowed by default with no rule surface, unlike Neutron security groups which have explicit ingress and egress rules.
  • Default policy is implicit-deny inbound on any port without a matching rule; OpenStack security groups follow the same default-deny model but allow explicit egress shaping.
  • Firewall Groups are free and have no per-instance attach limit documented; OpenStack security groups are likewise free but have different rule semantics (port + protocol + remote group).
Vultr docs ↗

Vultr Load Balancershigh

  • Vultr Load Balancers are a managed L4/L7 product configured per region with forwarding rules, health checks, and sticky sessions. Quake AI workloads use a self-managed reverse proxy or Kubernetes LoadBalancer Service.
  • A Vultr Load Balancer contains one or more frontend and backend forwarding rules. Self-managed Quake AI edges define listeners and upstreams in proxy or ingress configuration.
  • Vultr configures TLS termination with an inline certificate and key. Quake AI users manage TLS on the self-managed edge.
  • Vultr prices each managed Load Balancer separately. Size the compute used by a self-managed Quake AI edge instead.
Vultr docs ↗

How to migrate from Vultr to Quake AI with OpenTofu

Vultr and Quake AI attract similar audiences: cost-conscious engineers who self-manage infrastructure. If you already use Terraform or OpenTofu with the vultr provider, migrating to Quake AI is a provider swap with resource remapping.

Conceptual mapping#

Both platforms offer similar primitives, but the APIs and resource names differ:

ConceptVultr (vultr provider)Quake AI (OpenStack)
Providervultr/vultrterraform-provider-openstack/openstack
Compute Instancevultr_instanceopenstack_compute_instance_v2
Bare Metalvultr_bare_metal_serverNo equivalent (use openstack_compute_instance_v2 on the closest virtualized flavor).
Planvc2-1c-1gb, vhf-2c-4gb, vhp-4c-8gb, etc.s1a.small, m2a.large, c2a.xlarge, r2a.large, etc.
SSH keyvultr_ssh_keyopenstack_compute_keypair_v2
Reserved IP / Floating IPvultr_reserved_ipopenstack_networking_floatingip_v2
Firewall Groupvultr_firewall_group + vultr_firewall_ruleopenstack_networking_secgroup_v2 + openstack_networking_secgroup_rule_v2
Block Storagevultr_block_storageopenstack_blockstorage_volume_v3
VPC 2.0vultr_vpc2openstack_networking_network_v2 + openstack_networking_subnet_v2
Load Balancervultr_load_balancer (single resource with inline forwarding rules)Self-managed reverse proxy or API gateway instance with a floating IP
Object Storagevultr_object_storage (subscription)openstack_objectstorage_container_v1 (Swift) or S3 client via aws_s3_bucket against the Quake AI endpoint
VKE Clustervultr_kubernetesopenstack_containerinfra_cluster_v1 (Magnum) is the primary equivalent; self-managed RKE2 or k3s on Nova is the alternative. See migrate from VKE.
ImageVultr OS list (387 for Ubuntu 22.04, etc.)Quake AI images (Ubuntu-24.04, etc.)

Resource translation examples#

Compute Instance#

Vultr:

HCL
resource "vultr_instance" "web" {
  label    = "web-1"
  region   = "ewr"
  plan     = "vc2-2c-4gb"
  os_id    = 1743
}

Quake AI:

HCL
resource "openstack_compute_instance_v2" "web" {
  name        = "web-1"
  image_name  = "Ubuntu-24.04"
  flavor_name = "m2a.large"

  key_pair = openstack_compute_keypair_v2.main.name

  network {
    name = "PublicStatic"
  }
}

Firewall Group to security group#

Vultr:

HCL
resource "vultr_firewall_group" "web" {
  description = "web-firewall"
}

resource "vultr_firewall_rule" "http" {
  firewall_group_id = vultr_firewall_group.web.id
  protocol          = "tcp"
  ip_type           = "v4"
  subnet            = "0.0.0.0"
  subnet_size       = 0
  port              = "80"
}

resource "vultr_firewall_rule" "https" {
  firewall_group_id = vultr_firewall_group.web.id
  protocol          = "tcp"
  ip_type           = "v4"
  subnet            = "0.0.0.0"
  subnet_size       = 0
  port              = "443"
}

Quake AI:

HCL
resource "openstack_networking_secgroup_v2" "web" {
  name = "web-secgroup"
}

resource "openstack_networking_secgroup_rule_v2" "http" {
  security_group_id = openstack_networking_secgroup_v2.web.id
  direction         = "ingress"
  ethertype         = "IPv4"
  protocol          = "tcp"
  port_range_min    = 80
  port_range_max    = 80
  remote_ip_prefix  = "0.0.0.0/0"
}

resource "openstack_networking_secgroup_rule_v2" "https" {
  security_group_id = openstack_networking_secgroup_v2.web.id
  direction         = "ingress"
  ethertype         = "IPv4"
  protocol          = "tcp"
  port_range_min    = 443
  port_range_max    = 443
  remote_ip_prefix  = "0.0.0.0/0"
}

Apply the security group to instances via the security_groups argument on openstack_compute_instance_v2. Note that Vultr Firewall Groups attach to instances by reference (no IaC join resource); Neutron security groups attach via the security_groups argument on the compute instance.

Block Storage#

Vultr:

HCL
resource "vultr_block_storage" "data" {
  label    = "data-vol"
  size_gb  = 50
  region   = "ewr"
}

Quake AI:

HCL
resource "openstack_blockstorage_volume_v3" "data" {
  name = "data-vol"
  size = 50
}

Volume attachment and formatting happen through openstack_compute_volume_attach_v2 and cloud-init, respectively.

VPC 2.0#

Vultr VPC 2.0 is a single resource that bundles network and CIDR; Quake AI exposes network and subnet independently.

Vultr:

HCL
resource "vultr_vpc2" "main" {
  region         = "ewr"
  description    = "main-vpc"
  ip_type        = "v4"
  ip_block       = "10.0.0.0"
  prefix_length  = 24
}

Quake AI:

HCL
resource "openstack_networking_network_v2" "main" {
  name = "main-network"
}

resource "openstack_networking_subnet_v2" "private" {
  name       = "private"
  network_id = openstack_networking_network_v2.main.id
  cidr       = "10.0.0.0/24"
  ip_version = 4
}

Vultr Load Balancer to a self-managed edge proxy#

Replace a Vultr Load Balancer with a Caddy, Nginx, HAProxy, or API gateway instance on a private network. Attach one floating IP to the edge instance, terminate TLS there, and route requests to backend instance ports over private addresses. The Edge Reverse Proxy template provides a Caddy-based starting point, while the API Gateway template adds API routing and policy controls.

Vultr:

HCL
resource "vultr_load_balancer" "web" {
  region              = "ewr"
  label               = "web-lb"
  balancing_algorithm = "roundrobin"

  forwarding_rules {
    frontend_protocol = "tcp"
    frontend_port     = 80
    backend_protocol  = "tcp"
    backend_port      = 80
  }

  attached_instances = [vultr_instance.web.id]
}

Model the replacement in OpenTofu as:

  • One openstack_compute_instance_v2 edge instance running the proxy.
  • One openstack_networking_port_v2 on the application subnet.
  • One openstack_networking_floatingip_v2 associated with the edge port.
  • Security group rules for ports 80 and 443 on the edge, with backend ports restricted to the edge instance's private address.
  • Proxy configuration that lists each backend private address and its health-check path.

Migration workflow#

  1. Export your Vultr state. Run tofu show (or terraform show) to document current resources.
  2. Map Vultr plans to Quake AI flavors. Compare vCPU/RAM specs between Vultr plan SKUs and Quake AI flavors. See migrate from Vultr (compute) for a per-family mapping.
  3. Rewrite the provider block. Replace vultr/vultr with terraform-provider-openstack/openstack. Authenticate via standard OS_* environment variables (or cloud: blocks).
  4. Translate resources. Start with a single instance and security group, then add networking and storage.
  5. Set up data migration. For volumes, use rsync or scp to copy data between instances. For S3-compatible storage, use rclone. See migrate from Vultr Object Storage.
  6. Test with tofu plan. Validate the configuration before applying.
  7. Apply and verify. Deploy on Quake AI and confirm services are reachable.

Key differences from Vultr#

  • Authentication. The Vultr provider takes a single API key. The OpenStack provider uses Keystone with username, password, project, and domain set via environment variables (or application credentials, which are the recommended path for CI).
  • Networking model. Vultr auto-assigns a public IPv4 to every instance. Quake AI uses Floating IPs that you allocate explicitly and associate with a port.
  • Firewall vs security group. Vultr Firewall Groups are account-level standalone resources attached to instances by reference. Quake AI security groups attach to ports/instances with individual rules as separate resources.
  • Object storage. Both Vultr and Quake AI expose S3-compatible object storage; for IaC, see the S3 Storage with ACLs template.
  • Managed Kubernetes. Map vultr_kubernetes to openstack_containerinfra_cluster_v1 (Magnum) for the closest VKE-like experience; the platform provides the cluster template, control plane, and load-balanced API endpoint. If you need a custom CNI, kubelet flags, CRI, or a Kubernetes version outside the template catalog, provision Nova instances with OpenTofu and bootstrap with kubeadm, k3s, or rke2 instead. See migrate from VKE.
  • Pricing model. Vultr bills hourly with a monthly cap; Quake AI uses fixed monthly plans tied to a resource tier, with a small list of per-resource add-ons. See the pricing model. Compare plan and add-on costs in the Vultr pricing page and the Quake AI dashboard before you commit.

See also#

Usage Guidelines

The sample code, software libraries, command line tools, proofs of concept, templates, and other related technology on this page (including any of the foregoing that is provided by Quake AI personnel) is provided to you as Quake AI Content under the Quake AI Customer Agreement, or the relevant written agreement between you and Quake AI (whichever applies). Do not use this Quake AI Content in your production accounts, or on production or other critical data. You are responsible for testing, securing, and optimizing the Quake AI Content (such as sample code) as appropriate for production grade use based on your specific quality control practices and standards. Deploying Quake AI Content may incur Quake AI charges for creating or using Quake AI chargeable resources, such as running Compute instances or storing data in Object Storage. Your use is also subject to the Acceptable Use Policy.

Comparisons to third-party providers in this material reflect publicly documented behavior as of the validation date below. Pricing, quotas, service limits, and feature availability change frequently on every cloud. Verify provider-specific claims against the provider's own current documentation before relying on them for a procurement, architecture, or migration decision.

For the full policy, see Usage Guidelines.

Last validated: 19.06.2026

Was this page helpful?