This tutorial walks through provisioning your first virtual machine on ZCP, from account creation to accessing your VM.
Prerequisites
- A ZCP account (create one here, $300 launch credit, no payment upfront)
Step 1: Log in to the portal
Go to cloud.zcp.zsoftly.ca and log in with your account credentials.
Step 2: Create a VM
Go to Compute > Instances and click Add Instance.
Configure the VM:
| Setting | Value |
|---|---|
| Zone | YUL (recommended) |
| Template | Ubuntu 24.04 LTS |
| Compute offering | Large, 2 vCPU, 4 GB RAM |
| Root disk | 80 GB |
| Network | Default VPC |
Click Launch Virtual Machine.
The VM will be running within 30-60 seconds.
Step 3: Access your VM via console
Click your VM in the portal and open the Console tab. This launches a browser-based noVNC terminal session over HTTPS. No client software or SSH keys needed. You get a terminal directly in your browser.
This works for all accounts, regardless of network tier.
Step 4: SSH access (VPN customers)
If your account includes VPN access, your VM gets a public IP with Source NAT networking. SSH directly:
ssh ubuntu@YOUR_PUBLIC_IP
VPN customers configure firewall rules in the portal under Network > Firewall to open additional ports (HTTP, HTTPS, etc.).
To get VPN access, email info@zsoftly.com and request VPN onboarding. You will need Tailscale installed on your local machine. Our team will provision your account on the ZCP Tailscale network and confirm access.
Step 5: Expose services to the internet
YUL is the recommended region for public IP workloads and critical production. If you deploy in YOW, public IPv4 availability is limited, so private and non-critical workloads are the better fit there.
Option A: Tailscale Funnel (recommended if you have VPN access)
If you already have Tailscale installed for VPN, Funnel is the simplest path:
# On your VM, enable Funnel for your service
tailscale funnel 8080
Your service is now reachable at https://your-machine.tailnet-name.ts.net. One command, no extra setup.
Option B: Cloudflare Tunnel
# Install cloudflared
curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg | sudo tee /usr/share/keyrings/cloudflare-main.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/cloudflared.list
sudo apt update && sudo apt install -y cloudflared
# Authenticate and create a tunnel
cloudflared tunnel login
cloudflared tunnel create my-app
cloudflared tunnel route dns my-app my-app.example.com
# Run the tunnel
cloudflared tunnel --url http://localhost:8080 run my-app
Your service is now reachable at my-app.example.com. Free tier available.
Option C: Open-source alternatives
- frp: self-hosted reverse proxy. No third-party dependency if you have a server with a public IP.
- bore: minimal open-source tunnel. Single binary.
- SSH reverse tunnel:
ssh -R 80:localhost:8080 your-public-serverworks if you have any machine with a public IP.
Region guidance
If the workload needs straightforward public exposure, deploy it in YUL. Use YOW for internal services, private networking, non-critical production, or dev/test where direct public IPv4 is not the main requirement.
What to build next
From here:
- Attach block storage for persistent data volumes
- Set up a VPC with private networking between multiple VMs
- Install a one-click app from the marketplace (WordPress, GitLab, Docker)
- Enable observability to monitor your VM metrics
Each of these is covered in the ZCP documentation.
Cost
A 2 vCPU / 4 GB VM on the Large plan costs $48/month, billed hourly. Your $300 launch credit is valid for 60 days from account creation, so it can cover this VM while the credit remains available. No payment method required upfront. After the launch credit is consumed or expires, usage moves to post-paid billing. Each account includes resource quotas to prevent abuse.