Installation
Install Vardo on your server with a single command or manually via Docker Compose.
Prerequisites
Minimum requirements
Your server needs at least 1 GB RAM and 2 GB free disk space. 2 GB+ RAM and 20 GB+ disk are recommended for production. Ports 80 (HTTP) and 443 (HTTPS) must be accessible.
- Server: Linux VPS or dedicated server — Ubuntu 22.04+ or Debian 12+ (these are the only distros where the install script can automate package installation). The script detects Fedora, Rocky, Alma, Arch, Alpine, and RHEL/CentOS but cannot install packages on them — you'd need to install Docker and dependencies manually. macOS is supported for local development only (Docker Desktop required). WSL is detected but untested.
- Domain: A domain you control with access to DNS settings
Docker and Docker Compose are installed automatically by the install script if not already present.
One-command install
curl -fsSL https://vardo.run/install.sh | sudo bashThe installer prompts for an instance role first:
| Role | Use case |
|---|---|
| Production | Public server with TLS and domains |
| Staging | Testing environment (homelab, VPS) — domain is optional |
| Development | Local development |
For production installs, the script then prompts for three values:
- Dashboard domain — where the Vardo UI will be accessible (e.g.
vardo.example.com) - Base domain — the root domain for auto-generated app subdomains (e.g.
example.com) - ACME email — the email address for Let's Encrypt TLS certificates
What the installer does
The install script runs these steps in order:
- System checks — Verifies OS compatibility, RAM (minimum 1 GB, warns below 2 GB), available disk space (minimum 2 GB, warns below 20 GB) and required ports.
- Swap file — Creates a 2 GB swap file on servers with less than 4 GB RAM, if no swap is already active. Skipped on macOS.
- Packages — Installs
curl,gitandunattended-upgrades(automatic security updates) via your system's package manager. Installs Docker Engine and the Compose plugin if not present, then configures log rotation (10 MB x 3 files per container). - Clone — Clones the Vardo repository to
/opt/vardo(or pulls latest if already installed). - Configuration — Prompts for role, domain, base domain and ACME email. Generates random secrets for the database password, auth secret, encryption master key and Traefik dashboard credentials. Writes everything to
/opt/vardo/.env. - DNS validation — Detects the server's public IP and checks whether the dashboard domain resolves to it. Warns if DNS isn't configured but allows continuing.
- Build and start — Runs
docker compose buildanddocker compose up -d. - Health check — Waits up to 60 seconds for the app to respond on
/api/health. - Template seeding — Seeds the built-in service templates (PostgreSQL, Redis, MySQL, etc.) via an internal API call.
The installer does not configure a firewall. Docker publishes ports directly via iptables, bypassing ufw by default. Firewall setup is left to you.
DNS setup
Before or after installation, create two DNS records pointing to your server's IP:
| Type | Name | Value |
|---|---|---|
| A | vardo.example.com | <server-ip> |
| A | *.example.com | <server-ip> |
The first record routes traffic to the Vardo dashboard. The wildcard record lets Vardo auto-create subdomains for deployed apps (e.g. myapp.example.com).
The dashboard domain and base domain can use the same root domain or be entirely different. DNS propagation typically takes a few minutes but can take up to 48 hours.
Manual installation
If you prefer not to use the install script:
# Clone the repository
git clone --depth 1 https://github.com/joeyyax/vardo.git /opt/vardo
cd /opt/vardo
# Copy and edit the environment file
cp .env.example .env
# Edit .env with your values — see Configuration docs for details
# Build and start
docker compose up -dThe production Docker Compose stack includes these services:
| Service | Description |
|---|---|
| vardo-frontend | Next.js application (port 3000 internal) |
| vardo-postgres | PostgreSQL 17 database |
| vardo-redis | Redis Stack server |
| vardo-traefik | Reverse proxy with automatic TLS |
| vardo-cadvisor | Container resource monitoring |
| vardo-loki | Log aggregation |
| vardo-promtail | Log collector (ships Docker container logs to Loki) |
| vardo-wireguard | WireGuard tunnel for mesh networking |
Post-install
After installation:
- Visit
http://<your-server-ip>:3000in your browser (orhttps://your-domain.comif you configured a domain during setup). - Walk through the setup wizard — create your admin account, optionally configure email, backups, GitHub and DNS.
- Create your first organization and start deploying.
Useful commands
After installation, management goes through the install script at /opt/vardo/install.sh.
# Re-run from installed location (shows interactive menu)
sudo bash /opt/vardo/install.sh
# Specific commands
sudo bash /opt/vardo/install.sh update # Pull latest and rebuild
sudo bash /opt/vardo/install.sh doctor # Run health diagnostics
sudo bash /opt/vardo/install.sh uninstall # Stop and remove
# View logs
docker compose -f /opt/vardo/docker-compose.yml logs -f
# Restart
docker compose -f /opt/vardo/docker-compose.yml restart
# Stop
docker compose -f /opt/vardo/docker-compose.yml down
# Update manually
cd /opt/vardo && git pull && docker compose up -d --buildDoctor mode
Run sudo bash /opt/vardo/install.sh doctor to check system health. It verifies Docker is running, required ports are available, containers are up and the app is responding.
Unattended install
For automated provisioning, set environment variables and pass --unattended:
VARDO_DOMAIN=vardo.example.com \
VARDO_BASE_DOMAIN=example.com \
[email protected] \
curl -fsSL https://vardo.run/install.sh | sudo bash -s -- --unattendedBackups
Back up these items regularly:
.env— Contains all secrets (database password, auth secret, encryption key). Located at/opt/vardo/.env.- PostgreSQL data —
docker compose -f /opt/vardo/docker-compose.yml exec -T vardo-postgres pg_dumpall -U vardo > backup.sql - Docker volumes — The
vardo_projectsvolume contains deployment data.
Migrations run automatically on app startup via Drizzle. No need to run migrations manually after updates.
macOS (development)
The installer also works on macOS for local development. Install path defaults to ~/vardo instead of /opt/vardo, and the role is automatically set to development. Docker Desktop must be installed and running first.