Frappe-V15框架的介绍和安装

Author Avatar
ZhuXing
发表:2024-11-29 17:33:00
修改:2024-12-04 12:23:56

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 -vnpm -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即可访问

评论