ERPNext v16 常用命令与运维实战

ERPNext v16.52.1 bench 工具链实战:version/list-sites、execute/console 免登录执行、备份四件套与多站点备份、new-site→restore→验证→drop-site 全恢复演练、migrate 迁移与缓存清理、管理员密码重置,含真实踩坑实录。

ERPNextERPNext项目管理2026/10/28

ERPNext v16 常用命令与运维实战

目标:本篇系统梳理 ERPNext v16.52.1 的 bench 工具链——版本与站点管理、execute/console 执行环境、备份与恢复全演练(new-site → restore → 验证 → drop-site 清理闭环实测)、migrate 升级迁移与缓存清理;全部命令与回显均在 v16.52.1 实测环境逐条验证,含真实踩坑实录。

一、环境信息

本篇全部命令与回显来自以下实测环境(实测日期 2026-10-27/28):

  • 操作系统:Ubuntu 22.04(x86_64)
  • ERPNext:erpnext 16.52.1 + frappe 框架 16.53.0(bench version 实测)
  • 数据库:MariaDB 11.8;缓存/队列:Redis 6.2 双实例
  • 默认站点:frontend(已装 frappe + erpnext,含一条已提交的销售订单 SAL-ORD-2026-00001 作验证数据)
  • bench 工程路径:/home/frappe/frappe-bench
  • 部署形态:官方 frappe_docker pwd.yml 多服务栈(部署过程见《ERPNext v16 Docker Compose 部署实战》)

二、工具概览

bench 是 Frappe 体系的核心工程管理 CLI,承担站点全生命周期操作:建站/删站、备份恢复、版本迁移、配置读写与调试执行。它在 bench 工程根目录(本环境 /home/frappe/frappe-bench)运行,工程下每个子目录 sites/<站点名> 对应一个独立站点。

顶层命令全景(bench --help 实测回显,节选):

Commands:
  app-cache                View or remove items belonging to bench...
  backup-all-sites         Backup all sites in current bench
  completions              Install shell completion for bench (bash or zsh).
  config                   Change bench configuration
  disable-production       Disables production environment for the bench.
  download-translations    Download latest translations
  drop
  exclude-app              Exclude app from updating
  find                     Finds benches recursively from location
  get-app                  Clone an app from the internet or filesystem...
  init                     Initialize a new bench instance in the...
  new-app                  Create a new Frappe application under apps folder
  remove-app               Completely remove app from bench and re-build...
  renew-lets-encrypt       Sets Up latest cron and Renew Let's Encrypt...
  restart                  Restart supervisor processes or systemd units
  retry-upgrade            Retry a failed upgrade
  set-mariadb-host         Set MariaDB host for bench
  set-nginx-port           Set NGINX port for site
  set-redis-cache-host     Set Redis cache host for bench
  set-redis-queue-host     Set Redis queue host for bench
  set-redis-socketio-host  Set Redis socketio host for bench
  setup                    Setup command group for enabling setting up a...
  start                    Start Frappe development processes
  switch-to-branch         Switch all apps to specified branch, or...
  update                   Performs an update operation on current bench.
  validate-dependencies    Validates that all requirements specified in...

(框架侧站点命令在帮助后半段:backup/restore/new-site/drop-site/migrate/console/execute/clear-cache 等,本文 5.x 逐组详解。)

💡 技术拓展:bench 命令的两个作用域容易混淆——

作用域形态示例
工程级不带 --site,作用于整个 bench 工程bench version、bench set-config -g、bench backup-all-sites
站点级带 --site <站点名>,作用于单站点bench --site frontend backup、bench --site frontend migrate

数据类操作(备份/迁移/清缓存)务必确认 --site 目标,工程级与站点级混用是误操作高发点。

三、前置条件

  1. bench 工程就绪:在 bench 工程根目录执行命令(ls sites/ 能看到 common_site_config.json 与站点目录即就绪);
  2. 站点已初始化:本文以 frontend 站点为操作对象(建站过程见部署篇 4.4);
  3. 数据库 root 凭据在手:new-site/restore/drop-site 需要数据库 root 权限(本环境 root/q1w2e3r4);
  4. 磁盘预留:备份产物为站点数据库压缩 SQL + 文件 tar 包,实测本站点全量备份约 1 MB 量级,生产数据按库体积 1:1 预留并外送。

四、各工具详解

4.1 版本与站点管理

查看已装应用与版本(工程级):

cd /home/frappe/frappe-bench && bench version
erpnext 16.52.1  ()
frappe 16.53.0  ()

