搬砖小抄

此博客的诞生过程(Hexo+VPS+GIT同步)

字数统计: 1.2k阅读时长: 5 min
2018/04/09 Share

主要流程:

  1. 在本机(写博客的电脑,后面称之为写作环境)上用markdown语法进行写作,本机也需要Hexo运行环境,因为写好了还需要预览,检查.所见即所得.
  2. 将整个hexo项目托管到一个中介服务器上,手段很多,但是GIT托管最好用.
  3. 在VPS上安装GIT,Hexo,Nginx.其中GIT用于文件同步;Hexo担当编译器角色,将markdown格式的文档生成静态网页;Nginx做Web服务器.
  4. 为了用得舒服,需要在GIT服务器上设置webhook,目的是为了push博客更新事件(pull太笨拙了),触发VPS的更新动作(git pull,生成静态网页)

如果这个流程看懂了,并且各个技术环节都比较熟练,后面可以不用看了.

环境

  • 写作环境(自己的电脑)
    • 操作系统 windows
  • VPS环境
    • 操作系统 Ubuntu 16.04 (amd64,kernel 2.6.32)
  • GIT仓库 gitab.com

配置写作环境

  1. 安装nodejs(有windows安装包,过程略)
  2. 安装hexo命令行工具
    1
    npm install hexo-cli -g
  3. 创建hexo项目(此项目是后面需要通过git同步的项目)
    1
    2
    3
    4
    d:
    hexo init my-blog
    cd my-blog
    npm i
  4. 新建一篇文章,试试水
    1
    2
    3
    4
    5
    # 新建的文章位于 source/_post/下,
    # 文件名就是命令行输入的文件名,可以是中文,不过考虑到要部署到VPS(Linux)的需求,还是英文文件名便于命令行操作.
    hexo new "hello hexo"
    # 启动服务,服务器端口会在命令行提示.
    hexo s

写作环境已经搭建好了,hexo项目根路径是d:/my-blog.如果不需要发布到外网就可以收工了.

配置VPS环境

安装nodejs

我在nodejs的版本问题上踩了大坑,因为默认仓库nodejs只更新到4.2.6(2016-01发布),而hexo要求版本(>=6.9.0).这导致后面各种报错.所以有必要先看看软件仓库的nodejs版本号:

1
2
apt update
apt-cache policy nodejs

输出如下:

1
2
3
4
5
6
7
8
nodejs:
Installed: (none)
Candidate: 4.2.6~dfsg-1ubuntu4.1
Version table:
4.2.6~dfsg-1ubuntu4.1 500
500 http://archive.ubuntu.com/ubuntu xenial-updates/universe amd64 Packages
4.2.6~dfsg-1ubuntu4 500
500 http://archive.ubuntu.com/ubuntu xenial/universe amd64 Packages

因此不能直接从apt仓库安装nodejs,我按照nodejs的指引安装了8.x:

1
2
curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
sudo apt-get install -y nodejs

然后使用npm安装hexo命令行工具

1
npm install hexo-cli -g

配置gitlab的ssh访问密钥

这一步是因为我希望非人工的方式和私有git项目同步,这需要身份认证.如果是public项目就不需要了.

  1. 生成密钥对
    1
    2
    # your_email 应该是gitlab账号的email
    ssh-keygen -t rsa -C "your_email" -b 4096
  2. 命令执行后会在当前目录生成一对公私钥,公钥以.pub结尾.为了能够让ssh连接gitlab服务器时选择合适的私钥,需要在~/.ssh/下建立一个config文件,内容格式如下:
    1
    2
    3
    4
    # GitLab.com server
    Host gitlab.com
    RSAAuthentication yes
    IdentityFile 填私钥文件(ssh-keygen生成)的路径
  3. 在gitlab上,有一个添加SSH Key的页面(在个人设置里),将公钥文件(以.pub结尾的那个)里面的内容粘贴进去就好.

具体内容参考gitlab文档

hexo博客自动同步

先把项目拉取下来

1
2
3
mkdir -p ~/my-blog/git
cd ~/my-blog/git
git clone git@gitlab.com:xxx/my-blog.git

测试一下

1
2
3
cd ~/my-blog/git/my-blog
npm i
hexo g

在项目根目录下新建一个脚本文件(deploy.sh),处理git服务端的push事件:

1
2
git pull origin master
hexo g

在项目根目录下新建一个js文件(webhooks.js),监听gitlab的推送事件:

1
2
3
4
5
6
7
8
9
10
var http = require('http')
var exec = require('child_process').exec

http.createServer(function (req, res) {
console.log('[%s] req,url: %s',new Date().toISOString() ,req.url);
if(req.url === '/webhooks/push'){
exec('sh ./deploy.sh')
}
res.end()
}).listen(18080)

在gitlab上配置webhooks(先进入对应项目,然后找到Settings->Integrations)

  • URL填http://[vps的ip或者域名]:18080/webhooks/push
  • Secret Token用不上,随便填一个.
  • Trigger选Push events

测试webhook

1
node ./webhooks.js

在gitlab上配置webhooks的地方,找到刚刚配置好的webhook,点击Test(Push events).如果看见打印日志信息(见webhooks.js)就说明成功了.

为了让webhook服务后台运行,可以使用pm2

配置Nginx

万事俱备,就差一个web服务器了,这里选择Nginx

  1. 安装Nginx

    1
    apt install nginx
  2. 建立配置文件
    在/etc/nginx/conf.d/下新建hexo.conf文件,模版如下

    1
    2
    3
    4
    5
    6
    7
    8
    server {
    listen 80;
    server_name 1.2.3.4;
    location / {
    root ~/my-blog/git/my-blog/public;
    index index.html;
    }
    }
    • server_name 修改为VPS服务器IP或者域名
    • location.root 修改为${hexo项目}/public
  3. 重新加载nginx配置信息

    1
    nginx -s reload

    现在应该可以在公网上访问了.

进一步折腾

CATALOG
  1. 1. 环境
  2. 2. 配置写作环境
  3. 3. 配置VPS环境
    1. 3.1. 安装nodejs
    2. 3.2. 配置gitlab的ssh访问密钥
    3. 3.3. hexo博客自动同步
  4. 4. 配置Nginx
  5. 5. 进一步折腾