Archのrsyncで転送できないときに確認すること

Intro

celpa.conao3.comは私が契約している100GBの「さくらのレンタルサーバー」を向いているのだけど、その公開ディレクトリにGitHub Actionsからrsyncでデプロイしたい。

もちろん、GitHubのワーカーに秘密鍵をアップロードすることになるので、その秘密鍵は上手い具合に制限を設ける必要があります。

ローカルで試していたとき上手くいかなかったので、そのメモ。

普通のrsync

rsyncは接続先のサーバーにrsyncを起動して、そのプロセスと通信します。

どんなコマンドが実行されているかは -vvv オプションを付けることで表示されます。

$ rsync -vvv -an README.md conao3@conao3.sakura.ne.jp:/home/conao3/
opening connection using: ssh -l conao3 conao3.sakura.ne.jp rsync --server -vvvnlogDtpre.iLsfxC . /home/conao3/  (9 args)
sending incremental file list
[sender] make_file(README.md,*,0)
...

sent 60 bytes  received 368 bytes  285.33 bytes/sec
total size is 15,379  speedup is 35.93 (DRY RUN)
[sender] _exit_cleanup(code=0, file=main.c, line=1189): about to call exit(0) (DRY RUN)

opening connection using の行の rsync 以降が接続先で実行されているコマンドです。

そのため、そのコマンドだけ実行できる鍵を登録するには以下のように authorized_keys に登録します。 (-vvv はいらないので削る)

command="rsync --server -nlogDtpre.iLsfxC . /home/conao3/",no-port-forwarding,no-X11-forwarding,no-agent-forwarding ssh-rsa AAAA...

rsyncdを使ったrsync

鍵の作成

rsync用の鍵を新しく作る。 GitHub Actionsのsshが古く、Openssh形式の秘密鍵が読めなかったのでPEM形式で出力するようにオプションを付けた。

鍵の名前は sakura-rsync_rsa と入力した。

cd .ssh
ssh-keygen -t rsa -b 4096 -m PEM -C ""

鍵の登録

ファイルをやりとりしたいサーバーにログインし、 authorized_keys に公開鍵 sakura-rsync_rsa.pub を登録する。

command="rsync --server --daemon --config=/home/conao3/.rsyncd.conf .",no-port-forwarding,no-X11-forwarding,no-agent-forwarding ssh-rsa AAAA...

rsyncd.confの作成

私が使っているのは共有サーバーなので、当然、ユーザーホーム以下しか触れない。 そのため rsyncd.conf~/.rsyncd.conf に作成することにしました。

use chroot = no
read only = yes

[www]
  read only = no
  write only = yes
  path = /home/conao3/www

[cache]
  path = /home/conao3/www/files/cache-40bbae27

使ってみる

なぜかファイル転送されない。。。

$ rsync -vvv -e "ssh -i sakura-rsync_rsa" /home/conao/dev/template/elisp conao3@conao3.sakura.ne.jp::foo/
opening connection using: ssh -i sakura-rsync_rsa -l conao3 conao3.sakura.ne.jp rsync --server --daemon .  (10 args)
sending daemon args: --server -vvve.LsfxC . foo/  (4 args)
skipping directory elisp
send_file_list done
send_files starting
send_files phase=1
send_files phase=2
send files finished
total: matches=0  hash_hits=0  false_alarms=0 data=0

sent 16 bytes  received 11 bytes  18.00 bytes/sec
total size is 0  speedup is 0.00
[sender] _exit_cleanup(code=0, file=main.c, line=1189): about to call exit(0)

-a オプションを付けると転送された。

$ rsync -a -vvv -e "ssh -i sakura-rsync_rsa" /home/conao/dev/template/elisp conao3@conao3.sakura.ne.jp::foo
opening connection using: ssh -i sakura-rsync_rsa -l conao3 conao3.sakura.ne.jp rsync --server --daemon .  (10 args)
sending daemon args: --server -vvvlogDtpre.iLsfxC . foo/  (4 args)
sending incremental file list
[sender] make_file(elisp,*,0)
send_file_list done
[sender] pushing local filters for /home/conao/dev/template/elisp/
[sender] make_file(elisp/README.org,*,2)
[sender] make_file(elisp/Makefile,*,2)
[sender] make_file(elisp/elisp-template.el,*,2)
[sender] make_file(elisp/.github,*,2)
[sender] make_file(elisp/elisp-template-tests.el,*,2)
[sender] make_file(elisp/git-hooks,*,2)
[sender] make_file(elisp/.gitignore,*,2)
[sender] make_file(elisp/LICENSE,*,2)
[sender] make_file(elisp/Cask,*,2)
send_files starting

GitHub Actionsから使う

こんなファイルを .github/workflows/test.yml に保存すればできる。

GitHub ActionsでSSHを使う - Qiita」で紹介されていた shimataro/ssh-key-action を使わせてもらいました。

name: Main workflow
on:
  push:
    branches:
      - master
  pull_request:
    branches:
      - master

jobs:
  build:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        emacs_version:
          - '26.3'
    steps:
      - uses: actions/checkout@v1
      - uses: actions/setup-python@v1.1.1
      - uses: purcell/setup-emacs@master
        with:
          version: ${{ matrix.emacs_version }}
      - uses: conao3/setup-cask@master
      - name: Install SSH key
        uses: shimataro/ssh-key-action@v1
        with:
          private-key: ${{ secrets.SSH_KEY }}
          public-key: ${{ secrets.SSH_KEY_PUBLIC }}
          known-hosts: ${{ secrets.KNOWN_HOSTS }}

      - name: Cache fetch
        run: |
          rsync -av --progress -e 'ssh' conao3@conao3.sakura.ne.jp::cache/celpa.tar.gz /tmp/
          rm -rf working
          tar xf /tmp/celpa.tar.gz

      - name: Build
        run: |
          make

      - name: Deploy
        run: |
          rsync -av -e 'ssh' --delete --exclude=working ./ conao3@conao3.sakura.ne.jp::www/celpa/

      - name: Cache push
        run: |
          rm /tmp/celpa.tar.gz
          tar czf /tmp/celpa.tar.gz working
          rsync -av --progress -e 'ssh' /tmp/celpa.tar.gz conao3@conao3.sakura.ne.jp::cache/

まとめ

rsyncを使ってサイトをGitHub Actionsからデプロイできるようになりました。

参考