列出工程内全部站点:

bench list-sites
Available sites:
* frontend

(* 标记当前默认站点。)

站点信息速查:站点级事实(库名、已装应用、密码)在 sites/<站点>/site_config.json,版本锁定在 sites/apps.json——两文件的键义详解见《ERPNext v16 配置参数详解》3.1/5.7 节。

4.2 bench execute:免登录执行框架方法

bench execute 直接调用框架任意可导入方法,适合巡检与脚本化运维,不需要 Web 登录态。

查站点数据库体积(单位 MB,实测):

bench --site frontend execute frappe.db.get_database_size
48.60406876

查服务器时间(验证站点时区上下文,实测):

bench --site frontend execute frappe.utils.now_datetime
2026-10-28 00:58:13.495306

带参调用:--args 传位置参数(JSON 数组)、--kwargs 传关键字参数(JSON 对象),例如统计文档数:

bench --site frontend execute frappe.db.count --args '["Sales Order"]'
1

(实测环境恰好 1 张销售订单,回显与数据一致。)

4.3 bench console:交互式 Python 调试环境

bench console 打开该站点的 IPython 环境,预载 frappe 上下文(frappe.local、frappe.db 可直接用),是排查数据问题的最强工具。非交互用法支持标准输入直接喂代码(实测):

echo 'import frappe
print("站点:", frappe.local.site)
print("公司数:", frappe.db.count("Company"))
doc = frappe.get_doc("Sales Order", "SAL-ORD-2026-00001")
print("订单:", doc.name, doc.status, doc.grand_total)
' | bench --site frontend console

实测回显(节选):

In [2]: 站点: frontend

In [3]: 公司数: 1

In [5]: 订单: SAL-ORD-2026-00001 To Deliver and Bill 16000.0

In [6]: Do you really want to exit ([y]/n)?

要点:

  • console 里的数据变更默认不自动提交,显式 frappe.db.commit() 后才落库(只读查询无此顾虑);
  • 交互退出按 Ctrl+D,非交互管道模式结束即退出(回显中的退出确认按回车即可);
  • console 与 execute 的分工:execute 适合单方法调用进巡检脚本,console 适合多步探索与打印对象。

4.4 备份命令族

单站点备份(含文件):

bench --site frontend backup --with-files

实测回显:

Backup Summary for frontend at 2026-10-28 00:48:54.462911
Config  : /home/frappe/frappe-bench/sites/frontend/private/backups/20261028_004852-frontend-site_config_backup.json 176.0B
Database: /home/frappe/frappe-bench/sites/frontend/private/backups/20261028_004852-frontend-database.sql.gz 999.1KiB
Public  : /home/frappe/frappe-bench/sites/frontend/private/backups/20261028_004852-frontend-files.tar 10.0KiB
Private : /home/frappe/frappe-bench/sites/frontend/private/backups/20261028_004852-frontend-private-files.tar 10.0KiB
Backup for Site frontend has been successfully completed with files

备份四件套说明:

文件内容恢复时的对应选项
*-site_config_backup.json站点配置快照(db 凭据等)参考/比对手工用
*-database.sql.gz全库压缩 SQLrestore 的主参数
*-files.tar公共文件(用户上传的公开附件)--with-public-files
*-private-files.tar私有文件(备份自身、敏感附件)--with-private-files

多站点批量备份(工程级,实测):

bench backup-all-sites
Backup Summary for frontend at 2026-10-28 00:59:51.002067
Config  : /home/frappe/frappe-bench/sites/frontend/private/backups/20261028_005949-frontend-site_config_backup.json 200.0B
Database: /home/frappe/frappe-bench/sites/frontend/private/backups/20261028_005949-frontend-database.sql.gz 999.5KiB
Backup for Site frontend has been successfully completed

⚠️ 踩坑实录:backup-all-sites 不支持 --with-files 选项(实测报 No such option: --with-files),它只备数据库与配置,不备文件包。多站点环境需要文件备份时逐站点跑 bench --site <站点> backup --with-files。

备份产物统一落在 sites/<站点>/private/backups/,文件名含时间戳与站点名。生产节奏建议:数据库备份每日(可用系统 cron 调 bench backup)、文件备份变化后手动/周任务执行,并把 backups 目录外送到远端存储。

4.5 备份恢复全演练(new-site → restore → 验证 → 清理)

本节是一套完整可复现的恢复演练:把 frontend 的备份恢复到一个新站点 restore.local,验证数据完整后清理。生产故障换机恢复就是同一条路径。

