Hexo Rsync Deploy

Posted by Allen on 2014-11-25
Coding

上周末刚买了 Linode 的 VPS,打算把自己和朋友的几个小站部署上去。之前准备折腾下 Ghost,但是在 mbp 本地部署的时候报错,而且因为是基于 nodejs 的 webserver,还要配置 nginx 反向代理,所以先搁置下。系统干干净净地装了 Apache,allenkung.com 和另外几个「此域名出售」的静态站反正一百年不更新挂着了事。

剩下 blog 部分,blog.allenkung.com 是利用 hexo 部署在 github 上的,hexo 的 git deploy 机制很好用。但是小迟同学的 cakepoet.com 我计划尝试下使用 hexo 的 Rsync deploy 机制来部署。

Rsync是linux/Unix文件同步和传送工具。用于替代rcp的一个工具,rsync可以通过rsh或ssh使用,也能以daemon模式去运行,在以daemon方式运行时rsync server会开一个873端口,等待客户端去连接。连接时,rsync server会检查口令是否相符,若通过口令查核,则可以通过进行文件传输,第一次连通完成时,会把整份文件传输一次,以后则就只需进行增量备份.

于是跟 alex 讨教了下 Rsync 的部署,在 VPS 上试验了一下:

Step 2. 开启 Rsync 服务,将 /etc/default/rsync 文件中的:

1
RSYNC_ENABLE = true

Step 2. 建立一个 conf 文件,文件内容参考这篇《rsync命令详解》:

1
$ sudo nano /etc/rsyncd.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
[confname]						//自定义模块名称
path = /usr/local/nginx/conf //用来指定要备份的目录
comment = Nginx conf
ignore errors //可以忽略一些IO错误
read only = no //设置 no,客户端可以上传文件,yes是只读
write only = no //no 为客户端可以下载,yes 不能下载
hosts allow = 192.168.2.0/24 //可以连接的 IP
hosts deny = * //禁止连接的 IP
list = false //客户请求时,使用模块列表
uid = root
gid = root
auth users = username //连接用户名,和 linux 系统用户名无关系
secrets file = /etc/rsyncd.pass //验证密码文件

Step 3. 建立并编辑验证密码文件 rsyncd.pass,文件内容如下:

1
username:password

Step 4. 更改 /etc/rsyncd.pass 文件权限 600

1
$ sudo chown 600 /etc/rsyncd.pass

至此,准备工作都做完了。我们测试一下吧:

1
$ rsync -av /databack [email protected]::confname

拷贝本地机器文件到远程 rsync 服务器(daemon 形式运行 rsync)中。当DST路径信息包含”::”分隔符时启动该模式。

发现已经成功啦!那么回到此文的话题,在 hexo 中配置 rsync,编辑 _config.yml

1
2
3
4
5
6
7
8
9
deploy:
type: rsync
host: <host>
user: <user>
root: <root>
port: [port]
delete: [true|false]
verbose: [true|false]
ignore_errors: [true|false]

其中 rootport 两项比较困惑,先大致填一下,然后 $ hexo d 一下发现会报错:

1
Permission denied

于是开始漫长地 check 帖子之旅,找到最接近的情况是这个帖子,但是 hexo 作者表示已经修复并且 close 掉了这个 issue。

于是开始扒 hexo 的 code,首先是要找 hexo 的安装目录:

1
2
$ npm root -g
/usr/local/lib/node_modules

然后在node_modules/hexo/lib/plugins/deployer/rsync.js 找到这个文件,仔细的朋友会发现跟之前提到的时候作者修复 rsync bug 时候比,现在的文件目录是把 rsync 当成一个 plugin 来处理了,可见 hexo 也一直在进步中。

进一步扒代码找到相关的逻辑:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var params = [
args.delete === true ? '--delete' : '',
args.verbose === true ? '-v' : '',
args.ignore_errors === true ? '--ignore-errors' : '',
'-az',
'public/',
'-e',
'ssh -p ' + args.port,
args.user + '@' + args.host + ':' + args.root
].filter(function(arg){
return arg;
});
run('rsync', params, function(code){
callback(code ? 'Deploy failed: rsync (code ' + code + ')' : null);
});

可以看到 hexo 的 rsync deploy 模式是通过 ssh 的模式,貌似不能通过 daemon 模式去运行(有个很明显的好处就是不用通过系统用户去管理使用者的帐号密码,而可以通过 /etc/rsyncd.pass 文件来管理)。

目前还没有找到解决方案,我去研究下。


Comments: