MkDocs 站点部署
预计阅读时长 : 8 分钟
MkDocs 本质上是一个用于构建静态网站的工具,它通过将 Markdown 文档转换为 HTML 页面来实现对外发布。
按照官方指南的建议,MkDocs 的站点部署推荐使用 Github 集成,这样就可以利用 Github 的 Pages 服务来托管静态网站。但是,身在国内环境下,使用 Github 必然导致访问速度慢,甚至无法访问。
所以,国内网络环境下的最佳实践是构建 MkDocs 的 Docker 容器,然后映射文档所在的目录,并通过 Drone 的 Webhook 机制来触发构建和发布。
构建 Docker 镜像
构建 Docker 的镜像的基础是 Material for MkDocs insider 版本,这个版本是以 Github Sponsor 方式收费的,如果有需要可以根据自己的实力进行赞助获取访问权限。
除了默认的代码外,这个镜像中我们还需要补充安装 mkdocs.yml
文件中用到的依赖包(也就是配置文件中提到的各种插件)。
以下常用的依赖包需要添加到 user-requirements.txt
文件中。
插件列表 |
---|
| beautifulsoup4
cairosvg
jieba
neoteroi-mkdocs
pillow
termynal
mdx_truly_sane_lists
mergedeep
mkdocstrings
mkdocstrings-python
mkdocs-asciinema
mkdocs-badges
mkdocs-encryptcontent-plugin
mkdocs-git-revision-date-localized-plugin
mkdocs-glightbox
mkdocs-img2figv2-plugin
mkdocs-image-formatter-plugin
mkdocs-link-marker
mkdocs-link-preview-plugin
mkdocs-literate-nav
mkdocs-macros-plugin
mkdocs-mermaid2-plugin
mkdocs-markmap
mkdocs-meta-descriptions-plugin
mkdocs-minify-plugin
mkdocs-open-in-new-tab
mkdocs-kroki-plugin
mkdocs-resize-images
mkdocs-redirects
mkdocs-revealjs
mkdocs-toggle-sidebar-plugin
mkdocs-video
|
跨平台构建
构建镜像最常用的方法是使用手动构建,先在本地进行编译构建,然后复制到 VPS 上之后再进行导入。
由于构建的过程在 Mac arm64 设备平台上执行,因此需要使用 docker buildx
命令来构建指定平台(主要是 amd64)的镜像。
| docker buildx build --platform linux/amd64 -t mkdocs-material:20241114-amd64 .
|
然后,我们需要将镜像打包成压缩包,并上传到服务器上。
| docker save -o mkdocs-material:20241114-amd64.tar mkdocs-material:20241114-amd64
|
在服务器上,我们需要将压缩包解压,并导入到 Docker 中。
| docker load -i mkdocs-material:20241114-amd64.tarba
|
不过,由于我们会使用 Drone 来完成全部的自动化部署工作,因此这个手动构建的过程可以省略,仅供参考。
创建 Docker 容器
准备好了 Dcoker 镜像的源代码之后,我们接下去来创建容器使用的 docker-compose.yml
文件。
为了兼顾本地和服务器两个环境,我们为容器配置了两套 docker-compose.yml
文件。
两者之间的主要差别是使用的镜像不同,以及文档的映射目录不同。
使用 Drone 自动化部署
通过在 VPS 上部署 Drone 服务,并集成 Github 作为远端存储库, 我们可以实现文档的全自动化部署。
创建项目并激活
首先,推送文档项目到 Github 上创建远程存储库,然后在 Drone 中激活项目并在配置中打开 Trusted
选项。
然后,在项目中新建一个 .drone.yml
文件,并添加以下内容:
同步更新脚本 |
---|
| kind: pipeline
type: docker
name: sync-libukai
trigger:
branch:
- main
event:
- push
- cron
steps:
- name: sync-repo
image: alpine/git
volumes:
- name: docs-directory
path: /docs
commands:
- cd /docs
- git config --global --add safe.directory /docs
- git fetch origin main
- git reset --hard origin/main
volumes:
- name: docs-directory
host:
path: /home/git/mkdocs/libukai
|
初始化目标目录
接下去,我们需要在 VPS 上初始化目标目录,并绑定远程存储库。
首先,创建项目目录,需要和 Drone 中配置的 docs-directory
目录一致。
| mkdir -p /home/git/mkdocs/libukai
|
然后,进入目录中初始化 Git 本地存储库,并添加远程存储库。
| git init
git remote add origin https://github.com/libukai/awesome.git
|
推送更新文档内容
然后,我们就可以推送文档更新到 Github,并触发在 VPS 上触发 Drone ,完成自动化的部署和更新。
在一步当中,最终的效果是让 VPS 上的文档目录保持和 本地/Github 上的文档目录完全一致。
构建并更新容器
最后,我们使用推送 MdDocs 源代码项目的方式,来使用 Drone 构建容器并更新 Docker 容器。
| kind: pipeline
type: docker
name: mkdocs-docker-build
steps:
- name: build-docker-image
image: docker
volumes:
- name: docker_socket
path: /var/run/docker.sock
- name: aikebang
path: /aikebang
- name: libukai
path: /libukai
commands:
- cd /aikebang
- docker-compose -f docker-compose.deploy.yml down
- cd /libukai
- docker-compose -f docker-compose.deploy.yml down
- cd /aikebang
- docker-compose -f docker-compose.deploy.yml up -d --force-recreate
- cd /libukai
- docker-compose -f docker-compose.deploy.yml up -d --force-recreate
- docker image prune -f
volumes:
- name: docker_socket
host:
path: /var/run/docker.sock
- name: aikebang
host:
path: /home/git/mkdocs/aikebang
- name: libukai
host:
path: /home/git/mkdocs/libukai
|
代理设置
在构建 Docker 镜像时,如果需要使用代理,可以在 commands
中的 docker build
命令中添加代理参数:
| docker build --build-arg HTTP_PROXY=http://xxx.xxx.xxx.xxx:xxxxx --build-arg HTTPS_PROXY=http://xxx.xxx.xxx.xxx:xxxxx --build-arg NO_PROXY=localhost,drone-server,drone-agent -t mkdocs:latest-amd64 .
|
然后,当我们进行推送更新时,Drone 会自动触发镜像的重新构建,并且更新 MdDocs 服务对应容器中的镜像。