Hexo使用Qexo进行后台管理的部署配置

Hexo使用Qexo进行后台管理的部署配置
李瑶瑶Qexo云后台部署管理
实现思路
步骤 | 内容 | 资源 |
---|---|---|
一 | GitHub自动部署 | |
①本地Hexo源文件同步到GitHub私有仓库 | Qexo搭建教程 - JustPureH2O的博客 | |
②GitHub Actions自动部署 | Hexo博客自动部署-時光 | |
二 | Vercel在线部署云后台 | |
1. Qexo源代码fork到GitHub仓库(可跳过) | Abudu的Qexo源码 | |
2. Vercel一键部署 | 一键部署 | |
3. Vercel添加Storage | ||
4. Vercel修改Node.js版本为18 | ||
5. Vercel重新部署 | ||
6. Vercle初始化和配置 | GitHub_token、Vercel_token、Vercel项目ID | |
7. Vercel绑定自定义域名 | ||
三 | 本地部署 | |
使用SQlite数据库 | ||
四 | 同步 | |
Qexo/仓库 同步到本地 | ||
本地同步到仓库 | ||
五 | 图床配置 | 帝少123/telegraph-image、图床配置 · Qexo |
一.GitHub自动部署
1. 本地Hexo源文件同步到GitHub私有仓库
来源:Qexo搭建教程 - JustPureH2O的博客
在Github里新建仓库,用于存放博客源码。接着在本地转到你的博客源码文件夹中(就是你执行 hexo clean & hexo g & hexo d
的文件夹),右键点击 git bash here
,依次键入以下的代码:
- (“查看”里勾选“显示隐藏的文件”后,若源码目录下没有名为
.git
的文件夹,有则跳过该步骤)git init
- 复制仓库的网页地址,例:
https://github.com/<username>/<repo>
- 输入
git remote add <name> https://github.com/<username>/<repo>.git
(这里的<name>
任取,但保证先前未创建过,且不与已经存在的<name>
重复,否则将可能不会上传当前的文件夹) - 输入
git pull <name> master
,master
可更改,但保证和新建仓库的主branch同名 - 输入
git add .
(注意有个点) - 输入
git commit -m "Commit内容"
(内容可更改,但需要用半角双引号包裹起来) - 输入
git push <name> master
(master
保持前后一致即可)
如果是第一次上传,按顺序执行以下七步操作;如果已经上传过了,想要提交一些个人的更改,执行第四到第七步即可。“Github 仓库”这一项就填刚刚创建并上传的源码仓库,格式是 <username>/<repo>
(例:mynameisabcd/BlogSourceCode
)。
“项目分支”填源代码仓库的主要分支,一般是 master
;“博客路径”留空即可。
2. GitHub Actions自动部署
来源:Hexo博客自动部署-時光 _一次成功_🎉
① 获取token(保存好,只显示一次)
手动获取路径:Settings—Developer Settings—Personal access tokens—Tokens(classic)——Generate new token
Expiration:No Expiration(永不过期)
Select scopes:勾选 repo 和 workflow
生成后保存好,只显示一次,丢失需要重新生成
② 修改 config.yml
大部分人之前应该都是在本地进行博客编写,所以连接 GitHub 的方式一般都是使用的 ssh ,我们为了方便后续自动部署,需要把 config.yml 文件中的 deploy => repository => github 值改成 token url 的形式。
1 | deploy: |
改为
1 | deploy: |
将 {$GH_TOKEN} 替换成刚才生成的 token ,仓库地址是博客静态文件最终存放的仓库地址,即开通 Github Pages 服务的那个仓库地址。
这里可以同时部署到多个仓库,只需复制一份配置信息即可
1 | deploy: |
③ 创建 GitHub Actions 脚本
GitHub Actions 的工作流文件存放在源代码仓库的 .github/workflows 目录。workflow 文件采用 YAML 格式,文件名可以任意取,但是后缀名统一为 .yml,比如 deploy.yml。一个库可以有多个 workflow 文件。GitHub 在我们完成预设触发条件时,只要发现 .github/workflows 目录里面有 .yml文件,就会自动读取运行该文件。
可以手动建立此文件,或者通过源代码仓库 => Actions => 选择 Setup Node创建,但最终同样都需 push 到远端源代码仓库中。
1 | name: Lee's Blog CI/CD # 脚本 workflow 名称 |
代码提交前需要检查下是否已安装一键部署插件 hexo-deployer-git
1 | npm install hexo-deployer-git --save |
若提示 Deployer not found: git 则说明尚未引入该插件依赖
作者: 時光
来源:【Hexo】博客自动部署 | 時光
二.Qexo部署
1.Qexo源代码fork到GitHub仓库
2.Vercel一键部署
来源:点击一键部署
部署失败是正常的,不用管
3.Vercel添加Storage
我用的是Neon,华盛顿
4.Vercel修改Node.js版本为18
路径:Vercel—项目—设置—常规—Node.js版本
改为18.x 版本
5.Vercel重新部署
路径:Vercel—项目—部署—重新部署
英文:Vercel—项目—Deployments-Redeploy
6.Vercle初始化和配置
重新部署成功即完成初始化
配置:
① 用户配置
API留空自动生成,用户名和密码自定义
② 博客配置
Github密钥:前面生成的 GitHub_token
Github仓库:存放博客源文件的自动化部署仓库
项目分支:源文件所在的分支
博客路径:默认留空
③ Vercel配置
Vercel密钥:点击获取Vercel_token 头像—Account Settings—Tokens
项目ID:Vercel—项目—设置—常规—项目ID
7. Vercel绑定自定义域名
这一步可有可无。因为部署成功会自动生成一个域名用来访问,但是这个域名比较长,而且国内无法访问,需要挂梯子。可以通过自定义域名托管在cloudflare进行间接访问,并且也更好记。
前提是拥有自己的域名,例如 ly.com
。先把域名托管到cloudflare,过程中会给出两个名称S服务器地址,复制粘贴到域名注册商对应位置。
① 在cloudflare托管的域名中添加两条DNS记录
类型 | 名称 | 内容 | 代理状态 | TTL |
---|---|---|---|---|
A | @ | 76.76.21.21 | 已代理 | 自动 |
CNAME | www | cname-china.vercel-dns.com | 已代理 | 自动 |
其中”@“为使用根域名“ly.com
”,”www“为子域名”www.ly.com
“,“ly.com
”和”www.ly.com
“是用来绑定Qexo的域名,代替部署成功自动生成的域名,方便记忆。76.76.21.21
和cname-china.vercel-dns.com
是Vercel提供的DNS记录服务器。默认的cname.vercel-dns.com
在国内无法访问,所以采用另一个。
②更改域名的加密模式
我一开始自行配置的自定义域根本没办法访问,我找过添加自定义域的原因,找过添加DNS记录的原因,最终都无法访问,显示重定向次数过多。阴差阳错在NotionNext博客搭建的教程中看见了这一步操作,尝试后立刻成功通过自定义域访问Qexo管理面板。
来源:Vercel绑定自定义域名 | NotionNext帮助手册
具体操作:在域名的SSL/TSL中配置SSL/TSL加密模式为完全。这是因为默认的灵活加密证书不匹配会导致反复重定向,而无法访问。
③ 在Vercel中添加自定义域
将“ly.com
”和”www.ly.com
“分别添加到Vercel的自定义域中,不需要其它操作。
等几分钟应该就OK了。
三.本地部署
想尝试本地部署,又不想用Docker和其他安装的数据库,试过MySQL,安装失败了,感觉很麻烦,于是在ChatGPT的帮助下尝试直接在Windows部署Qexo。
1. 拉取Qexo
在想要部署qexo的文件夹下打开VScode,运行下列代码拉取qexo
1 | git clone https://github.com/Qexo/Qexo.git |
2. 安装依赖
进入拉取的qexo文件夹cd qexo
运行
1 | pip install -r requirements.txt |
3. 配置 SQLite 数据库
根目录下新建configs.py
文件,内容为
1 | from pathlib import Path |
4. 运行迁移
运行数据库迁移命令,以便 Django 创建相应的数据库表
1 | python manage.py makemigrations |
5. 运行
通过下面命令运行本地qexo服务
1 | python manage.py runserver |
浏览器打开https://127.0.0.1:8000
进入Qexo,在其中的配置都会保存在SQLite数据库db.sqlite3
中
局域网内其他设备使用,可以运行
1 | python manage.py runserver 0.0.0.0:8000 |
其他设备通过 http://电脑IP:8000 可以进入qexo
6. 一键运行
部署成功了,但是每次运行都要进入文件夹、输入命令和浏览器打开地址,所以采用批处理一键运行,为避免跨磁盘运行出错,直接把批处理文件放在manage.py相同路径下,也就是Qexo文件夹。
在Qexo目录下新建文本文档,内容为
1 | @echo off |
重命名为Qexo.bat,右键发送到桌面快捷方式
- 快捷方式美化
把快捷方式重命名为Qexo
右键——属性——更改图标,保存下图,用 在线图标转换工具 转换成.ico文件,作为快捷方式的图标。
ps:试过各种方式转换成.ico,都无法上传图片,只能提供png格式自行转换了