第 1 步:生成最新备份(回显见 4.4,本演练使用 20261028_005829 批次)。

第 2 步:新建空站点:

bench new-site restore.local --mariadb-user-host-login-scope='%' --admin-password=q1w2e3r4 --db-root-username=root --db-root-password=q1w2e3r4

实测回显(节选;DocType 更新进度条略):

Installing frappe...
Updating DocTypes for frappe        : [==                                      ] 5%...
Current Site set to: restore.local

⚠️ 踩坑实录:老教程里的 --no-mariadb-socket 选项已弃用,实测会打印警告: --no-mariadb-socket is DEPRECATED; use --mariadb-user-host-login-scope='%' (wildcard) or --mariadb-user-host-login-scope=<myhostscope>, instead. v16 一律改用 --mariadb-user-host-login-scope='%'(数据库用户允许从任意主机连入,容器/独立库服务器场景必需)。

第 3 步:全量恢复备份到新站点:

bench --site restore.local restore sites/frontend/private/backups/20261028_005829-frontend-database.sql.gz \
  --with-private-files sites/frontend/private/backups/20261028_005829-frontend-private-files.tar \
  --with-public-files sites/frontend/private/backups/20261028_005829-frontend-files.tar \
  --db-root-username root --db-root-password q1w2e3r4

实测回显(节选):

File sites/frontend/private/backups/20261028_005829-frontend-database.sql.gz not found. Trying to check in alternative directories.
File /home/frappe/frappe-bench/sites/frontend/private/backups/20261028_005829-frontend-database.sql.gz found.
App frappe already installed
*** Scheduler is disabled ***
Site restore.local has been restored with files

两点解读:

  • 第一行的 "not found... found" 是 bench 的相对路径自动补全(先按相对路径找、再按 bench 内部路径找),回显正常;
  • restore 直接恢复了备份里的 installed_apps(frappe + erpnext),无需提前在空站点装应用。

⚠️ 踩坑实录两则: ① restore 没有 --with-files 选项,文件包选项是 --with-private-files 与 --with-public-files(实测报错 No such option '--with-files'. (Did you mean one of: '--with-private-files', '--with-public-files'?),与 backup 的 --with-files 命名不对称,极易踩); ② 不传 --db-root-username/--db-root-password 时 restore 会交互式询问 MySQL root 密码(实测卡在 MySQL root password: 提示),脚本化恢复必须显式传凭据。

第 4 步:验证恢复完整性(console 查三处关键数据,实测):

echo 'print("公司:", frappe.db.get_value("Company", "Quzuo Trading", "default_currency"))
print("订单:", frappe.db.get_value("Sales Order", "SAL-ORD-2026-00001", ["status","grand_total"], as_dict=True))
print("客户数:", frappe.db.count("Customer"))
' | bench --site restore.local console
In [1]: 公司: CNY
In [2]: 订单: {'status': 'To Deliver and Bill', 'grand_total': 16000.0}
In [3]: 客户数: 1

公司/订单/客户与主站完全一致,恢复闭环验证通过。

第 5 步:清理演练站点(drop-site 自带删站前自动备份,实测):

bench drop-site restore.local --db-root-username root --db-root-password q1w2e3r4 --force
Taking backup of restore.local
Backup Summary for restore.local at 2026-10-28 00:59:24.906918
Config  : /home/frappe/frappe-bench/sites/restore.local/private/backups/20261028_005923-restore_local-site_config_backup.json 163.0B
Database: /home/frappe/frappe-bench/sites/restore.local/private/backups/20261028_005923-restore_local-database.sql.gz 999.1KiB
Public  : /home/frappe/frappe-bench/sites/restore.local/private/backups/20261028_005923-restore_local-files.tar 10.0KiB
Private : /home/frappe/frappe-bench/sites/restore.local/private/backups/20261028_005923-restore_local-private-files.tar 10.0KiB
Dropping site database and user
Moving site to archive under /home/frappe/frappe-bench/archived/sites
bench list-sites
Available sites:
* frontend

drop-site 的行为三连:先自动做一次全量备份(双保险)→ 删库删用户 → 站点目录移入 archived/sites 归档(不直接删除)。彻底清理归档可手工移除 archived/sites 下对应目录。

4.6 migrate:版本迁移

应用版本变化后(升级 erpnext/frappe、安装新应用)执行迁移,把 DocType 补丁、数据结构变更应用到数据库:

bench --site frontend migrate

实测回显(节选,主线为补丁与结构变更进度输出,收尾段如下):

