Quick start
Get VAC running on a fresh VPS and ship your first app in about fifteen minutes.
You'll need a small Linux box, optionally a domain pointed at it, and a Git repository to deploy.
Before you begin
Make sure you have:
- A Linux VPS (Debian 12 / Ubuntu 22.04+ recommended). VAC's control plane idles under 200 MB RAM excluding the database, so a 1–2 vCPU box leaves plenty for your apps.
- Root or
sudoaccess. - Docker Engine with the Compose v2 plugin. The installer will offer to install Docker for you if it's missing.
- (Optional but recommended) a domain, with a
vac.<domain>record and a wildcard*.<domain>A record pointing at the box. Without a domain the dashboard stays on plain HTTP athttp://<host>:9393.
VAC is designed for a single machine. The control plane and your apps live on the same host — there's no multi-node mode. That's the point: a complete PaaS you can reason about end to end.
Install the VAC control plane
SSH into your VPS and run the installer. It pulls the prebuilt compose stack (vac-db, vac-api, vac-proxy), generates secrets, and brings everything up.
curl -sSL get.vac.vojir.io | sudo shRun it in a terminal and it walks you through a short setup — domain, managed services, sudo-free access — and shows a summary before touching the host. Piped without a terminal (CI, provisioning) it runs unattended with safe defaults.
To pin a version and set the domain up front (which skips the matching prompts):
VAC_VERSION=v0.5.0 VAC_DOMAIN=example.com sh install.shSee Installation for every option, flag, and what gets written where.
Point DNS at the box
If you set a domain, add two records so the dashboard and your apps resolve. Both point at the same host IP:
vac IN A 203.0.113.42 ## the dashboard → https://vac.example.com
* IN A 203.0.113.42 ## every app → https://{app}.example.comCaddy (bundled as vac-proxy) requests certificates from Let's Encrypt on demand the first time each hostname is hit — no manual cert wrangling. The first dashboard load may take a few seconds while the cert is issued.
Create the first operator account
The installer prints a one-time setup link in its summary, along with the dashboard URL. Open it and create your admin account:
- With a domain:
https://vac.example.com - Without:
http://<host>:9393
You can enable TOTP two-factor auth right away — VAC uses it both for login and as step-up confirmation for destructive actions.
Connect your first repository
In the dashboard, click New app and paste a Git URL. VAC accepts:
- Public HTTPS —
https://github.com/you/app.git, no credentials needed. - SSH —
git@github.com:you/app.git. VAC mints a per-app deploy key; copy its public half into your repo's deploy keys.
Pick a branch (defaults to main). VAC detects how to build the repo automatically — a Compose file, a Dockerfile, or a recognised framework. See Build settings for the detection order and how to override it.
Deploy
Hit Deploy. VAC clones the repo, builds the stack, brings it up, and gates the rollout on a Caddy health check before flipping the app to running. Build and runtime logs stream live into the dashboard the whole time.
Your app is reachable at https://{app}.example.com, terminated with a valid HTTPS cert and restarting itself on crash. A failed deploy never tears down the running version — the previous one keeps serving while the failure is recorded as state.
Deploy on every push
Want push-to-deploy? Each app exposes an inbound webhook. Add the webhook URL to your repo's settings, then create a deploy trigger (e.g. push to main, or tags matching v*). VAC validates the signature and redeploys on matching events. See Webhooks.
What's next
Environment variables & secrets
Inject runtime config and secrets, encrypted at rest.
Custom domains
Point a bare domain at a service and let Caddy issue the cert.
Backups
Schedule per-service backups to local disk or S3.
The vac CLI
Host-ops commands: status, logs, upgrade, set-domain.