Terraform Provider
Manage ServersCamp infrastructure as code with our official Terraform provider.
Installation
Add the provider to your Terraform configuration:
versions.tf
terraform {
required_providers {
serverscamp = {
source = "serverscamp/serverscamp"
version = "~> 1.0"
}
}
}
Then run:
Terminal
terraform init
Provider Configuration
Configure the provider with your API token:
provider.tf
provider "serverscamp" {
# Token can also be set via SERVERSCAMP_API_TOKEN env var
api_token = var.serverscamp_token
}
Environment Variables
| Variable | Description |
|---|---|
SERVERSCAMP_API_TOKEN | API token for authentication |
Resources
serverscamp_vm
Manages a virtual machine instance.
vm.tf
resource "serverscamp_vm" "web" {
display_name = "web-server"
vm_class_id = "burst-xs"
vm_template_id = "ubuntu-25.04"
storage_class_id = "standard-storage"
network_class_id = "baseline-network"
disk_gb = 20
network_id = serverscamp_network.main.id
ssh_key_id = serverscamp_ssh_key.deploy.id
assign_public_ips = true
}
output "vm_ip" {
value = serverscamp_vm.web.public_ipv4
}
Arguments
| Name | Type | Description |
|---|---|---|
display_name | string | Optional. Human-readable name |
vm_class_id | string | Required. VM class (CPU/RAM) |
vm_template_id | string | Required. OS template |
storage_class_id | string | Required. Storage tier |
network_class_id | string | Required. Network tier |
disk_gb | number | Required. Disk size in GB |
network_id | string | Required. Network UUID |
ssh_key_id | string | Optional. SSH key ID |
assign_public_ips | bool | Optional. Assign public IPs |
Attributes
| Name | Description |
|---|---|
id | VM UUID |
state | Current state (running, stopped, etc.) |
internal_ip | Private IP address |
public_ipv4 | Public IPv4 address |
public_ipv6 | Public IPv6 address |
serverscamp_network
Manages a virtual private network (VPC).
network.tf
resource "serverscamp_network" "main" {
display_name = "production"
cidr = "10.0.0.0/24"
router_id = serverscamp_router.gateway.id
}
serverscamp_router
Manages an internet gateway router.
router.tf
resource "serverscamp_router" "gateway" {
display_name = "main-gateway"
}
output "router_ip" {
value = serverscamp_router.gateway.public_ipv4
}
serverscamp_ssh_key
Manages an SSH public key.
ssh.tf
resource "serverscamp_ssh_key" "deploy" {
name = "deploy-key"
public_key = file("~/.ssh/id_rsa.pub")
}
serverscamp_bucket
Manages an S3-compatible storage bucket.
bucket.tf
resource "serverscamp_bucket" "assets" {
name = "my-app-assets"
}
output "bucket_endpoint" {
value = serverscamp_bucket.assets.endpoint
}
Data Sources
serverscamp_vm_classes
List available VM classes.
data.tf
data "serverscamp_vm_classes" "all" {}
output "available_classes" {
value = data.serverscamp_vm_classes.all.classes
}
serverscamp_vm_templates
List available OS templates.
data.tf
data "serverscamp_vm_templates" "all" {}
# Filter Ubuntu templates
locals {
ubuntu_templates = [
for t in data.serverscamp_vm_templates.all.templates :
t if can(regex("ubuntu", lower(t.name)))
]
}
Complete Example
Deploy a web server with networking:
main.tf
terraform {
required_providers {
serverscamp = {
source = "serverscamp/serverscamp"
version = "~> 1.0"
}
}
}
provider "serverscamp" {}
# Router for internet access
resource "serverscamp_router" "main" {
display_name = "main-router"
}
# Private network
resource "serverscamp_network" "app" {
display_name = "app-network"
cidr = "10.0.1.0/24"
router_id = serverscamp_router.main.id
}
# SSH key
resource "serverscamp_ssh_key" "admin" {
name = "admin-key"
public_key = file("~/.ssh/id_rsa.pub")
}
# Web server
resource "serverscamp_vm" "web" {
display_name = "web-01"
vm_class_id = "burst-xs"
vm_template_id = "ubuntu-25.04"
storage_class_id = "standard-storage"
network_class_id = "baseline-network"
disk_gb = 20
network_id = serverscamp_network.app.id
ssh_key_id = serverscamp_ssh_key.admin.id
assign_public_ips = true
}
output "web_server_ip" {
value = serverscamp_vm.web.public_ipv4
}
output "ssh_command" {
value = "ssh scamp@${serverscamp_vm.web.public_ipv4}"
}