1. rsync 优缺点

1.1 优点

  1. 增量备份
  2. 可以镜像保存整个目录树和文件系统。
  3. 可以很容易做到保持原来文件的权限、时间、软硬连接等。
  4. 拥有优化的流程和比较高的文件传输效率。

1.2 缺点

  1. 大量小文件的时候,比对时间较长,有时候,同步过程中,rsync进程可能会停止或者僵死,如果小文件非常多就直接使用压缩包进行传输即可.

  2. 同步大文件的时候会出现中断的,未完成同步前是隐藏文件,可以通过续传(–partail)等参数进行实现续传.

2. 个人服务器端设置

2.1 安装 rsync

要使用 rsync 同步,第一步当然是要安装 rsync 了,键入以下命令来完成 rsync 的安装:

1
sudo apt install rsync

安装成功会显示git的版本号

1
rsync --version

显示

1
rsync  version 3.2.3  protocol version 31

2.2 新建 rsync 用户

    出于安全的原因考虑,我们一般不会使用root来运行同步功能,因此,需要创建一个 rsync 用户来执行同步。

键入以下命令来完成同步用户的创建:

1
sudo adduser rsyncer

创建用户的途中会要求输入用户密码,这个密码请务必记住,切换到这个用户时需要,其它配置使用默认值直接回车就行。

2.3 生成 SSH key

有很多方法生成 SSH key:

  1. 在服务器运行 ssh-keygen

  2. 在git客户端生成,如 SourceTree 、Gitkranken 中都可以生成

生成一个 Key 对,其中一个扩展名是.pub,是公匙。假设分别命名为:id_rsaid_rsa.pub

2.4 把 SSH public Key 加入个人服务器

1
2
3
4
5
6
7
8
su rsyncer  # 要输入密码
cd ~
mkdir www   # 创建同步目录
mkdir .ssh
chmod 700 .ssh
touch .ssh/authorized_keys
chmod 600 .ssh/authorized_keys
vim .ssh/authorized_keys  # 用文本编辑器打开 `id_rsa.pub`,复制所有内容到这个文件里

注意:.ssh的权限必须是700,authorized_keys的权限必须是600

2.5 修改 SSH 默认配置

以下内容一般不用修改,如果同步有问题再来修改。

1
vim /etc/ssh/sshd_config

打开一下三项配置前的注释,若没有则在最后添加

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

修改保存后重启sshd服务

1
systemctl restart sshd.service

3. github仓库设置

3.1. 设置Git仓库

打开仓库设置,按下图把相关设置加入 secrets,

Github仓库设置

其中“私匙”是上面那个id_rsa文件,用文本编辑器打开复制所有内容。

3.2 修改自动化 Actions 脚本

把以下内容加入脚本:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
    - name: webfactory/ssh-agent
      uses: webfactory/ssh-agent@v0.7.0
      with:
        ssh-private-key: ${{ secrets.HONGKONG_PRIVATE_KEY }}

    - name: Publish hexo to remote host
      # `rsync`命令实现增量同步, --delete参数表示会删除远程文件夹中本地不存在的文件
      # -a是复合参数, 可复制本地文件的全部属性至远程, -v会显示具体同步的文件信息
      # 如果首次运行可添加-n参数, 即-anv, 可显示同步的文件信息但不实际操作
      # exclude中的文件夹路径是相对于本地同步文件夹而言, 即".deploy_git/.git"
      run: |
        rsync -av -e "ssh -o StrictHostKeyChecking=no" --delete --exclude={'.git/','.github/'} public/ ${{ secrets.HONGKONG_USERNAME }}@${{ secrets.HONGKONG_SERVER_IP }}:${{ secrets.HONGKONG_WWW_PATH }}

特别注意:ssh -o StrictHostKeyChecking=no 不能少,否则连不上个人服务器,当时就是被这个折腾了好久 :(: ,具体解释在这:SSH 协议的 ssh StrictHostKeyChecking