さくらのVPSに無料の外部自動バックアップ機能を追加する方法

#環境と概要
 - さくらのVPS
 - CentOS 7.4
 - SELinux無効

イメージバックアップツールで丸ごとバックアップ → マウントしたオンラインストレージに保存。
という疑似自動バックアップ機能構築のお話

さくらのVPSにはバックアップ機能がないため、もしもの場合に備えて外部への自動バックアップ機能を追加する
保存先をさくらインターネット外部（オンラインストレージ）にしたのは、さくら側の障害（[事例1](https://qiita.com/GachiNyanNyan/items/627a22f32b93f0e58912),[事例2](https://dame3212.net/2015/12356.html),[事例3](https://megalodon.jp/2019-1225-1156-39/https://qiita.com:443/unico/items/76499d1e20042d929aa1)）によるデータ損失を防ぐため。

> **「さくらのVPS」でバックアップの機能はありますか**
> 
> いいえ、「さくらのVPS」は、標準・オプション共に、バックアップの機能はございません。
> 同一ゾーンであれば複数台構成でのご利用が可能でございますため、他のサーバとデータを同期する、
重要なデータはローカル環境に保存するなど、ご対応ください。

##機能要件
- 定期的なバックアップ（毎日・3世代）
- 保存先は外部ストレージ
- 稼働サービスへの影響を最小限に留める（ネットワーク帯域のみ、その他は`rcon`で）
- 追加費用不要

##使用ソフト・サービスと役割
 - [Mondo Rescue](http://www.mondorescue.org/) - イメージバックアップ
 - [davfs2](http://savannah.nongnu.org/projects/davfs2) - WebDAVのマウント
 - [TeraCLOUD](https://teracloud.jp/ja/) - バックアップ保存先

##TeraCLOUDについて
外部保存先オンラインストレージとして[TeraCLOUD](https://teracloud.jp/ja/support_service.html)を使用

###TeraCLOUDの選択理由
 - 無料で15GBまで使用可※
 - WebDAVが使用可
 - 共有機能が使用不可（人為的ミス防止）
 - Oracle Solaris 11で堅牢
 - ZFS RAID-Z3（RAID6）で保全性が高い
 - 速度が安定
 - 帯域制限（10Mbps）がある（ネットワーク帯域専有防止）

※3世代ぐらいであれば十分

#外部保存先のセットアップ
アカウント作成は下記参照。下記の手順通りで無料容量が10GB→15GBになる（[今月10日までは更に5GB追加](https://teracloud.jp/ja/campaign_201709.html)）
[速くてシンプルな国産オンラインストレージ「TeraCLOUD」 | ハルパス](https://blog.halpas.com/archives/6428)

アカウント準備後、[マイページ（要ログイン）](https://teracloud.jp/ja/modules/mypage/usage/)の`WebDAV接続URL`（例：https://futtsu.teracloud.jp/dav/ ）をメモ

##さくらのVPSにマウント
davfs2のセットアップ

```:インストール
yum -y install davfs2
```

```:仮想保存先作成
mkdir /backup
```

```:マウント
mount -t davfs https://futtsu.teracloud.jp/dav/ /backup
  Username:    #TeraCLOUDユーザ名
  Password:    #TeraCLOUDパスワード
```

```:マウント確認
df -h
https://futtsu.teracloud.jp/dav/    26G   13G   13G   50% /backup
```

※認証が面倒であれば`/etc/davfs2/secrets`に書いておくとスキップ可（セキュリティ的には非推奨）

```
vi  /etc/davfs2/secrets

https://futtsu.teracloud.jp/dav/ ユーザ名 パスワード
```

#バックアップ機能のセットアップ
Mondo Rescueのセットアップ

```:インストール
cd /etc/yum.repos.d/
wget http://www.mondorescue.org/ftp/centos/7/x86_64/mondorescue.repo
yum -y install mondo lzop
```

【CentOS7限定】エラー事前対策

```mindi.conf
vi /etc/mindi/mindi.conf

EXTRA_SPACE=240000 #追記
BOOT_SIZE=100000 #追記
```

##バックアップスクリプト
スクリプトの作成

```:自動化スクリプト
vi /etc/cron.daily/auto_backup.sh
```

次のシェルをコピペ

```auto_backup.sh
#!/bin/bash
today=$(date +%Y%m%d)

#Backup_日付.isoのファイル名でバックアップ
mondoarchive -O -i -N -L -s16g -E"/backup" -d /var/tmp -p Backup_${today}
#バックアップイメージを移動
mv /var/tmp/Backup_${today}-1.iso /backup
#古いバックアップイメージを削除
find /backup -type f -mtime +4 -exec rm -f {} \;
```

| オプション | 意味 |
|:-:|:-:|
| -O  | バックアップ  |
| -V  | ベリファイを実行  |
| -i  | ISOファイルとして出力 |
| -*num*  | 圧縮レベル※ |
| -L  | lzo圧縮を使用（高速化） |
| -N  | ローカルファイルのみバックアップ |
| -s  | 最大サイズ（指定なしの場合、）  |
| -E  | 除外するディレクトリ （パイプ区切り）|
| -d  | 出力先ディレクトリ |
| -p  | 出力ファイル名  |

実行権限を付与

```
chmod 755 /etc/cron.daily/auto_backup.sh
```

**～以上～**

##圧縮レベルについて
`0`～`9`で大きいほど高圧縮。指定なしの場合は`3`

```:サイズと速度関係
最大(9)：2.7GB - 16分31秒
標準(3)：3.0GB - 2分30秒
無圧縮 ：4.6GB - 2分3秒
```
##I/O、CPU負荷対策について（※追記 2018/5/20）
`rcon`を使えばリソース制限が可
[コマンド実行時のCPUやIOリソースを簡単に制御するツールrconを作った - 人間とウェブの未来](http://hb.matsumoto-r.jp/entry/2015/12/02/133448)

差分バックアップ（`-D`）でも良いが、3世代しか保持しないので親が消えて復元不可になる（未検証）

#復元
バックアップメディアとして出力しているため、そのままブート可
ISOを[カスタムOSインストール機能](https://help.sakura.ad.jp/hc/ja/articles/206207821-%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0OS%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%82%AC%E3%82%A4%E3%83%89)を使って起動、`Automatically`を選択で復元できる

#参考
[公式ドキュメント](http://www.mondorescue.org/docs/mondoarchive.8.html)
[Mondo RescueでCentOS6のフル/増分バックアップを行う | riscascape.net](https://www.riscascape.net/archives/6493)
[findコマンドのmtimeオプションまとめ - Qiita](https://qiita.com/narumi_/items/9ea27362a1eb502e2dbc)
[Mondo Rescue を使ったバックアップとリカバリ - Qiita](https://qiita.com/mozo/items/55574d7039bacfa8d8c8)
[Linuxmania：Mondo Rescue の使いかた](https://www.linuxmania.jp/mondo_rescue.html)