Users
Manage users: Add, Delete, Suspend, Unsuspend, etc.
List Users
To list all users, use the following command:
opencli user-list
When printed to a terminal, RAM, CPU, disk and inodes usage is shown in orange when over 80% of the limit and in red when over 90%, online users get a green dot, and suspended users are shown in red. Colors are left out when the output is piped or NO_COLOR is set.
Example output
# opencli user-list
USERNAME EMAIL STATUS ONLINE 2FA IP ADDRESS PLAN DOMAINS RAM (used/allocated) CPU (used/allocated) DISK (used/allocated) INODES (used/allocated) NOTES
stefan [email protected] Active ● Yes On 203.0.113.10 (shared) Standard plan 3 412.5M/2 GB 0.1 cores/1 Core 9.20GB/10.00GB 48213/1000000 VIP client
panel [email protected] Suspended No Off 203.0.113.25 (dedicated) Standard plan 1 N/A/2 GB N/A/1 Core 0.52GB/10.00GB 10422/1000000
You can also format the data as JSON:
opencli user-list --json
Example output
{
"data": [
{
"id": 1000,
"username": "stefan",
"context": "stefan",
"owner": "root",
"package": {
"name": "Developer Plus",
"owner": "root"
},
"locale_code": "EN_us"
},
{
"id": 1001,
"username": "panel",
"context": "panel",
"owner": "root",
"package": {
"name": "Developer Plus",
"owner": "root"
},
"locale_code": "EN_us"
},
{
"id": 1002,
"username": "emailfilterapi",
"context": "emailfilterapi",
"owner": "root",
"package": {
"name": "Developer Plus",
"owner": "root"
},
"email": "emailfilterapi",
"locale_code": "EN_us"
}
],
"metadata": {
"result": "ok"
}
}
To display only user count:
opencli user-list --total
Example output
# opencli user-list --total
Total number of users: 3
or:
opencli user-list --total --json
Example output
#opencli user-list --total --json
3
List all users Quotas
opencli user-list --quota
Example output
{
"timestamp": "2026-04-01T10:16:01Z",
"users": [
{"username":"stefan","uid":1000,"home_path":"/home/stefan/","disk_used":269744,"disk_soft":5120000,"disk_hard":5120000,"inodes_used":130,"inodes_soft":1000000,"inodes_hard":1000000},
{"username":"pejcic","uid":1001,"home_path":"/home/pejcic/","disk_used":550216,"disk_soft":5120000,"disk_hard":5120000,"inodes_used":143,"inodes_soft":1000000,"inodes_hard":1000000},
{"username":"demo","uid":1002,"home_path":"/home/demo/","disk_used":4138604,"disk_soft":10240000,"disk_hard":10240000,"inodes_used":74889,"inodes_soft":1000000,"inodes_hard":1000000}
]
}
Add User
opencli user-add <USERNAME> <PASSWORD|generate> <EMAIL> "<PLAN_NAME>" [--send-email] [--debug] [--reseller=<RESELLER_USERNAME>] [--private-note=<NOTE>] [--webserver=<TYPE>] [--sql=<mysql|mariadb>] [--no-sentinel]
To create a new user run the following command:
opencli user-add <USERNAME> <PASSWORD> <EMAIL> <PLAN_NAME>
Example:
opencli user-add stefan pejcic324 [email protected] 'Default Plan Nginx'
Example output
# opencli user-add stefan pejcic324 [email protected] 'Default Plan Nginx'
[✔] Successfully added user stefan with password: pejcic324
Provide generate as password to generate a strong random password.
Optional flags:
--send-email- send an email with login credentials to the user's email address.--private-note=<NOTE>- save a private note for this user (visible only in OpenAdmin).--reseller=<RESELLER_USERNAME>- assign a reseller as the owner of this user.--webserver=<TYPE>- webserver to use, one of the webservers defined in the defaultdocker-compose.ymltemplate (by defaultnginx,apache,openrestyoropenlitespeed), optionally prefixed withvarnish+(e.g.varnish+nginx). A webserver not in the template is ignored with a warning and the default is used.--sql=<mysql|mariadb>- database type to use.--no-sentinel- don't send the user_create notification.--skip-images- don't pull container images for the new user.--debug- display verbose information.
Example:
opencli user-add stefan generate [email protected] 'Default Plan Nginx' --webserver=varnish+nginx --sql=mariadb --send-email
Example output
# opencli user-add stefan generate [email protected] 'Default Plan Nginx' --webserver=varnish+nginx --sql=mariadb --send-email
[✔] Successfully added user stefan with password: k3Vq9XbT2mWz4LpR
Create user for Reseller
opencli user-add <USERNAME> <PASSWORD> <EMAIL> "<PLAN_NAME>" --reseller=<RESELLER_USERNAME>
Example output
# opencli user-add client1 'StrongPass1' [email protected] 'Default Plan Nginx' --reseller=reseller1
[✔] Successfully added user client1 with password: StrongPass1
Transfer User
To transfer user account to another server:
opencli user-transfer --account <OPENPANEL_USER> --host <DESTINATION_IP> --username <DESTINATION_SSH_USERNAME> --password <DESTINATION_SSH_PASSWORD> [--port 22] [--force] [--live-transfer]
Example output
# opencli user-transfer --account stefan --host 203.0.113.20 --username root --password 'DestinationPass'
Import started, log file: /var/log/openpanel/admin/transfers/stefan_203.0.113.20_2026-09-24_10-30-00.log
[2026-09-24 10:30:00] Testing SSH connection to [email protected]...
[2026-09-24 10:30:01] SSH connection established, starting transfer process..
[2026-09-24 10:30:01] Log file: /var/log/openpanel/admin/transfers/stefan_203.0.113.20_2026-09-24_10-30-00.log
[2026-09-24 10:30:01] PID: 48213
[2026-09-24 10:30:02] Resolved context for stefan: stefan
[2026-09-24 10:30:03] Importing new plan...
[2026-09-24 10:30:03] Importing user into database...
[2026-09-24 10:30:03] Listing features on remote server ...
[2026-09-24 10:30:03] Copying feature set 'default.txt' to remote server
[2026-09-24 10:30:04] Creating system user (stefan) on remote server ...
[2026-09-24 10:30:05] Syncing files for user stefan (context: stefan) ...
...
[2026-09-24 10:31:10] Importing sites ...
[2026-09-24 10:31:10] Site imported: example.com
[2026-09-24 10:31:11] Enabling rootless podman for stefan on destination ...
[2026-09-24 10:31:12] Restoring FTP accounts for stefan (context: stefan) ...
[2026-09-24 10:31:13] [FTP] restored [email protected] -> /var/www/html/example.com
[2026-09-24 10:31:13] FTP accounts restored for context stefan.
[2026-09-24 10:31:15] Syncing mail data ...
[2026-09-24 10:31:16] Syncing maildir /var/mail/example.com → /var/mail/example.com ...
[2026-09-24 10:31:17] Checking podman context ....
[2026-09-24 10:31:17] Starting containers inside podman context on remote server ...
[2026-09-24 10:32:01] Reloading services on 203.0.113.20 server ...
[2026-09-24 10:32:12] Reloading mailserver and webmail on 203.0.113.20 server ...
[2026-09-24 10:32:20] Recalculating disk and inodes usage for all users on 203.0.113.20 ...
[2026-09-24 10:32:20] Elapsed time: 0h 2m 20s
[2026-09-24 10:32:20] SUCCESS: Transfer process for user stefan completed.
--account- OpenPanel username to transfer.-h,--host- destination server IP.-u,--username- SSH user on the destination server (defaultroot).--password- SSH password for the destination server, leave it out to use SSH keys.--port- SSH port on the destination server (default22).--force- overwrite the account if the username already exists on the destination server.--live-transfer- suspend the account after the transfer and forward DNS to the new server.
The destination server needs OpenPanel installed. Files, databases, domains, sites, DNS zones, SSL, FTP and email accounts (Enterprise) are copied, and containers are recreated on the destination from the user's volumes. If a plan with the same name already exists on the destination it's reused, and the log shows a warning when its feature set differs from the source. Progress is written to /var/log/openpanel/admin/transfers/.
Backup User
To create a full account .tar.gz backup of a single user (files, databases, mail, and configuration):
opencli user-backup --account <USER> [--output <DIR>] [--quiet] [--no-throttle]
Without --output the archive goes to /var/www/html/_backups/ in the user's files, and the backup stops if that folder points through a symlink. The tar and compression steps run at low CPU and IO priority (nice, ionice), --no-throttle runs them at normal priority.
Example output
# opencli user-backup --account stefan
[2026-09-24 10:30:00] Backup started log: /var/log/openpanel/admin/backups/stefan_backup_20260924_103000.log (PID: 48213)
[2026-09-24 10:30:00] Account: stefan Context: stefan UID:1001 GID:1001 Plan: Default Plan Nginx
[2026-09-24 10:30:00] Checking disk space ...
[2026-09-24 10:30:00] Source size (~812 MB via du)
[2026-09-24 10:30:00] Free at dest (~48210 MB at /backup)
[2026-09-24 10:30:00] Disk space OK.
[2026-09-24 10:30:00] Writing manifest ...
[2026-09-24 10:30:00] Exporting panel DB rows ...
...
[2026-09-24 10:30:02] Streaming /home/stefan → homedir/ ...
...
═══════════════════════════════════════════════════════════════
BACKUP COMPLETE — stefan_20260924_103000.tar.gz
═══════════════════════════════════════════════════════════════
Archive: /backup/stefan_20260924_103000.tar.gz
Size: 402M
Compression: pigz
Time taken: 0h 1m 12s
Contents:
Plan: "Default Plan Nginx"
Domains (2): example.com example.net
Sites: 1
Feature set: default
FTP accounts: 2
Home dir: homedir/ (source ~812 MB)
Containers: nginx php-fpm-8.3 mysql
--output <DIR>- custom destination directory for the archive (defaults to the location configured for backups).--quiet- only log to file, don't print progress to stdout.
Restore User
To restore a user account from a .tar.gz backup created with user-backup:
opencli user-restore --file <ARCHIVE> [--force] [--new-username=<NAME>] [--reseller=<NAME>] [--temp-dir=<PATH>] [--quiet]
--reseller=<NAME> restores the account for a reseller: it's refused when the reseller has reached their account or disk limit, when the plan from the backup doesn't exist or isn't assigned to the reseller, or together with --force. The restored account is owned by the reseller.
Example output
# opencli user-restore --file /backup/stefan_20260924_103000.tar.gz
Import started, log file: /var/log/openpanel/admin/imports/openpanel-import_20260924_110000.log
[2026-09-24 11:00:00] Log file: /var/log/openpanel/admin/imports/openpanel-import_20260924_110000.log
[2026-09-24 11:00:00] PID: 51234
[2026-09-24 11:00:00] Archive: /backup/stefan_20260924_103000.tar.gz
[2026-09-24 11:00:00] Checking disk space for extraction ...
[2026-09-24 11:00:00] Extracting archive ...
[2026-09-24 11:00:09] Restoring 'stefan' (context: stefan) format v2
[2026-09-24 11:00:09] Restoring system user (stefan) ...
[2026-09-24 11:00:10] Restoring /home/stefan ...
[2026-09-24 11:00:31] Restoring panel DB rows ...
[2026-09-24 11:00:31] Plan 'Default Plan Nginx' exists (ID: 1) — reusing.
[2026-09-24 11:00:31] User row ready (ID: 7).
[2026-09-24 11:00:31] Restoring domains ...
[2026-09-24 11:00:31] Domain restored: example.com
[2026-09-24 11:00:31] Domain restored: example.net
[2026-09-24 11:00:31] Restoring FTP accounts ...
[2026-09-24 11:00:32] FTP user restored: [email protected]
...
[2026-09-24 11:00:40] Reloading services ...
[2026-09-24 11:00:41] Recalculating quotas ...
═══════════════════════════════════════════════════════════════
RESTORE COMPLETE — stefan
═══════════════════════════════════════════════════════════════
Archive: stefan_20260924_103000.tar.gz
Time taken: 0h 0m 41s
Restored:
System user: stefan [created]
Home directory: /home/stefan/ (812M)
...
--force- overwrite the account if a user with the same username already exists.--new-username=<NAME>- restore under a different username than the one in the backup.--temp-dir=<PATH>- directory to extract the archive into during restore (must be empty). Defaults to/tmp/.--quiet- only log to file, don't print progress to stdout.
Delete User
To delete a user and all his data run the following command:
opencli user-delete <USERNAME>
Example output
# opencli user-delete stefan
This will permanently delete user 'stefan' and all associated data. Confirm? [Y/n]: y
User stefan deleted successfully.
add -y flag to disable prompt.
This action is irreversible and will permanently delete all user data.
Suspend User
To suspend (temporary disable access) to user, run the follwowing command:
opencli user-suspend <USERNAME> [-y] [--debug]
Example output
# opencli user-suspend stefan
Are you sure you want to suspend OpenPanel user 'stefan'? (y/N) y
User 'stefan' suspended successfully.
add -y flag to disable prompt.
Unsuspend User
To unsuspend (enable access) to user, run the follwowing command:
opencli user-unsuspend <USERNAME>
Example output
# opencli user-unsuspend stefan
User 'stefan' unsuspended successfully.
Rename User
To change a username run:
opencli user-rename <USERNAME> <NEW_USERNAME>
Example output
# opencli user-rename stefan pejcic
User 'stefan' successfully renamed to 'pejcic'.
Change Email
To change a email run:
opencli user-email <USERNAME> <NEW_EMAIL>
Example output
# opencli user-email stefan [email protected]
Success: Email for user 'stefan' updated to '[email protected]'
Change Password
To reset the password for a OpenPanel user, you can use the user-password command:
opencli user-password <USERNAME> <NEW_PASSWORD>
Changing the password also logs the user out of all active sessions, revokes all of their MCP tokens, and invalidates any API tokens issued before the change.
Example output
# opencli user-password stefan 'NewStrongPass1'
Successfully changed password for user stefan
Provide random as password to generate a strong random password:
opencli user-password <USERNAME> random
Example output
# opencli user-password stefan random
Successfully changed password for user stefan, new random generated password is: 7kQ!vR2m#Lx9TzpA
Login as User
This command allows you to generate an auto-login link for any OpenPanel user.
opencli user-login <USERNAME>
Example output
# opencli user-login demouser --open
https://demo.openpanel.org:2083/login_autologin?admin_token=RMWvZK1cdeRkZQJGVQv682qby9XIPr&username=demouser
To invalidate an existing token for a user:
opencli user-login <USERNAME> --delete
Example output
# opencli user-login demouser --delete
Auto-login token 'b7f3c9e2a1d84f06' for user demouser is now invalidated.
To open the link in a browser:
opencli user-login <USERNAME> --open
Example output
# opencli user-login demouser --open
https://srv.example.com:2083/login_autologin?admin_token=b7f3c9e2a1d84f06&username=demouser
Change Plan
Command: opencli user-change_plan allows you to change plan for a user.
opencli user-change_plan <username> "<new_plan_name>"
Example output
# opencli user-change_plan stefan "Developer Plus"
[✔] Total CPU limit (4) set successfully.
[✔] Tasks ceiling set to 300 (derived from RAM; /home/stefan/TasksMax overrides).
[✔] Total RAM limit (6G) set successfully.
[✔] Disk limit (10) and inodes (1000000) applied successfully.
Changing port speed to 100 is not possible at the moment.
Plan changed successfully for user stefan from Standard plan to Developer Plus
Quota
Command: opencli user-quota enforces and recalculates disk and inodes for specific or all users.
opencli user-quota <username|--all>
Example output
# opencli user-quota stefan
[2026-01-28 17:51:40] Processing user: stefan
[2026-01-28 17:51:40] Quota set for user stefan: 20480000 blocks (20 GB) and 2500000 inodes
[2026-01-28 17:51:40] Updating repquota file...
[2026-01-28 17:51:40] Repquota file updated successfully: /etc/openpanel/openpanel/core/users/repquota
Check / Disable 2FA
To disable Two-Factor Authentication for a user, run the following command:
opencli user-2fa <USERNAME> [disable]
Example output
# opencli user-2fa stefan
Two-factor authentication for stefan is ENABLED.
# opencli user-2fa stefan disable
Two-factor authentication for stefan is now DISABLED.
Assign / Remove IP to User
To assign free IP address to a user run the following command:
opencli user-ip <USERNAME> <IP_ADDRESS>
Example output
# opencli user-ip stefan 203.0.113.11
IP successfully changed for user stefan to dedicated IP address: 203.0.113.11
To assign IP address that is currently used by another user to this user, run the following command:
opencli user-ip <USERNAME> <IP_ADDRESS> -y
Example output
# opencli user-ip stefan 203.0.113.11 -y
IP successfully changed for user stefan to dedicated IP address: 203.0.113.11
To remove dedicated IP address from a user run:
opencli user-ip <USERNAME> delete [-y]
Example output
# opencli user-ip stefan delete
IP configuration deleted for user stefan.
IP successfully changed for user stefan to shared IP address: 203.0.113.10
Add --debug to any user-ip command to display verbose information.
Check
Check files and security for a user:
opencli user-check <USERNAME>
Example output
# opencli user-check mozda
===== Checking user: mozda =====
---- Docker Daemon Security ----
[INFO] Running for user: mozda
[WARN] Inter-container communication on default bridge is allowed
[WARN] Docker logging level is not set to 'info' ('default')
[PASS] Docker is not allowed to modify iptables
[PASS] Not using deprecated aufs storage driver
[WARN] TLS authentication for Docker daemon is NOT configured
[PASS] Docker daemon is NOT listening on TCP socket
[PASS] Experimental features are NOT enabled
[PASS] Rootless context is configured
[PASS] Containers can not get new privileges
[PASS] Google DNS resolvers are configured
---- System and User Files ----
[PASS] /home/mozda/docker-data is configured for docker data.
[PASS] home.mozda.bin.rootlesskit file exists.
[PASS] .env file exists.
[PASS] docker-compose.yml file exists.
[PASS] backup.env file exists.
[PASS] crons.ini file exists.
[PASS] custom.cnf file exists.
[PASS] default.vcl file exists.
[PASS] httpd.conf file exists.
[PASS] nginx.conf file exists.
[PASS] openresty.conf file exists.
[PASS] pma.php file exists.
[PASS] Disk usage is below quota (3.80 GB used of 4.88 GB).
[PASS] Inode usage is below quota (113350 used of 1000000).
[INFO] Checking files ownership for user: mozda (UID: 1004, GID: 1004)
[WARN] File '/home/mozda/docker-data/overlay2/25af867389efa6af7eb6120dceef0bb601796ab469af0c9c4c798671594be432/diff/var/www/html' is owned by UID:100032 instead of UID:1004
[FAIL] Some docker files in /home/mozda/docker-data/ are not owned by UID:1004
---- Container Security Checks ----
[INFO] Found 2 running container(s)
---- Container: openresty ----
[PASS] openresty: Container running from OpenPanel
[PASS] openresty: Container name matches compose service name: openresty
[PASS] openresty: Container is running
[PASS] openresty: Container is running as root
[PASS] openresty: Using specific tag for image: openresty/openresty:bullseye-fat
[WARN] openresty: No HEALTHCHECK configured
[WARN] openresty: SELinux options not set
[WARN] openresty: --no-new-privileges restriction not set
[PASS] openresty: No extra Linux capabilities added
[PASS] openresty: Privileged mode is disabled
[WARN] openresty: Bind mounts under /home/ or /etc/openpanel/
[PASS] openresty: Docker socket is NOT mounted
[PASS] openresty: sshd is NOT running inside container
[PASS] openresty: Using OpenPanel network (mozda_www)
[PASS] openresty: All ports are bound to 127.0.0.1
[PASS] openresty: Memory usage is limited to .50 GB
[PASS] openresty: CPU usage is limited to .50 CPUs
[PASS] openresty: PID cgroup limit is set (100)
[WARN] openresty: Root filesystem is NOT read-only
[PASS] openresty: Host devices are NOT exposed
[WARN] openresty: Default ulimit is used
---- Container: php-fpm-8.2 ----
[PASS] php-fpm-8.2: Container running from OpenPanel
[PASS] php-fpm-8.2: Container name matches compose service name: php-fpm-8.2
[PASS] php-fpm-8.2: Container is running
[PASS] php-fpm-8.2: Container is running as root
[WARN] php-fpm-8.2: No HEALTHCHECK configured
[WARN] php-fpm-8.2: SELinux options not set
[WARN] php-fpm-8.2: --no-new-privileges restriction not set
[PASS] php-fpm-8.2: No extra Linux capabilities added
[PASS] php-fpm-8.2: Privileged mode is disabled
[WARN] php-fpm-8.2: Bind mounts under /home/ or /etc/openpanel/
[PASS] php-fpm-8.2: Docker socket is NOT mounted
[PASS] php-fpm-8.2: sshd is NOT running inside container
[PASS] php-fpm-8.2: Using OpenPanel network (mozda_db)
[PASS] php-fpm-8.2: No exposed ports
[PASS] php-fpm-8.2: Memory usage is limited to .25 GB
[PASS] php-fpm-8.2: CPU usage is limited to .12 CPUs
[PASS] php-fpm-8.2: PID cgroup limit is set (100)
[WARN] php-fpm-8.2: Root filesystem is NOT read-only
[PASS] php-fpm-8.2: Host devices are NOT exposed
[WARN] php-fpm-8.2: Default ulimit is used
===== Audit Summary =====
Total checks performed: 70
✅ Passed: 50
❌ Failed: 1
⚠️ Warnings: 16
ℹ️ Info: 3
⚠️ Critical issues found! Please review and address failed checks.
Report
Health report for a user: what is working and what needs attention, from the same checks the OpenPanel interface shows as warnings and the email notifications use.
opencli user-report <USERNAME|--all> [--section <name,...>] [--json]
The report starts with a summary of all problems found, errors first, then one part per section. Lines marked [ERROR] need fixing, [WARN] might cause problems, [INFO] is good to know. The command exits with 1 when any error is found, or when the user doesn't exist.
Sections, in report order:
| Section | What it checks |
|---|---|
info | Account, server (load, RAM, disk), plan limits vs. usage, enabled modules and features, OpenPanel version, system containers |
account | Locale, admin notes, custom message, email notification preferences and whether they can be delivered, favorites |
containers | Status, CPU/RAM/PIDs vs. limits, restarts, OOM kills, containers not from the default template, hourly usage history |
processes | Processes per container, top processes by CPU and RAM, zombie processes |
files | Disk and inodes quota, biggest volumes and folders, permission problems, trash and auto-purge, FTP accounts and connections, malware scanner and quarantine |
backups | Backup destination, schedule, retention, encryption, backup service status, last run, full account archives |
domains | Domains with size, status (active, suspended), docroot or redirect |
dns | Nameservers, zone validation, where each domain points, SPF/DKIM/DMARC, dynamic DNS |
ssl | Certificate type, issuer and expiry per domain, AutoSSL errors |
waf | WAF status, level and profiles per domain, blocked requests, top rules and IPs |
webserver | Web server, Varnish, config test, vhosts and the folders they serve, error log |
php | Versions per domain and their support status, php.ini changes vs. the defaults, extensions, ionCube, PHP-FPM errors |
websites | Installed websites with version, available updates and whether they answer |
databases | MySQL/MariaDB, PostgreSQL and MongoDB: databases, sizes, users, remote access, running queries, log errors |
cache | Redis, Valkey, Memcached, Elasticsearch and OpenSearch status and usage |
emails | Mail server, webmail, mailboxes and quotas, aliases, hourly sending limit |
crons | Cron jobs with schedule, last and next run, results, timezone |
stats | Visitor statistics, log rotation, log sizes per domain |
security | 2FA, passkeys, logins, sessions, blocked IPs, API and MCP tokens, shell access, suspicious activity |
activity | Last entries of the activity log |
When run in a terminal, the progress of each section is shown while the report is being made. It is left out when the output goes to a file or a pipe.
Example output
# opencli user-report stefan --section info,ssl
################################################################################
Report for stefan, generated 2026-10-06 09:25:45 GMT
################################################################################
== SUMMARY ==
2 error(s), 0 warning(s), 0 info
[ERROR] INFORMATION > SERVER: Server load (10.23) is over twice the CPU cores (4).
[ERROR] SSL: example.com has no SSL certificate yet, AutoSSL hasn't issued one.
== INFORMATION ==
Username: stefan
Status: Active
Owner: root
Email: [email protected]
Created: 2026-10-05 17:02:56
Context: stefan
IP address: 192.0.2.10 (shared)
-- SERVER --
Hostname: server.example.com
OS: Ubuntu 24.04 LTS, kernel 6.8.0-31-generic
CPU: 4 cores, x86_64, Intel Xeon Processor (Cascadelake)
Load: 8.19, 10.23, 10.04 (1, 5, 15 min)
[ERROR] Server load (10.23) is over twice the CPU cores (4).
RAM: 2.98 GB used of 8.73 GB (34%)
Disk: 31.21 GB used of 98.31 GB, 62.09 GB free (34%)
-- PLAN --
Plan: Standard plan
CPU / RAM: 2 cores / 2g
...
== SSL ==
Domain Type Issuer Expires Days left
example.com auto - - -
[ERROR] example.com has no SSL certificate yet, AutoSSL hasn't issued one.
site.example.com auto Let's Encrypt 2026-12-30 85
...
Valid: 15 of 16
Report for every user:
opencli user-report --all
Example output
# opencli user-report --all
################################################################################
Report for stefan, generated 2026-10-06 09:25:45 GMT
################################################################################
== SUMMARY ==
...
################################################################################
Report for pejcic, generated 2026-10-06 09:25:58 GMT
################################################################################
...
JSON
With --json the report is saved as JSON instead of printed, so it can be read by other tools. For a single user it is saved to /home/<context>/user_report_status.json:
opencli user-report stefan --json
Example output
# opencli user-report stefan --json
Report for stefan saved to /home/stefan/user_report_status.json
With --all every user is saved as one line (NDJSON) to /etc/openpanel/openpanel/user_report_status.json:
opencli user-report --all --json
Example output
# opencli user-report --all --json
Reports for 2 user(s) saved to /etc/openpanel/openpanel/user_report_status.json
Both files are replaced in one step when the report is done, they never contain a half written report. --section works with --json too. In the JSON, issues has every problem found (errors first) and sections has each section's rows as group/label/value, its own issues and its plain text output:
Example JSON
{
"username": "stefan",
"context": "stefan",
"owner": "root",
"plan": "Standard plan",
"suspended": false,
"generated_at": "2026-10-06T09:26:02Z",
"duration_ms": 6520,
"summary": { "errors": 1, "warnings": 0, "info": 0 },
"issues": [
{ "severity": "error", "section": "SSL", "message": "example.com has no SSL certificate yet, AutoSSL hasn't issued one." }
],
"sections": [
{
"key": "ssl",
"title": "SSL",
"duration_ms": 6510,
"rows": [
{ "group": "", "label": "Valid", "value": "15 of 16" }
],
"issues": [
{ "severity": "error", "section": "SSL", "message": "example.com has no SSL certificate yet, AutoSSL hasn't issued one." }
],
"text": "\n== SSL ==\n Domain ..."
}
]
}
Daily Summary
Command: opencli user-daily_summary saves a day's summary for every user with the Daily Summary module, shown on their Statistics > Daily Summary page, and emails it to users who turned on Daily summary on their Notifications page. It runs every day at 06:15 for the previous day, and each user gets a summary by email at most once. Saved summaries are kept for 90 days.
opencli user-daily_summary <USERNAME|--all> [--date YYYY-MM-DD] [--dry-run]
--datebuilds the summary of that day instead of yesterday.--dry-runprints the email instead of saving and sending it.
Example output
# opencli user-daily_summary --all
Checking stefan
Summary for 2026-10-15: 2 need attention, 3 worth a look, saved.
stefan notified by email.
Checking john
john doesn't have the Summary module.
# opencli user-daily_summary stefan --date 2026-10-15 --dry-run
Summary for 2026-10-15: 1 need attention, 1 worth a look.
Subject: ⚠ 1 thing needs your attention – 15 Oct summary for stefan
Hi stefan,
Here's how your account did on Thursday, 15 October. Your 2 websites handled 5,452 requests from 1,448 visitors, 12% more than the day before. 1 thing needs your attention.
NEEDS YOUR ATTENTION
1. blog.example.com has 3 known security holes
They're in Astra and Contact Form 7. An update usually fixes them.
→ Update WordPress and its plugins: https://server.example.com:2083/website?domain=blog.example.com
WORTH A LOOK
• Your disk is 86% full
You're using 8.6 GB of 10.0 GB.
→ See what uses the space: https://server.example.com:2083/disk-usage/
...
See the full summary: https://server.example.com:2083/summary/2026-10-15
Error Report
Command: opencli user-error_report emails users the errors and critical errors found in their websites' logs in the last 24 hours, the same ones shown on the Error Logs page. Only users with the Error Logs feature who turned on Daily error report on their Notifications page get it, at most once a day and only when there were errors. It runs every day at 07:30.
opencli user-error_report <USERNAME|--all> [--dry-run]
--dry-run prints the email instead of sending it.
Example output
# opencli user-error_report --all
Checking stefan
stefan notified by email about 3 error(s).
Checking john
john has the daily error report turned off.
# opencli user-error_report stefan --dry-run
Subject: Daily error report for account stefan
In the last 24 hours, 2 error(s) were found in the logs of account stefan.
By website:
- example.com: 2
Latest errors:
- 2026-10-15 19:49 UTC [critical] php-fpm-8.3 (example.com): Fatal error: Uncaught Error: Call to undefined function nonexistent_fn() in /var/www/html/example.com/index.php:3
- 2026-10-15 19:42 UTC [critical] php-fpm-8.3 (example.com): Fatal error: Uncaught Error: Call to undefined function nonexistent_fn() in /var/www/html/example.com/index.php:5
Block IP
Prevent specific IP addresses or CIDR ranges from accessing any user websites:
opencli user-block_ip <username> [--list='ip_here another_ip' | --delete-all]
List blocked IPs for a user:
opencli user-block_ip <username>
Example output
# opencli user-block_ip stefan
11.22.33.44
124.64.23.0/24
Block IP addresses from accessing user websites:
opencli user-block_ip <username> --list='11.22.33.44 124.64.23.0/24'
Example output
# opencli user-block_ip stefan --list='11.22.33.44 124.64.23.0/24'
Blocking IP 11.22.33.44 for user stefan...
Blocking IP 124.64.23.0/24 for user stefan...
Blocklist applied for domain 'example.com'
Blocklist applied for domain 'example.net'
Remove all blocked IP addresses for a user:
opencli user-block_ip <username> --delete-all
The blocklist is emptied and Caddy is reloaded. The command prints no output.
View login log
View up to last 20 successfull logins for the user.
opencli user-loginlog <USERNAME> [--table|--text|--json]
Example output
# opencli user-loginlog stefan
IP Country Time
203.0.113.5 RS 2026-09-24 09:12:44
198.51.100.7 DE 2026-09-23 18:02:10
# opencli user-loginlog stefan --json
[
{
"ip": "203.0.113.5",
"country": "RS",
"time": "2026-09-24 09:12:44"
}
]
Output is shown as a table by default. Use --text for plain text or --json for JSON.
Varnish
Check Varnish Caching status for user and enable/disable Varnish service.
opencli user-varnish <USERNAME> [enable|disable|status]
Enable Varnish:
opencli user-varnish <USERNAME> enable
Example output
# opencli user-varnish stefan enable
...
Varnish Cache is now enabled.
Disable Varnish:
opencli user-varnish <USERNAME> disable
Example output
# opencli user-varnish stefan disable
...
Varnish Cache is now disabled.
Check status:
opencli user-varnish <USERNAME> status
Example output
# opencli user-varnish stefan status
Varnish Cache is enabled.
Check short status (returns Current status: on/off):
opencli user-varnish <USERNAME>
Example output
# opencli user-varnish stefan
Current status: On
- List Users
- List all users Quotas
- Add User
- Create user for Reseller
- Transfer User
- Backup User
- Restore User
- Delete User
- Suspend User
- Unsuspend User
- Rename User
- Change Email
- Change Password
- Login as User
- Change Plan
- Quota
- Check / Disable 2FA
- Assign / Remove IP to User
- Check
- Report
- JSON
- Daily Summary
- Error Report
- Block IP
- View login log
- Varnish