Multi-cloud infrastructure provisioning CLI. Deploy VMs, networks, and load balancers across AWS, Azure, GCP, and DigitalOcean using Terraform with built-in security hardening.
# Validate prerequisites (Terraform + cloud credentials)
$ spinup validate
# Provision a VM interactively
$ spinup provision
# Or provision with CLI arguments
$ spinup provision --cloud aws --region us-east-1 --resource vm --name my-server -y
# List all resources
$ spinup list
# Destroy a resource
$ spinup destroy --name my-server -yAWS, Azure, GCP, and DigitalOcean with identical interface. 12 Terraform templates for all resource/provider combinations.
VM, Network, and LoadBalancer. Each generates production-ready Terraform configurations with proper security groups.
Deploy complete application stacks (small/medium/large/xl) with a single command. 16 built-in stack templates.
Automatic VM hardening: UFW firewall, fail2ban, SSH hardening, kernel hardening, IP whitelisting.
| Option | Alias | Description |
|---|---|---|
--cloud | -c | aws, azure, gcp, or digitalocean |
--region | -r | Cloud region (e.g., us-east-1) |
--resource | --type | vm, network, or loadbalancer |
--name | -n | Resource name |
--instance-type | --size | Instance type (default varies) |
--security-level | - | minimal, default, or maximum |
--ssh-port | - | Custom SSH port (default: 22) |
--auto-approve | -y | Skip confirmation prompts |
| Command | Description |
|---|---|
spinup list | List all provisioned resources |
spinup destroy --name <n> | Destroy a provisioned resource |
spinup plan --name <n> | Show Terraform plan without applying |
spinup validate | Check prerequisites and credentials |
Deploy complete application stacks with a single command. Choose from 4 predefined templates across all cloud providers.
| Size | VMs | Network | LB | Description |
|---|---|---|---|---|
| small | 2 | No | No | 1 web + 1 database |
| medium | 3 | Yes | No | 2 web + 1 database |
| large | 4 | Yes | Yes | 3 web + 1 data (db+cache) |
| xl | 7 | Yes | Yes | 4 web + 2 db + 1 cache |
# Create a large stack on AWS
$ spinup stack create --template large --cloud aws --region us-east-1 --name myapp -y
# List all stacks
$ spinup stack list
# View available templates
$ spinup stack templates
# Destroy an entire stack
$ spinup stack destroy --name myapp -y{
"name": "myapp",
"cloud": "aws",
"region": "us-east-1",
"securityLevel": "default",
"resources": [
{ "type": "network", "name": "network", "cidr": "10.0.0.0/16" },
{ "type": "loadbalancer", "name": "lb", "port": 80 },
{ "type": "vm", "name": "web", "count": 3, "instanceType": "t3.small" },
{ "type": "vm", "name": "db", "count": 1, "instanceType": "t3.large" }
]
}All VMs are automatically hardened by default. Your public IP is auto-detected and whitelisted for SSH access.
| Feature | Minimal | Default | Maximum |
|---|---|---|---|
| Auto Security Updates | Yes | Yes | Yes |
| Disable Root SSH | Yes | Yes | Yes |
| Key-Only SSH Auth | - | Yes | Yes |
| UFW Firewall + IP Whitelist | Yes | Yes | Yes |
| Fail2ban | - | Yes | Yes |
| Kernel Hardening | - | Yes | Yes |
| Remove Unnecessary Packages | - | - | Yes |
| Disable IPv6 | - | - | Yes |
export AWS_ACCESS_KEY_ID=xxx
export AWS_SECRET_ACCESS_KEY=xxxRegions: us-east-1, us-west-2, eu-west-1, eu-central-1, ap-south-1, ...
export ARM_CLIENT_ID=xxx
export ARM_CLIENT_SECRET=xxx
export ARM_SUBSCRIPTION_ID=xxx
export ARM_TENANT_ID=xxxRegions: eastus, westus2, northeurope, westeurope, ...
export GOOGLE_APPLICATION_CREDENTIALS=/path/to/key.json
export GOOGLE_CLOUD_PROJECT=my-project-idRegions: us-central1, us-east1, europe-west1, asia-east1, ...
export DIGITALOCEAN_TOKEN=your-api-tokenRegions: nyc1, nyc3, sfo3, ams3, sgp1, lon1, fra1
SSH keys are automatically generated and stored locally. Default usernames vary by cloud provider.
| Provider | Username | Key Location |
|---|---|---|
| AWS | ubuntu | ~/.spinup/workspaces/<name>/<name>_ssh_key.pem |
| Azure | azureuser | ~/.spinup/workspaces/<name>/<name>_ssh_key.pem |
| GCP | ubuntu | ~/.spinup/workspaces/<name>/<name>_ssh_key.pem |
| DigitalOcean | root | ~/.spinup/workspaces/<name>/<name>_ssh_key.pem |
# Connect to an AWS VM
$ ssh -i ~/.spinup/workspaces/my-server/my-server_ssh_key.pem ubuntu@<public-ip>
# Connect with custom SSH port
$ ssh -i ~/.spinup/workspaces/my-server/my-server_ssh_key.pem -p 2222 ubuntu@<public-ip>
# Verify security hardening was applied
$ cat /var/log/spinup-security.log
$ sudo ufw status verbose
$ sudo fail2ban-client status sshdRequired runtime for the CLI tool.
Must be in PATH. Verify with terraform version.
Environment variables for your chosen cloud provider.