さくらのVPS バックアップ環境(MondoRescue + ownCloud)の構築スクリプトをシェアした

#はじめに
皆さんこんにちは。
最近は新型コロナで家から気軽に出られない日が続きますが、いかがお過ごしでしょうか。

今回はそんな家から出ない時間を使って、タイトルのMondoRescue + ownCloudを利用したバックアップ環境の構築スクリプトを作成しました！
そのスクリプトをさくらのVPSで利用できる、シェアスクリプト機能を利用してシェアしています。

シェアスクリプト機能の説明から、スクリプトの中身を 「Mondo backup & ownCloud 解説」から説明していきますが、その機能もう知ってるよ！という内容であれば解説まで飛ばしていただければと思います。

#さくらのVPS シェアスクリプト機能って？？
簡単に言えば、**ユーザー自身が作成したスタートアップスクリプトを共有する機能**の事ですね！

さくらのVPSではOS再インストール時やVPS新規ご契約時に、登録されているスクリプトを実行させて、WordPressのインストールやZabbixのインストール、環境の構築などを自動的に行える「**スタートアップスクリプト**」機能があります。

スタートアップスクリプト詳細：https://vps-news.sakura.ad.jp/startupscripts/

その中に、さくらから提供されているスクリプト以外にも自分で作成可能な、「カスタムスクリプト」がありますが、このカスタムスクリプトを共有する機能をシェアスクリプト機能、と呼んでいます。

お知らせ：https://vps-news.sakura.ad.jp/2020/03/10/vps-ss-share/

###スタートアップスクリプトってインストール時しか実行出来ないじゃん
とお考えの方、大丈夫です！！！
スクリプトの中身を確認すると確かにマウスカーソルが操作禁止マークのようになりますが、実はコピーは可能なんです！

ですので、こういう機能だけ自分のサーバにも追加したいな、というときも、該当しているスクリプトを探して必要な部分を参照する、というようなことも出来るのでぜひ一度利用してみていただければありがたいですm(_ _)m

#シェアスクリプトを利用したOSインストール方法
では実際にどうやってシェアスクリプト機能を利用するのか？を説明します。
※ここでは自分の作成したスクリプトのインストール方法になります。

1. コントロールパネルからログインし、スクリプトを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545026/7d97eafd-c2a7-d3d7-f26a-92529c7ffd02.png)
2. 検索窓から [Mondo] を入力して虫眼鏡のアイコンをクリックします。
   (何も入力せずにクリックした場合は、全てのスクリプトが表示されます。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545026/5c0c51f7-c3ef-9970-67b9-32cf64ad3c51.png)
3. 「**Mondo backup & ownCloud**」のスクリプト名が表示されたら、スクリプト名部分をクリックします。
4. 最下段の「**スクリプトを利用する**」部分から、適用したいサーバを選択します。(新規に契約するサーバに適用することも可能)
![処理済～スクリプト修正前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545026/d566ba46-820f-48db-bb81-410e4b64e20a.png)
5. 必要項目を入力して設定内容の確認、OSをインストールします。
特に **メールアドレス** の項目はLet's Encryptで利用するため、必ず入力してください:pray:
6. 一度起動してきた後、暫く待つと再び再起動がかかります。
7. 起動完了後、「**https://<入力したドメイン or 初期VPSドメイン>/owncloud/index.php/login**」へブラウザからアクセスし、ownCloudのログイン画面が表示されれば完成です:tada:


#Mondo backup & ownCloud 解説
ここからがスクリプトの中身のお話になります。スクリプトの中身を見つつ確認して見てもらえると嬉しいです！
###スクリプト概要
提供している内容はシンプルで、

 * Mondo Rescueを利用してサーバのフルバックアップを取得する
 * バックアップを月初に一回取得するスクリプトを設置する
 * 取得したバックアップをownCloudを利用して、簡単にダウンロード出来るようにする

の3つの機能を自動的にインストール、セットアップするスクリプトになります。

QiitaにもMondo Rescueでバックアップを取る記事はたくさんありますが、取得したバックアップは容量が大きくなりがち、かつデータをサーバ内部にためがちなので、できるだけ簡単にデータをダウンロードできることと、他の用途でも使えるものがないかなと言うことでownCloudを利用しています。

###インストールされるパッケージ
標準OSであるCentOS7に下記のパッケージがインストールされます。

* mondo
* Apache
* mod_ssl
* MariaDB
* PHP 7.2
* ownCloud

###MariaDBのデータベース設定
スクリプトの中では、各パッケージのインストールについて特別なことはしていません。
が、データベースの設定をする前に、以下のコマンドを実行しています。

```
DELETE FROM mysql.user WHERE User='';
DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');
DROP DATABASE test;
DELETE FROM mysql.db WHERE Db='test' OR Db='test\_%';
```

これは **mysql_secure_installation** を実行してデータベースを初期化した際に発行されるクエリで、必要のないデータベースやアカウント、MariaDBへの外部からの接続を削除しています。

###ownCloudの初期設定
ownCloudは本来であれば、インストール時に一度Webブラウザからアクセスしてアカウントやどのデータベースを利用するかの設定をする必要があります。
ただ、ownCloudのアプリを使用する際はsqliteが非推奨のためMySQL(MariaDB)の利用を優先し、occコマンドを利用してブラウザでの設定をスキップしています。
occコマンド : https://doc.owncloud.com/server/admin_manual/configuration/server/occ_command.html

```
sudo -u apache php ${DOCROOTDIR}/owncloud/occ maintenance:install --database "mysql" \
     --database-name "${OCDBNAME}" --database-user "${OCDBUSER}" --database-pass "${OCDBPASSWORD}" \
     --admin-user "${OCDBUSER}" --admin-pass "${OCDBPASSWORD}" || exit 1
```
この部分で利用するデータベースの種類、データベース名やPW、初期アカウントの設定を実行しています。

