设置生产

> 警告: 我们不建议在裸机服务器上安装。推荐的生产环境部署方式是使用 Docker 镜像。你可以在这里找到相关说明:
>
>

你可以通过配置 Supervisor 和 nginx 这两个程序来将 bench 设置为生产环境使用。如果你想把生产环境设置还原为开发环境设置,请参考以下命令

简易生产环境设置

如果你运行 sudo bench setup production,这些步骤会自动完成

手动生产环境设置

Supervisor

Supervisor 确保驱动 Frappe 系统的进程持续运行,并在它们意外崩溃时自动重启。你可以使用命令 bench setup supervisor 生成 Supervisor 所需的配置。配置将存放在 config/supervisor.conf 目录中。然后你可以将该文件复制或链接到 Supervisor 的配置目录,并重新加载使其生效。

例如,

bench setup supervisor
sudo ln -s `pwd`/config/supervisor.conf /etc/supervisor/conf.d/frappe-bench.conf

注意:

  • 如果你不需要生成启动 Redis 服务器的配置,请使用 --skip-redis 选项。例如 bench setup supervisor --skip-redis
  • 对于 CentOS 7,扩展名应为 ini,因此命令变为
bench setup supervisor
sudo ln -s `pwd`/config/supervisor.conf /etc/supervisor/conf.d/frappe-bench.ini #for CentOS 7 only

当你更新应用时,bench 还需要重启由 Supervisor 管理的进程。为了自动化这一操作,你需要使用命令 sudo bench setup sudoers $(whoami) 来设置 sudoers。

Nginx

Nginx 是一个 Web 服务器,我们用它来提供静态文件服务,并将其余请求代理到 Frappe。你可以使用命令 bench setup nginx 生成 nginx 所需的配置。配置将存放在 config/nginx.conf 文件中。然后你可以将该文件复制或链接到 nginx 的配置目录,并重新加载使其生效。

例如,

bench setup nginx
sudo ln -s `pwd`/config/nginx.conf /etc/nginx/conf.d/frappe-bench.conf

注意:当你更改配置后重启 nginx 时,如果你有另一个配置将服务器块设为端口 80 的默认配置(大多数情况下是 nginx 欢迎页面),可能会启动失败。你需要禁用该配置。它最可能存在的位置是 /etc/nginx/conf.d/default.conf 和 /etc/nginx/conf.d/default。在最新版本的 nginx 安装中,该文件位于 /etc/nginx/sites-available/default

设置多租户

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

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 服务,才能使你的自定义域名生效