说明

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

特色功能 文章管理~全新界面 缓存功能~速度至上 麻雀虽小~五脏俱全
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. 准备Jenkinsfile文件,用于jenkins自动化部署(非必须),如果你没有jenkins的话,可以直接使用docker build构建镜像
  5. Qexo的源码,这里我们不需要拷贝到本地,不对代码进行侵入式修改,直接使用git clone命令拉取代码即可,这样我们的镜像就是一个纯净的Qexo项目

2. 项目构建

2.1. 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
FROM python:3.11.3-alpine
# 维护者信息
LABEL maintainer="gucat@gucat.cn"
# 设置生产模式环境变量
# 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://github.com/Qexo/Qexo.git /app
# 安装依赖
RUN pip install -r requirements.txt
# 拷贝启动脚本
COPY . /app/
RUN chmod +x /app/run.sh
# 暴露端口
EXPOSE 8000
# 挂载目录
VOLUME ["/app", "/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文件夹等需要放进去,可以使用拷贝,或者挂载方式,这里我使用的是拷贝方式(为了省事),毕竟kubernetes配置secret也是挺麻烦的,而且可能会存在很多问题
  8. 我最后运行使用的是run.sh脚本,所以一定记得给脚本赋予可执行权限!!!
  9. 一定记得给脚本赋予可执行权限!!!
  10. VOLUNE挂载目录,这里我挂载了/app, /app/db, /app/data三个目录,/app目录是整个项目目录,/app/db是数据库目录,/app/data是静态文件目录,app目录非必要不要挂载,因为整个项目和镜像启动文件都在里面,如果挂载了,可能会导致项目无法启动,我挂载出来是方便开发测试
  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", "dev.gucat.vip", "124.222.111.144"]
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. Jenkinsfile

这里就不贴jenkins的配置了,跟我之前的文章一样,我使用的kaniko,你可以直接使用docker build

3. 配置

3.1. docker运行

1
docker run -d --name qexo -p 8000:8000 -v /mnt/app/db:/app/db -v /mnt/app/data:/app/data qblyxs/qexo:1.0
  1. --name qexo容器名字
  2. -d后台运行,这里请设置为后台运行,不然你会卡在runserver命令上,如果卡住请新建一个终端即可,runserver不会退出
  3. -p 8000:8000端口映射,这里我使用的是8000端口,你可以自行修改
  4. -v /app/db:/app/db数据库目录挂载,这里我使用的是/app/db目录,你可以自行修改
  5. 镜像请自己进行构建,不要使用我的镜像,没有保障,我暂时不会对该项目进行维护,毕竟我的精力有限,只做研究

3.2. kubernetes运行

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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
---
apiVersion: v1
kind: Namespace
metadata:
name: qexo
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: qexo-deployment
namespace: qexo
spec:
replicas: 1
selector:
matchLabels:
app: qexo
template:
metadata:
labels:
app: qexo
spec:
containers:
- name: qexo
image: qblyxs/qexo:1.0 #替换成自己使用的镜像
imagePullPolicy: Always
ports:
- containerPort: 8000
volumeMounts:
- name: db-volume
mountPath: /app/db
- name: data-volume
mountPath: /app/data
volumes:
- name: db-volume
hostPath:
path: /mnt/app/db
- name: data-volume
hostPath:
path: /mnt/app/data
---
apiVersion: v1
kind: Service
metadata:
name: qexo-service
namespace: qexo
spec:
type: NodePort
ports:
- port: 8000
targetPort: 8000
nodePort: 31400 #可替换成自己想要的端口 30000-32767 ,或者不写,随机分配
selector:
app: qexo
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: qexo-ingress
namespace: qexo
spec:
ingressClassName: nginx
rules:
- host: hexo.gucat.vip
http:
paths:
- backend:
service:
name: qexo-service
port:
number: 8000
path: /
pathType: Prefix
---
  1. 这只是个比较简单的yaml配置,你还可以添加其他pod比如redismysql等,这里我就不贴了,你可以自行添加
  2. 然后数据挂载这里自己挂载到了主机上,也可以使用pvpvc等方式,扩展性和可移植性更好
  3. ingress这里我使用的是nginx-ingress,你也可以使用其他的
  4. 配置里很多信息需要自己稍微修改下,改成自己的

这只是个简单例子,看看官方以后会不会出相关的方法和文档

4. 最后贴出一些截图

这是docker部署的效果展示
这是docker部署的效果展示
这是kubernetes环境下的部署效果
这是kubernetes环境下的部署效果
qexo主页样式
qexo主页样式
qexo配置列表
qexo配置列表
文章在线编辑
文章在线编辑