Dashmox is still in development. Expect frequent updates. The free plan is available now; Pro and Business are not.

Install the free plan
Skip to the guide

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.

RequirementWhy
Ubuntu Server 24.04 or 26.04 LTSNothing else is supported. The installer reads the release and refuses anything it does not know.
1 GiB RAM, 2 GiB comfortableThe panel itself is small. Memory goes on what you host.
2 GiB free diskEnough for the release and the packages. Websites need whatever they need on top.
A fresh serverIt installs and configures Nginx, PHP and the rest. On a machine already serving something, it is the wrong tool.
RootIt 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.

Databases
Runtimes
The rest

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.

PathWhat is thereGrows with
/homeEvery website’s files, one Linux account eachWhat you host. This is the one to give room.
/var/backups/dashmoxWebsite backups and recovery pointsHow many you keep and how often
/var/lib/mysql, /var/lib/postgresqlHosted databasesWhat the applications store
/var/lib/dashmoxThe panel’s own databaseBarely. Customers and settings.
/opt/dashmoxInstalled releases, kept for rollbackA few hundred megabytes each
If you give /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

OptionWhat it does
--hostname NAMEThe 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 ADDRESSThe owner’s email address.
--panel-port PORTPort for the panel and the customer sign in. Default 8443.
--public-ip IPThe public address when the server is behind NAT. Without it the installer detects the local addresses.
--timezone ZONEAn IANA timezone. Default UTC.
--tls auto|self-signedACME once public DNS is ready, or a self signed certificate until it is.

What the server hosts

OptionWhat it does
--databases yes|noHosted MariaDB. Default no.
--postgresql yes|noHosted PostgreSQL, a second engine for applications whose schema MariaDB cannot read. Default no, and either engine may be on without the other.
--phpmyadmin yes|nophpMyAdmin with panel sign on. Needs databases and PHP.
--php-versions none|LISTSelectable 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|ppaWhere a version this release does not carry may come from. distro refuses rather than adding a third party archive. Default distro.
--database-engine mysql|mariadbWhich 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|upstreamWhere 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|LISTNode.js runtimes for hosted applications, comma separated majors from 20, 22 and 24. Default none.
--containers yes|noContainer websites. Installs Docker and runs only the approved images below. Default no.
--container-images LISTThe 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|noMail hosting: customer mailboxes and forwarding. Needs --hostname.
--storage-quotas yes|noLinux user quotas, so website storage limits are enforced. Adds usrquota to /etc/fstab and remounts. Default no.

Authoritative DNS

OptionWhat it does
--powerdns yes|noThe local authoritative DNS module. Default no.
--dns-nameservers NAMESTwo to four public nameserver hostnames, comma separated.
--dns-nameserver-addresses MAPThe 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 IPSThe addresses an automatic zone publishes for a website. Must differ from the nameserver addresses.
--dns-auto-zones yes|noCreate the primary domain’s zone when a website is provisioned. Default no, and it needs the two options above.

The firewall and SSH

OptionWhat it does
--firewall yes|noUFW rules, preserving the SSH ports that are active or configured. Default no.
--ssh-port PORTAn additional SSH port to preserve, for a server that has moved it.
--backup-private-endpoint yes|noAllow 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.

OptionWhat it does
--server-type panel|backupWhat this machine is for.
--panel NAMEWith --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 FILEWith --server-type backup: that panel’s public key, as the panel showed it when you added this server.

Running it differently

OptionWhat it does
--release ARCHIVE --sha256 HEXInstall a prebuilt release, verified against a checksum you supply rather than one the archive carries.
--preflight-onlyCheck the prerequisites and change nothing, which is the safe thing to run first on a server you did not build.
--repairRecreate the managed files without replacing configuration or data.
--configureReapply Nginx, TLS and the firewall from the configuration already on the server.
--non-interactiveAccepted 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.
--helpThe 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.