使用Hexo搭建博客之进阶篇

简介

  • Hexo:一个快速、简单且强大的博客框架。
  • Hexo的简单之处在于你可以用30分钟,甚至更短的时间就可以生成一个属于你自己的博客。
  • Hexo的强大之处在于你对博客界面细节的调整,有可能用上1天的时间。
  • 在进阶篇中,我着重介绍如何方便的部署博客及迁移博客。

起因

  • 每次更换电脑以后,为了写博客就必须去安装Hexo,为避免繁琐的步骤,故封装了Docker镜像。
  • 使用Docker封装镜像后,可以很方便的利用Docker跨平台的特性,《Linux上安装Docker》
  • 由于本文涉及的LinuxDocker知识较多,建议量力而行。

备份博客

概要

  • 如果想要很方便的迁移博客或者部署博客,需要我们将博客的原始文件进行远程备份,GitHub成为了我们的首选。
  • 《使用Hexo搭建博客之基础篇》中,我们了解了Hexo相关目录及文件的作用。
  • 此处,我采用将博客的原始文件托管到GitHub管理,渲染后的文件放在云服务器上,以供他人访问。
  • 其中需要备份的文件:_config.yml文件、source目录、scaffolds目录,而themes目录则是在每次迁移博客后,重新拉取。
  • 正如我的GitHub上一样,而README.md文件是为了方便自己迁移博客。

操作

  • GitHub上新建一个仓库,例如:blog
  • 在本地新建一个与GitHub仓库同名的目录:
1
mkdir -p /blog
  • 拷贝我们需要备份的目录及文件到此目录:
1
2
cp _config.yml /blog/
cp -r source/ /blog/
  • 若你的主题自定义过多且不考虑升级,建议同时备份到GitHub上,注意删除对应主题下有关git的目录及文件。
1
2
cp -r themes/ /blog/
rm -rf /blog/themes/next/.git*
  • 配置Git的基本信息:
1
2
git init
git remote add origin git@github.com:YuXiaoCoder/blog.git
  • 上传到GitHub仓库:
1
2
3
git add --all
git commit -a -m '07/15/2018'
git push --set-upstream origin master
  • 以后更新博客内容以后,记得不仅要deploy,还要commitGitHub上。

迁移博客

  • 当换了新的环境以后,先配置好可以免密访问GitHub
  • 将备份的博客拉取到本地即可。

docker-hexo

  • 其实,Docker的作用就是帮我们把hexo及依赖插件与博客的原始文件进行了分离。

构建镜像

  • 本地构建镜像, 先clone仓库到本地, 再构建镜像:
1
2
3
git clone https://github.com/YuXiaoCoder/docker-hexo.git
cd docker-hexo/
docker build --no-cache --tag docker-hexo .

预览博客

  • 此容器用于预览博客,类似hexo server,在本地运行:

  • 创建Server容器:

1
2
3
4
5
6
7
8
9
10
11
docker run -d \
--net host \
-e MODE="server" \
-e PORT=4000 \
--restart=always \
--name "hexo-server" \
-v /blog/source:/blog/source \
-v /blog/themes:/blog/themes \
-v /blog/scaffolds:/blog/scaffolds \
-v /blog/_config.yml:/blog/_config.yml \
docker-hexo
  • 更新内容后,若发现内容未自动更新,可尝试重启容器:
1
docker restart hexo-server

部署博客

  • 此容器用于部署博客,支持rsyncgit,使用git时,需要传入NAMEEMAIL

  • 在物理机上创建根目录:

1
mkdir -p /data/www/
  • 创建Deploy容器:
1
2
3
4
5
6
7
8
9
10
11
# rsync
docker run -d \
--net host \
-e MODE="deploy" \
--name "hexo-deploy" \
-v /root/.ssh:/root/.ssh \
-v /blog/source:/blog/source \
-v /blog/themes:/blog/themes \
-v /blog/scaffolds:/blog/scaffolds \
-v /blog/_config.yml:/blog/_config.yml \
docker-hexo
  • 更新博客后,预览检查无误后,部署博客:
