Hexo 是一个便捷的静态博客系统,最方便快捷的方案就是部署到 GitPage 上。但是 GitPage 的服务器位于境外,如果没有加 CDN 的话,国内用户访问 GitPage 的速度普遍较慢,而且国内搜索引擎对基本不(能)抓取 GitPage 上的内容,影响网站的 SEO。

环境

  1. Git环境的 ECS(以 CentOS 为例)
  2. 本地Hexo环境(Node.js等)
  3. 已备案域名等其他必要的东西

原理

示意图

创建仓库

在 ECS 上,检查 Git 环境,创建 Git 仓库

1
2
mkdir blog.git && cd blog.git
git init --bare

其中git init --bare指令的作用是创建一个裸仓库。裸仓库与普通git仓库不同,普通git仓库包含所有可操作性的项目文件和.git目录,而裸仓库只包含commit的版本信息。简便起见,这里直接创建裸仓库。

Hexo配置

1
2
3
4
5
6
deploy:
- type: git
  #git仓库路径
  repo: root@xx.xxx.xxx.xxx:/www/blog.git
  #分支
  branch: master

插件安装

1
npm install hexo-deployer-git --save

该插件的作用是执行deploy的时候,将 Hexo 生成的静态文件提交到 Hexo 的_config.yml配置的deploy.repo地址。如果已经成功部署到 GitPage 过,该插件一般都默认安装了,可以执行该命令检查、更新插件。

自动部署

创建钩子

进入 Git 仓库/hooks目录,并创建钩子post-receive

1
2
3
cd /www/blog.git/hooks
touch post-receive
vim post-receive

然后输入以下内容

1
2
3
4
5
6
7
8
#!/bin/bash -l
GIT_REPO=/www/blog.git
TMP_GIT_CLONE=/www/tmp/blog
PUBLIC_WWW=/www/wwwroot/byteprince.com
rm -rf ${TMP_GIT_CLONE}
git clone $GIT_REPO $TMP_GIT_CLONE
rm -rf ${PUBLIC_WWW}/*
cp -rf ${TMP_GIT_CLONE}/* ${PUBLIC_WWW}

其中/www/blog.git为仓库路径,/www/wwwroot/byteprince.com为博客网站路径,/www/tmp/blog是临时目录。

git会先将文件拉到临时目录,然后再将所有文件拷贝到博客网站目录/www/wwwroot/byteprince.com

保存后退出。

更改目录权限

更改网站目录权限

1
2
chmod +x post-receive
chmod 777 -R /www/wwwroot/byteprince.com

运行

每次写完博客,在本地博客目录下运行hexo g -d即可。可能需要输入远程访问服务器的密码。

出现以下提示说明部署成功。

1
2
...
INFO  Deploy done: git