技術書典16でChatGPT本を出します!(ここをクリック)

Misskey・Calckeyのデータベースをバックアップする

ひとり鯖を運用していて思うのが「データベースのバックアップしておかないと怖いな」と日々感じます。ということで今回は「postgreSQLで作成されたMisskey・Calckeyデータベースをバックアップする方法」を備忘録として残しておきます。

Misskeyは動作未確認ですが、多分行けるはず。(保存ファイル名変更はやる必要あるけど)また、ブログ執筆者自身もあまりサーバーインフラ周りをよく理解してないので、その辺もご了承ください。(サーバーインフラ歴:数か月の民)

目次

バックアップ準備(ディレクトリ作成)

バックアップをする前にディレクトリの作成、ついでにパーミッションも変更しておきます。

$ sudo mkdir /var/backup
$ sudo chmod 777 /var/backup

手動で行う場合

アップデートやメンテナンスを行う前に手動で取って置く用。下記コマンドをTera Tarmなどに入力したら「/var/backup/」ディレクトリ内にできてるはず。

$ sudo -u postgres pg_dumpall | gzip -c > /var/backup/calckey$(date +%Y%m%d%H%M)-backup.gz

2023/07/25 追記

could not change directory to “/root”: Permission deniedが出る

サーバーのバックアップを取るメモ | とりのこし

上記の記事を見て、エラーのこと書き忘れたと気づきました。申し訳ない。

今私の環境で試したところ、下記の結果になりました。

  • root権限:エラー表記あり
  • sudu権限を渡した一般ユーザーA:エラー表記なし

多分「/var/backup」を作ったユーザーに権限があって、そのユーザーでバックアップコマンドを打たないとアクセス権限エラーが出るっぽいですね。ただ、エラーを吐いててもバックアップ自体はできてるのでヨシ!でもいいと思いますけれども(よくない)

バックアップ時の挙動・バックアップファイル確認について

上記のエラー文を吐いても吐かなくてもバックアップファイルができてることがあります。(バックアップしたよというコメントが出ないので、できていることに気づかない)

なので、一度FTPソフトで/var/backup/ディレクトリで確認するか、下記のコマンドを入力してファイルがあるか確認してください。

$ ls -l /var/backup

この時、ファイルの容量も確認しておくと吉。一見ファイルができてるように見えても、データベースバックアップに作成失敗してて、データ容量がすっかすっかになってることがあります。

こんな感じにね(白目)

解説

sudo -u postgres

ユーザーをpostgresに変更します。

pg_dumpall

データベースをすべてバックアップします。

gzip -c

ファイルをgzip形式で保存します。

gzipは$ sudo apt install gzip で要インストールなので、注意。

/var/backup/calckey$(date +%Y%m%d%H%M)-backup.gz

ディレクトリとファイル名です。

この形式では/var/backup/calckey202307200123-backup.gzというファイルができます。

202307200123は出力した日付になるため、基本的にファイル名が重複しないはず。

cronで自動化する

結論

/etc/cron.d内にdbackupファイルを作成、Vimでdbackupファイルを開きます。

$ sudo vi /etc/cron.d/dbackup

ファイルを開いたら、下記の項目を記入して保存します。

SHELL=/bin/sh
MAILTO=""
0 2 * * * postgres pg_dumpall | gzip -c > /var/backup/calckey$(date +\%Y\%m\%d\%H\%M)-backup.gz

Vimについてはこのサイト見ながらやってみてください。(ぶん投げ)

【超初心者向け】Vim(Vi)でなんとかファイル編集する方法 | Y Lab Desk

ファイルを保存したら、パーミッションの変更とcronの再起動を行います。

$ sudo chmod 644 /etc/cron.d/dbackup
$ sudo systemctl restart cron

cron解説

SHELL=/bin/sh

おまじない的に入れてます(完全に理解してない)多分なくても行けそう。

MAILTO=””

cronを実行した時、logに(CRON) info (No MTA installed, discarding output)が出てたので、エラーをなくすために入れました。

多分MTAなどを入れてるなら、エラーはでないはず。

0 2 * * *

日時指定。左から「分/時/日/月/曜日」になっていて、この設定では毎日午前2時(サーバーの時刻)に設定されています。毎日0時に指定したい場合は0 0 * * *、毎日17時30なら30 17 * * *と設定すればOK。

詳しい時刻記入仕様はここを見てください(ぶん投げ2回目)

cronの日時指定を、基礎から学ぶ(分,時,日,月,曜日の指定、◯分ごと、月末起動、など) – YoheiM .NET

余談ですが、ちなみにサーバーが日本のタイムゾーンじゃない場合があります(とくに海外サーバー)私が使っているのはNYだったので13時間ほどズレているので、NYの時刻で時間設定をする必要があります。なので一度「date」コマンドを使ってサーバーの時刻を確認しとくといいかもしれません。

calckey$(date +\%Y\%m\%d\%H\%M)-backup.gz

出力のファイル名になります。コマンド自体は手動コマンドとほぼ同じで、書き方が若干違います。%の前に\が入ってる=Cronの仕様上、書き方を変える必要があり、ファイル名を変えたい場合は気を付けましょう。

それ以外

基本主導のコマンドと同じなので解説略。

指定した日付より前のバックアップを削除する

上記のcronのままだと毎日延々とバックアップファイルを作ってしまい、ストレージを圧迫してしまいます。それを防ぐためにも、指定した日付より前(ここでは14日間)のバックアップファイルを削除するcronを作成しておきます。

dbackupファイルの最終行に下記の項目追加して、cronを再起動すればOK。

5 2 * * * root find /var/backup -name '*.gz' -mtime +14 -delete

cron解説

5 2 * * *

時刻。負荷軽減のためにバックアップの時間より数分遅く設定してあります。

root

root権限で実行します。

find /var/backup -name ‘*.gz’

/var/backup内にある「*.gz」ファイルを探します。

-mtime +14 -delete

14日より前に作成したファイルを削除します。

参考サイト(順不同)

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次