1
docker start hexo-deploy

docker-nginx

  • 若博客使用的是GitHub Pages,则无需阅读此部分的内容。
  • 为了方便云服务器部署并升级Nginx, 故封装了docker-nginx镜像。
  • 本镜像仅开放了80端口及443端口(若需要),请自行理解docker的端口映射及目录映射。

构建镜像

  • 本地构建镜像, 先clone仓库到本地, 再构建镜像:
1
2
3
git clone https://github.com/YuXiaoCoder/docker-nginx.git
cd docker-nginx/
docker build --no-cache --tag docker-nginx .
  • 本地构建镜像, 先clone仓库到本地, 再构建镜像:
1
2
3
git clone https://github.com/YuXiaoCoder/docker-certbot.git
cd docker-certbot/
docker build --no-cache --tag docker-certbot .

申请证书

  • 运行nginx,证明域名所有权:
1
2
mkdir -p /etc/nginx/conf.d/
vim /etc/nginx/conf.d/blog.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
server {
listen 80;
server_name www.xiaocoder.com;
location ~ /.well-known {
allow all;
root /data/www/;
}

location / {
root /data/www/;
index index.html index.htm;
}
}
1
2
3
4
5
6
7
docker run -d \
--rm \
--net host \
--name "nginx-server" \
-v /data/www:/data/www \
-v /etc/nginx/conf.d/:/etc/nginx/conf.d/ \
docker-nginx
  • 申请证书:
1
2
3
4
5
6
docker run -it \
--rm \
-v /data/www:/data/www \
-v /etc/letsencrypt:/etc/letsencrypt \
docker-certbot \
certonly --webroot -w /data/www -d www.xiaocoder.com --email xiao.950901@gmail.com
  • 加强diffie-hellman算法强度(耐心等待):
1
openssl dhparam -out /etc/ssl/certs/dhparams.pem 2048
  • 删除nginx容器:
1
docker stop nginx-server

运行容器

  • 创建配置文件:
1
vim /etc/nginx/conf.d/blog.conf
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
server {
listen 80;
server_name www.xiaocoder.com;
location ~ /.well-known {
allow all;
root /data/www/;
}

return 301 https://$server_name$request_uri;
}

server {
listen 443 ssl;
server_name www.xiaocoder.com;

location / {
root /data/www;
index index.html index.htm;
try_files $uri $uri/ =404;
}

ssl_stapling on;
ssl_stapling_verify on;
ssl_session_tickets on;
ssl_session_timeout 5m;
ssl_prefer_server_ciphers on;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_dhparam /etc/ssl/certs/dhparams.pem;
ssl_session_cache builtin:1000 shared:SSL:10m;
ssl_certificate /etc/letsencrypt/live/www.xiaocoder.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.xiaocoder.com/privkey.pem;
ssl_ciphers TLS-AES-256-GCM-SHA384:TLS-CHACHA20-POLY1305-SHA256:TLS-AES-128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:!aNULL:!eNULL:!MD5;
}
  • 运行nginx
1
2
3
4
5
6
7
8
9
docker run -d \
--net host \
--restart=always \
--name "nginx-server" \
-v /data/www:/data/www \
-v /etc/letsencrypt:/etc/letsencrypt \
-v /etc/nginx/conf.d/:/etc/nginx/conf.d/ \
-v /etc/ssl/certs/dhparams.pem:/etc/ssl/certs/dhparams.pem \
docker-nginx

完成部署

  • 创建续订证书的容器:
1
2
3
4
5
docker run -d \
--name "certbot" \
-v /data/www:/data/www \
-v /etc/letsencrypt:/etc/letsencrypt \
docker-certbot renew
  • 设置定时任务:
1
crontab -e
1
2
30 3 * * 6 docker restart certbot
35 3 * * 6 docker restart nginx-server

请作者喝瓶肥宅快乐水