rsyncを使ってネットワーク経由でバックアップ

rsyncでバックアップcronを設定しました。
今後、Linuxサーバを立ち上げるたびに設定すると思うので、備忘録として残しておきます。

# rsyncとは

UNIXシステムにおいて、ディレクトリの同期やバックアップを行うためのコマンドです。ネットワーク経由でバックアップできるため、別のPCにバックアップを集約することができます。
バックアップ先に、rsyncdが動作している必要があります。
私はSynology製のNASを立ち上げていて、rsyncサービスに対応しているため、それを使おうと思います。

以降の説明では、バックアップ先ホスト名を「synology.test.com」、バックアップ元ホスト名を「origin.test.com」としています。

# バックアップ先にsshでログインできるようにする

バックアップ処理をcron化するためには、以下の条件を満たしておく必要があります。

・バックアップ先が公開鍵でsshログインを受け付けること
・公開鍵でパスフレーズなしでバックアップ先にsshログインできること
・設定情報でバックアップ先にsshログインできること

## バックアップ先が公開鍵でsshログインを受け付けること

バックアップ先での設定です。

以下を参考にさせていただきました。
　[Synology DiskStation で SSH 接続を公開鍵認証方式にする](https://qiita.com/shimizumasaru/items/56474d98e723ea1b5ae3)

(まだ設定していない場合、)sshdの設定を変更し、公開鍵でsshログインできるようにsshdを設定しておく必要があります。

/etc/ssh/sshd_config において、以下の部分のコメントをはずします。

```
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile  .ssh/authorized_keys
```

sshdを再起動します。（以下はSynology特有です）

<pre>
> synoservicectl --reload sshd
</pre>

## 公開鍵でパスフレーズなしでバックアップ先にsshログインできること

バックアップ元での作業です。

cron化したときに、毎回公開鍵のパスフレーズが聞かれてしまうとcron化できないので、パスフレーズなしの公開鍵ペアを作成します。

<pre>
> cd ~/.ssh
> ssh-keygen -t rsa -f id_rsa_synology
</pre>

このとき、パスフレーズが聞かれますが、何も指定せず、Enterのみを入力してください。
これで、id_rsa_synologyとid_rsa_synolog.pubの2つのファイル(公開鍵ペア)ができました。ファイルのパーミッションが、それぞれ、600、644となっていることを確認してください。.sshフォルダ自体は700です。

次に、id_rsa_synology.pubの内容をそのまま、バックアップ先の以下のファイルに追記します。

　~/.ssh/authorized_keys

それでは、SSHで公開鍵ログインできることを確認しておきます。パスワード無しでログインできるかと思います。

<pre>
> ssh -i ~/.ssh/id_rsa_synology synology.test.com
</pre>

## 設定情報でバックアップ先にsshログインできること

バックアップ元で作業します。

sshのconfigファイルを使うと、ログイン時に利用する公開鍵ファイルやポート番号などの接続情報を定義しておくことができます。
以下を参考にさせていただきました。
　[.ssh/configファイルでSSH接続を管理する](https://qiita.com/0084ken/items/2e4e9ae44ec5e01328f1)

~/.ssh/configに以下を追記します。

```
Host synology_backup
        HostName synology.test.com
        User hogehoge
        IdentityFile /home/XXXXX/.ssh/id_rsa_synology
```

今度は、以下でログインできるようになります。

<pre>
> ssh synology_backup
</pre>

# バックアップ先にバックアップフォルダを作成する

バックアップ先での作業です。

バックアップファイルが保存されるフォルダを作成します。
バックアップ先へのログインユーザは、バックアップ元で ~/.ssh/configに指定したユーザ(hogehoge)とします。

<pre>
> mkdir ~/rsync_data
</pre>

フォルダ名は自由です。

# バックアップスクリプトを作成する

バックアップ元での作業です。

バックアップを実行するシェルスクリプトを作成します。

rsyncコマンドのパラメータは、以下を参考にさせていただきました。
　https://hackers-high.com/linux/rsync-backup-part2/

```sh:~/projects/cron/do_backup.sh
#!/bin/bash

NOW=`date +%Y%m%d-%H%M%S`
LOCALHOST_NAME='origin'
LOCAL_DIR='/home/XXXXX/projects'
TARGET_HOST='synology_backup'
TARGET_DIR="/var/services/homes/hogehoge/rsync_data/${LOCALHOST_NAME}"
TARGET_BACKUP="../${LOCALHOST_NAME}_backup/${NOW}"

rsync -az --delete --backup --backup-dir='"'${TARGET_BACKUP}'"' ${LOCAL_DIR} ${TARGET_HOST}:${TARGET_DIR}
```

変数化していますので、バックアップしたいフォルダ、バックアップ先のフォルダ等を変更してください。

LOCALHOST_NAME：バックアップ先にこのファルダ名で作成されます。複数のバックアップ元から作成されたときに重複しないようにするためです。
LOCAL_DIR：バックアップしたいバックアップ元のフォルダです。
TARGET_HOST：~/.ssh/configに指定した名前です。
TARGET_DIR：バックアップ先のフォルダ名です。
TARGET_BACKUP：これもバックアップ先のフォルダ名なのですが、これはファイルの削除履歴を保持するためのフォルダになります。

一度実行してみましょう。

<pre>
> sh ~/projects/cron/do_backup.sh
</pre>

バックアップ先のフォルダにバックアップされましたでしょうか？
成功していたら、以下のように、実行権限を与えておきましょう。

<pre>
> chmod u+x ~/projects/cron/do_backup.sh
</pre>

# cron化する

バックアップ元での作業です。

それでは定期実行するために、cron化していきましょう。
以下を実行し、

<pre>
> crontab -e
</pre>

最後の行に追記します。

```
0 2 * * * /home/XXXXX/projects/cron/do_backup.sh
```

上記は、毎日2時にシェルスクリプトを実行するようにしています。
これで完成です。

以上