Your first real deploy
WordPress in 2 min, Next.js from Git, database-backed apps, SSL, mail, backups — concrete walkthroughs.
The first-boot wizard gave you a working test site. Here’s how to put something real on it.
Pre-requisites
- You’ve finished the first-boot wizard.
- The dashboard sidebar shows ACTIVE status (license or trial).
- You have at least one hosting account set up.
- For real deploys: at least one domain attached to that account.
Pick the path that matches what you want to put online first.
Path A — WordPress (2 minutes, no Git)
This is the most common first deploy. Vloud’s app-installer recipe handles the database, the secrets, and the file unpack.
- Dashboard → Apps in the sidebar → “Install from marketplace”.
- Find WordPress in the marketplace catalogue. Click Install.
- On the install form, pick:
- Hosting account — the slug you created in the wizard.
- Domain — pick from the dropdown (must be attached to that account; add new ones from the Domains page).
- Sub-path — leave blank for the domain root, or set to
/blogfor a sub-path install. - Site title — visible on the WordPress front-end.
- Admin email — the WordPress admin’s login.
- Admin password — auto-generated if you leave it blank; Vloud shows it once after install.
- Click Install. Watch the live progress stream:
▸ Downloading WordPress 6.7.1 (35 MB) … ✓ ▸ Provisioning MySQL database + user … ✓ ▸ Unpacking to /home/acme/public_html/ … ✓ ▸ Setting ownership: acme:www-data … ✓ ▸ Rendering wp-config.php from template … ✓ ▸ Running WordPress install via WP-CLI … ✓ ✓ WordPress live at https://blog.acme.com - On success the dashboard shows:
- The site URL — click to open in a new tab and check it loads.
- The WordPress admin URL (
/wp-admin) + the credentials (display once, copy to your password manager). - The database credentials — Vloud manages them; available on the app’s detail page.
Same recipe works for: Joomla, Drupal, Nextcloud, phpBB, Laravel (a skeleton, not a real app), static HTML. The marketplace catalogue is the canonical list.
Verifying the WordPress install
# From the server:
curl -sSI https://blog.acme.com/wp-login.php | head -5
# Expected: HTTP/2 200 + WordPress headers
# Confirm the DB was provisioned + WP knows it:
sudo mysql -e "SHOW DATABASES" | grep wp_
# Expected: a line like wp_acme_blog
# Tail the access log:
sudo tail -f /home/acme/logs/access.log
Path B — Next.js app from a Git repo
For a Node.js / Next.js app you maintain in Git. Vloud detects the framework, runs the build, and serves the app behind nginx.
- Make sure your repo is reachable. Either:
- A public Git URL (no auth needed).
- Or set up an SSH deploy key — Dashboard → Settings → SSH keys → add the public key to your Git host.
- Dashboard → Applications → Deploy from Git.
- Fill in:
- Repository URL —
https://github.com/you/your-app.gitorgit@github.com:you/your-app.git. - Branch — defaults to
main. - Hosting account — the Linux user that’ll own the running process.
- Domain — must already be attached to the hosting account.
- Build command — auto-detected (
npm run buildfor Next.js). Override if needed. - Start command — auto-detected (
npm start). Override for custom servers. - Node version — defaults to 20; pick 18 if your app pins it.
- Environment variables — paste your
.envcontents. Stored encrypted at rest.
- Repository URL —
- Click Deploy. Live progress stream shows clone → install → build → pm2 start → nginx upstream config. Cold first deploy takes 1–3 minutes; subsequent deploys reuse the build cache (~30–60s).
- On success: the dashboard shows the running pm2 process id, the allocated port (Vloud picks one in the 3000–3999 range), and the public URL.
Redeploying after a Git push
From the application detail page → Redeploy. Vloud does a blue/green swap: starts the new build on a different port, healthchecks it, swaps nginx upstream when healthy. Zero-downtime if the healthcheck passes.
For automatic redeploys on push, set up a webhook → Dashboard → Application → Webhooks tab → copy the URL into your Git provider’s webhook config.
Logs + diagnostics for the Next.js app
# Application stdout/stderr (live):
Dashboard → Application → Logs
# Or from the server:
sudo -u acme pm2 logs your-app
# nginx upstream errors:
sudo tail -f /var/log/nginx/error.log
Path C — Database-backed app (PHP or Node)
If you already wrote the app and want to deploy it alongside its database:
- Dashboard → Databases → New database. Pick MySQL or PostgreSQL. Vloud creates:
- The database (e.g.
acme_myapp) - A dedicated DB user with strong random password
- GRANT scoped to that database only Credentials displayed once. Copy them.
- The database (e.g.
- Deploy the app as in Path B (Git) or upload via SFTP. The DB credentials go into your app’s
.env. - Run your migrations on first deploy (via your app’s build command, or post-deploy hook).
Need PostgreSQL or Redis but they aren’t installed?
Postgres + Redis aren’t installed by the bootstrap by default. From Settings → Modules you can see which are installed; install with apt:
# PostgreSQL:
sudo apt install -y postgresql
sudo systemctl restart vloud
# Redis (also enables BullMQ-backed deploys):
sudo apt install -y redis-server
sudo systemctl restart vloud
Restart the engine after install so it re-detects the new runtimes. See Modules & runtimes for the full list.
Adding SSL to your domain
Vloud auto-issues Let’s Encrypt certificates for domains attached through the dashboard. If you skipped SSL during the wizard (e.g. IP fallback) or attached a domain manually:
- Dashboard → Domains → click the domain.
- Click Issue SSL. Vloud queues a Let’s Encrypt issuance.
- HTTPS goes live within ~30s. Auto-renewal runs daily; no further action.
DNS must resolve to your server’s public IP for issuance to succeed — Let’s Encrypt verifies via HTTP-01 challenge on port 80. If you’re behind a firewall that blocks 80, you can switch to DNS-01 — see Domains → Advanced → ACME challenge mode.
Setting up email for your domain
Requires the mail stack — Postfix, Dovecot, Rspamd. Confirm they’re active in Settings → Modules first (they’re installed by the bootstrap unless you set VLOUD_BOOTSTRAP_NO_POSTFIX=1 etc.).
- Dashboard → Email → Add domain. Pick the domain.
- Vloud displays the DNS records you need to add at your DNS provider: MX, SPF (TXT), DKIM (TXT), DMARC (TXT). Add them.
- Wait for propagation (
dig +short MX yourdomain.comshould return the right host). - Dashboard → Email → click the domain → Verify DNS. Vloud queries each record and shows pass/fail per record.
- Add a mailbox: Mailboxes → New mailbox. Set the address + password.
- Test send-and-receive: send mail to
you@yourdomain.comfrom a personal Gmail; open Vloud’s Webmail (Dashboard → Email → Webmail SSO) to receive it. Send back; confirm headers show SPF=pass, DKIM=pass at the receiving end.
Scheduling a backup
From the day you put real data on this server, take backups. From the dashboard:
- Dashboard → Backups → New backup. Pick the hosting account, the schedule (daily 03:00 UTC is the default), and the retention (default: keep 7 daily + 4 weekly).
- Tick Run first backup now to confirm the flow works on a non-empty data set.
- Watch the live progress. The tarball lands at
/var/lib/vloud/backups/<slug>/<date>.tgz. - Verify the restore path before you trust the backups. Pick a test account, simulate “lost everything”, run Restore from the backup you just took.
Quick health check after your first real workload
Once you’ve deployed a real app and put traffic on it, walk through these:
- Sidebar capacity widget — instances + linux_users counts reflect what you deployed.
- Dashboard activity feed — shows the recent deploys, mailbox creates, backup runs.
- nginx access logs — actual traffic from your real users.
- Settings → Modules — every daemon you expected to be on (mail, fail2ban, firewall) shows ACTIVE.
- System → Updates — engine version matches what you installed.
- Settings → License — tier shows what you bought, capacity bars reflect usage.
- Help → My tickets — empty (no bugs yet, hopefully).
If something breaks: what to do
- App returned 500. Application logs in the dashboard first. nginx error log (
/var/log/nginx/error.log) for upstream issues. For PHP apps, the per-account FPM error log lives in/var/log/php8.3-fpm.log. - SSL didn’t issue. DNS not propagated, or port 80 blocked, or ACME challenge config wrong. Dashboard → Domains → the failing domain → SSL → see the certbot error.
- Mail isn’t delivering. Vloud’s outbound logs:
sudo tail -f /var/log/mail.log. Most common cause: your VPS provider blocks outbound port 25. Check. - Engine itself is misbehaving. Report it through Help → Report a bug. The diagnostic bundle attaches automatically — that’s the fastest path to a fix.
- Engine won’t start at all. Recovery + safe-mode.
What to do next
- Set up additional hosting accounts as you onboard more sites / customers. Each gets its own Linux user, PHP-FPM pool, quota.
- Enable the security engine if your license includes it — Dashboard → Security → Enable. One-shot apt install of clamav-daemon + yara + freshclam + advisor scoring.
- Configure notifications — Dashboard → Notifications → set up Slack / Discord / email channels for the alerts you care about.
- Read the operator guide for day-to-day administration patterns: suspending accounts, per-account quotas, capacity planning.
- If you’re hosting for customers, introduce them to the tenant portal. They get their own SSO-isolated panel without seeing your other tenants.