The native installer supports a clean Ubuntu Server 24.04 LTS VPS with Python 3.12. The reference deployment is single-node and receive-only.
- root or sudo access
- public IPv4 or IPv6 address
- inbound ports 25, 80 and 443 allowed
A/AAAArecords for public, application and mail hostnamesMXrecord for the mail domain pointing to the mail hostname- provider support for inbound SMTP on port 25
- PTR/rDNS review for the mail hostname
| Type | Name | Value |
|---|---|---|
| A/AAAA | example.com |
server address |
| A/AAAA | app.example.com |
server address |
| A/AAAA | mail.example.com |
server address |
| MX | example.com |
10 mail.example.com. |
Plan mode validates arguments and prints the intended layout without changing the server:
./install.sh --domain example.com --admin-email admin@example.com \
--server-ip 203.0.113.10 --non-interactive --planWhen installing over SSH, start a resilient terminal session first so a PuTTY/network disconnect does not terminate the foreground installer:
tmux new -s mailstack-installThen run the installer inside that session:
chmod +x install.sh
sudo ./install.sh --domain example.com --admin-email admin@example.com \
--server-ip 203.0.113.10 --non-interactiveOptional flags include custom application/mail/public hostnames, --www, a password environment variable, --repair, and --skip-dns-check. Use ./install.sh --help for the authoritative list. The installer warns, but does not abort, when a mutating run starts over SSH outside tmux/screen.
- Argument and operating-system validation
- DNS and port preflight
- Package installation
- Service identities and filesystem permissions
- Secret generation and database bootstrap
- Application and public-site deployment
- Postfix, Dovecot, Nginx and systemd configuration
- TLS certificate issuance
- Database migration, static collection and resumable administrator/system-mailbox provisioning
- Acceptance checks and installation marker
If a clean installation stops after secrets or bootstrap data have been created, inspect the failure, preserve the generated state, and rerun the same release and parameters with --repair. Repair preserves a valid existing administrator and valid postmaster/abuse mailboxes, creates only missing bootstrap objects, and fails closed on inconsistent state. It never silently changes an existing administrator password. If repair must create the administrator, a new root-only initial-credentials file is written immediately after creation.
Do not source /etc/vibmail/vibmail.env into the parent root shell before installation/repair. Installer-launched Django commands use an isolated least-privilege environment so stale exported database credentials cannot override the rendered production environment.
- Store
/etc/vibmail/installer-secrets.envsecurely. - Sign in at the configured application hostname.
- Confirm
postmaster@DOMAINandabuse@DOMAIN. - Send an external test message and verify LMTP delivery and ingestion.
- Run the health and verification scripts.
- Create and test a backup before onboarding users.
Do not run the clean installer over an unreviewed existing mail stack. Use the documented upgrade/repair process and take a verified backup first.