现在完美伪装成一个应用程序了
7. 更新方法
- 一键更新,选择dev,确定。提示出错不用管,到本地项目文件夹找到
_tmp
,里面是更新的release,名字为Qexo-*短码
,把里面的文件剪切出来粘贴覆盖项目根目录文件。 - 无法通过设置界面一键更新,可以手动覆盖更新。进入Releases · Qexo/Qexo,下载最新版本的 Source Code.zip

解压后覆盖本地文件,只会覆盖更新源码文件,不会影响本地的configs.py
,db.sqlite3
和qexo.bat
。
四.同步
推送代码:
1 | git add . |
查看分支代码:
1 | git branch |
1.Qexo/仓库 同步到本地
将远程的更改合并到本地
1 | git pull master master |
2.本地同步到仓库
本地推送到自动化部署仓库
1 | git push master master |
处理可能的合并冲突
如果 git pull
后出现冲突,Git 会提示你在哪些文件上有冲突,你需要手动解决冲突:
- 使用文本编辑器打开冲突的文件,Git 会标记出冲突的部分。
- 解决冲突后,执行:
1 | git add <resolved\_file> # 添加解决冲突后的文件 |
然后再执行:
1 | git push master master |
3.Qexo同步仓库内容
设置—博客配置—重新提交
(相当于更换一个源码仓库,会重新加载内容)
本地部署问题
执行 hexo cl;hexo g;hexo d
出错,先重新连接仓库
1 | git config --global user.name "liyao231381" #liyao231381替换为GitHub_ID |
再执行部署命令
1 | hexo d |
五.图床配置
我使用的是自己搭建的Sanyue图床,感谢 **dishao123 (帝少)**,搭建教程已经转载👇
搭建教程:Telegram和Cloudflare搭建免费图床 | 理·型·健
通过Qexo图床中的远程API进行配置。参考了 远程API | Qexo 文档 和 帝少的开源图床项目 ,在ChatGPT-4o-mini的帮助下配置成功。
配置参数:
配置项 | 参数 | 解释 |
---|---|---|
API 地址 | https://自定义域/upload?authCode=自定义前端密码&uploadNameType=index | 图床图片上传的 API和参数配置,index表示返回图片名仅前缀数字,避免文件名有空格和汉字影响渲染显示 |
POST 参数名 | file | 图床图片上传 API 参数中图片文件的参数名 |
JSON 路径 | 0.src | 图床 API 返回数据中图片 URL 所在的路径,若为整个返回值请留空 |
自定义请求头 | *留空 | POST 请求时附带的请求头,需要标准 JSON 格式,若不需要请留空 |
自定义 BODY | *留空 | POST 请求时额外的请求主体,需要标准 JSON 格式,若不需要请留空 |
自定义前缀 | https://自定义域 | 返回 URL 所需要添加的前缀,若不需要请留空 |
删除API | *留空 |
中间一直配置出错,最后找到原因在于JSON路径。qexo文档示例JSON路径为data.url
,返回的JSON中图片路径在data参数的url参数中。图床文档示例JSON路径为data[0].src
,返回的JSON中图片路径在src参数中。我把Qexo配置中JSON路径分别设置为data.src
,data[0].src
,[0].src
,.src
和src
都无法成功。最后通过ChatGPT得知:
数组访问:使用 0
作为索引来访问数组中的第一个元素。
于是把JSON路径设为0.src
就成功了。
大功告成!!!有问题找Chat GPT
