0%

利用git将本地Hexo生成的博客部署到服务器

hexo 简介

Hexo 是一个快速、简洁且高效的博客框架。Hexo 使用 Markdown(或其他渲染引擎)解析文章,在几秒内,即可利用靓丽的主题生成静态网页。 由于Hexo最终会生成静态页面,所以在部署的时候我们只需要将静态页面上传到服务器即可。结合git我们就可以实现一键自动部署。下面将介绍如何配置。

服务器准备工作

安装 git

在服务器上安装 git 工具

1
yum install git

新建 git 用户

在服务器上新建 git 用户(当然也可以是其他名字)

1
useradd -d /home/git -m git

这个命令会新建一个用户,并创建 /home/git/ 目录做为这个用户的目录,同时创建一个与用户名相同的组。

配置 SSH 免密访问

在本地的电脑上(也就是你写博客的电脑上),进入 ~/.ssh/ 目录(如果没有就创建一个),执行:

1
ssh-keygen -t rsa

一路回车,会在 ~/.ssh/ 目录下生成 id_rsaid_rsa.pub 两个文件。把 id_rsa.pub 文件传到服务器的 git 用户目录下。

1
scp .ssh/id_rsa.pub git@<your-ip>:.

使用 git 用户登录服务器,执行:

1
2
mkdir -p ~/.ssh
cat id_rsa.pub >> ~/.ssh/authorized_keys

到此客户端机器就可以免密登录到服务器了。
如果出现不能登录的情况,可能是文件权限有问题,在服务器上做如下修改:

1
2
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

在服务器上 ~/.ssh/ 目录必须要在 git 用户下创建。

服务器配置

在服务器上创建仓库

使用 git 用户登录服务器,执行:

1
2
3
4
cd ~
mkdir blog.git
cd blog.git
git init --bare

配置 Git Hook

假设 web 目录为 /var/www/,博客放在 blog 子目录中。
使用 root 用户登录服务器,进入 /var/www/ 目录,并创建 blog 子目录,此时 git 用户没有该这个目录的写权限。用 ls -l 查看权限,blog 目录属于 root 用户:

1
drwxr-xr-x  2 root root 4096 10月 27 00:19 blog

这个目录要给 git 用户访问,blog.git 仓库收到提交后,git 用户要把提交的内容再 checkout/var/www/blog/ 目录。因为 root 用户创建的这个目录 git 用户没有写权限,所以要把这个目录的所有权交给 git 用户:

1
chown git:git blog

再用 ls -l 查看:

1
drwxr-xr-x  2 git git 4096 10月 27 00:19 blog

切换到 git 用户执行:

1
2
cd ~
git clone blog.git /var/www/blog

最后一步,处理 blog.git 提交的事件,自动更新内容到 blog 目录。在 git 用户下执行:

1
2
3
4
5
6
7
cd ~/blog.git/hooks
touch post-receive
cat > post-receive << EOF
> #!/bin/bash -l
> unset GIT_DIR
> cd /var/www/blog && git pull
> EOF

给脚本加上执行权限:

1
chmod +x post-receive

配置本地 Hexo 的部署信息

打开 _config.yml 文件,找到 deploy 字段,修改如下:

1
2
3
4
5
deploy: 
type: git
message: update
repository: git@<your-ip>:blog.git
branch: master

如果出于安全或其它原因考虑,你修改了 SSH 默认的端口,那么上面 repository 的配置要做如下修改:

1
repository: ssh://git@<your-ip>:<your-port>/~/blog.git

执行以下命令部署:

1
hexo d

如果出现以下错误:

1
ERROR Deployer not found: git

是因为你还没有安装部署工具。Hexo 3.0 开始,部署工具需要单独安装:

1
npm install hexo-deployer-git --save

测试

当我们完成一篇文章的编辑后, 可以直接执行:

1
hexo g -d

将最新的博客部署到服务器上。