Quick start
On a fresh server, run the installer as root. It detects your OS, installs the full stack, and starts a 14-day trial automatically. Set your panel hostname and an email for SSL.
# fresh AlmaLinux 9 or Ubuntu 24.04 server, as root curl -fsSL https://get.dirhamaday.ae | DH_HOSTNAME=panel.yourdomain.ae DH_EMAIL=you@yourdomain.ae bash
That is it. In a few minutes the installer prints your panel URL, an admin username and a one-time password. Open https://panel.yourdomain.ae:8443 and sign in. Your server immediately appears in the Dirham A Day owner console as a new install on a 14-day trial.
Requirements
A clean server
A fresh VPS or dedicated server with nothing else installed (no existing cPanel, Plesk, nginx, Apache or MySQL). 2 vCPU / 4 GB RAM is a sensible minimum; more for busy sites.
Supported OS
AlmaLinux 9 (recommended) or Ubuntu 24.04 LTS, 64-bit. The installer auto-detects which and adapts.
Root + a hostname
Root SSH access, and a hostname you control (e.g. panel.yourdomain.ae) pointed at the server's IP for the panel certificate.
What gets installed
One command lays down the whole hosting stack, hardened and wired together, plus the three DirhamHost services.
Web & runtime
nginx, PHP-FPM 8.1 / 8.2 / 8.3 (switchable per account), MariaDB 10.11, phpMyAdmin.
DNS, mail & FTP
PowerDNS (with a local API), Postfix + Dovecot with Omnio webmail, pure-ftpd (FTPS).
Security
CSF firewall + LFD, ModSecurity WAF, Let's Encrypt via acme.sh, SELinux enforcing, Redis + rspamd for mail.
DirhamHost services
dh-agent (root executor), dh-api (panel API on 127.0.0.1:8800), and the panel served by nginx on port 8443.
First login
https://panel.yourdomain.ae:8443 — the operator (Host) panel. The customer (Users) panel lives at /user/.
Username admin. The one-time password is printed at the end of the install and saved to /etc/dirhamhost/admin.initial until your first login.
Rotate it immediately, and turn on TOTP two-factor from the panel. From the shell you can also run:
/opt/dirhamhost/bin/dh-api passwd 'a-strong-new-password'
dhctl op system.info systemctl status dh-agent dh-api nginx mariadb pdns csf
Licence & 14-day trial
Every fresh install starts a 14-day free trial automatically (up to 5 hosting accounts) — no key needed. When you are ready, activate a paid licence; there are no per-account fees.
Check your licence state
dhctl op license.status
Activate a paid key
APPLY=1 dhctl op license.activate key=DH-XXXX-XXXX-XXXX-XXXX-XXXX
| Tier | Hosting accounts | Good for |
|---|---|---|
| Trial | 5 (14 days) | Kicking the tyres |
| Solo | 50 | A personal fleet of sites |
| Pro | 200 | A growing hosting business |
| Unlimited | Effectively unlimited | Full hosts & resellers |
The add-ons
Four add-ons extend DirhamHost. They are entitlements on your licence — once granted, they light up in the panel automatically after the next check-in (within a few minutes).
🛡 DirhamGuard
Per-account resource limits (CPU, RAM, processes, IO) so one busy site never slows the rest. Set limits per package; watch usage per account.
📦 DirhamVault
Automatic off-site backups with one-click restore of a whole account, or a single file, database or mailbox.
🧾 DirhamBill
Native billing: invoices, recurring card payments in AED via Stripe, a customer client area and domain provisioning. A WHMCS alternative with no separate licence.
✉ Omnio Email
Branded webmail on your own hostname, single sign-on from the panel, and full deliverability (SPF/DKIM/DMARC).
Turn an add-on on
Buy or comp the add-on from the owner console (it is added to your licence's entitlements). On the node, confirm it is live:
dhctl op license.status # "features" lists your granted add-ons systemctl restart dh-api # pick up a just-granted add-on immediately
Accounts & packages
A package defines the limits; an account is a hosting customer. Create a package once, then spin up accounts against it. Every op is dry-run by default — add APPLY=1 to execute.
Create a hosting package
APPLY=1 dhctl op package.save name=starter disk_gb=10 bandwidth_mb=100000 \ php_memory_mb=256 php_max_children=12 max_databases=10 max_email=25 sites=5
Create an account
APPLY=1 dhctl op account.create username=acme domain=acme.ae package=starter dhctl op account.list
Everyday account actions
APPLY=1 dhctl op account.setphp username=acme version=8.3 APPLY=1 dhctl op account.changepackage username=acme package=pro APPLY=1 dhctl op account.suspend username=acme APPLY=1 dhctl op account.backup username=acme
Migrate sites in
DirhamHost imports from cPanel/WHM and CentOS Web Panel (CWP), by uploaded archive or a live SSH pull, at full fidelity — files, databases, email, DNS and SSL.
From cPanel (live pull)
# authorise this node's key on the old server, then pull + import
dhctl op import.remote.key
APPLY=1 dhctl op import.remote.pull host=OLD_IP ssh_user=root account=cpuser
APPLY=1 dhctl op import.cpanel archive=/var/lib/dirhamhost/imports/cpmove-cpuser.tar.gz \
username=cpuser package=starter domain=cpuser-domain.ae
From CentOS Web Panel (CWP)
APPLY=1 dhctl op import.cwp.test host=OLD_IP ssh_user=root APPLY=1 dhctl op import.cwp.pull host=OLD_IP ssh_user=root account=cwpuser dhctl op import.cwp.status
SSL, DNS & email
Free SSL (auto-renewing)
APPLY=1 dhctl op ssl.issue username=acme # issues + installs for acme.ae and www
Certificates renew themselves via acme.sh four times a day. The domain must resolve to this server and port 80 be reachable.
DNS
dhctl op dns.list domain=acme.ae APPLY=1 dhctl op dns.add domain=acme.ae name=blog type=A content=1.2.3.4
APPLY=1 dhctl op mail.mailbox.create address=info@acme.ae password='...' # see dhctl ops for exact op names
Mailboxes get a setup email automatically; webmail (Omnio) opens already signed-in from the panel. SPF/DKIM/DMARC records are generated for each domain.
Branded client area
With DirhamBill you get a customer-facing client area and store at my.yourdomain.com — sign-up, the store, domains, invoices, card payments and tickets — all under your brand.
- Point a subdomain — an A record for my.yourdomain.com to this server.
- Provision it — set up the client-area vhost + certificate for that host.
- Connect Stripe — paste your Stripe secret in the panel's billing settings (AED).
- Go live — customers buy hosting & domains; accounts provision automatically on payment.
Security & backups
Firewall (CSF)
csf -r # reload rules csf -a 1.2.3.4 # allow an IP csf -d 5.6.7.8 # deny an IP csf -x # disable (recovery); csf -e to re-enable
Backups (DirhamVault)
dhctl op backup.list APPLY=1 dhctl op account.backup username=acme APPLY=1 dhctl op account.restore username=acme archive=/path/to/backup.tar.gz
Updates
dhctl op system.info # current version systemctl restart dh-agent dh-api # after an update lands
Command reference
Everything the panel does is a named, allow-listed operation you can also run from the shell with dhctl. List them all, inspect one, or run it. Dry-run is the default; APPLY=1 executes.
dhctl ops # list every operation dhctl op account.create username=x domain=x.ae package=starter # dry-run APPLY=1 dhctl op account.create username=x domain=x.ae package=starter
| Area | Handy ops |
|---|---|
| Accounts | account.create · account.list · account.suspend · account.changepackage · account.setphp · account.backup · account.restore |
| Packages | package.save · packages.list · package.delete |
| SSL & DNS | ssl.issue · ssl.status · dns.list · dns.add · dns.update · dns.nameservers.apply |
| Databases | db.create · db.user.create · db.grant · db.pmatoken (one-click phpMyAdmin) |
| Migration | import.remote.pull · import.cpanel · import.cwp.pull · import.cwp.status |
| Licence | license.status · license.activate · license.enforce |
| System | system.info · backup.list · account.usage |
Troubleshooting
- Panel won't load — systemctl status dh-api nginx; check journalctl -u dh-api -n 50.
- Install failed part-way — re-run the installer; completed steps are skipped, so it resumes safely.
- SSL didn't issue — confirm the hostname resolves to this server and port 80 is open, then APPLY=1 dhctl op ssl.issue username=....
- Licence says invalid — dhctl op license.status; a node binds to one machine, ask us to rebind if you moved servers.
- A site is slow / "resource limit" — check DirhamGuard usage for that account and raise its package limits.
- Locked out by the firewall — provider console → csf -x.
Files & ports
| Thing | Where |
|---|---|
| Operator / customer panel | https://<host>:8443/ · /user/ |
| Binaries · CLI | /opt/dirhamhost/bin/ (dh-agent, dh-api, dhctl) |
| Config | /etc/dirhamhost/ (admin.initial, ssl/, license, stripe.secret) |
| State & imports | /var/lib/dirhamhost/ (imports/, backups, license.status) |
| Panel web files | /var/www/dirhamhost/panel/ |
| Audit log | /var/log/dirhamhost/ · install: /var/log/dirhamhost-install.log |
| Open ports | 21 (ftp), 25/587/465/993 (mail), 53 (dns), 80/443 (web), 8443 (panel), 2096/2097 (webmail/pma) |
| Services | dh-agent · dh-api · nginx · mariadb · pdns · postfix · dovecot · csf |
Need a hand, a licence, or a migration done for you? Talk to the Dirham A Day team — support@dirhamaday.ae or WhatsApp +971 58 553 6767.