Skip to content

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.

  1. Dashboard → Apps in the sidebar → “Install from marketplace”.
  2. Find WordPress in the marketplace catalogue. Click Install.
  3. 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 /blog for 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.
  4. 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
  5. 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.

  1. 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.
  2. Dashboard → ApplicationsDeploy from Git.
  3. Fill in:
    • Repository URLhttps://github.com/you/your-app.git or git@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 build for 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 .env contents. Stored encrypted at rest.
  4. 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).
  5. 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:

  1. Dashboard → DatabasesNew 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.
  2. Deploy the app as in Path B (Git) or upload via SFTP. The DB credentials go into your app’s .env.
  3. 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:

  1. Dashboard → Domains → click the domain.
  2. Click Issue SSL. Vloud queues a Let’s Encrypt issuance.
  3. 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.).

  1. Dashboard → EmailAdd domain. Pick the domain.
  2. Vloud displays the DNS records you need to add at your DNS provider: MX, SPF (TXT), DKIM (TXT), DMARC (TXT). Add them.
  3. Wait for propagation (dig +short MX yourdomain.com should return the right host).
  4. Dashboard → Email → click the domain → Verify DNS. Vloud queries each record and shows pass/fail per record.
  5. Add a mailbox: MailboxesNew mailbox. Set the address + password.
  6. Test send-and-receive: send mail to you@yourdomain.com from 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:

  1. Dashboard → BackupsNew backup. Pick the hosting account, the schedule (daily 03:00 UTC is the default), and the retention (default: keep 7 daily + 4 weekly).
  2. Tick Run first backup now to confirm the flow works on a non-empty data set.
  3. Watch the live progress. The tarball lands at /var/lib/vloud/backups/<slug>/<date>.tgz.
  4. 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

  1. Set up additional hosting accounts as you onboard more sites / customers. Each gets its own Linux user, PHP-FPM pool, quota.
  2. Enable the security engine if your license includes it — Dashboard → Security → Enable. One-shot apt install of clamav-daemon + yara + freshclam + advisor scoring.
  3. Configure notifications — Dashboard → Notifications → set up Slack / Discord / email channels for the alerts you care about.
  4. Read the operator guide for day-to-day administration patterns: suspending accounts, per-account quotas, capacity planning.
  5. If you’re hosting for customers, introduce them to the tenant portal. They get their own SSO-isolated panel without seeing your other tenants.