Skip to content

Tenant portal

What your customers see when they log into their own hosting account — files, databases, email, DNS, cron, terminal. SSO-isolated from operator and other tenants.

The tenant portal is the customer-facing surface for each hosting account. When you sell hosting to someone, that’s where they live. It runs at /tenant/* on the same engine, with a completely separate auth realm from the operator dashboard.

Two distinct auth realms

RealmLogin URLWhoSees
Operator/loginYou (the host)All accounts, all settings, the whole panel
Tenant/tenant/loginYour customerOnly their account — files, mailboxes, databases, domains, DNS, cron

JWT tokens for the two realms are stamped with different kind claims (operator vs tenant). A tenant token cannot validate against an operator endpoint, even if the signature is correct — the engine refuses cross-realm access by design. Operators can also be tenants on a different account in the same browser; sessions are independent.

What a tenant gets

Once you set a password for the tenant on an account, they can log in at /tenant/login with their email + password. The portal surfaces:

Files

  • Web file manager rooted at /home/<slug>/.
  • Upload / download / rename / edit / chmod.
  • Tenant-side terminal (browser-based shell as the Linux user), 30-min session with 10-min idle timeout.
  • SSH key management — tenant adds their own keys for direct shell access.

Databases

  • MySQL / PostgreSQL databases scoped to their account.
  • phpMyAdmin SSO from the portal (no separate login).
  • Create / drop databases + users within their quota.

Email

  • Mailbox CRUD: add, delete, change password, set quota.
  • Forwarding rules + autoresponders + Sieve filters.
  • Webmail SSO (Roundcube) — opens with the tenant already authenticated.

Domains + DNS

  • Attach / detach domains to their account.
  • Edit DNS records on zones the operator delegates to them.
  • Trigger SSL re-issuance.

Cron

  • Per-tenant crontab editor.
  • Resource-capped (the cron jobs run inside the tenant’s systemd slice).

Apps

  • One-click installers — WordPress, Drupal, Joomla, Nextcloud, phpBB, Laravel.
  • Tenant-managed app deploys.

Backups

  • View backup history for their account.
  • Restore from a tarball (operator can disable this if you don’t want tenants self-restoring).

Setting a tenant password

The operator decides who gets a tenant login. From the account detail page → Tenant accessSet password (or Invite via email if SMTP is configured). The tenant receives a one-time invite link; setting their password creates the tenant credentials.

2FA + security

  • Tenant 2FA available — operator can require it for all tenants or leave it optional.
  • Lockout: 5 failed login attempts → 15-minute lockout (column tenant_locked_until).
  • Per-tenant SSH key trust — keys added in the portal show up on the operator dashboard for audit.

What tenants cannot do

Hard limits enforced by the engine:

  • See other tenants’ accounts.
  • See operator-level pages (Modules, License, Hosting packages, etc.).
  • Exceed their account’s quotas (disk, mail storage, DB size, cron count).
  • Modify nginx config directly.
  • Run arbitrary privileged commands.

The tenant terminal runs as the tenant’s Linux user — same shell isolation as SSH. Whatever they can do over SSH, they can do in the terminal.

Branding the tenant portal

If your license includes white-label, you can replace Vloud branding on the tenant portal with your own — logo, name, footer links, support email. Dashboard → Settings → Branding. The operator dashboard keeps Vloud branding (it’s the panel for the platform itself).

Introducing a customer to their portal

When you create a hosting account for a customer:

  1. Set their domain + initial site (or let them deploy).
  2. Set their tenant password (or send the invite email).
  3. Send them the portal URL — typically https://<your-dashboard-host>/tenant/login (or your white-labelled equivalent).
  4. Point them at the tenant-facing docs — your customers reading the same Vloud docs you read.

Common operator questions

“My customer says they can’t see X.” Most often a feature gate. Check their hosting package — email feature off in their package means no email surface. See Tiers & features.

“My customer locked themselves out.” Operator → Account detail → Tenant access → Reset password. Or unlock manually: sudo sqlite3 /opt/vloud/packages/server/vloud.db "UPDATE accounts SET tenant_locked_until = NULL WHERE id = <id>".

“My customer wants to upload a 10 GB file.” Tenant disk quota check first; raise it on the account if needed. Webmail upload limit is 25 MB by default; SFTP for anything bigger.

“Can the tenant see my other customers?” No, by design — every query the tenant portal makes is scoped through account_id joins in middleware. Cross-account access returns 403.