Removing orphan Pages
Removing orphan Reports
Removing orphan Notifications
Removing orphan Sidebars
Removing orphan Docks
Removing orphan List Filters
Removing orphan Kanban Boards
Removing orphan Desktop Icons

要点:

  • migrate 前必须先 bench --site <站点> backup --with-files(迁移不可逆,回滚靠备份恢复);
  • 已是最新版本时 migrate 照常可跑(补丁清单为空,快速收尾),常用于验证迁移链路;
  • 多站点环境用 bench --site all migrate 逐站点迁移(每站点输出独立)。

4.7 缓存清理

bench --site frontend clear-cache
(无输出即成功,静默完成)
bench --site frontend clear-website-cache
(无输出即成功)

clear-cache 清框架层缓存(文档缓存、元数据缓存、Redis cache 实例内容),DocType 改动后页面行为异常、权限改后不生效时使用;clear-website-cache 清门户层页面缓存。清理后验证服务正常(实测):

curl -s http://127.0.0.1:8135/api/method/ping
{"message":"pong"}

4.8 管理员密码重置

bench --site frontend set-admin-password q1w2e3r4
(无输出即成功)

忘记 Administrator 密码时的正规重置通道(实测重设为原值验证命令可用)。生产环境应设强密码并遵守密码策略。

五、注意事项

  1. Scheduler is disabled 是正常回显:new-site/restore 过程中看到 *** Scheduler is disabled *** 不是故障——迁移期间调度器有意停用,站点恢复后由 scheduler 进程按配置接管;
  2. 备份必须外送:backups 目录与站点同盘(sites 卷内),磁盘故障时备份数据与业务数据同生共死,务必同步到远端;
  3. restore/new-site 的凭据参数:脚本化操作显式传 --db-root-username/--db-root-password,否则命令卡在交互式密码输入(4.5 踩坑实录②);
  4. drop-site 不是立即删除:站点目录归档到 archived/sites 且删站前自动备份,误删有双重补救窗口;
  5. console 写操作要 commit:console 内的数据变更不自动提交,frappe.db.commit() 才落库;
  6. 配置类命令(set-config/set-admin-password 等)的完整语义与值类型陷阱见《ERPNext v16 配置参数详解》3.2 节,本篇不重复展开。

六、常见问题(FAQ)

Q1:restore 报 No such option '--with-files'?

backup 用 --with-files 打包文件,restore 的对应选项拆成了两个:--with-private-files <私有 tar> 与 --with-public-files <公共 tar>(4.5 踩坑实录①)。命令命名不对称是 v16 的既定行为,按报错提示(Did you mean...)选对即可。

Q2:restore/new-site 卡在 MySQL root password 提示?

命令进入交互式输密。脚本化场景显式传 --db-root-username root --db-root-password <密码>;人工执行也可在提示处直接输入。

Q3:new-site 报 --no-mariadb-socket 已弃用?

v16 用 --mariadb-user-host-login-scope='%' 替代(语义为数据库用户允许的登录主机范围,'%' 表示任意主机)。官方 pwd.yml 的 create-site 命令即用此新参数。

Q4:bench execute 怎么执行带参数的方法?

--args 传位置参数数组、--kwargs 传关键字对象,均为 JSON 形态:bench --site frontend execute frappe.db.count --args '["Sales Order"]'(实测回显 1)。

Q5:console 里改了数据但界面上没生效?

console 不自动提交。写操作后执行 frappe.db.commit();若界面还显示旧值,再清一次缓存(bench --site <站点> clear-cache)刷新文档缓存。

Q6:升级后应用行为异常如何回退?

升级 = 替换代码 + migrate 两步。代码回退用 bench switch-to-branch(切回旧版本分支)或重新部署旧版本镜像;数据回退只能靠升级前的备份(bench restore,路径见 4.5)。所以 migrate 前的备份是唯一可靠回退点,不可省略。

七、参考链接

  1. bench 官方命令文档:https://docs.frappe.io/framework/user/en/bench
  2. Frappe 框架仓库:https://github.com/frappe/frappe
  3. ERPNext GitHub 仓库:https://github.com/frappe/erpnext
  4. 官方部署仓库 frappe_docker:https://github.com/frappe/frappe_docker
  5. 本专栏背景认知:《ERPNext 介绍与选型指南》
  6. 本专栏部署实战:《ERPNext v16 Docker Compose 部署实战》
  7. 本专栏配置详解:《ERPNext v16 配置参数详解》