介绍

ERPNext是一个企业资源规划 (ERP) 套件,它利用了开源技术的强大功能和灵活性。它擅长管理核心业务流程,例如财务、销售、人力资源、制造、采购、服务等需求。实施ERPNext 这样的系统的好处包括:

  • 通过自动化重复的业务流程提高生产力
  • 通过为公司内的所有部门共享数据来提高效率
  • 凭借对业务伙伴如何相互关联的整体愿景,做出更好的决策

ERPNext 基于Frappe,这是一个用Python编写的全栈 Web 应用程序框架,它充分利用了Node/JavaScript 运行时环境,并使用MariaDB作为其后端数据库。基于 Frappe 的应用程序(如 ERPNext)的众多优势之一是工作台命令行(bench CLI)。工作台命令行通过自动执行安装、更新、配置和管理多个 Frappe/ERPNext 站点等任务,为管理员节省了时间。

在本教程中,您将在一台运行 Ubuntu 22.04 的服务器上安装和配置 ERPNext 。这将允许您根据需要为各种开发或生产环境进行配置,并为构建更复杂的容错架构做好准备。

先决条件

  • 一台 Ubuntu 22.04 最小安装的服务器,至少有 4 GB 的 RAM 和一个非 rootsudo用户。

注意:选择服务器规格时,请记住 ERP 系统是资源密集型的。本指南要求一台具有 4 GB RAM 的服务器,这对于基本测试环境来说已经足够了,但具体的硬件要求可能会因用户数量和您的业务规模而异。

  • 带有 A 记录的完全注册的域名指向您的服务器(frappe支持多租户,不同站点不同租户)。
  • 以及如下组件。
  Python 3.11+ 
  Node.js 18
  Redis 6.0.x+                                  (缓存和实时更新)
  MariaDB 10.6.6+                               (运行数据库驱动的应用程序)
  yarn 1.12+                                    (js依赖管理器)
  pip 20+                                       (py依赖管理器)
  wkhtmltopdf 0.12.6                            (用于生成 pdf)
  cron                                          (bench的计划作业:自动证书更新、计划备份)
  NGINX                                         (在生产中代理多租户站点)

1、安装基础环境

1.1 配置防火墙【可选】

尽管为开发环境配置防火墙是可选的,但对于生产环境来说,这是一项强制性的安全措施。

您需要在 ERPNext 服务器上打开以下端口:

  • 80/tcp443/tcpHTTP和HTTPS分别
  • 3306/tcp 用于 MariaDB 连接(仅在需要远程访问数据库时推荐)
  • 143/tcp25/tcpIMAP和STMP分别
  • 22/tcp对于 SSH(如果您尚未OpenSSH在 UFW 设置中启用)
  • 8000/tcp 用于在部署到生产之前测试您的平台

要一次打开多个端口,您可以使用以下命令:

sudo ufw allow 22,25,143,80,443,3306,8000/tcp

或者,您可以使用以下命令允许来自特定端口上特定 IP 地址的连接:

sudo ufw allow from server_IP to any port port_number

打开所有必要的端口后,启用防火墙:

sudo ufw enable

现在确认防火墙的状态:

sudo ufw status

UFW 将输出您启用的规则的列表。确保 ERPNext 的必要端口已打开:

OutputStatus: active

To                         Action      From
--                         ------      ----
22,25,80,143,443,3306,8000/tcp  ALLOW       Anywhere
22,25,80,143,443,3306,8000/tcp (v6) ALLOW   Anywhere (v6)

设置适当的防火墙是两个初步步骤中的第一步。

1.2 修改安装源【可选】

由于某些人所共知的原因,修改安装源这步是必须的。

1.备份

sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak 

2.修改

#安装vim
sudo apt install -y vim
#修改源
sudo vim /etc/apt/sources.list

3.按ggVG进行全选,按d进行删除
4.将下面源粘贴
5.按esc,再按shift+:,输入wq回车(这步是保存退出)

deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse

1.3 更新及配置时区

修改时区和时间

#根据您所在的地区设置正确的时区
sudo timedatectl set-timezone "Asia/Shanghai"
#查看执行结果
sudo date -R

更新您的服务器:

#修改root密码
sudo passwd root #根据提示修改密码
#切换到root用户
su root #根据提示输入上一步修改的密码
#执行升级和更新,可以去掉sudo
sudo apt-get update -y && apt-get upgrade -y

重新启动服务器以应用所有更改:

sudo reboot

给您的服务器几分钟重启时间,然后使用ssh它重新进入您的实例。

1.4 安装Python 3.11

