hexo通过git自动部署到vps

本文环境:
vps:centos 7 64位
本地: windows 10 32位

本地安装并配置git

  • 安装git

  • 创建SSH Key

在git bash中运行

1
2
ssh-keygen -t rsa -C "mcosx@example.com"   //注意替换邮箱
//ssh-keygen -t rsa -b 4096 -C "your_email@example.com" 使用这个会出错(2015-12-28)

生成id_rsaid_rsa.pub或你自己命名的两个文件

  • 配置ssh key

因为我将vps的ssh端口更改了,所以此处多一步
.ssh目录config文件中增加以下配置

1
2
3
4
5
Host 00.00.00.00  //替换主机ip
HostName 00.00.00.00
port 56734 //替换端口号
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa //替换id_rsa文件名

据说也可以更改git地址为 ssh://git@00.00.00.00:56734/home/git/hexo.git类似这样的(未测试)

vps上git配置

  • 安装git
1
yum install -y git
  • 创建git用户
1
2
useradd git   // 或 adduser git
passwd git //修改密码
  • git服务器打开RSA认证

在Git服务器上需要将/etc/ssh/sshd_config中的RSA认证打开,即

1
2
3
#RSAAuthentication yes
#PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

然后将本地生成的公钥文件id_rsa.pub内容复制入/home/git/.ssh/authorized_keys文件中

  • 禁用git用户的shell登陆

出于安全考虑,新创建的git用户不允许登陆shell,这可以通过编辑/etc/passwd文件完成。
将类似

1
git:x:1003:1003:,,,:/home/git:/bin/bash

这样的代码替换为

1
git:x:1003:1003:,,,:/home/git:/usr/bin/git-shell

这样,git用户可以正常通过ssh使用git,但无法登录shell,因为我们为git用户指定的git-shell每次一登录就自动退出。

在vps上部署hexo自动发布

  • vps上初始化git仓库
1
2
3
4
cd /home  //注意,我开始试着用/root目录,出现错误,应该是git用户权限的问题
//刚发现原来/etc/passwd/中git用户的目录对应着/home/git
git init --bare hexo.git //初始化
chown -R git:git hexo.git //更改用户和用户组
  • vps配置hexo自动发布

我们上一步建立的git仓库(相当于git服务器)位于/home/git/hexo.git,而vps上我设置的web对应目录为/home/wwwroot/blog.mcosx.cn,所以要再设置个git(相当于客户端)从git仓库中clone到对应的web目录.并且要让这一步骤自动进行可以通过git hook中的post-receive。
通过执行vim /home/git/hexo.git/hooks/post-receive新建文件并添加以下代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash -l

#PUBLIC_WWW=/data/wwwroot/mcosx_hexo
#cd $PUBLIC_WWW
#env -i git reset --hard
#env -i git pull

#GIT_REPO=/home/git/mcosx_hexo.git
#TMP_GIT_CLONE=/tmp/blog
#PUBLIC_WWW=/data/wwwroot/mcosx_hexo
#rm -rf ${TMP_GIT_CLONE}
#git clone $GIT_REPO $TMP_GIT_CLONE
#rm -rf ${PUBLIC_WWW}/*
#cp -rf ${TMP_GIT_CLONE}/* ${PUBLIC_WWW}

git --work-tree=/data/wwwroot/mcosx_hexo --git-dir=/home/git/mcosx_hexo.git checkout -f

然后运行

1
2
3
4
5
6
7
chmod +x /home/git/hexo.git/hooks/post-receive
rm -fr /home/wwwroot/blog.mcosx.cn #删除web文件夹,需要的话请提前备份
git clone /home/git/hexo.git /home/wwwroot/blog.mcosx.cn
chown -R git:git /home/wwwroot/blog.mcosx.cn #增加权限
cd /home/wwwroot/blog.mcosx.cn
git config user.name "mcosx"
git config user.email "mcosx@example.com"
  • hexo本地配置

然后在本地站点hexo中添加

1
2
3
4
5
deploy:
- type: git
message:
repo:
server: git@00.00.00.00:/home/git/hexo.git,master ##替换服务器地址

其他

  • 权限问题

本文执行git操作的为git用户,所以上传的文件只能做git用户权限类的事。例如本文中就只能解析静态网页,因为git用户没有php的访问权限。
如果需要解析php动态页面,可以通过修改php-fpm的配置文件www.conf,让`user = git`,甚至还可以修改nginx的nginx.conf文件,让user为git:git,使它成为nginx的操作用户。

遇到的问题

  • ./post-receive文件执行错误
1
2
[root@localhost hooks]# ./post-receive
bash: ./post-receive: /bin/bash^M: bad interpreter: No such file or directory

原来是文件格式问题,dos自动给行尾加^M,要将文件格式转为unix。
vim可以这样:set fileformat=unix,
通过cat -v <文件名>可以查看是否有^M.

2015-12-28 更新

  • git连接问题
    可以用ssh -v git@00.00.00.00测试并判断错误出处

  • remote: fatal: Not a git repository: ‘.’
    检查hooks文件

  • 目标文件夹空
    post-receive必须接受到更新才会触发,没有更改不会执行

参考

http://huifeng.me/2015/08/16/deploy-hexo-to-vps/
https://isudox.com/2015/09/03/hexo-your-blog/
http://blog.csdn.net/u012345283/article/details/42970991