Operator guide
Day-to-day administration patterns — hosting accounts, quotas, capacity planning, suspending tenants, monitoring, support.
After the first deploy you’re running Vloud day-to-day. This guide is the operator’s reference for the patterns that come up repeatedly.
Hosting accounts
A hosting account is a Linux user + a slice of your license capacity. Create one per customer.
Adding an account
Dashboard → Hosting Accounts → New account. Pick the slug (Linux username), an email for the account owner, and a hosting package if you’ve set them up. The engine:
- Runs
useradd --create-home <slug>via the privileged runner. - Generates a per-tenant PHP-FPM pool at
/etc/php/8.3/fpm/pool.d/<slug>.conf. - Reloads
php8.3-fpm. - Reserves one slot against
max_linux_usersin your license.
Suspending an account
Dashboard → Hosting Accounts → account row → Suspend. Vloud:
- Sets the PHP-FPM pool’s process limit to 0 (existing requests drain).
- Replaces the nginx vhost with a “site suspended” landing page.
- Disables the account’s mailboxes (Dovecot returns 503).
- Keeps all files + database rows on disk.
Resume reverses everything in one click. Used for billing holds, abuse pending review, or maintenance windows.
Deleting an account
Dashboard → Hosting Accounts → account row → Delete. Asks for the slug as confirmation. Removes the Linux user, home dir, mailboxes, databases, DNS zones, vhosts.
Take a backup first. Vloud doesn’t restore deleted accounts on demand — you’d need to pull from your backup tarball + replay.
Per-account quotas
If you installed with VLOUD_BOOTSTRAP_NO_STORAGE_QUOTA=1 you don’t have these; see Modules & runtimes to enable.
Dashboard → Account → Resource limits. Per account:
- Disk — XFS / ext4 user quota, hard + soft caps with a grace window.
- Databases — count + total size.
- Mailboxes — count + total mail storage.
- Cron jobs — count.
- PHP-FPM children — concurrent process cap.
- Bandwidth — monthly outbound transfer (advisory; surfaced as a warning).
Defaults inherited from the account’s hosting package, override per-account when needed.
Capacity planning
The sidebar capacity widget shows your engine’s current utilisation vs license limits at a glance. Click → Settings → License for the full breakdown.
Two dimensions to watch:
- max_instances — running apps. Counted per app: a WordPress install with no PHP-FPM children running counts as zero; one with active workers counts.
- max_linux_users — distinct hosting accounts.
When you hit a cap, the next create attempt returns 402 + the Upgrade prompt. Plan for: cap × 0.8 = soft alert, cap × 0.95 = “upgrade before you’re stuck”.
Monitoring + alerts
Dashboard → Monitoring → see live CPU / RAM / disk / network / load on the host; per-process + per-account breakdowns.
Setting up alert channels
Settings → Notifications. Add a channel:
- Email — to an external SMTP relay or your local Postfix.
- Slack — incoming webhook URL.
- Discord — incoming webhook URL.
- Generic webhook — any HTTPS endpoint that accepts a JSON POST.
- PagerDuty — events API v2 integration key.
Per alert, pick severity threshold + which channels fire. Common alerts to set up day 1:
- Disk > 85% (warning), > 95% (critical)
- RAM > 90% sustained for 5 min
- Load average > N (CPU count × 1.5)
- SSL cert expiring in < 14 days
- Backup job failed last run
- Engine update available (CRITICAL only — auto-update handles routine patches)
Backups
Dashboard → Backups. Schedule per-account or for the whole host.
Default schedule
- Daily 03:00 UTC
- Keep 7 daily + 4 weekly + 12 monthly
- Tarballs land at
/var/lib/vloud/backups/<slug>/<date>.tgz
What’s in a backup
Per account: public_html/ files, MySQL dumps, Postgres dumps, mailbox maildirs, the per-tenant nginx config, the PHP-FPM pool config. Crontab if used.
Not included by default: the engine’s own state (vloud.db, /etc/vloud.env). For that, script the manual snapshot from Recovery & safe mode.
Restoring
Dashboard → Backups → pick a tarball → Restore. Restore modes:
- Files only — replaces
public_html/, leaves DB / mail. - Database only — drops + recreates from dump.
- Mail only — replaces maildir.
- Full — everything.
Restore-over-existing prompts for confirmation. Restore-to-different-slug supports cloning an account.
Per-tenant mail management
Dashboard → Email → domain → mailboxes. Per mailbox:
- Disk quota.
- Forwarding rules (catch-all, per-address forwards, autoresponder).
- DKIM signing on/off.
- Sieve filters via the tenant portal.
DNS for mail is your responsibility — Vloud generates the records (MX, SPF, DKIM, DMARC) and you copy them to your DNS provider. Verify with Dashboard → Email → Verify DNS.
When something needs investigation
For a problem on a specific account (slow site, mail bouncing, app crashing):
- Account detail page in the dashboard → Activity tab. Shows recent deploys, restarts, suspensions.
- Logs tab on the account → live tail of access log, error log, PHP-FPM pool log.
sudo -u <slug>from the server → impersonate the account for shell-level debugging.- Support bundle → Help → Report a bug from the dashboard, attach the bundle. The bundle redacts secrets but includes the recent error context. See Reporting bugs.
Common tasks reference
| Need | Where |
|---|---|
| Add a domain to an existing account | Dashboard → Domains → New domain |
| Renew an expiring SSL manually | Dashboard → Domains → domain → SSL → Re-issue |
| Add a tenant user to an account | Dashboard → Account → Tenant users → Invite |
| Force a job-worker restart | sudo systemctl restart vloud-job-worker |
| Re-trigger a heartbeat (after license change) | sudo systemctl restart vloud |
| Disable a daemon | Modules & runtimes |
| Recover from a broken update | Recovery & safe mode |
What’s next
- Tenant portal — what your customers see when they log into their own account.
- Updating Vloud — how releases reach this host.
- Recovery & safe mode — when things go sideways.