注意:如果你是ubuntu 23.XX或更高版本,默认的python版本就是3.11,所以可以跳过此步。
#导入存储库
sudo add-apt-repository ppa:deadsnakes/ppa -y
sudo apt update
#安装Python
sudo apt install python3.11 -y
#如果想完整安装Python,请使用以下命令,可选
#sudo apt install python3.11-full -y
#查看一下具体版本号
python3.11 --version
#设置Python默认版本
python3 --version
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.10 1
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.11 2
#选2
sudo update-alternatives --config python3 
python3 --version

1.5 下载node.js

sudo curl -sL https://deb.nodesource.com/setup_18.x | sudo -E bash -

1.6 安装依赖

sudo apt install -y python3-dev python3-setuptools python3-pip python3-distutils python3.11-venv software-properties-common mariadb-server mariadb-client redis-server nodejs xvfb libfontconfig  libmysqlclient-dev nginx cron fail2ban supervisor git nano ansible pkg-config libcairo2-dev libjpeg-dev libgif-dev librsvg2-dev 
#安装wkhtmltopdf
wget https://gitee.com/qinyanwan/erpnext/releases/download/v13.29.0/wkhtmltox_0.12.6.1-2.jammy_amd64.deb
sudo dpkg -i wkhtmltox_0.12.6.1-2.jammy_amd64.deb
#如果安装提示有缺少依赖的错误,执行下面命令修复。
sudo apt -f install -y
#检查wkhtmltopdf版本
wkhtmltopdf –version
#显示wkhtmltopdf 0.12.6.1 (with patched qt)即是正确版本
#安装字体
sudo apt-get install ttf-wqy-zenhei -y
sudo apt-get install ttf-wqy-microhei -y

#将pip源配置为国内源
pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/
pip config set install.trusted-host mirrors.aliyun.com
依赖项说明
python3-dev
python3-setuptools
python3-pip
python3-distutils
python3.11-venv
python
software-properties-common
mariadb-server
mariadb-client
mariadb
redis-tools
redis-server
redis
nodejsnodejs
xvfb
libfontconfig
wkhtmltopdf
ttf-wqy-zenhei
ttf-wqy-microhei
wkhtmltopdf
nginx fail2ban supervisor生产环境使用
croncron
vim git nano编辑器与git

1.7 安装yarn

#修改npm源
#查询源
npm config get registry
#npm更换国内源,淘宝源
npm config set registry https://registry.npm.taobao.org

#恢复官方源
npm config set registry https://registry.npmjs.org

#删除注册表
npm config delete registry

#安装yarn
sudo npm install -g yarn -y

# 查询源
yarn config get registry
#更换国内源,淘宝源
yarn config set registry https://registry.npm.taobao.org/
#恢复官方源
yarn config set registry https://registry.yarnpkg.com
#删除注册表
yarn config delete registry

1.8 创建 MariaDB 超级管理员用户【可选】

ERPNext 期望使用 MariaDB 的root用户来管理数据库连接,但这并不是一种好的安全做法。为了克服这个限制并让非 root 用户管理 MariaDB,您现在将手动创建一个以用户命名的数据库。然后您将能够为新用户分配特殊权限以驱动 ERPNext 数据库操作

打开 MariaDB 提示符:

sudo mysql

现在创建一个以您要为 MariaDB 连接分配的用户命名的新数据库。这里使用frappe但您可以选择不同的名称:

CREATE DATABASE frappe;

确认数据库是使用以下 SQL 语句创建的:

SHOW DATABASES;

您将看到类似于以下内容的输出:

Output+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| frappe              |
+--------------------+

现在创建frappe具有类似于root 的权限的 MariaDB 用户,然后为该用户提供您选择的强密码。将密码保存在安全的地方;稍后您将需要它:

#mariadb_password是你要替换的实际密码
GRANT ALL PRIVILEGES ON *.* TO 'frappe'@'%' IDENTIFIED BY 'mariadb_password' WITH GRANT OPTION;

现在确认用户创建和新用户的权限:

SELECT host, user, Super_priv FROM mysql.user;

你会看到这样的输出:

Output+-----------+-------+------------+
| Host      | User  | Super_priv |
+-----------+-------+------------+
| localhost | root  | Y          |
| localhost | mysql | Y          |
| %         | frappe| Y         |
+-----------+-------+------------+
3 rows in set (0.001 sec)

现在刷新权限以应用所有更改:

FLUSH PRIVILEGES;

完成后,退出会话:

exit;

现在您已经创建了一个数据库用户,您只需要微调 MariaDB 以确保正确的 ERPNext 15 操作。幸运的是,ERPNext 团队提供了一个出色的配置模板,您可以将其用作实施的起点。在下一节中,您将学习如何使用该模板正确配置 MariaDB 数据库。

1.9 配置 MariaDB

mysql的安全配置

sudo mysql_secure_installation

Enter current password for root (enter for none): #这里直接回车
Switch to unix_socket authentication [Y/n] N
Set root password? [Y/n] y #如果选择n就意味着你要准备一个专用的数据库账号,比如:frappe,详细步骤参看下面的章节
Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] n #要使用root,这里必须选n
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y

