介绍
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 和一个非 root
sudo
用户。
注意:选择服务器规格时,请记住 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/tcp
和443/tcp
HTTP和HTTPS分别3306/tcp
用于 MariaDB 连接(仅在需要远程访问数据库时推荐)143/tcp
和25/tcp
IMAP和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 |
nodejs | nodejs |
xvfb libfontconfig wkhtmltopdf ttf-wqy-zenhei ttf-wqy-microhei |
wkhtmltopdf |
nginx fail2ban supervisor | 生产环境使用 |
cron | cron |
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
安装bench
CLI:
# 安装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,这允许您自定义流程以匹配任何特定用例。不过,对于其余的生产环境设置,您可以利用bench
CLI的便利性,让它自动安装和配置这些剩余服务。
确保您位于 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
文章来源:https://blog.dontgod.com/index.php/archives/29/