Misskeyのデータベースをバックアップしよう【OCIオブジェクトストレージ編】
突然の事故でサーバーが……というのは特にクラウドサービスを使っていると気にする必要はないのですが、バックアップは念のためにとっておきたいものです。
メディアファイルとPostgreSQLさえ無事なら、Misskeyインスタンスは復活することができます。
オブジェクトストレージを使っていれば、メディアファイルのバックアップについては考えなくて済みます。
PostgreSQLのバックアップについて
PostgreSQLのバックアップは、簡単な方法として、pg_dumpもしくはpg_dumpallというコマンドを使い、ダンプファイルを生成するというものがあります。
このダンプを安全なところに保管し、いざいうとき新しいサーバーのデータベースへダンプからデータを復元(リストア)すれば、新しいデータベースでデータを利用することができるようになります。
OCIでのバックアップ方法を解説します
ファイルを格納するだけなら、色々な方法が考えられます。
Oracle Cloud Infrastructureの無料枠の解説をしたことがあるので、今回はOCIのオブジェクトストレージにダンプファイルを圧縮保存していく方法を解説します。
オブジェクトストレージのバケットを作成する
https://cloud.oracle.com/object-storage/bucketsからバケットの作成を選択し、新しくバケットを作成してください。設定は弄らなくても大丈夫です。
バケット名とネームスペースを控えておいてください。
日数経過でファイルが消えるようにする
古いバックアップが日数経過で自動的に消えるように設定してみましょう。
ポリシーの設定
https://cloud.oracle.com/identity/policiesにアクセスし、[ポリシーの作成]を選択します。
名前や説明は自分でわかるように適当につけます。
ポリシー・ビルダーは、手動エディタの表示をオンにし、
Allow service objectstorage-ap-osaka-1 to manage object-family in tenancy
と入力します。作成を選択してください。
ライフサイクル・ポリシー・ルールの作成
作成したバケットのページに戻ってください。
ライフサイクル・ポリシー・ルールタブを選択し、[ルールの作成]を選択します。
ライフサイクル・アクションを[削除]に、日数はお好みの日数にしてください。
状態が有効になっていることを確認し、[作成]を選択します。
これでオブジェクトストレージ側の作業は完了です。
OCI CLIのインストール
オブジェクトストレージにコマンドでアップロードするために、OCIのCLIツールをインストールします。
まずはMisskeyインスタンスにsshログインしてください。
(デフォルトユーザーのまま(ubuntuユーザーなど)で実行してください。sudoは余計です。
misskeyユーザーでも大丈夫ですし、ルートユーザーならホームディレクトリを/rootと読み替えてください。)
CLIインストール
次のコマンドを実行します。
bash -c "$(curl -L https://raw.githubusercontent.com/oracle/oci-cli/master/scripts/install/install.sh)" - --accept-all-defaults
CLI設定
設定を行います。
oci setup config
Enter a...といろいろ聞かれます。下の画像1枚目やこちらの記事も参考にしてください。
ユーザーとテナンシの詳細画面は右上のメニューからアクセスできます(下の画像2枚目)。
コンパートメントのOCIDは私の場合聞かれませんでした。
Do you want to generate a new API Signing... はyと答えてください。
公開鍵アップロード
ユーザーページに移動し、APIキータブを選択し、[APIキーの追加]を選択します。
[公開キーの貼り付け]を選択してください。
大きなテキストボックスには、sshにて次のコマンドを実行した結果を貼り付けてください。
cat .oci/oci_api_key_public.pem
貼り付けたら[追加]を選択します。
このような結果が出てきます。cat ~/.oci/config
の結果と比較するとだいたい同じ内容ものになっているはずです。
OCI CLIのセットアップはこれで完了です。
参考:
https://docs.oracle.com/ja-jp/iaas/Content/API/SDKDocs/cliinstall.htm#InstallingCLI
https://cloudii.jp/news/blog/oracle-cloud/2018-07-30-173907/
https://cloudii.jp/news/blog/oracle-cloud/2018-08-01-104038/
バックアップを作成し、アップロードしてみる
MisskeyインスタンスのサーバーでPostgresのバックアップを作成します。
今回は、pg_dumpallしたものをgzip圧縮しmis.gzとして保存します。
sudo -u postgres pg_dumpall | gzip -c > mis.gz
ls -lh mis.gz
で確認してみましょう。
私の場合、圧縮前は273MBであり、圧縮すると77MBということなので、ちゃんと中身はありそうです。
(圧縮前のサイズはgzipせずにファイルに出力して確認してみました。)
OCIのCLIでアップロードしてみます。
"ネームスペース"と"バケット名"は、最初に作成したバケットのものに置き換えてください。
oci os object put -ns ネームスペース -bn バケット名 --file mis.gz --name "$(date +%Y%m%d_%H-%M-%S).gz" --no-multipart
バケットのページを更新し、きちんとアップロードされたか確認してみます。
cronを設定
バックアップ先を作成。
sudo mkdir /var/backup
sudo chmod 777 /var/backup
cronファイルを作成します。
sudo nano /etc/cron.d/pgbuckup
cronは次のように設定します。cronファイルの書き方については各自調べてください。
この例では、バックアップを毎日UTC時刻6:00(日本時間15時)に実行します。
ユーザーは、CLIをインストールしたユーザー(ubuntuなど)です。
SHELL=/bin/bash
0 6 * * * postgres pg_dumpall | gzip -c > /var/backup/db.gz
5 6 * * * ユーザー /home/ユーザー/bin/oci os object put -ns ネームスペース -bn バケット名 --file /var/backup/db.gz --name "$(date +\%Y\%m\%d_\%H-\%M-\%S).gz" --no-multipart
パーミッションを設定し、cronを再起動して適用します。
sudo chmod 644 /etc/cron.d/pgbuckup
sudo systemctl restart cron
バックアップのリストア
バックアップの復元(リストア)についても書いておきます。
Misskeyのインストールを行う前に、postgresqlをインストールしてバックアップを復元する必要があります。
シェルスクリプトを実行する場合は、Postgresをローカルにインストールをしない(n)と回答し、パスワードは前のものと同じにしてください。
次のような手順でバックアップを復元できるはずです(※ただし未検証です!)。
- 新しいインスタンスで「OCI CLIのインストール」を実行します。
オブジェクトストレージからファイルをダウンロードし、解凍します。
oci os object get -ns ネームスペース -bn バケット名 --name "バックアップのファイル名.gz" --file "bu.gz"
gzip -c -d bu.gz > bu.sql
バックアップを復元します。
sudo -u postgres psql -f bu.sql
新しいサーバーでもバックアップcronの設定は忘れずに行いましょう。