停止mariadb.service

sudo systemctl stop mariadb

mysql的安全配置

在文本编辑器中打开文件:/etc/mysql/my.cnf

sudo nano /etc/mysql/my.cnf
#添加以下代码。然后保存文件并退出文本编辑器:
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
innodb_read_only_compressed = FALSE

[mysql]
default-character-set = utf8mb4

保存并关闭文件。重启

sudo service mysql restart

1.10 安装Bench CLI

确保 Frappe 用户(在本例中是frappe)对其home目录具有适当的权限:

sudo chmod -R o+rx /home/frappe

安装benchCLI:

# 安装bench cli
sudo -H pip3 install frappe-bench

#升级
sudo pip3 install --upgrade frappe-bench
# 查看bench版本
bench --version

1.11 安装Frappe 框架

在 Frappe 安装期间,您可能会超出Ubuntu 的文件监视限制,默认设置为 8192。为避免此问题,请使用以下命令设置更高的限制:

echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p

tee命令会将您的echo命令内容附加到被调用的文件中,同时还将输出打印到您的控制台。

接下来,初始化 Frappe Framework 15:

bench init --frappe-branch version-15 frappe-bench --frappe-path=https://gitee.com/mirrors/frappe --verbose

完成后,您将看到类似于以下的输出,表明您的环境已成功创建:

Output...
Done in 82.23s.
INFO:bench.utils:setting up backups
no crontab for frappe
SUCCESS: Bench /home/frappe/frappe-bench initialized

注意:bench init如果spawn ENOMEM遇到错误,该过程可能会停止。当您的系统内存不足时会导致此错误。您必须在继续之前解决问题,方法是安装更多物理内存或分配 SWAP 虚拟内存。

让我们仔细看看用于创建环境的命令:

  • /home/frappe/frappe-bench是 Frappe 框架、网站和相关应用程序的安装路径。frappe-bench将创建一个新目录(在本例中称为)以容纳所有必需的文件。
  • --frappe-path 指向 Frappe 存储库,在本例中是官方 Github 存储库。
  • --frappe-branch是要安装的 Frappe 版本。因为要安装ERPNext 15,所以选择的版本是Frappe 15。
  • --python是将使用的 Python 版本。ERPNext 15 需要 Python 3.11+。

Frappe 框架提供的灵活性远远超出了使用隔离环境的范围。您还可以创建不同的站点并将应用程序安装到其中。

2、安装ERPNext及应用

在本节中,您将设置一个基于 Frappe 的站点,然后在其上安装 ERPNext 15应用程序。

2.1 下载app

切换到 Frappe 初始化的目录。

cd /home/frappe/frappe-bench

使用命令行下载payments、 ERPNext、hrms:

#payments必选下载
bench get-app --branch version-15 https://gitee.com/qinyanwan/payments
#安装主体必须下载
bench get-app --branch version-15 erpnext https://gitee.com/mirrors/erpnext 
#HR模块为可选
bench get-app --branch version-15 https://gitee.com/qinyanwan/hrms  

运行以下命令可以安装任何缺少的依赖项【可选】:

#升级上来的可能需要运行一下
bench setup requirements

2.2 创建站点

为您的 ERPNext 安装创建一个新站点。确保根据需要替换命令中的参数:

bench new-site your_domain --admin-password 'erpnext_admin_password' --mariadb-root-username frappe --mariadb-root-password 'mariadb_password' --db-name erpnext

让我们花点时间回顾一下上面命令中使用的选项:

  • bench new-site 创建一个基于 Frappe 框架的新站点。
  • your_domain是新站点的名称。确保您的域的 DNS 具有指向您服务器 IP 的 A 记录。
  • erpnext_admin_password是 ERPNext 的管理员用户所需的密码。将此密码保存在安全的地方—您很快就会用到它。
  • mariadb_password是您在指南开头为 MariaDB 用户创建的密码frappe
  • erpnext是指定数据库名

如果你只想用数据库的root账号创建站点,以及不想指定数据库名(会使用hash随机产生),参考如下:

bench new-site endev.local --db-name erpnextdev

2.3 设置默认站点【可选】

如果你是多租户,请跳过此步骤,如果这台服务器上就只有1个站点,建议您使用如下命令设置默认站点,以便后续的bench命令都不需要指定--site参数。

bench use your_domain

2.4 安装ERPNext及应用

将 ERPNext 应用程序安装到站点上:

bench --site your_domain install-app erpnext
#设置过默认站点可以省略--site
bench install-app erpnext
# 在安装hrms前需要先运行bench start,再开一个窗口来安装
bench --site your_domain install-app hrms

安装完成后,您将拥有一个可运行的 ERPNext 15 应用程序。现在让我们使用bench命令来测试它:

bench start

以上将启动一个实时监控控制台,向您显示有关网络服务器和其他服务的各种消息。打开 Web 浏览器并导航到localhost:8000(对于本地安装)或your_domain:8000(如果您使用的是远程服务器)。您将看到 ERPNext 登录屏幕(我们将在稍后的步骤中继续登录和设置,一旦我们的网站准备好生产)。

访问您的测试部署后,返回到您的终端并按CTRL+C。这将停止 ERPNext 并退出监控控制台。

如果您的主要目标是开发新模块或修改 ERPNext 15,那么您可以在此时停止。但是,如果您需要的是不需要手动启动的生产环境系统,那么您将需要安装和配置一些额外的依赖组件。

2.5 设置生产环境

尽管您的 ERPNext 15 应用程序已准备就绪,但整个系统尚未设置为生产环境。为确保 ERPNext 的可靠性和安全性,您需要启用一些附加服务:

  • Fail2ban提供了额外的保护层,防止来自恶意用户和机器人的暴力破解。
  • Nginx主要用作 Web 代理,将所有流量从端口重定向8000到端口80(HTTP) 或端口443(HTTPS)
  • Supervisor确保 ERPNext 的关键流程不断启动和运行,并在必要时重新启动它们。

到目前为止,您已经手动安装和配置了 ERPNext 15,这允许您自定义流程以匹配任何特定用例。不过,对于其余的生产环境设置,您可以利用benchCLI的便利性,让它自动安装和配置这些剩余服务。

确保您位于 Frappe 工作目录中:

cd /home/frappe/frappe-bench

现在使用以下命令完成为生产设置 ERPNext 15:

# 前面运行的bench 要停止再设置生产环境
bench运行的窗口按 Ctrl + c
# 设置为生产环境
sudo bench setup production {USERNAME} #如不成功可以反复运行此命令

以上将安装和配置 Nginx、Supervisor 和 Fail2Ban 并设置ERPNext为生产环境。

bench命令创建的配置文件为:

  • 两个 Nginx 配置文件位于/etc/nginx/nginx.conf/etc/nginx/conf.d/frappe-bench.conf
  • 一个 Fail2Ban 代理监狱位于 ,/etc/fail2ban/jail.d/nginx-proxy.conf一个过滤器位于/etc/fail2ban/filter.d/nginx-proxy.conf

这些默认配置对于本教程就足够了,但您应该随意探索和调整这些文件以满足您的要求。您可以通过运行以下命令停止所有服务:

sudo supervisorctl stop all

然后,一旦您准备好,您就可以重新启动您的服务:

sudo supervisorctl start all

安装完后可查看一下是否有活动的wokers

bench doctor

正常情况下会显示如下:
—–Checking scheduler status—–
Scheduler disabled for erpnext
Scheduler inactive for erpnext
Workers online: 3
—–erpnext Jobs—–
如果不成功,可以再设置一遍生产环境。

现在您已准备好测试您的安装。

测试您的 ERPNext 15 安装

首先,验证关键生产服务是否正在运行。使用以下systemctl命令,然后将其通过管道传输到grep

systemctl list-unit-files | grep 'fail2ban\|nginx\|supervisor'

你会看到这样的输出:

Outputfail2ban.service                 enabled
nginx.service                          enabled
supervisor.service                     enabled

确认一切正常后,您可以在您的服务器上实时测试 ERPNext 15。打开您最喜欢的浏览器并导航your_domain或您托管 ERPNext 15 应用程序的任何位置。

几秒钟后,您应该会看到 ERPNext 15 登录屏幕。使用管理员作为用户名(电子邮件)和erpnext_admin_password您之前创建的密码。

2.6 安装中文本地化【可选】

安装ERPNext界面汉化

# 获取app
bench get-app https://gitee.com/btsdean/frappecn.git
bench get-app https://gitee.com/btsdean/erpnextcn.git
# 安装app
bench install-app frappecn
bench install-app erpnextcn

3、常见问题&命令

3.1 常见问题

使用过程中突然无法连接服务器,页面出现报错。
原因:
生产环境的fail2ban在同一ip操作太频繁时视为受到DDOS攻击而触发自动保护。
处理方法:
打开/etc/fail2ban/jail.d/nginx-proxy.conf

# 将maxtry数值改大一些,比如25,bantime改小一些,改完保存退出。
sudo vi /etc/fail2ban/jail.d/nginx-proxy.conf

# 重启fail2ban
sudo systemctl restart fail2ban

余则霖 / ERPNext常见问题更多问题可以查看余老师在码云的问题库

3.2 常用命令

更新app

bench update --apps erpnext --pull --reset

生产环境修改app的更新源

# 查看APP更新源
bench remote-urls
# 设置APP更新源
bench remote-set-url https://github.com/frappe/frappe.git