Open sourceIn the free reqad package (GPL-3.0).

Command line (CLI)

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.

Run it as root. reqad account, reqad db, reqad email, reqad auth, reqad health, reqad api, reqad mcp, reqad deploy, reqad app, reqad backup, reqad stats, reqad logs, reqad resources and reqad package change the server and refuse to run as anyone else. reqad info and reqad --version work as any user.

Commands

CommandWhat it does
reqad infoThe OS, the web server and template in use, and every installed PHP version.
reqad accountList, show, create, edit and delete hosting accounts; check and fix the permissions of an account's files.
reqad dbList, create, delete and export MySQL/MariaDB databases, change a database user's password.
reqad emailList, create, edit and delete mailboxes.
reqad authThe panel login: login page or browser prompt, admin password, 2FA, sessions, blocked IPs - and the way back in when you are locked out.
reqad healthWhat needs attention: certificates, mail DNS, PHP versions, services, backups - the dashboard's Needs attention card.
reqad deployGit deployments: deploy a site from a branch, roll back, follow the log.
reqad appNode.js and Python apps: runtimes, create, start / stop, logs, environment.
reqad backupAn account's own backups: list them, see what is in one, and put files, a database or a mailbox back.
reqad statsVisitor stats and bandwidth: a site's visitors, pages and traffic, every account's bandwidth in a month, the hourly count and the country database.
reqad logsA site's web server log, a day at a time: its requests (filter, search, older pages) and the web server's errors grouped by kind.
reqad resourcesResource usage: CPU, memory and processes of every account or of one, the limits it reached, what it runs now, and Stop.
reqad apiThe REST API: turn it on or off, make and revoke access tokens, see the latest calls.
reqad mcpAI assistants: turn AI access on or off, make and revoke tokens, the latest tool calls - and reqad mcp serve, which the assistant runs over SSH.
reqad packagePremiumHosting packages (Reqad Hosting Pro): create and change packages, give accounts a package, the default package, usage against the limits, disk and mailbox quotas, bandwidth. With the add-on, reqad account also gets suspend, unsuspend and suspended.
reqad webserverPremiumThe web server setup (Reqad Hosting Pro): nginx alone, or Apache behind nginx; switch every site from one to the other.
reqad ipPremiumExtra IP addresses of the server (Reqad Hosting Pro): add, change and remove them, check their reverse DNS.
reqad --versionThe 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
reqad api --help
reqad mcp --help
reqad deploy --help
reqad app --help
reqad backup --help
reqad stats --help
reqad logs --help
reqad resources --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
OptionWhat it does
--wwwServe www.<domain> as well as the bare domain.
--emailEnable mail for the domain: exim, DKIM keys and the MX, SPF and DMARC records.
--dnsCreate the DNS zone at the provider configured under DNS Settings.
--letsencryptRequest a certificate. Certbot runs in the background, so the command returns before the certificate is issued.
--quota=MBDisk 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 perms bob checks the owners and permissions of everything in the account's home: files owned by another user or by root (often copied in as root), groups other than the account's or the web server's, files anyone can write to, setuid files, wp-config.php and .env files anyone can read, and the modes of ~/.ssh. It exits 0 when everything is fine and 3 when it found problems. --fix repairs them and sets the account's top folders and PHP pool by the panel's permissions model; it first writes an undo script to /var/lib/reqad/perms-restore-bob-<time>.sh. --keep-root leaves files owned by root as they are, for files you put there as root on purpose, for example published downloads the site must not change.

reqad account perms bob                 # check only
reqad account perms bob --fix           # repair
reqad account perms bob --fix --keep-root
Delete removes everything. 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>
reqad db export <database> [--output=FILE|-] [--no-gzip]

<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.

export saves a database as SQL: a consistent snapshot with its stored routines and triggers, without a CREATE DATABASE, so it can be imported into a database of any name. It writes <database>-<date>.sql.gz in the current folder, or the file --output names, readable only by you, and never overwrites a file that exists. --output=- sends it to standard output for a pipe, and --no-gzip gives plain SQL:

