诊断调度程序

如果你遇到定时任务延迟或任务似乎没有运行的情况,可以运行以下几个命令来诊断问题。

bench doctor

该命令会按顺序输出以下内容:

  • 每个站点的调度器状态
  • 工作进程数量
  • 待处理任务

理想输出:

Workers online: 0
—–None Jobs—–

bench –site [site-name] show-pending-jobs

该命令会按顺序输出以下内容:

  • 队列
  • 队列中的任务

理想输出:

—–Pending Jobs—–

bench purge-jobs

该命令会清除所有队列中的全部待处理任务

配置 HTTPS

获取所需文件

你可以从受信任的证书颁发机构获取 SSL 证书,也可以自行生成。对于自签名证书,浏览器会显示证书不受信任的警告。以下是一个使用 Let’s Encrypt 获取免费 SSL 证书的教程

所需的文件有

  • 证书(通常扩展名为 .crt)
  • 解密后的私钥

前提条件

  1. 你需要有一个 DNS 多租户设置
  2. 你的站点应能通过有效域名访问
  3. 你需要服务器上的 root 权限
  4. 你需要一个通过受信任的证书颁发机构生成的有效证书,或一个自签名证书。

要从私有机构生成 .crt,通常需要生成一个 CSR(证书签名请求)。如果你已经有证书(.crt)文件,可以跳过此步骤。要生成 CSR 和对应的密钥文件,请运行以下命令:

openssl req -new -newkey rsa:2048 -nodes -keyout mydomain.com.key -out mydomain.com.csr

你需要将此 CSR(.csr)文件上传到私有证书颁发机构(例如 GoDaddy、ComodoSSL),以便据此生成有效的证书(.crt)文件。

如果你有多个证书(主证书和中间证书),则需要将它们拼接起来。例如:

cat your_certificate.crt CA.crt >> certificate_bundle.crt

同时确保你的私钥仅 root 用户可读:

chown root private.key
chmod 600 private.key

将这两个文件移动到合适的位置

mkdir /etc/nginx/conf.d/ssl
mv private.key /etc/nginx/conf.d/ssl/private.key
mv certificate_bundle.crt /etc/nginx/conf.d/ssl/certificate_bundle.crt

设置 nginx 配置

为你的站点设置证书和私钥的路径

bench set-ssl-certificate site1.local /etc/nginx/conf.d/ssl/certificate_bundle.crt
bench set-ssl-key site1.local /etc/nginx/conf.d/ssl/private.key

生成 nginx 配置

bench setup nginx

重新加载 nginx

sudo service nginx reload

或

systemctl reload nginx # 适用于 CentOS 7

现在你已经配置了 SSL,所有 HTTP 流量都将重定向到 HTTPS

为你的网站添加自定义域名

你可以为你的站点添加多个自定义域名,只需运行:

bench setup add-domain [desired-domain]

运行该命令后,系统会询问你要为哪个站点设置自定义域名。

你还可以通过以下选项为自定义域名设置 SSL:

 --ssl-certificate [path-to-certificate]
 --ssl-certificate-key [path-to-certificate-key]

示例:

 bench setup add-domain custom.erpnext.com --ssl-certificate /etc/letsencrypt/live/erpnext.cert --ssl-certificate-key /etc/letsencrypt/live/erpnext.key

域名配置存储在对应站点的 site_config.json 中

 "domains": [
 {
 "ssl_certificate": "/etc/letsencrypt/live/erpnext.cert",
 "domain": "erpnext.com",
 "ssl_certificate_key": "/etc/letsencrypt/live/erpnext.key"
 }
 ],

你需要通过运行 bench setup nginx 重新生成 nginx 配置,并通过运行 sudo service nginx reload 重新加载 nginx 服务,才能使你的自定义域名生效

编译 po 到 mo

用法

bench compile-po-to-mo [OPTIONS]

前提条件

你的应用的 locale 目录中已有 PO 文件,其中包含至少一种语言的翻译。

描述

