我的 博客 停服已经有几个月了,主要原因是使用的 Google Cloud 免费服务器已经到期了,而整个博客系统的迁移成本很大,因此迟迟没有开启服务。
这周末,终于有时间来彻底解决博客迁移问题了。通过改造 Hexo 博客系统,使其支持 Docker 部署,彻底摆脱了运行环境依赖,以后再更换云服务器厂商时,就可以做到快速平滑迁移了。
我的博客做过定制化改造,使用的是 hexo-theme-yilia 作为主题,评论使用的是 disqus-php-api,支持 HTTPS 协议,因此本次改造主要涉及这些。
Docker 环境
云服务器
由于没有了 Google Cloud 的免费使用资格,只能在国内挑选较便宜的腾讯云云服务器厂商,购买了一台低配云服务器。
这台服务器的操作系统是 CentOS,我们选用 Docker Compose 作为容器编排工具。
安装 Docker
# 1.删除旧的Docker版本 |
安装 Docker Compose
# 1.获取docker-compose脚本 |
项目改造
调整目录结构
之前的目录结构较为单一,需调整项目目录结构。调整后的目录结构如下:
├── _config.yml # Hexo配置文件 |
其中,disqus
和 yilia
目录分别对应 disqus-php-api 和 hexo-theme-yilia 这 2 个子项目,并采用 submodule
模式管理这些源代码。
在
submodule
模式下,clone
和pull
命令会有一些变化,分别为git clone --recursive https://github.com/fan-haobai/blog.git
和git pull && git submodule foreach git pull origin master
。
编排容器
本博客系统,主要依赖 NodeJS
、PHP
、Nginx
环境,因此分别构建 3 个容器。
配置 docker-compose.yml
Docker Compose 会根据 docker-compose.yml
配置文件,来自动编排容器。配置如下:
version: '3' |
其中,services
下为需要编排的 nodejs
、php
、nginx
容器服务。每个容器服务都可以灵活配置,常见的配置参数如下:
- restart:容器退出时,是否重启
- build:构建容器 Dockerfile 文件所在的目录
- ports:映射端口
- volumes:挂载目录
- command:容器启动后执行的命令
- env_file:环境变量文件
- extra_hosts:域名IP映射
- container_name:容器名称
Docker Compose 支持多配置文件,且为覆盖关系。因此将
ssl-override.yml
作为获取 HTTPS 证书时启动容器的配置文件。
配置 docker.env
环境变量统一配置在 docker.env
文件中,并增加示例环境文件 docker.example.env
。环境变量目前较少,如下:
# 是否启用HTTPS证书 |
构建 Dockerfile
Dockerfile 文件统一放在 dockerfiles
目录下,并分别建立 nodejs
、php
、nginx
文件夹。
NodeJS
该容器下需要安装 git
、npm
。Dockerfile 文件如下:
FROM node:12-alpine |
其中,start.sh
为容器的启动脚本,主要作用为生成静态资源文件。内容如下:
|
PHP
该容器基于官方的基础镜像,安装一些必要的扩展。Dockerfile 文件如下:
FROM php:7.3.7-fpm-alpine3.9 |
其中,conf.d
下为 php
的配置文件。
Nginx
- Dockerfile 文件
该容器基于官方的基础镜像,并安装 cron
、wget
、python
。Dockerfile 文件如下:
FROM nginx:latest |
其中,conf.d
下为 nginx
的配置文件,ssl
下为 HTTPS 证书的生成脚本。
- HTTPS 证书生成脚本
ssl
下的 init_ssl.sh
为首次获取 HTTPS 证书脚本,refresh_cert.sh
为更新 HTTPS 证书脚本。
其中,init_ssl.sh
脚本内容如下:
|
ssl-override.yml
会覆盖docker-compose.yml
中的环境变量,因此会将环境变量ENABLE_SSL
设置为false
,并将php
解析到127.0.0.1
,以确保nginx
容器在首次能成功启动。
而 refresh_cert.sh
脚本内容如下:
|
其中,SSL_DOMAINS
为环境变量文件 docker.env
中配置需要支持 HTTPS 的域名。
- 容器启动脚本
在该容器启动后,会执行 start.sh
脚本。其内容如下:
|
其中需要注意,当不启用 HTTPS 协议时,需要将 Nginx 配置修改为不启用 HTTPS;而启用时,会添加每 2 个月重新生成证书的定时任务。nginx
也需要改为前台启动模式,否则容器会因没有前台程序而自动退出。
部署
前面的一切都准备就绪后,部署就异常简单了,后续再迁移时,也只需要简单做部署这一步就好了。
- 配置环境变量
cp docker.example.env docker.env |
- 获取HTTPS证书
/bin/bash dockerfiles/nginx/ssl/init_ssl.sh |
注意:如果无需支持HTTPS协议,则跳过此步骤,并将环境变量
ENABLE_SSL
修改为false
。
- 启动所有容器
docker-compose up --force-recreate --build -d |
如果一切顺利,那么运行 docker ps -a
命令就能看到已成功启动的容器,如下:
docker ps -a |
通过 www.fanhaobai.com 域名也可以直接访问到本站了。
使用 webhook-cli 工具可以支持代码自动部署,详细见 我的博客发布上线方案 — Hexo。
更新 »
- disqus-php-api 已替换为开源的 DisqusJS,无需再单独部署。
- 博客源码 howborn/blog。
