How to migrate from Vultr to Quake AI with OpenTofu
Coming from another cloud?
▸Vultr·Cloud Compute / Bare Metal Instances, Block Storage, VPC 2.0, Firewall Groups, Load Balancers
Cloud Compute / Bare Metal Instances
- 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.
Block Storage
- 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.
VPC 2.0
- 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).
Firewall Groups
- 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 Load Balancers
- 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.
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:
| Concept | Vultr (vultr provider) | Quake AI (OpenStack) |
|---|---|---|
| Provider | vultr/vultr | terraform-provider-openstack/openstack |
| Compute Instance | vultr_instance | openstack_compute_instance_v2 |
| Bare Metal | vultr_bare_metal_server | No equivalent (use openstack_compute_instance_v2 on the closest virtualized flavor). |
| Plan | vc2-1c-1gb, vhf-2c-4gb, vhp-4c-8gb, etc. | s1a.small, m2a.large, c2a.xlarge, r2a.large, etc. |
| SSH key | vultr_ssh_key | openstack_compute_keypair_v2 |
| Reserved IP / Floating IP | vultr_reserved_ip | openstack_networking_floatingip_v2 |
| Firewall Group | vultr_firewall_group + vultr_firewall_rule | openstack_networking_secgroup_v2 + openstack_networking_secgroup_rule_v2 |
| Block Storage | vultr_block_storage | openstack_blockstorage_volume_v3 |
| VPC 2.0 | vultr_vpc2 | openstack_networking_network_v2 + openstack_networking_subnet_v2 |
| Load Balancer | vultr_load_balancer (single resource with inline forwarding rules) | Self-managed reverse proxy or API gateway instance with a floating IP |
| Object Storage | vultr_object_storage (subscription) | openstack_objectstorage_container_v1 (Swift) or S3 client via aws_s3_bucket against the Quake AI endpoint |
| VKE Cluster | vultr_kubernetes | openstack_containerinfra_cluster_v1 (Magnum) is the primary equivalent; self-managed RKE2 or k3s on Nova is the alternative. See migrate from VKE. |
| Image | Vultr OS list (387 for Ubuntu 22.04, etc.) | Quake AI images (Ubuntu-24.04, etc.) |
Resource translation examples#
Compute Instance#
Vultr:
resource "vultr_instance" "web" {
label = "web-1"
region = "ewr"
plan = "vc2-2c-4gb"
os_id = 1743
}Quake AI:
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:
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:
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:
resource "vultr_block_storage" "data" {
label = "data-vol"
size_gb = 50
region = "ewr"
}Quake AI:
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:
resource "vultr_vpc2" "main" {
region = "ewr"
description = "main-vpc"
ip_type = "v4"
ip_block = "10.0.0.0"
prefix_length = 24
}Quake AI:
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:
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_v2edge instance running the proxy. - One
openstack_networking_port_v2on the application subnet. - One
openstack_networking_floatingip_v2associated 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#
- Export your Vultr state. Run
tofu show(orterraform show) to document current resources. - 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.
- Rewrite the provider block. Replace
vultr/vultrwithterraform-provider-openstack/openstack. Authenticate via standardOS_*environment variables (orcloud:blocks). - Translate resources. Start with a single instance and security group, then add networking and storage.
- Set up data migration. For volumes, use
rsyncorscpto copy data between instances. For S3-compatible storage, userclone. See migrate from Vultr Object Storage. - Test with
tofu plan. Validate the configuration before applying. - 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_kubernetestoopenstack_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 withkubeadm,k3s, orrke2instead. 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#
- Migration Explorer: interactive service comparison across cloud providers
- IaC on Quake AI
- Simple VM template
- Infrastructure Templates
- How to get started with Infrastructure as Code on Quake AI
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
See Also
Terraform and OpenTofu on Quake AI
Prerequisite
How to migrate from AWS CloudFormation to OpenTofu on Quake AI
Shares: IaC, Terraform
How to migrate from Docker Compose to OpenTofu on Quake AI
Shares: IaC, Terraform
How to migrate from Hetzner Cloud to Quake AI with OpenTofu
Shares: IaC, Terraform
How to migrate from Linode (Akamai) to Quake AI with OpenTofu
Shares: IaC, Terraform