Frappe-V15框架的介绍和安装
Frappe 发音为 fra-pay,是一个全栈、功能齐全的 Web 框架,用 Python 和 Javascript 编写,以 MariaDB 作为数据库。它是 ERPNext 的驱动框架,非常通用,可用于构建数据库驱动的应用程序。
为什么选择 Frappe?
与其他框架相比,Frappe 的主要区别在于元数据也被视为数据。这使您能够非常轻松地构建前端。我们相信单片架构,因此 Frappe 几乎具备构建现代 Web 应用程序所需的一切。它有一个功能齐全的管理 UI,称为 Desk,可处理表单、导航、列表、菜单、权限、文件附件以及更多开箱即用的功能。
使用Frappe,你需要掌握:Python、JavaScript和jQuery、数据库管理和常见SQL查询、Jinja
首先我们看官方的环境要求
MariaDB 10.6.6+
Python 3.10/11/12
Node 18 or 20
Redis 6 (caching and realtime updates)
yarn 1.12+ (js dependency manager)
pip 20+ (py dependency manager)
wkhtmltopdf (version 0.12.5 with patched qt) (for pdf generation)
cron (bench's scheduled jobs: automated certificate renewal, scheduled backups)
这里我们选择Ubuntu系统作演示(最好给够2核4GB以上,官方要求是2核8GB),我们从清华源下载Ubuntu22.04.05LTS,清华源的镜像已经配好了apt源不需要我们手动配置
Index of /ubuntu-releases/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror
安装Ubuntu这里不再赘述,网上教程随便搜一下,如果你想要在服务器部署也是可以的,文章最后会说明和在虚拟机部署的区别
一、我们设置root账户的密码,并回到root账户
xing@xing:~/桌面$ cd
xing@xing:~$
xing@xing:~$ sudo passwd root
[sudo] xing 的密码:
新的密码:
重新输入新的密码:
passwd:已成功更新密码
xing@xing:~$ su root
密码:
root@xing:/home/xing# cd
root@xing:~#
二、我们将一个用户(没有就自己创建)作为主要 Frappe Bench 用户,并且为该用户分配管理员权限
root@xing:~# usermod -aG sudo xing
三、我们切换到刚才的用户,并进入用户主目录。更新软件列表和更新已安装的软件包
root@xing:~# su xing
xing@xing:/root$ cd
xing@xing:~$ sudo apt-get update -y
xing@xing:~$ sudo apt-get upgrade -y
等待更新完成
四、安装GIT
xing@xing:~$ sudo apt-get install git
五、安装Python 3及其相关的开发工具和包管理工具
xing@xing:~$ sudo apt-get install python3-dev python3.10-dev python3-setuptools python3-pip python3-distutils python3.10-venv
这里我们给pip换源方便后续操作:
xing@xing:~$ pip config --user set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple/
xing@xing:~$ pip config --user set global.trusted-host pypi.tuna.tsinghua.edu.cn
注:一定要注意当前使用的是哪个用户,不同的用户的config之间好像是不通用的,亲身教训
六、安装管理软件源的工具
xing@xing:~$ sudo apt-get install software-properties-common
七、安装MariaDB
xing@xing:~$ sudo apt install mariadb-server mariadb-client
八、安装Redis
xing@xing:~$ sudo apt-get install redis-server
九、安装虚拟框架缓冲区、字体配置库、命令行工具、MySQL客户端开发库
xing@xing:~$ sudo apt-get install xvfb libfontconfig wkhtmltopdf libmysqlclient-dev
十、设置Mariadb数据库
xing@xing:~$ sudo mysql_secure_installation
在设置过程中,将提示您几个问题,如下所示。按照说明继续设置;
输入当前 root 密码:(输入您的 SSH root 用户密码)
切换到 unix_socket 身份验证 [Y/n]: Y
更改 root 密码?[Y/n]: Y
此步骤将要求您设置新的 MySQL root 密码。此密码可以与 SSH root 用户密码不同
删除匿名用户?[Y/n] Y
禁止远程 root 登录?[Y/n]:N
将其设置为 N,因为我们可能希望从远程服务器访问数据库,以使用业务分析软件,如 Metabase / PowerBI / Tableau 等
删除测试数据库并访问它?[Y/n]:Y
现在重新加载权限表?[Y/n]:Y
十一、编辑 MySQL 默认配置文件
Tips:不熟悉vim可以用nano,更符合Windows的操作习惯
1、xing@xing:~$ sudo vim /etc/mysql/my.cnf
在my.cnf
底部增加以下代码块:
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
[mysql]
default-character-set = utf8mb4
2、xing@xing:~$ sudo service mysql restart
重启使配置生效
十二、安装NodeJS
使用 NodeSource 的 PPA(Personal Package Archive)来安装指定版本的 Node.js
xing@xing:~$ curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
#接着就可以安装了
xing@xing:~$ sudo apt-get install -y nodejs
我们可以用node -v
和 npm -v
来检测是否安装成功,出现下面的提示就是安装成功了
xing@xing:~$ node -v
v18.20.5
xing@xing:~$ npm -v
10.8.2
十三、配置npm源
这里我们用清华源来演示,配置后可以通过npm config get registry
验证是否配置成功
xing@xing:~$ npm config set registry https://mirrors.tuna.tsinghua.edu.cn/npm/
xing@xing:~$ npm config get registry
https://mirrors.tuna.tsinghua.edu.cn/npm/
显示https://registry.npmmirror.com
即是配置成功
十四、安装Yarn
xing@xing:~$ sudo npm install -g yarn
配置镜像源,并通过yarn config get registry
验证是否配置成功
xing@xing:~$ yarn config set registry https://mirrors.tuna.tsinghua.edu.cn/npm/
yarn config v1.22.22
success Set "registry" to https://mirrors.tuna.tsinghua.edu.cn/npm/.
Done in 0.02s.
xing@xing:~$ yarn config get registry
https://mirrors.tuna.tsinghua.edu.cn/npm/
十五、安装 Frappe Bench
xing@xing:~$ sudo pip3 install frappe-bench
Bench 是一个用于管理 Frappe 部署的 CLI 工具。它提供了一个简单的界面来帮助您设置和管理基于 Frappe 框架的多个站点和应用程序。
Bench常用指令:Bench Commands
十六、初始化Frappe Bench
在初始化之前,我们还有一步要做:
首先执行cd /usr/local/lib/python3.10/dist-packages/bench/utils
进入 Bench
工具的安装目录,这个目录里有一个system.py
文件
system.py
文件是Bench
的默认配置文件,用于初始化和管理 Frappe 和 ERPNext 环境的系统级配置。
我们打开用VIM打开system.py
文件,查看代码
sudo vim system.py
imports - standard imports
import grp
import os
import pwd
import shutil
import sys
# imports - module imports
import bench
from bench.utils import (
exec_cmd,
get_process_manager,
log,
run_frappe_cmd,
sudoers_file,
which,
is_valid_frappe_branch,
)
from bench.utils.bench import build_assets, clone_apps_from
from bench.utils.render import job
@job(title="Initializing Bench {path}", success="Bench {path} initialized")
def init(
path,
apps_path=None,
no_procfile=False,
no_backups=False,
frappe_path=None,
frappe_branch=None,
verbose=False,
clone_from=None,
skip_redis_config_generation=False,
clone_without_update=False,
skip_assets=False,
python="python3",
install_app=None,
dev=False,
):
"""Initialize a new bench directory
* create a bench directory in the given path
* setup logging for the bench
* setup env for the bench
* setup config (dir/pids/redis/procfile) for the bench
* setup patches.txt for bench
* clone & install frappe
* install python & node dependencies
* build assets
* setup backups crontab
"""
# Use print("\033c", end="") to clear entire screen after each step and re-render each list
# another way => https://stackoverflow.com/a/44591228/10309266
import bench.cli
from bench.app import get_app, install_apps_from_path
from bench.bench import Bench
verbose = bench.cli.verbose or verbose
bench = Bench(path)
bench.setup.dirs()
bench.setup.logging()
bench.setup.env(python=python)
config = {}
if dev:
config["developer_mode"] = 1
bench.setup.config(
redis=not skip_redis_config_generation,
procfile=not no_procfile,
additional_config=config,
)
bench.setup.patches()
# local apps
if clone_from:
clone_apps_from(
bench_path=path, clone_from=clone_from, update_app=not clone_without_update
)
# remote apps
else:
frappe_path = frappe_path or "https://github.com/frappe/frappe.git"
is_valid_frappe_branch(frappe_path=frappe_path, frappe_branch=frappe_branch)
get_app(
frappe_path,
branch=frappe_branch,
bench_path=path,
skip_assets=True,
verbose=verbose,
resolve_deps=False,
)
# fetch remote apps using config file - deprecate this!
if apps_path:
install_apps_from_path(apps_path, bench_path=path)
# getting app on bench init using --install-app
if install_app:
get_app(
install_app,
branch=frappe_branch,
bench_path=path,
skip_assets=True,
verbose=verbose,
resolve_deps=False,
)
if not skip_assets:
build_assets(bench_path=path)
if not no_backups:
bench.setup.backups()
def setup_sudoers(user):
from bench.config.lets_encrypt import get_certbot_path
if not os.path.exists("/etc/sudoers.d"):
os.makedirs("/etc/sudoers.d")
set_permissions = not os.path.exists("/etc/sudoers")
with open("/etc/sudoers", "a") as f:
f.write("\n#includedir /etc/sudoers.d\n")
if set_permissions:
os.chmod("/etc/sudoers", 0o440)
template = bench.config.env().get_template("frappe_sudoers")
frappe_sudoers = template.render(
**{
"user": user,
"service": which("service"),
"systemctl": which("systemctl"),
"nginx": which("nginx"),
"certbot": get_certbot_path(),
}
)
with open(sudoers_file, "w") as f:
f.write(frappe_sudoers)
os.chmod(sudoers_file, 0o440)
log(f"Sudoers was set up for user {user}", level=1)
def start(no_dev=False, concurrency=None, procfile=None, no_prefix=False, procman=None):
program = which(procman) if procman else get_process_manager()
if not program:
raise Exception("No process manager found")
os.environ["PYTHONUNBUFFERED"] = "true"
if not no_dev:
os.environ["DEV_SERVER"] = "true"
command = [program, "start"]
if concurrency:
command.extend(["-c", concurrency])
if procfile:
command.extend(["-f", procfile])
if no_prefix:
command.extend(["--no-prefix"])
os.execv(program, command)
def migrate_site(site, bench_path="."):
run_frappe_cmd("--site", site, "migrate", bench_path=bench_path)
def backup_site(site, bench_path="."):
run_frappe_cmd("--site", site, "backup", bench_path=bench_path)
def backup_all_sites(bench_path="."):
from bench.bench import Bench
for site in Bench(bench_path).sites:
backup_site(site, bench_path=bench_path)
def fix_prod_setup_perms(bench_path=".", frappe_user=None):
from glob import glob
from bench.bench import Bench
frappe_user = frappe_user or Bench(bench_path).conf.get("frappe_user")
if not frappe_user:
print("frappe user not set")
sys.exit(1)
globs = ["logs/*", "config/*"]
for glob_name in globs:
for path in glob(glob_name):
uid = pwd.getpwnam(frappe_user).pw_uid
gid = grp.getgrnam(frappe_user).gr_gid
os.chown(path, uid, gid)
def setup_fonts():
fonts_path = os.path.join("/tmp", "fonts")
if os.path.exists("/etc/fonts_backup"):
return
exec_cmd("git clone https://github.com/frappe/fonts.git", cwd="/tmp")
os.rename("/etc/fonts", "/etc/fonts_backup")
os.rename("/usr/share/fonts", "/usr/share/fonts_backup")
os.rename(os.path.join(fonts_path, "etc_fonts"), "/etc/fonts")
os.rename(os.path.join(fonts_path, "usr_share_fonts"), "/usr/share/fonts")
shutil.rmtree(fonts_path)
exec_cmd("fc-cache -fv")
我们观察这两行代码
frappe_path = frappe_path or "https://github.com/frappe/frappe.git"
exec_cmd("git clone https://github.com/frappe/fonts.git", cwd="/tmp")
这两行代码我们可以理解为:在没有指定路径时使用 GitHub 上的 Frappe 仓库地址,我们可以去Gitee找到别人的Frappe同步仓库,替换仓库地址以提高下载速度
Gitee上的Frappe同步仓库:
https://gitee.com/jasonfu06/frappe
替换后,cd
回到主目录即可开始初始化
xing@xing:/usr/local/lib/python3.10/dist-packages/bench/utils$ cd
xing@xing:~$ bench init --frappe-branch version-15 frappe-bench
注:显示网络问题就是换源出了问题,再设置一次。不行就去百度换其他的源
安装成功后我们查看主目录,可以看到已经成功初始化了frappe-bench
,我们进入frappe-bench
xing@xing:~$ ls
公共的 模板 视频 图片 文档 下载 音乐 桌面 frappe-bench snap
xing@xing:~$ cd frappe-bench
进入后我们创建一个新站点用于挂在我们的frappe-bench
,这时会让我们输入Mariadb的密码和设置站点的初始密码
xing@xing:~/frappe-bench$ bench new-site Frappe15
MySQL root password:
Installing frappe...
Updating DocTypes for frappe : [========================================] 100%
Set Administrator password:
Re-enter Administrator password:
Updating Dashboard for frappe
Frappe15: SystemSettings.enable_scheduler is UNSET
*** Scheduler is disabled ***
创建成功后我们输入bench use Frappe15
,将Frappe15
作为默认站点
xing@xing:~/frappe-bench$ bench use Frappe15
最后运行输入bench start
即可运行Frappe
这时候会返回日志,显示Frappe映射到了哪一个端口
注意:如果是在服务器部署的,我们登陆你的服务器平台,进入控制条,在安全组里放行8000端口的入方向和出方向
如果是虚拟机,直接访问内网地址 + 8000即可。在服务器部署的访问公网IP + 8000即可访问