Skitflow
Self-hosted

Cloud Providers & VM Provisioning

Connect VMware vCenter or Proxmox VE to Skitflow and provision VMs directly from the dashboard (self-hosted + enterprise only).

Cloud Providers are self-hosted only and require an active enterprise license or trial with the cloudProviders feature enabled.

Skitflow can connect to on-premises hypervisors and provision virtual machines on demand. Supported backends:

TypeHypervisor
vmwareVMware vCenter (ESXi)
proxmoxProxmox VE

Permissions

Three roles govern access. Owners and admins bypass permission checks automatically.

PermissionWhat it allows
cloud.manageCreate/update/delete providers, VM tiers, and VM orders
cloud.orderOrder VMs and delete their org's VM orders
cloud.readRead-only access to providers, tiers, and orders

Configure roles under Settings → Custom Roles.

Cloud Providers

A cloud provider is the connection record for a hypervisor endpoint. Credentials are stored AES-GCM encrypted.

Adding a provider

Navigate to Settings → Cloud Providers → Add Provider and fill in:

FieldDescription
NameDisplay label
Typevmware or proxmox
HostvCenter/Proxmox hostname or IP
Auth modepassword (username + password) or token (API token)
UsernameService account username
Password / TokenCredential (write-only — not readable after save)
Skip TLS verificationDisable certificate verification for self-signed certs

Click Test Connection to verify before saving.

Managing providers

ActionNotes
EditAll fields except type can be updated. Password is re-encrypted only when a new value is submitted.
DeleteRemoves the provider record. Associated VM tiers and VM order (provision) records are cascade-deleted. Registered server rows and running VMs are not touched.
InventoryFetches the live resource list from the hypervisor (networks, datastores, templates, resource pools for VMware; nodes, storages, bridges, templates for Proxmox).

API examples

# List providers
curl -X GET 'https://your-instance/api/cloud.listProviders' \
  -H 'x-api-key: YOUR_API_KEY'

# Create a VMware provider
curl -X POST 'https://your-instance/api/cloud.createProvider' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
    "name": "vCenter Dev",
    "providerType": "vmware",
    "authMode": "password",
    "host": "vcenter.internal",
    "username": "[email protected]",
    "password": "secret",
    "skipTlsVerify": false
  }'

# Test a connection without saving
curl -X POST 'https://your-instance/api/cloud.testProvider' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
    "providerType": "proxmox",
    "authMode": "token",
    "host": "proxmox.internal:8006",
    "username": "root@pam",
    "password": "TOKEN_VALUE",
    "skipTlsVerify": true
  }'

VM Tiers

A VM tier is a saved hardware + placement template attached to one provider. Members with cloud.order can order VMs from tiers without needing cloud.manage.

VMware tier placement fields

FieldDescription
templateMoidSource VM/template managed object ID
networkMoidTarget network/portgroup MOID
datastoreMoidTarget datastore MOID
resourcePoolMoidResource pool MOID
folderMoid(optional) Destination folder MOID

Proxmox tier placement fields

FieldDescription
templateVmidSource template VMID
nodeTarget Proxmox node name
storageId(optional) Storage for the cloned disk
bridge(optional) Network bridge; if omitted, the template's existing network config is kept. vlanTag is only applied when bridge is set.
vlanTag(optional) VLAN tag 1–4094
ipAddress(optional) Static IP for cloud-init
ipCidr(optional) Prefix length (0–32)
gateway(optional) Default gateway
sshUsername(optional) Username injected via cloud-init
extraDiskGb(optional) Additional data disk size
extraDiskStorageId(optional) Storage for the extra disk

Common hardware fields (both types)

FieldDescription
cpuvCPU count (≥ 1)
memoryMbRAM in MiB (≥ 256)
diskGbRoot disk size in GiB (≥ 1)
sshKeyId(optional) SSH key to inject (must belong to the same org)
cloudInitExtra(optional) Additional cloud-init user-data

API examples

# List tiers for a provider
curl -X GET 'https://your-instance/api/cloud.listTiers?cloudProviderId=PROVIDER_ID' \
  -H 'x-api-key: YOUR_API_KEY'

# Create a Proxmox tier
curl -X POST 'https://your-instance/api/cloud.createTier' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
    "name": "2vCPU / 4 GB",
    "cloudProviderId": "PROVIDER_ID",
    "cpu": 2,
    "memoryMb": 4096,
    "diskGb": 40,
    "placement": {
      "kind": "proxmox",
      "templateVmid": 9000,
      "node": "pve01",
      "bridge": "vmbr0"
    }
  }'

VM Provisioning

A VM provision (order) tracks one VM lifecycle from request through hypervisor deployment to a registered Skitflow server.

Ordering a VM

Navigate to Settings → Servers → Order VM (also available from Settings → Cloud Providers). Choose a saved tier or fill in ad-hoc custom parameters.

For Proxmox orders from a tier, you can override the IP address and extra disk at order time without changing the tier.

Order payload (from tier)

curl -X POST 'https://your-instance/api/cloud.orderVm' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
    "vmName": "app-01",
    "vmTierId": "TIER_ID"
  }'

Order payload (custom, VMware)

curl -X POST 'https://your-instance/api/cloud.orderVm' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
    "vmName": "app-02",
    "cloudProviderId": "PROVIDER_ID",
    "custom": {
      "kind": "vmware",
      "cpu": 4,
      "memoryMb": 8192,
      "diskGb": 80,
      "templateMoid": "vm-100",
      "networkMoid": "network-10",
      "datastoreMoid": "datastore-5",
      "resourcePoolMoid": "resgroup-8"
    }
  }'

Provision status lifecycle

pending → cloning → customizing ─┬→ waiting_ip → ready
                                  │                ↘ failed
                                  └──────────────────↘ manual
StatusMeaning
pendingQueued, not yet started
cloningHypervisor is cloning the template
customizingApplying CPU/RAM/disk/network configuration
waiting_ipWaiting for the VM to report an IP address. Skipped entirely for a Proxmox order with a static ipAddress — that address is used directly.
readyVM is running and registered as a Skitflow server
failedProvisioning failed — see errorMessage on the provision record
manualVM was created but requires manual server registration — either no SSH key/cloud-init failed (reached straight from customizing) or the IP poll timed out after waiting_ip. errorMessage states which case applies.

Once ready, the provisioned VM appears in Servers and can be used for deployments.

Deleting a provision

Deleting a provision:

  1. Destroys the VM on the hypervisor (best-effort — a connection failure is logged but does not block deletion).
  2. Removes the linked server record from the Servers list.
  3. Deletes the provision row.
curl -X POST 'https://your-instance/api/cloud.removeProvision' \
  -H 'x-api-key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"vmProvisionId": "PROVISION_ID"}'

Audit log

Every create, update, and delete action on providers, tiers, and provisions is recorded in Audit Logs under resource types cloud-provider, vm-tier, and vm-provision.

On this page