```
sudo -u apache php ${DOCROOTDIR}/owncloud/occ config:system:set trusted_domains 1 --value=${HOSTNAME} || exit 1
```
`/var/www/html/owncloud/config/config.php` の信頼するドメイン欄に指定したホスト名を追加して、ブラウザからドメインを指定してアクセス出来るように修正しています。

###Let's Encryptの設定
Let's EncryptはVPSの初期ドメイン、もしくは指定したドメインで取得されます。
証明書の更新を目的として、`/etc/cron.d/certbot-auto`にファイルがあるので、cronが定期的に実行されます。
※メールアドレスが指定されていないと、この部分で失敗してしまいます。

###ApacheのSSL設定
設定は**/etc/httpd/conf.d/owncloud.conf**に出力されています。
設定内容は[Apacheの資料](https://httpd.apache.org/docs/trunk/ssl/ssl_howto.html)を参照し、[Qualys SSL Labs](https://www.ssllabs.com/ssltest/)でA評価が取れるように設定しています。

###バックアップスクリプト
スクリプトは`/usr/local/bin/mondo_backup.sh`に設置してあります。

```
GEN='5'
```
でバックアップファイルの世代数を指定しているので、取得する世代数を変更する場合は数値を変更してください。
バックアップ自体は

```
BACKUP_DIR="${DOCROOTDIR}/owncloud/data/${OCDBUSER}/files/backup"
${MONDO_ARCHIVE} -Oi -9 -s 4480m -N -V -E "${BACKUP_DIR}" -d \${BACKUP_DIR} -p "\$(date '+%Y%m%d')_backup"
```
のコマンドで取得されていて、以下の点が注意してください。

* バックアップファイルはownCloudで初期設定されたアカウント配下の、`backup`ディレクトリ以下に作成される
* バックアップのディレクトリは-Eオプションでバックアップから除外される
* -sオプションで4GBを指定しているので、バックアップファイルの容量が4GB以上になると分割される

特にバックアップ容量が大きくなってくると、リストア中のイメージの交換が出来ないので注意してください。

問題なくバックアップが作成されたら、作成されているファイルの数と設定された世代数を比較して、ファイル数の方が多ければ一番古いファイルを削除します。
その後、ownCloudのoccコマンドを使用して、ownCloudにファイルが作成されたことを反映します。

```
sudo -u apache php ${DOCROOTDIR}/owncloud/occ files:scan ${OCDBUSER}
```
※OS上で作成されたファイルは、データベースの更新が行われないためownCloud上で認識されません。
※本来は[WebDAV環境を用意](https://doc.owncloud.org/server/8.2/user_manual/files/access_webdav.html#creating-webdav-mounts-on-the-linux-command-line)するのが正しいところですが、ownCloudに新しいアカウントが追加された場合、データ保存のディレクトリ構成が異なる可能性があるため、この方法を利用しています。

このバックアップの動作は`/etc/cron.d/mondo-backup`に設定しているとおり、上記のバックアップは毎月1日、0時から動作します。
#バックアップデータのダウンロード
ownCloudにブラウザからアクセスしてダウンロードを実施するか、クライアントソフトを利用してダウンロードする方法があります。
クライアントソフトの利用には、

* PCが起動したらデータのダウンロードが始まる
* 月初にPCを起動しておけば夜中にダウンロードまで完了している

等のメリットがあるので、個人的にはおすすめです！
ownCloudのクライアントソフトは、初回にブラウザからログインした際に表示される画面から入手することが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545026/e0ef2317-34df-9fe7-0e0b-1f418aec9252.png)

#ISOイメージからのリストア
Mongo Rescueで取得したバックアップファイルはISOイメージになっています。
そのため、VPSに対してリストアを行う場合は**ISOイメージからのインストール**を利用します。
###ISOイメージインストール方法
アップロードの手順はさくらの公式手順があるので、そちらを参照してください。
ISOイメージインストール： https://help.sakura.ad.jp/206055662/
###リストア方法
イメージを利用してインストールが始まったら、VNCコンソールを開きます。(電源が有効になったら接続できます。)
しばらく操作しないか、エンターを打つことで以下の画面が出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545026/fbc6ea7d-2089-fe8d-98ad-e267b6688180.png)

Automaticallyを選んでもエラーが出てくると思われるので、**Interactively**を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545026/7f891616-b774-7edd-8f57-52e7a63a914a.png)
あとは下記のイメージ通り選択していきます。
![image (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545026/4da616ea-d6ea-e1a7-2de0-b254742bb9c7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545026/4ec77fd6-2a9c-7b52-00e0-c241987cb776.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545026/c8351643-a1c2-c430-7c7d-18168a1e4428.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545026/401fdcf8-f220-8980-c3ac-4632ba2acf98.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545026/6c9d8ebe-521b-6a71-b629-a0658614855f.png)
以上まで完了するとシェルインターフェースに移行しますので、以下を入力します。

```
# exit
```
おそらくこれでほぼ復旧出来ていると思われますが、フルバックアップなので更新の多いアプリケーション(MariaDB等)はタイミングによっては破損している可能性もあります。
不安な場合は、アプリケーション毎に個別のバックアップ方法でバックアップの取得とレストアを試しておいたほうが良いでしょう:confounded:

#おわりに
長くなりましたが、以上がMondoRescueとownCloudを利用したバックアップ機能の説明と、ざっくりしたリストア方法の記述でした！

皆さんもより便利な機能があればスクリプト化してシェアしてみていただければと思います:pray:
それではよいGWを！