Qexo 是一个快速、强大、美观的在线 静态博客编辑器。使用 GPL3.0 开源协议。支持包括且不限于在 Vercel 等平台部署, 为您的静态博客添加动态的元素。本文使用 Docker 本地部署 Qexo。

1. 项目分析

1.1. 项目结构

  1. 数据库
  2. Django

其中数据库支持多种数据库,官网有所介绍,这里不再赘述,我们制作镜像,肯定镜像越轻量越好,所以我们选择轻量级的sqlite3数据库,然后就是django环境,我们可以直接使用python:3.11.3-alpine镜像进行构建,alpine镜像体积小,比较适合我们的需求

1.2. 资源准备

  1. 需要构建镜像的Dockerfile文件
  2. 需要一个db文件夹,用于存放数据库文件,在里面创建一个空的db.sqlite3文件
  3. 准备一个configs.py文件存放数据库连接配置信息
  4. Qexo的源码,这里我们不需要拷贝到本地,不对代码进行侵入式修改,直接使用git clone命令拉取代码即可,这样我们的镜像就是一个纯净的Qexo项目

1.3. 本地环境

  • Docker 环境
  • Ubuntu 22.04

2. 项目构建

2.1. 构建 Dockerfile

1
2
3
mkdir /data/qexo
cd /data/qexo
vim Dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
FROM python:3.11.3-alpine
# 维护者信息
LABEL maintainer="whb@yyds.space"
# 设置生产模式环境变量
# ENV APP_ENV production
# pipy源设置
RUN pip config set global.index-url https://mirrors.cloud.tencent.com/pypi/simple/
# 设置时区
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && \
  apk --no-cache add tzdata && \
  cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
  apk --no-cache del tzdata && \
  apk --no-cache add git && \
  mkdir /app
# 设置工作目录
WORKDIR /app
# 拷贝数据
RUN git clone https://ghproxy.com/https://github.com/Qexo/Qexo.git /app
# 安装依赖
RUN pip install --upgrade pip
RUN apk --no-cache add build-base python3-dev libffi-dev
RUN pip install Django==3.2.18
RUN pip install PyMySQL==1.0.2
RUN pip install boto3==1.26.94
RUN pip install requests==2.28.2
RUN pip install PyGithub==1.58.1
RUN pip install python-gitlab==3.13.0
RUN pip install html2text==2020.1.16
RUN pip install PyYAML
RUN pip install urllib3==1.26.15
RUN pip install Markdown==3.4.1
RUN pip install djongo==1.3.6
RUN pip install django-cors-headers==3.14.0
RUN pip install pymongo==3.13.0
RUN pip install dnspython==2.2.1
RUN pip install sqlparse==0.2.4
RUN pip install psycopg2-binary==2.9.5
RUN pip install cryptography==39.0.2
RUN pip install pyopenssl==23.0.0
RUN pip install oss2==2.17.0
RUN pip install beautifulsoup4==4.11.2
# 拷贝启动脚本
COPY . /app/
RUN chmod +x /app/run.sh
# 暴露端口
EXPOSE 8000
# 挂载目录
VOLUME ["/app/db", "/app/data"]
# 启动django
ENTRYPOINT ["/bin/sh", "/app/run.sh"]
  1. FROM python:3.11.3-alpine使用python:3.11.3-alpine镜像作为基础镜像,前面有介绍
  2. pipy源设置,这里我使用的是腾讯云的pypi/simple,你也可以使用其他的,比如阿里云pypi/simple,注意即使是服务器,这里最好请使用公网的源,不要使用内网的源,否则可能会出现不可预知的错误
  3. 时区设置,这就不用多说了,不设置时区,可能会导致时间不正确,比如djangoadmin后台,时间显示不正确
  4. 然后我创建了app目录用来存放项目
  5. git clone拉取Qexo项目源代码,如果有网络问题可以使用https://ghproxy.com/代理加速,这个请自行选择
  6. 拉取代码后,源代码仓库有requirements.txt直接使用就好,但是本人遇到了一些环境问题导致镜像构建失败,所以安装了开发环境后,手动重新部署依赖。
  7. 拷贝相关文件到镜像中,configs.pydb文件夹等需要放进去,可以使用拷贝,或者挂载方式,这里我使用的是拷贝方式(为了省事)。
  8. 我最后运行使用的是run.sh脚本,所以一定记得给脚本赋予可执行权限!!!
  9. 一定记得给脚本赋予可执行权限!!!
  10. VOLUNE挂载目录,这里我挂载了/app/db, /app/data两个目录,/app/db是数据库目录,/app/data是静态文件目录。
  11. app/db目录是数据库目录,这个目录一定要挂载出来,否则重启镜像会导致配置的数据丢失,这个目录实现数据持久化
  12. app/data目录是静态文件目录,这个目录也需要挂载出来,用来存放hexo的项目,也就是说请把这个目录挂载给hexo目录,非本地搭建hexo,可不挂载

2.2. 配置 run.sh

1
2
3
4
5
#!/bin/bash

python3 manage.py makemigrations
python3 manage.py migrate
python3 manage.py runserver 0.0.0.0:8000 --noreload
  1. makemigrations创建数据库迁移文件
  2. migrate执行数据库迁移
  3. runserver启动django服务
  4. 这些是django的基本操作,当然生产环境还是建议使用gunicornuwsgi等工具

2.3. 配置 configs.py

1
2
3
4
5
6
7
8
9
10
# 数据库配置
import pymysql,os

DOMAINS = ["127.0.0.1", "qexo.yyds.space", "101.43.253.61"]
DATABASES = {
   'default': {
       'ENGINE': 'django.db.backends.sqlite3',
       'NAME': os.path.join('/app/db' , 'db.sqlite3'),
  }
}
  1. DOMAINS是域名配置,需要配置自己的域名或者IP地址,类似于添加到访问白名单的地址,如果不配置,会导致权限问题无法访问
  2. DATABASES是数据库配置,这里我使用的是sqlite3数据库,如果你使用的是mysql或者postgresql等数据库,请自行修改配置
  3. 如果是mysql等数据库,需要自行安装pymysql数据库驱动,用什么数据库就安装什么驱动
  4. 如果是mysql等数据库,还需要添加相关数据库配置,比如HOSTPORTUSERPASSWORD
  5. 这里使用sqlite3数据库,直接使用os.path.join('/app/db' , 'db.sqlite3')拼接数据库路径

2.4. 构建镜像

1
docker build -t qexo:1.0 .

2.5. 运行镜像

1
docker run -d --name qexo -p 8000:8000 -v /data/qexo/db:/app/db -v /data/blog:/app/data qexo:1.0
  1. --name qexo容器名字
  2. -d后台运行,这里请设置为后台运行,不然你会卡在runserver命令上,如果卡住请新建一个终端即可,runserver不会退出
  3. -p 8000:8000端口映射,这里我使用的是8000端口,你可以自行修改
  4. -v /app/db:/app/db数据库目录挂载,这里我使用的是/app/db目录,你可以自行修改

3. Qexo初始化配置

如果由域名,您可以配置Qexo域名,A记录指向本地。配置域名反向代理到本地8000端口。示例:https://qexo.yyds.space

如果没有域名,则可以直接访问本地服务器 8000 端口,示例:http://IP:8000

3.1. web 界面配置博客

服务商选择本地,博客路径选择Qexo容器挂载博客路径。

image-20230730105056328

3.2 Qexo 界面展示

image-20230730105737811

4、参考文献

感谢大佬的文档支持!!!

QEXO构建Docker镜像及Kubernetes部署教程 | GUCAT