Command line
Every Reqad install ships a reqad command that creates, changes and removes hosting accounts, databases and mailboxes from a shell or a script. It runs the same code as the panel, so an account created on the command line is indistinguishable from one created in the browser - same vhost, same PHP-FPM pool, same mail and DNS setup.
reqad account, reqad db, reqad email, reqad auth and reqad health change the server and refuse to run as anyone else. reqad info and reqad --version work as any user.Commands
| Command | What it does |
|---|---|
reqad info | The OS, the web server and template in use, and every installed PHP version. |
reqad account | List, show, create, edit and delete hosting accounts. |
reqad db | List, create and delete MySQL/MariaDB databases, change a database user's password. |
reqad email | List, create, edit and delete mailboxes. |
reqad auth | The panel login: login page or browser prompt, admin password, 2FA, sessions, blocked IPs - and the way back in when you are locked out. |
reqad health | What needs attention: certificates, mail DNS, PHP versions, services, backups - the dashboard's Needs attention card. |
reqad --version | The installed Reqad version. |
Every command has its own help:
reqad --help reqad account --help reqad db --help reqad email --help reqad auth --help reqad health --help
Not seeing account, db or email in reqad --help? Update the panel with dnf update reqad.
Hosting accounts
reqad account list
reqad account show <user>
reqad account create <user> <domain>
[--www] [--email] [--dns] [--letsencrypt] [--quota=MB]
reqad account edit <user>
[--password] [--php=VERSION[:fpm|mod_php]] [--email=on|off]
reqad account delete <user> [--yes]Create an account for a domain, with mail, the www. alias, a DNS zone at your configured provider and a Let's Encrypt certificate:
reqad account create bob example.com --www --email --dns --letsencrypt
| Option | What it does |
|---|---|
--www | Serve www.<domain> as well as the bare domain. |
--email | Enable mail for the domain: exim, DKIM keys and the MX, SPF and DMARC records. |
--dns | Create the DNS zone at the provider configured under DNS Settings. |
--letsencrypt | Request a certificate. Certbot runs in the background, so the command returns before the certificate is issued. |
--quota=MB | Disk quota in MB. Ignored when quotas are off on the server. |
The account is created with the server's default PHP version. Switch it later - and on Apache also choose the handler:
reqad account edit bob --php=8.3 reqad account edit bob --php=8.2:mod_php reqad account edit bob --email=off
reqad account list prints one row per account:
┌──────┬──────┬──────────────────┬───────┬────────┬─────────────────────┐ │ UID │ USER │ DOMAIN │ EMAIL │ STATUS │ CREATED │ ├──────┼──────┼──────────────────┼───────┼────────┼─────────────────────┤ │ 1041 │ bob │ example.com │ yes │ active │ 2026-09-14 11:20:07 │ │ 1042 │ shop │ shop.example.net │ no │ active │ 2026-09-18 09:02:55 │ └──────┴──────┴──────────────────┴───────┴────────┴─────────────────────┘
reqad account show adds the account's PHP version and handler, disk usage and quota, shell access, its mailboxes and databases, and its limits: CPU, memory and processes for SSH, cron and the web terminal, and database connections per database user. reqad account limits <user> shows what is in use right now and recent limit hits.
reqad account delete bob removes the vhost, the PHP-FPM pool, mail, certificates, the DNS zone, the home directory and every database and database user prefixed bob_. From a terminal it asks you to type the account name back; in a script pass --yes.Databases
reqad db list [--account=ACCOUNT] reqad db create <account> <name> [--dbuser=NAME] reqad db delete <database> [--yes] reqad db passwd <dbuser>
<account> is the hosting account the database belongs to, and it is the prefix of every name, exactly as in the panel. create takes the short name and adds the prefix to both the database and its user; --dbuser picks a different user name, also prefixed. delete and passwd take the full name:
reqad db create bob wp --generate-password # database bob_wp, user bob_wp reqad db create bob shop --dbuser=shopuser # database bob_shop, user bob_shopuser reqad db passwd bob_wp reqad db delete bob_shop --yes
┌──────────┬─────────────┬─────────┬─────────────────────────────────────┐ │ DATABASE │ SYSTEM USER │ SIZE_MB │ USERS │ ├──────────┼─────────────┼─────────┼─────────────────────────────────────┤ │ bob_wp │ bob │ 12.41 │ bob_wp@localhost, bob_wp2@localhost │ │ bob_shop │ bob │ 0.72 │ bob_shop@localhost │ └──────────┴─────────────┴─────────┴─────────────────────────────────────┘
The account must exist - the prefix is what ties a database to a hosting account, and is why deleting the account also deletes its databases. Deleting a database also drops the users that were granted on it, unless a user still has access to another database. A dash in the SYSTEM USER column means there is no hosting user behind the prefix - which is how a database left behind by a removed account shows up.
Mailboxes
reqad email list [--domain=DOMAIN] reqad email create <address> reqad email edit <address> [--password] [--enable|--disable] reqad email delete <address> [--yes]
The domain must already belong to an account with mail enabled (reqad account create … --email, or reqad account edit <user> --email=on).
reqad email create sales@example.com --generate-password reqad email edit sales@example.com --disable reqad email list --domain=example.com
┌───────────────────┬─────────────┬──────────┐ │ EMAIL │ SYSTEM USER │ STATUS │ ├───────────────────┼─────────────┼──────────┤ │ bob@example.com │ bob │ active │ │ sales@example.com │ bob │ disabled │ └───────────────────┴─────────────┴──────────┘
--disable blocks IMAP, POP3 and SMTP login for that mailbox but keeps delivering mail to it, so nothing is lost while an account is suspended; --enable allows login again. delete removes the mailbox with its messages, filters and autoresponder.
Acting as one account
Add --user=ACCOUNT to any account, db or email command to run it with that hosting account's permissions instead of the server admin's. Lists show only the account's own databases and mailboxes, and anything that belongs to another account is refused:
reqad db list --user=bob # only bob's databases reqad db delete alice_wp --user=bob --yes # refused: does not belong to account bob reqad email create info@example.com --user=bob
Creating or deleting accounts, assigning databases and the auth commands stay with the server admin and are refused with --user. It is the same check that account-level access to Reqad uses, so it is also a quick way to see what an account is allowed to do.
Panel login
reqad auth status reqad auth mode web|basic reqad auth passwd [<user>] reqad auth 2fa-reset [<user>] reqad auth sessions reqad auth logout [<user>] reqad auth unban <ip> reqad auth firewall [status|off] reqad auth email-code [status|off|on] reqad auth passkeys [<user>] [--remove-all] reqad auth log [--lines=N]
| Command | What it does |
|---|---|
status | Login page or browser prompt, the admins with their 2FA state and sessions, and the blocked addresses. |
mode web | Switch port 2087 to the login page. The current password keeps working. |
mode basic | Go back to the browser's password prompt, with the same password. |
passwd | Set an admin's password (default: the only admin) and log out its sessions. Takes the password options below. |
2fa-reset | Turn two-factor authentication off - for a lost phone. |
sessions | Every logged-in browser: user, address, browser, last activity. |
logout | End every session of one admin, or of everyone. |
unban | Unblock an address that failed to log in too often: the login lockout and the CSF block. |
firewall off | Open the panel port to every address again when the IP restriction keeps you out. The saved list is kept. |
email-code off | Stop asking new devices for the emailed code, when it does not arrive. on turns it back on. |
passkeys | List an admin's passkeys; --remove-all deletes them, for a lost or stolen device. |
log | The latest security events: logins, failures, blocks and changes. |
reqad auth passwd --generate-password # new random password, printed once reqad auth unban 203.0.113.7 reqad auth log --lines=50
These commands need SSH access as root, which is why they are the way back in - see Locked out? for which one fits which problem.
Needs attention
reqad health list [--account=ACCOUNT] [--all] reqad health run [--check=ID] reqad health checks reqad health dismiss <id> [--days=N|--forever] reqad health restore <id>
| Command | What it does |
|---|---|
list | The problems the last run found, most serious first, with the account and the id of each. --account=bob shows one account, --account=- the server's own; --all includes hidden ones. |
run | Run the checks now. They also run every 30 minutes. --check=ssl,mail_dns runs only those. |
checks | The checks there are, with their ids. |
dismiss | Hide a problem for 7 days, --days=N, or --forever. It shows again when the time is up and it is still there. |
restore | Show a hidden problem again. |
With --user=ACCOUNT, list shows only that account's problems and dismiss works only on them; run stays with the server admin. What each check looks for is on the Needs attention page.
Passwords
No command takes a password as an argument - an argument would land in your shell history and in the process list, where any user on the server can read it. There are three ways to supply one:
| Option | What it does |
|---|---|
| nothing | Prompts for the password twice, without echoing it. Needs a terminal. |
--password-stdin | Reads it from the first line of standard input. For scripts and configuration management. |
--generate-password | Generates a strong password and prints it once with the result. |
# interactive: asks twice, echoes nothing reqad account create bob example.com # from a secret store, a file or a pipe pass show hosting/bob | reqad account create bob example.com --password-stdin # let Reqad pick one and print it reqad email create sales@example.com --generate-password
Scripting
Add --json to any command to get a machine-readable result instead of a table or a message. Colors and box drawing are dropped automatically when the output is not a terminal, so piping is safe either way.
reqad account show bob --json
{
"ok": true,
"message": "",
"warnings": [],
"error": "",
"data": {
"uid": 1041,
"user": "bob",
"domain": "example.com",
"status": "active",
"created_at": "2026-09-14 11:20:07",
"email": true,
"disk_usage": 512,
"disk_quota": 0,
"php": "8.3",
"php_handler": "fpm",
"mailboxes": [
"sales@example.com"
],
"databases": [
"bob_wp"
]
}
}warnings is where a change that went through but not cleanly reports itself - a DNS zone that could not be created, a certificate request that did not start, a DKIM key the provider refused. The operation succeeded; something around it did not.
| Exit code | Meaning |
|---|---|
0 | Success. |
1 | The operation failed (the reason is on standard error, or in error with --json). |
2 | Wrong usage: unknown command or option, missing argument, or a delete without a terminal and without --yes. |
Anything that deletes asks for confirmation when it has a terminal, and refuses to run without one. -y or --yes skips the question - which is what you want in a script and what you do not want in a shell.
Tab completion
Reqad installs bash completion for the command, so there is nothing to add to your profile. Press Tab after reqad and it completes commands, options and real values from the server - account names, databases, database users, mailboxes, mail domains and the PHP versions actually installed:
reqad account edit <TAB> bob shop reqad account edit bob --php=8.<TAB> 8.2 8.3 8.4 8.5 reqad db delete bob_<TAB> bob_wp bob_shop reqad email edit sa<TAB> sales@example.com
It works behind sudo reqad too. Completion never prompts for a password: the values that need root are only offered to a shell that already is root.
server-software.ini, and the cleanup done on delete. Actions taken on the command line are written to the panel's request log.Need a hand? Create a free account or contact us.