PO 文件以人类可读的格式保存翻译。在应用程序使用这些翻译之前,需要将它们编译成二进制文件(以 MO 结尾)。该二进制文件存储在 bench 的 sites/assets/locale 文件夹中。

为了提高效率,如果存在比 PO 文件更新的 MO 文件,则会跳过编译。

此命令会随 bench build 和 bench update 自动执行。当你刚添加了一些翻译并希望在界面中查看结果时,可以在开发环境中显式运行它。

选项

  • --app 此参数允许你指定一个应用,以便只更新该应用的 PO 文件。默认值:所有应用。
  • --locale 此参数允许你指定一个语言区域,以便只更新该语言区域的 PO 文件。默认值:所有语言区域。
  • --force 强制重新编译,即使 PO 文件没有变化。

示例

编译 ERPNext 的德语翻译。

bench compile-po-to-mo --app erpnext --locale de

这会从 apps/erpnext/erpnext/locale/de.po 读取翻译并将其编译为二进制文件。结果保存到 sites/assets/locale/de/LC_MESSAGES/erpnext.mo。

更新采购订单文件

用法

bench update-po-files [OPTIONS]

前提条件

你的应用 locale 目录中已存在 POT 文件和 PO 文件。

说明

此命令会将你现有的翻译文件与现有的 POT 文件(包含所有可翻译字符串)同步。它会删除所有过时的字符串并添加新的字符串。

在你重新生成包含可翻译字符串的 POT 文件后,你会需要运行此命令。如果你使用的是专门的翻译管理平台,该平台可能也会为你处理这一步,这样你就不需要此命令了。

选项

  • --app 此参数让你指定一个应用,以便只更新该应用的 PO 文件。默认值:所有应用。
  • --locale 此参数让你指定一个语言区域,以便只更新该语言区域的 PO 文件。默认值:所有语言区域。

示例

将 ERPNext 的可翻译字符串与包含德语翻译的文件同步。

bench update-po-files --app erpnext --locale de

这会从 apps/erpnext/erpnext/locale/de.po 读取翻译,并从 apps/erpnext/erpnext/locale/main.pot 读取可翻译字符串。结果会保存到 apps/erpnext/erpnext/locale/de.po。

将CSV迁移到采购订单

用法

bench migrate-csv-to-po [OPTIONS]

前提条件

请确保你的应用已经有一个 POT 文件。如果没有,你可以生成一个。

说明

该命令会从 CSV 文件中读取你现有的翻译,将它们与现有的 POT 文件进行匹配,并将结果写入[app_module]/locale/[locale].po。

只有在从旧翻译系统切换到新翻译系统时,你才需要使用这个命令。

选项

  • --app 这个参数让你可以指定一个应用,以防你只想迁移某个应用的翻译。默认值:所有应用。
  • --locale 这个参数让你可以指定一个语言区域,以防你只想迁移某个语言区域的翻译。默认值:所有语言区域。

示例

将 ERPNext 的德语翻译从 CSV 迁移到 PO。

bench migrate-csv-to-po --app erpnext --locale de

这会从 apps/erpnext/erpnext/translations/de.csv 读取翻译,并从 apps/erpnext/erpnext/locale/main.pot 读取可翻译字符串。结果会保存到 apps/erpnext/erpnext/locale/de.po。如果你对结果满意,现在就可以删除 CSV 文件了。

生成pot文件

用法

bench generate-pot-file [OPTIONS]

描述

这会生成一个用于翻译的模板文件,包含某个应用的所有可翻译字符串(但不包含翻译内容)。该模板文件将被写入 [app_module]/locale/main.pot。

对于我们的许多应用,此命令会通过 GitHub Actions 定期自动运行。

选项

  • --app 如果你想只为某一个应用生成 POT 文件,可以用这个参数指定应用。默认值:所有应用。

示例

为 ERPNext 重新生成 POT 文件:

bench generate-pot-file --app erpnext

这会从 apps/erpnext 中提取所有可翻译字符串,并将它们写入 apps/erpnext/erpnext/locale/main.pot

