在本地部署 “hexo后端” - Qexo

在本地部署 “hexo后端” - Qexo

十月 25, 2023

原文地址:https://blog.iloli.love/archives/33773f16/

在阅读本文之前,你需要做的事:已经在 服务器/本地 部署好 hexo 及其相关依赖 ,还有python3.x及对应版本的pip 以及 git / curl 等命令

本文应用场景为通过本地部署的 Qexo 控制本地部署的 hexo ,为了轻量化,数据库使用SQlite

本文假设运行 python 的命令为 python3 ,运行 pip 的命令为 pip3 ,Qexo 目录为 /data/qexo

接下来我们开始部署 Qexo

下载所需文件

运行命令

如果是境内鸡则运行:

1
git clone https://ghproxy.com/https://github.com/Qexo/Qexo.git /data/qexo && cd /data/qexo && curl https://ghproxy.com/https://raw.githubusercontent.com/miaowmint/Qexo-docker/main/qexoconfigs.py -o configs.py &&  mkdir -p db && cd db && curl https://ghproxy.com/https://raw.githubusercontent.com/miaowmint/Qexo-docker/main/db/db.sqlite3 -o db.sqlite3

如果是境外鸡则运行:

1
git clone https://github.com/Qexo/Qexo.git /data/qexo && cd /data/qexo && curl https://raw.githubusercontent.com/miaowmint/Qexo-docker/main/qexoconfigs.py -o configs.py &&  mkdir -p db && cd db && curl https://raw.githubusercontent.com/miaowmint/Qexo-docker/main/db/db.sqlite3 -o db.sqlite3

命令解释:git clone Qexo的所需文件到 /data/qexo ,然后在该目录下载数据库配置文件,接下来在该目录下新建 db 文件夹,在 db 文件夹中下载数据库文件

运行结果如图所示
https://vip2.loli.io/2023/10/26/lubOosMFSkIdhVQ.png

修改配置文件

接下来修改 /data/qexo/configs.py ,将其中的 127.0.0.1yourqexo.com 分别修改为 你的服务器IP你用来访问Qexo的域名(如果有的话)

https://vip2.loli.io/2023/10/26/dGFlyrTunqkBWK1.png

https://vip2.loli.io/2023/10/26/yj3GP4KZS2L89hB.png

安装python依赖包

然后运行如下命令安装Python包

1
cd /data/qexo && pip3 install -r requirements_withoutmsyql.txt

部分运行结果如图所示

https://vip2.loli.io/2023/10/26/4MW8JYXtAyf1TeU.png
https://vip2.loli.io/2023/10/26/famydhoWbqTIv6F.png

如果这一步遇到报错,可能是因为你的python版本不合适,或者网络问题,或者镜像源问题,或者各种奇奇怪怪的问题;总之请自行解决

另附一份可能的报错以及解决方案:

对于如下的报错,可以将上面的命令改为下面这个

1
cd /data/qexo && pip3 install -r requirements_withoutmsyql.txt --ignore-installed PyYAML

https://vip2.loli.io/2023/10/26/HPQzjJTxYAMiD3R.png

运行 Qexo

接下来运行命令

1
python3 manage.py makemigrations && python3 manage.py migrate

运行结果如图,看到 ERROR: Provider获取失败, 跳过(functions.py.<module>[line:55]) 不用理会,是正常现象

https://vip2.loli.io/2023/10/26/qo3k4zsKh6ladFL.png
https://vip2.loli.io/2023/10/26/3pO7qtaA9Zel8cS.png

如果没有报错的话就可以继续运行如下命令

1
python3 manage.py runserver 0.0.0.0:8000 --noreload

可以看到 Qexo 已经运行成功了

https://vip2.loli.io/2023/10/26/FCVjIYgl53JMH4n.png

此时访问 http://你的服务器IP:8000 就可以进入 Qexo 初始化并愉快的使用 Qexo 了

https://vip2.loli.io/2023/10/26/9WeKvAQXJrwaz8S.png

使用 supervisor 常驻 Qexo 进程

在上面的步骤虽然成功运行了 Qexo ,但是如果我们按了 Ctrl + C 或者断开 ssh 连接,Qexo 进程就莫得了,总之我们要想办法常驻 Qexo 进程

有一个方法是使用 screen 新建一个视窗运行 python3 manage.py runserver 0.0.0.0:8000 --noreload

这个方法确实有效,但缺点是当服务器重启后无法自动运行 Qexo ,所以我们可以使用另一种方案:使用 supervisor 常驻 Qexo 进程

这里我使用的是宝塔面板里的插件 进程守护管理器 ,这个插件就是基于 supervisor 的,如果你不想使用宝塔面板,请自行找教程安装 supervisor ,我会在下面给出子配置文件

按照下图所示添加守护进程,点击确定即可
https://vip2.loli.io/2023/10/26/7ZCJtWbQFac8dwp.png

以下为该配置对应的 supervisor 子配置文件

https://vip2.loli.io/2023/10/26/L9Uk78H4mwodIBv.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[program:qexo]
command=python3 manage.py runserver 0.0.0.0:8000 --noreload
directory=/data/qexo/
autorestart=true
startsecs=3
startretries=3
stdout_logfile=/www/server/panel/plugin/supervisor/log/qexo.out.log
stderr_logfile=/www/server/panel/plugin/supervisor/log/qexo.err.log
stdout_logfile_maxbytes=2MB
stderr_logfile_maxbytes=2MB
user=root
priority=999
numprocs=1
process_name=%(program_name)s_%(process_num)02d

FAQ

如果我想通过域名访问 Qexo 应该怎么做

通过 Nginx 反代 http://127.0.0.1:8000

如果使用CDN,并且CDN支持自定义回源端口,则可以在CDN侧设置 使用 HTTP 回源 8000 端口

如果我的服务器上有 python3.x 但是没有对应的 pip 怎么办

试试运行如下命令

1
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py && python3 get-pip.py

使用 Qexo 更新文章时无法自动部署,报错 /bin/sh: line 1: hexo: command not found

使用 hexo 的完整路径

我是通过宝塔插件 nodejs 管理器 安装的nodejs,npm 安装的是hexo-cli ,完整路径为 /www/server/nodejs/v18.18.2/lib/node_modules/hexo-cli/bin/hexo 将其中的v18.18.2修改为你使用的nodejs版本

如果是其他途径安装的,请自行寻找

修改前的自动部署命令

1
hexo clean && hexo g

修改后的自动部署命令

1
/www/server/nodejs/v18.18.2/lib/node_modules/hexo-cli/bin/hexo clean && /www/server/nodejs/v18.18.2/lib/node_modules/hexo-cli/bin/hexo g

有一键脚本吗

没有,有时间我或许会试着写一个,但脚本里绝对不会提供 环境 和 依赖 的配置

有 Docker 版本吗

没有,具体理由见 https://github.com/miaowmint/Qexo-docker#readme