reqad db export bob_wp                                   # ./bob_wp-20261025-130557.sql.gz
reqad db export bob_wp --output=/root/bob_wp.sql.gz
reqad db export bob_wp --output=- --no-gzip | mysql bob_wp_test

Mailboxes

reqad email list   [--domain=DOMAIN]
reqad email create <address> [--size=SIZE]
reqad email edit   <address> [--password] [--enable|--disable] [--size=SIZE]
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). --size (500M, 2G, or default) sets the mailbox size; it needs Reqad Hosting Pro.

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       [status|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]
CommandWhat it does
statusLogin page or browser prompt, the admins with their 2FA state and sessions, and the blocked addresses.
mode webSwitch port 2087 to the login page. The current password keeps working.
mode basicGo back to the browser's password prompt, with the same password.
passwdSet an admin's password (default: the only admin) and log out its sessions. Takes the password options below.
2fa-resetTurn two-factor authentication off - for a lost phone.
sessionsEvery logged-in browser: user, address, browser, last activity.
logoutEnd every session of one admin, or of everyone.
unbanUnblock an address that failed to log in too often: the login lockout and the CSF block.
firewall offOpen the panel port to every address again when the IP restriction keeps you out. The saved list is kept.
email-code offStop asking new devices for the emailed code, when it does not arrive. on turns it back on.
passkeysList an admin's passkeys; --remove-all deletes them, for a lost or stolen device.
logThe 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>
CommandWhat it does
listThe 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.
runRun the checks now. They also run every 30 minutes. --check=ssl,mail_dns runs only those.
checksThe checks there are, with their ids.
dismissHide a problem for 7 days, --days=N, or --forever. It shows again when the time is up and it is still there.
restoreShow 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.

REST API

reqad api status
reqad api on|off
reqad api tokens  [--all]
reqad api new     <name> [--account=ACCOUNT] [--write] [--delete] [--days=N] [--ip=LIST]
reqad api revoke  <id|name|prefix>
reqad api log     [--lines=N] [--token=ID]
CommandWhat it does
statusWhether the API answers, its address and how many tokens are active.
on / offTurn the API on or off. While it is off every request is refused; the tokens are kept.
tokensThe tokens with their permissions, account, expiry and last use. --all includes revoked ones.
newMake a token and print it - the only time it is shown. It can read; --write adds create and change, --delete adds delete. --account=bob limits it to what that account owns. --days=N sets the expiry (default 90, 0 = never), --ip the addresses it works from.
revokeRefuse the token from now on.
logThe latest calls: time, token, address, request, status.

The endpoints and examples are on the REST API page. With --user=ACCOUNT these commands are refused: tokens are the server admin's.

AI assistants (MCP)

reqad mcp status
reqad mcp on|off
reqad mcp tokens  [--all]
reqad mcp new     <name> [--account=ACCOUNT] [--write] [--delete] [--days=N] [--ip=LIST]
reqad mcp revoke  <id|name|prefix>
reqad mcp log     [--lines=N] [--token=ID]
reqad mcp tools   [--token-file=PATH]
reqad mcp serve   --token-file=PATH
CommandWhat it does
statusWhether AI access is on, how many tokens are active and how many tools there are.
on / offTurn AI access on or off. While it is off assistants cannot connect, and running sessions stop at their next call; the tokens are kept.
tokensThe AI access tokens with their permissions, account, expiry, last use and token file. --all includes revoked ones.
newMake a token, save it in /var/lib/reqad/mcp/<id>.token (root only) and print the settings for Claude Code and other clients. It can read; --write adds create and change, --delete adds delete (each delete still needs a second, confirmed call). --account=bob limits it to what that account owns. --days=N sets the expiry (default 30, at most 90), --ip the SSH client addresses it works from.
revokeRefuse the token from now on, also in running sessions, and delete its file.
logThe latest tool calls: time, token, address, tool, status.
toolsThe tools assistants get; with --token-file only the ones that token may call.
serveSpeak MCP on standard input and output. This is what the assistant runs over SSH.

