搭建 Hexo 博客并使用 Git Hook 自动部署到阿里云

最新闲来无事,折腾了一下 Hexo 博客系统,它是 Node.js 写的,据说速度很快。它的所有操作都可以直接在命令行完成,修改也只需要修改配置文件就可以了,不用上后台各种点击,避免各种麻烦。

Hexo 博客系统架构

首先了解一下 Hexo 博客系统的架构,它是如何实现静态博客通过服务器访问的:

Hexo 博客系统架构

通过上图我们可以知道,整个流程就是在本地通过 hexo g 渲染博客的静态文件,然后通过 hexo d 把静态文件 push 到服务器上我们自己创建的 git 仓库,服务器再通过 git-hooks 同步网站根目录,这样就可以访问了。

搭建 Hexo 博客并使用 Git Hook 自动部署到阿里云整个流程大致可分为两步:

  1. 本地搭建 Hexo;
  2. 服务器环境搭建;

本地搭建 Hexo

如何本地安装 Hexo 系统,官方文档已经很详细了,可移步这里查看;当然网上也有很多文章介绍,可自行谷歌,这里就不再详细叙述;我是按照官网文档进行操作的;

安装 Hexo 需要 NodeJs 和 Git 环境:

Nodejs 安装可以参考我之前写的使用 nvm 安装 nodejs
Mac 系统自带 Git 所以就不需要重新安装了;Windows 系统可以上官网下载安装包进行安装;

另外,还需要在本地生成 SSH 密钥,可参考 Git SSH Key 生成步骤

服务器环境搭建:

服务器环境搭建包括配置 Git 、Nginx 配置 、创建 git 用户;
下面主要说一下配置服务器远程 Git,Nginx 配置看这里

第一步

安装 git:

$ sudo apt-get install git

第二步

创建一个 git 用户,用来运行 git 服务:

$ sudo adduser git

虽说现在的仓库只有我们自己在使用,新建一个 git 用户显得不是很有必要,但是为了安全起见,还是建议使用单独的 git 用户来专门运行 git 服务

第三步

创建证书登录,把自己电脑的公钥,也就是 ~/.ssh/id_rsa.pub 文件里的内容添加到服务器的 /home/git/.ssh/authorized_keys 文件中,如果没有 .ssh/ 目录和 authorized_keys 文件需要新建,添加公钥之后可以防止每次 push 都输入密码。

第四步

初始化 Git 仓库,我是将其放在 /var/repo/blog.git 目录下的:

$ sudo mkdir /var/repo
$ cd /var/repo
$ sudo git init --bare blog.git

使用 --bare 参数,Git 就会创建一个裸仓库,裸仓库没有工作区,我们不会在裸仓库上进行操作,它只为共享而存在。

第五步

配置 git hooks,关于 hooks 的详情内容可以参考这里

我们这里要使用的是 post-receive 的 hook,这个 hook 会在整个 git 操作过程完结以后被运行。
blog.git/hooks 目录下新建一个 post-receive 文件:

$ cd /var/repo/blog.git/hooks
$ vim post-receive

post-receive 文件中写入如下内容:

#!/bin/sh
git --work-tree=/alidata/www/hexo --git-dir=/var/repo/blog.git checkout -f

注意,/alidata/www/hexo 要换成你自己的部署目录,一般可能都是 /var/www/html。上面那句 git 命令可以在我们每次 push 完之后,把部署目录更新到博客的最新生成状态。这样便可以完成达到自动部署的目的了。

不要忘记设置这个文件的可执行权限:

chmod +x post-receive

第六步

改变 blog.git 目录的拥有者为 git 用户:

$ sudo chown -R git:git blog.git

第七步

禁用 git 用户的 shell 登录权限。
出于安全考虑,我们要让 git 用户不能通过 shell 登录。可以编辑 /etc/passwd 来实现,在 /etc/passwd 中找到类似下面的一行:

git:x:1001:1001:,,,:/home/git:/bin/bash

将其改为:

git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell

这样 git 用户可以通过 ssh 正常使用 git,但是无法登录 sehll。

至此,服务器端的配置就完成了。

本地配置

配置你的 hexo 博客可以自动 deploy 到服务器上,再也不用 ftp 上传了。

修改 hexo 目录下的 _config.yml 文件,找到 [deploy] 条目,并修改为:

deploy:
  type: git
  repo: git@example.com:/var/repo/blog.git
  branch: master

要注意将 example.com 换成你自己的服务器地址,以及服务器端 git 仓库的目录;将 example.com 在 Nginx 配置文件中指向你服务器根目录,就可以使用 git@example.com:/var/repo/blog.git 格式的地址了;
本地配置就是如此地简单。至此,我们的 hexo 自动部署已经全部配置好了。

使用

从此以后,要发新博客的步骤不要太简单:

$ hexo new "new-post"
# bla..bla..bla..
$ hexo clean && hexo generate --deploy

有没有很酷很方便,一条命令就可以将博客自动部署到自己的服务器上了,开始快乐地写博客吧。

可能出现的问题

  1. 执行 hexo deploy 后,命令行报错:

    error deployer not found: git

    那是因为你没有安装 hexo-deployer-git,执行 npm install hexo-deployer-git,具体看官方文档吧。

  2. 执行 hexo deploy 后,命令行报错:

    remote: fatal: cannot create directory at '2017': Permission denied

    并且,git hook 并没有执行,或者执行后在你的部署目录 /alidata/www/varcn/ 里并没有推送的文件,出现这个问题可能是你的部署目录 /alidata/www/varcn/ 没有写权限导致的,添加写权限只能就可以了;

    cd /alidata/www/varcn
    chmod go+w varcn

参考:

2 条评论
Leo Xu

你好,我也出现了这个问题
remote: fatal: cannot create directory at '2018': Permission denied
但是我试了把git仓库的地址和网站根目录地址都改成了777权限,仍然不好用。。。

Leo Xu

你好。。。我重新clean,g,d一下就好了。。。。
谢谢你的教程!

发表评论 取消回复
* 昵称
* Email
* 网址
* 评论