工作台修剪台

用法

bench trim-tables [OPTIONS]

说明

从某个 DocType 中移除的文档字段可能不会从其
数据库表中删除。这是 Frappe 的刻意设计,以防止数据过早丢失。
大多数情况下这不会造成问题,但到了某个时候,你可能会因为
这些残留数据而遇到麻烦。

定期清理表的一些好处包括:

  • 更小的备份体积
  • 缩短站点备份所需时间
  • 减少站点数据库占用
  • 在 SELECT * 的情况下优化查询
  • 数据库干净整洁,没有隐藏或冗余的数据

此命令会修改你站点数据库中表的架构。默认情况下,它会在修改之前
对你的整个数据库进行完整备份。万一这些表
被错误地修改了,你可以使用恢复命令将站点
恢复到原始状态。

选项

  • --format、-f 设置输出格式。可用选项为 JSON 和 TEXT。
    默认为 TEXT。

标志

  • --dry-run 显示将要删除的内容
  • --no-backup 不备份站点。不建议这样做,因为这是一个
    破坏性操作。

示例

  1. 可能存在大量残留列占用空间。也许你是在自定义 DocType 时
    遇到行大小限制已达上限的错误,才发现了这个问题。为了
    确认没有任何幽灵列或旧的隐藏字段占用空间,你可以
    运行以下命令来确认
bench --site {site} trim-tables --dry-run

基准裁剪数据库

用法

bench trim-database [OPTIONS]

描述

从列表视图中删除 DocType 可能不会从数据库中删除它们对应的表。
迁移有时可能会在你的站点数据库中留下幽灵表。这样做可能是为了冗余、
在你的数据损坏或丢失时进行恢复,或者仅仅是因为人为错误。

此命令会删除任何看起来像是上述残留的表。在删除之前,它会尝试对这些表进行部分备份。
如果这些表是必需的,并且被错误地删除了,你可以使用 partial-restore 命令将它们恢复到你的站点数据库中。

选项

  • --format、-f 设置输出格式。可用选项为 JSON 和 Table。默认为 Table。

标志

  • --dry-run 显示将被删除的内容。
  • --no-backup 在清理之前不要备份站点。

示例

  1. 你想知道运行此命令会删除哪些数据吗?请使用
    --dry-run 标志运行它。
bench --site {site} trim-database --dry-run
  1. 想在此基础上构建,并且需要数据可被机器解析?将输出
    --format 设置为 json。
bench --site {site} trim-database --format json

基准转换数据库

此命令在 版本 14 中添加,且仅支持 MariaDB

用法

bench transform-database [OPTIONS] table

描述

transform-database 命令允许你管理站点表的设置。目前,你可以为站点数据库中的选定表切换存储引擎和行格式设置。

MariaDB 10.6 弃用了 COMPRESSED 行格式,而该格式长期以来一直是 Frappe 的默认选项。添加此命令是为了处理升级到更高版本 MariaDB 的情况。有关更多信息,请参阅 PR。

选项

  • --table 要转换的表的名称,以逗号分隔。要转换所有表,请传入 ‘all’ [必填]
  • --engine 为上述表选择存储引擎。可用选项为 InnoDB 和 MyISAM。
  • --row_format 为上述表设置 ROW_FORMAT 参数。可用选项为 DYNAMIC、COMPACT、REDUNDANT、COMPRESSED。

标志

  • failfast 在首次失败时退出

示例

  1. 假设你想将表 “tabAccess Record” 的引擎更改为 MyISAM。如果这是一个处理大量写入和极少读取的日志表,你可能会想这样做。
bench --site {site} transform-database --table 'tabAccess Record' --engine 'MyISAM'
  1. 你已将当前服务器上的 MariaDB 从 10.3 升级到 10.7,并且你想将所有使用 COMPRESSED 行格式的表转换为新的默认格式,即 DYNAMIC。你需要运行以下命令。
bench --site {site} transform-database --table 'all' --row_format 'DYNAMIC'