hexo使用rsync部署填坑之路

1,034 阅读4分钟

hexo 可快速上手做出自己的博客网站,部署方式 也非常多。在部署到github的时候基本不会遇到什么问题,但是当选择使用rsync部署到阿里云ECS的时候,windows下部署的坑就一个个的出现了。

遇到的问题

首先看下官方的部署教程, 只有下面一小段内容: 安装 hexo-deployer-rsync$ npm install hexo-deployer-rsync --save

修改配置

deploy:
  type: rsync
  host: <host>
  user<user>
  root: <root>
  port: [port]
  delete: [true|false]
  verbose: [true|false]
  ignore_errors: [true|false]

rsync不存在的报错

直接运行 hexo d 之后就会报错了,有可能在powershell上面是乱码,git bash运行后出现以下报错:

INFO  Validating config
INFO  Deploying: rsync
'rsync' is not recognized as an internal or external command,
operable program or batch file.

windows默认没安装rsync,查找之后要安装cwrsync。然后去官网下载多个版本后出现了各种其他问题,这里我用5.5.0版本完成了后续操作。

下载之后进行了如下操作:

首先,下载的软件包解压到想放的位置,然后双击 cwrsync.cmd 开始安装,正常则会生成 home 目录,但是我这边没有生成(截图中是我后手动添加的)。

rsync1.png

ok,先没管 home 目录,先将 bin 目录添加到环境变量,以便访问到 rsync.exe 文件。之后再来 hexo d 一次。好,出现了如下报错:

INFO  Validating config
INFO  Deploying: rsync
Could not create directory '/home/lazy5/.ssh'.
Host key verification failed.
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(226) [sender=3.1.2]

上面报错那意思没找到ssh密钥存储的目录,奇怪的是我这边用户根目录下有.ssh目录,且服务器上也添加了对应公钥。而且这个目录很奇怪,/home这种目录应该指的linux下的目录结构吧。几番研究发现,这个版本的rsync调用的ssh并不是我们安装的,而是cwrsync的bin目录下的ssh.exe,那意思就是这个密钥目录可能不是指向用户目录的,而是cwrsync的安装目录。于是,在安装目录我新建了 /home/lazy5/.ssh 目录。

同时双击 bin 目录下的 ssh-keygen.exe 文件,之后一路回车,则在 /home/lazy5/.ssh 目录下生成密钥对,目录如下:

rsync4.png

将生成的公钥添加到服务器对应用户的 authorized_keys 中,然后再部署一次试试。还是失败了,查看下面的 无权限报错

无权限报错

首先出现的是如下权限过高的问题:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

Permissions 0770 for '/home/lazy5/.ssh/id_rsa' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "/home/lazy5/.ssh/id_rsa": bad permissions
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

因此,我删除了 /home/lazy5/.ssh/id_rsa 除了所有者 lazy5 以外的权限。

rsync5.png

以上设置之后,权限过高的问题就没有了。理论上这样部署就没有了,但是在实际操作中还遇到了其他权限问题,具体截图没有了,列举如下:

1. deploy 配置使用的是 root ,导致访问被拒绝。这里建议新建一个用户用户rsync的操作,同时建议和本地windows电脑用户名一致,我这里是 lazy5,服务器上也新建了一个一样的用户名。

2. 部署报建立文件夹没权限的问题:由于新建的 lazy5 不在 root 组,而部署的目录属于 root 用户,chown 将目录权限改到 lazy5, 同时也可以把 lazy5 加到 root 组。

3. 服务器访问拒绝的其他权限问题:服务器ssh未开启公钥登录的方式,修改配置文件。

    1. vim /etc/ssh/sshd_config

    2. 增加如下配置:

PubkeyAuthentication yes
PermitRootLogin yes
PasswordAuthentication no
RSAAuthentication yes

    3. 重新加载,systemctl restart sshd

成功上传之后域名访问403

一切大功告成,访问网站出现了403,估计是权限的问题了。查看hexo目录下的文件权限如下:

rsync2.png

chmod 777 hexo -R 之后可以正常访问,但是每次部署后都需要登录服务器修改权限,这种方式肯定是不行的。那rsync为什么要改权限呢,依据是什么?前面说到了部署到服务器的文件是lazy5权限,那是不是文件访问的权限是不是也是直接用了本地文件权限。

查看本地项目目录属性,权限中没有 Everyone,因此添加上去再说。

rsync.png

重新部署后,终于权限正常了!

rsync3.png

后语

以上就是 hexo 中使用 rsync 遇到坑的大致记录,其中由于填坑过程遗漏了很多记录,所以不一定全面,后续有再遇到会继续补充。另外由于坑太多,感觉这里直接 pm2 部署,在服务器上再 hexo generate 生成,估计也能达到一样的效果,后续可尝试并记录下。