How to connect an assistant: AI assistants (MCP). With --user=ACCOUNT these commands are refused.

Git deployments

reqad deploy list     [--account=ACCOUNT]
reqad deploy show     <id|domain> [--secret]
reqad deploy create   <domain> --repo=URL [settings]
reqad deploy edit     <id|domain> [settings] [--new-secret]
reqad deploy run      <id|domain> [--wait]
reqad deploy rollback <id|domain> [--release=NAME] [--wait]
reqad deploy log      <id|domain> [--run=ID]
reqad deploy delete   <id|domain> [--yes]
SettingWhat it does
--repo=URLThe repository: git@host:you/site.git (read with the site's deploy key) or https://....
--branch=NAMEThe branch to deploy (default main).
--dir=PATHThe folder the web serves, e.g. public.
--build=COMMANDSRun in the new release as the account; separate commands with new lines or &&.
--shared=LISTPaths kept between releases, comma separated; end folders with /.
--keep=NReleases kept for rolling back (default 5).
--check=PATHA page that must answer after the switch, or the deploy goes back to the previous release.
--auto=on|offDeploy when the webhook reports a push (default on).

create prints the deploy key and the webhook address and secret. run --wait and log on a running deploy follow its output and exit with 1 when it fails, which suits scripts. With --user=ACCOUNT only that account's sites can be deployed. More on the Git deployments page.

Node.js and Python apps

reqad app list      [--account=ACCOUNT]
reqad app show      <id|domain>
reqad app create    <domain> --runtime=node:24|python:3.12 [--start=CMD] [settings] [--no-start]
reqad app edit      <id|domain> [settings]
reqad app start|stop|restart <id|domain>
reqad app logs      <id|domain> [--lines=N]
reqad app env       <id|domain> [--file=PATH]
reqad app install   <id|domain> [--wait]
reqad app detect    <domain> [--dir=PATH] [--runtime=node|python]
reqad app delete    <id|domain> [--yes]
reqad app runtimes  [--available]
reqad app runtime   install|update|remove node <major> | python <3.x>
SettingWhat it does
--runtime=KIND:VERSIONnode:24, node:22, python:3.12... (installed with app runtime install).
--start=CMDRuns in the app folder; it must listen on 127.0.0.1:$PORT. Required, except for a site deployed from Git that has no release yet: the first deploy reads it from the code.
--dir=PATHThe app folder in the account's home (default: the Git deployment's current release, else apps/<domain>/app).
--static=on|offnginx serves files that exist in the document root first.
--memory=MBMemory limit (default 512).

env prints the app's environment file, or replaces it with --file and restarts the app. --no-start on create waits for the code, for example for the first Git deploy. install installs the app's packages in the background and restarts it (--wait follows the output). detect reads the code (as the account; nothing runs) and prints the start command it needs, the other ones it found and the runtime that fits; --dir looks at another folder of the account. With --user=ACCOUNT, only that account's apps can be managed; installing runtimes is the server admin's. More on the apps page.

An account's backups

reqad backup list     <account> [--refresh]
reqad backup show     <account> <backup>
reqad backup restore  <account> <backup> --files=PATH|--database=NAME|--email=MAILBOX [--mode=MODE]
                      [--name=NEW_DB] [--grant=DBUSER]
reqad backup restores <account>

list shows the account's nightly backups on the backup server (remote-YYYYMMDD) and the archives in /usr/local/reqad/backup (local-YYYYMMDD-HHMM), newest first. show lists what one holds: its databases, mailboxes and top folders. restore works in the background, exactly like the account panel's Backups pages:

WhatModes
--files=PATHA file or folder of the home folder, empty for all of it (without mail). missing (default): only what is not there now; overwrite: the backup's version wins, other files stay; replace: exactly as in the backup (not for the whole home folder).
--database=NAMEtables (default): the backup's tables replace the same tables, others stay; replace: emptied first; new: into a new database --name, given to --grant if set.
--email=MAILBOXmissing (default): messages and folders deleted since come back, nothing is duplicated; replace: the mailbox as in the backup. A mailbox deleted since is made again, with its old password.

What a restore replaces or deletes is kept in the account's ~/backup-restores/, and a database is copied there before it changes. restores shows how the latest ones ended. With --user=ACCOUNT only that account's backups can be used. More on the backups page.

Visitor stats and bandwidth

reqad stats show    <domain|all> [--period=30d|12m|YYYY-MM] [--account=USER]
reqad stats usage   [--month=YYYY-MM]
reqad stats collect [--domain=DOMAIN] [--quiet]
reqad stats geoip   [--update] [--auto] [--monthly=on|off]
reqad stats on|off

show prints a site's visitors, page views, requests, bandwidth and server errors per day (per month with --period=12m), then its top pages, referring sites, missing pages, bots and countries; all is every site of --account. usage is the Bandwidth Usage page: every account and its sites in a month, busiest first. collect counts what the logs got since the last count (cron runs it every hour). geoip shows the country database; --update downloads this month's DB-IP Lite file now, --monthly turns the monthly update on or off. on and off turn visitor stats on or off for the whole server (off, the logs are still counted while hosting packages have a bandwidth limit). With --user=ACCOUNT, only show and usage work, for that account's own sites. More on the visitor stats page.

Site logs

reqad logs site <domain> [--day=YYYY-MM-DD] [--filter=all|err|5xx] [--bots=no] [--q=TEXT] [--ip=ADDRESS] [--offset=N]
reqad logs site <domain> --errors [--day=YYYY-MM-DD] [--all-lines]
reqad logs days <domain>

site lists a day's requests of a site (main or addon domain), newest first, 50 at a time: time, answer code, method and address, IP address and country, size, and the browser or bot. --filter=err keeps the 4xx and 5xx answers, 5xx only the server errors; --bots=no leaves bots and scanners out; --q keeps the requests with that text in the address, IP, browser or referring page; --ip one address; --offset goes further back. --errors shows the web server's errors for the site that day, grouped by kind (permissions, PHP not running, timeouts, blocked by a security rule...), or the newest lines with --all-lines. days lists the days the server still keeps. The default day is today. With --user=ACCOUNT it works for that account's own sites, as in the account panel's Metrics > Logs.

Resource usage

reqad resources usage     [--range=day|week|month]
reqad resources show      <account> [--range=day|week|month]
reqad resources processes <account>
reqad resources stop      <account> <pid> --start=TICKS
reqad resources collect   [--quiet]

usage is the Resource Usage page: every account's CPU and memory (average and highest check), processes, PHP workers at the most and the limits it reached, and the whole server; the default range is the last 24 hours. show splits one account into its SSH / cron / terminal sessions, each site's PHP, email and background jobs, with database connections per user, its limits and the limits it reached. processes lists what it runs now; stop stops one of them (TERM, then KILL after 5 seconds), and --start, the start time processes --json shows, makes sure a process number used again is never hit. collect is the check cron runs every minute. With --user=ACCOUNT everything but collect works, for that account only. More on the resource usage 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:

OptionWhat it does
nothingPrompts for the password twice, without echoing it. Needs a terminal.
--password-stdinReads it from the first line of standard input. For scripts and configuration management.
--generate-passwordGenerates 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 codeMeaning
0Success.
1The operation failed (the reason is on standard error, or in error with --json).
2Wrong 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.

Same code as the panel. The command line and the web interface call one shared implementation, so both enforce the same rules - reserved usernames, password strength, the account limit from 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.