Install Dashmox on a server
One command on a fresh Ubuntu server. It asks nothing and hands you a single-use token to create your account. This page is what to check first, and what it does to the disk.
Before you start
What the server needs.
All of it is checked before anything is installed, so nothing is left half done.
| Requirement | Why |
|---|---|
| Ubuntu Server 24.04 or 26.04 LTS | Nothing else is supported. The installer reads the release and refuses anything it does not know. |
| 1 GiB RAM, 2 GiB comfortable | The panel itself is small. Memory goes on what you host. |
| 2 GiB free disk | Enough for the release and the packages. Websites need whatever they need on top. |
| A fresh server | It installs and configures Nginx, PHP and the rest. On a machine already serving something, it is the wrong tool. |
| Root | It creates accounts, writes service files and edits /etc/fstab for storage limits. |
A booted systemd host and Ubuntu’s own python3 are both checked too; a normal Ubuntu Server image has them.
Which release
Choose 24.04 unless you have a reason not to.
Both work. Ubuntu carries one PHP version per release and the archive Dashmox gets the rest from publishes nothing for 26.04, so a 26.04 server offers PHP 8.5 and nothing else while 24.04 offers 8.1 through 8.4. That is our limitation rather than Ubuntu’s, and it changes the day that archive covers 26.04. If every site you host runs 8.5, 26.04 is fine.
Install
One command.
curl -fsSL https://dashmox.com/install.sh | sudo bash
Configure the install
Tick what this server is for. Nothing here is required: the command above installs a working panel and the setup wizard asks the rest the first time you sign in.
Your command
curl -fsSL https://dashmox.com/install.sh | sudo bash
Run it as root on a fresh Ubuntu server.
Run it as root. It fetches the newest release, checks it against the published checksum and installs it, asking nothing, so the same command works unattended in a provisioning script.
When it finishes it prints a single-use token. Open the panel, use the token to create the owner account, and a setup wizard asks what the server is for: which runtimes, whether it hosts mail, whether it runs DNS. Those answers can all be changed afterwards.
Disk layout
One filesystem is fine. If you split it, split these.
A single root filesystem is fine and is what most servers should do. Websites and backups are what fill a hosting server up, so those are the two worth separating on a machine you expect to grow.
| Path | What is there | Grows with |
|---|---|---|
/home | Every website’s files, one Linux account each | What you host. This is the one to give room. |
/var/backups/dashmox | Website backups and recovery points | How many you keep and how often |
/var/lib/mysql, /var/lib/postgresql | Hosted databases | What the applications store |
/var/lib/dashmox | The panel’s own database | Barely. Customers and settings. |
/opt/dashmox | Installed releases, kept for rollback | A few hundred megabytes each |
/home its own filesystem, that is the one storage limits apply to.
Per-website storage limits are filesystem quotas on whichever filesystem holds /home. The installer turns them on itself: it installs the quota tools, adds the option to /etc/fstab, keeps a copy of the file and puts it back if the remount fails.
On a cloud image the kernel’s quota support can live in an extra modules package the image leaves out. The installer adds it when it can and says so when it cannot, and storage limits are then reported as not enforced rather than silently ignored. The health page says which you have.
Options
Everything the installer takes, and what it does without being asked.
Nothing is asked. Every option has a default and the panel's setup wizard asks the rest the first time you sign in, so the one command above is a complete install. These exist for a scripted one, where there is nobody to answer a wizard.
sudo ./install.sh --hostname panel.example.com --email owner@example.com --tls auto
Static website hosting and Nginx are always installed. A fresh install with no options also installs the PHP this Ubuntu release carries, MariaDB and phpMyAdmin, because that is what a hosting panel is for. Mail, authoritative DNS, Node, containers and storage quotas are the wizard’s to turn on, and adding one later is what the installer is good at.
The panel itself
| Option | What it does |
|---|---|
--hostname NAME | The panel’s own address, a name or an address. Passing it on a server that is already installed renames the panel, rewrites its virtual host and reissues its certificate. |
--email ADDRESS | The owner’s email address. |
--panel-port PORT | Port for the panel and the customer sign in. Default 8443. |
--public-ip IP | The public address when the server is behind NAT. Without it the installer detects the local addresses. |
--timezone ZONE | An IANA timezone. Default UTC. |
--tls auto|self-signed | ACME once public DNS is ready, or a self signed certificate until it is. |
What the server hosts
| Option | What it does |
|---|---|
--databases yes|no | Hosted MariaDB. Default no. |
--postgresql yes|no | Hosted PostgreSQL, a second engine for applications whose schema MariaDB cannot read. Default no, and either engine may be on without the other. |
--phpmyadmin yes|no | phpMyAdmin with panel sign on. Needs databases and PHP. |
--php-versions none|LIST | Selectable PHP runtimes, comma separated, such as 8.3,8.4. A version this Ubuntu release carries installs from it; any other needs --php-repository ppa. Default none. |
--php-repository distro|ppa | Where a version this release does not carry may come from. distro refuses rather than adding a third party archive. Default distro. |
--database-engine mysql|mariadb | Which database this server runs. They cannot both be installed, so this is chosen when the server is built. mysql is the default: most people arrive with a database they already have, theirs is usually MySQL, and a dump it wrote imports without being edited first. mariadb is the other one. On a server that already runs the other it is refused and a message says so, because switching means migrating every database. Default mysql. |
--database-repository distro|upstream | Where MariaDB comes from on a new install. upstream fetches 11.8 from MariaDB where this release carries something older, so a dump written by MySQL 8 imports without being edited first. distro uses this release own version. Neither changes a MariaDB that is already installed, and an archive that cannot be read is removed again. Default upstream. |
--node-versions none|LIST | Node.js runtimes for hosted applications, comma separated majors from 20, 22 and 24. Default none. |
--containers yes|no | Container websites. Installs Docker and runs only the approved images below. Default no. |
--container-images LIST | The image references this server will run, each with an explicit tag, such as nginx:1.27-alpine,ghcr.io/org/app:v1.2.3. |
--mail yes|no | Mail hosting: customer mailboxes and forwarding. Needs --hostname. |
--storage-quotas yes|no | Linux user quotas, so website storage limits are enforced. Adds usrquota to /etc/fstab and remounts. Default no. |
Authoritative DNS
| Option | What it does |
|---|---|
--powerdns yes|no | The local authoritative DNS module. Default no. |
--dns-nameservers NAMES | Two to four public nameserver hostnames, comma separated. |
--dns-nameserver-addresses MAP | The addresses each nameserver answers on, as ns1.example.com=203.0.113.2+2001:db8::2,ns2.example.com=203.0.113.3. These are reserved for DNS and no website may use them. |
--dns-site-addresses IPS | The addresses an automatic zone publishes for a website. Must differ from the nameserver addresses. |
--dns-auto-zones yes|no | Create the primary domain’s zone when a website is provisioned. Default no, and it needs the two options above. |
The firewall and SSH
| Option | What it does |
|---|---|
--firewall yes|no | UFW rules, preserving the SSH ports that are active or configured. Default no. |
--ssh-port PORT | An additional SSH port to preserve, for a server that has moved it. |
--backup-private-endpoint yes|no | Allow an off-site backup destination on a private or loopback address, for an operator running their own object store. Default no. |
A backup server instead of a panel
A backup server holds packed copies of other Dashmox servers’ websites and installs none of the panel: no web server, no database, no PHP and no licence. Set it up with --server-type backup, read out the host key it prints, add it in the panel under off-site backups, then run the installer again with --panel and --key to admit that panel.
| Option | What it does |
|---|---|
--server-type panel|backup | What this machine is for. |
--panel NAME | With --server-type backup: this server’s name for a panel that may send it backups. Everything that panel can reach here is scoped to it. |
--key FILE | With --server-type backup: that panel’s public key, as the panel showed it when you added this server. |
Running it differently
| Option | What it does |
|---|---|
--release ARCHIVE --sha256 HEX | Install a prebuilt release, verified against a checksum you supply rather than one the archive carries. |
--preflight-only | Check the prerequisites and change nothing, which is the safe thing to run first on a server you did not build. |
--repair | Recreate the managed files without replacing configuration or data. |
--configure | Reapply Nginx, TLS and the firewall from the configuration already on the server. |
--non-interactive | Accepted and ignored. Nothing is asked any more, so every install is what this used to mean. It is still taken because the published one line command and older scripts pass it, and refusing it would break them for no gain. |
--help | The same list, from the installer itself, which is where it comes from. |
Upgrades are not this installer’s job: use dashmox update --archive PATH --sha256 HEX, which is covered in Updating Dashmox. Unattended updates are not implemented.
Afterwards
Where to go next.
- Host your first website, which is the next ten minutes.
- Certificates and HTTPS if a domain already points at the server.
- The health page, which says what this server is and is not enforcing.
- Updating Dashmox, which is one button and keeps the previous release for rollback.