设置多租户

假设你已经让第一个站点正常运行,并且已经完成了
生产环境部署步骤,本节将说明如何托管你的第二个
站点(以及更多站点)。你的第一个站点会自动设为默认站点。你可以
使用以下命令来更改它:

bench use sitename

基于端口的多租户

你可以创建一个新站点,并让它运行在不同的端口上(而第一个
站点仍运行在 80 端口)。

  • 关闭基于 DNS 的多租户(只需一次)

bench config dns_multitenant off

  • 创建一个新站点

bench new-site site2name

  • 设置端口

bench set-nginx-port site2name 82

  • 重新生成 nginx 配置

bench setup nginx

  • 重新加载 nginx

sudo service nginx reload

基于 DNS 的多租户

你可以将站点命名为会解析到它的主机名。这样,你添加到 bench 中的所有站点都会运行在同一个端口上,并会根据主机名自动选择。

要在基于 DNS 的多租户下创建新站点,请执行以下步骤。

  • 开启基于 DNS 的多租户(只需一次)

bench config dns_multitenant on

  • 创建一个新站点

bench new-site site2name

  • 重新生成 nginx 配置

bench setup nginx

  • 重新加载 nginx

sudo service nginx reload

为你的站点设置限制

注意:此功能自版本 12 起已弃用

Frappe v7 新增了对站点设置限制和约束的支持。
这些限制在站点文件夹内的 site_config.json 文件中设置。

{
“db_name”: “xxxxxxxxxx”,
“db_password”: “xxxxxxxxxxxx”,
“limits”: {
“emails”: 1500,
“space”: 0.157,
“expiry”: “2016-07-25”,
“users”: 1
}
}

你可以通过运行以下命令来设置限制:

bench –site [sitename] set-limit [limit] [value]

你可以同时设置多个限制,通过运行

bench –site [sitename] set-limits –limit [limit] [value] –limit [limit-2] [value-2]

你可以设置的有效限制包括:

  • users – 站点最大用户数限制
  • emails – 站点每月发送邮件数量限制
  • space – 站点可使用的最大空间限制(GB)
  • email_group – 邮件组中允许的最大成员数限制
  • expiry – 站点到期日期(YYYY-MM-DD,需加引号)

示例:

bench –site site1.local set-limit users 5

你可以通过工具栏 / AwesomeBar 打开“Usage Info”页面来查看使用情况。只有已设置的限制才会显示在该页面上。

使用Let’s Encrypt设置HTTPS

前提条件

  1. 你需要已经配置好多租户 DNS
  2. 你的网站应该可以通过有效的域名访问
  3. 你需要在服务器上拥有 root 权限

注意:Let’s Encrypt 证书每三个月就会过期

使用 Bench 命令

只需运行:

sudo -H bench setup lets-encrypt [site-name]

你会遇到几个提示,请根据情况逐一回应。这个命令还会在 root 用户的 crontab 中添加一条记录(这需要更高的权限),用于每月尝试续期证书。

自定义域名

你也可以为自定义域名设置 Let’s Encrypt。只需使用 --custom-domain 选项

sudo -H bench setup lets-encrypt [site-name] –custom-domain [custom-domain]

续期证书

要手动续期证书,你可以使用:

sudo bench renew-lets-encrypt


手动方法

下载合适的 Certbot-auto 脚本到 /opt 目录

https://certbot.eff.org/

停止 nginx 服务

$ sudo service nginx stop

运行 Certbot

$ ./opt/certbot-auto certonly –standalone

在 Let’s Encrypt 初始化之后,系统会提示你输入一些信息。具体的提示内容可能会因你之前是否使用过 Let’s Encrypt 而有所不同,但我们会带你走完第一次的流程。

在提示处,输入一个用于接收通知和丢失密钥恢复的电子邮件地址:

然后你必须同意 Let’s Encrypt 订阅协议。选择“同意”:

然后输入你的域名。注意,如果你想让单个证书适用于多个域名(例如 example.com 和 www.example.com),请确保把它们都包含进去:

证书文件

获取证书后,你将得到以下 PEM 编码的文件:

  • cert.pem:你域名的证书
  • chain.pem:Let’s Encrypt 链证书
  • fullchain.pem:cert.pem 和 chain.pem 合并后的文件
  • privkey.pem:你证书的私钥

这些证书存储在 /etc/letsencrypt/live/example.com 文件夹下

为你的站点配置证书

进入你的 erpnext 站点目录下的 site_config.json

$ cd frappe-bench/sites/{{site_name}}

将以下两行添加到你的 site_config.json 中

“ssl_certificate”: “/etc/letsencrypt/live/example.com/fullchain.pem”,
“ssl_certificate_key”: “/etc/letsencrypt/live/example.com/privkey.pem”

重新生成 nginx 配置

$ bench setup nginx

重启 nginx 服务器

$ sudo service nginx restart


自动续期(实验性)

以 root 或具有超级用户权限的用户登录,运行 crontab -e 并输入:

在每月第一个星期一续期 letsencrypt 证书,并在执行时收到电子邮件

MAILTO=”[email protected]”
0 0 1-7 * * [ “$(date ‘+%a’)” = “Mon” ] && sudo service nginx stop && /opt/certbot-auto renew && sudo service nginx start

诊断调度程序

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

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