背景
仲間内でAmongUsを遊ぶ機会があり、その時のためにAutoMuteUsを手元にホスティングしていました。2021年3月末ごろにAmongUsに大型アップデートが入り、AutoMuteUsも対応して新しいバージョンを使いたくなったため、古いバージョンで使っていたdocker内のDBから新しい方のdocker内のDBにデータを移す必要が生じました。
AutoMuteUsの各バージョンは、移行前が6.10.1、移行後が6.12.1です。
前準備
データ移行先の最新のAutoMuteUsをインストールしておきます。
https://github.com/denverquane/automuteus
各DBデータの取得
古いAutoMuteUsのdocker-compose.ymlのあるディレクトリに移動した後
$ docker-compose up # AutoMuteUs起動
$ docker ps # 各構成要素のコンテナ名確認
で各コンテナの情報を確認しておきます。
PostgreSQLからの取得
$ docekr exec -it <postgresのコンテナ名> sh
-----<以下コンテナ内>-----
$ pg_dump -h localhost -U <postgresのユーザー名> -c <目的のDB名:デフォルトであればユーザー名と同じ> --format=c > hogehoge.dump
$ pg_dump -h localhost -U <postgresのユーザー名> -c <postgresのユーザー名> -s --format=c > hogehoge_schema.dump
----<以下コンテナ外>----
# dumpしたデータをdocker外に持ち出す
$ docker cp <コンテナID>:/hogehoge.dump .
$ docker cp <コンテナID>:/hogehoge_schema.dump .
Redisからの取得
$ docekr exec -it <redisのコンテナ名> sh
-----<以下コンテナ内>-----
$ redis-cli save
----<以下コンテナ外>----
# dumpしたデータをdocker外に持ち出す
$ docker cp <コンテナID>:/data/dump.rdb .
必要なデータが手に入ったのでdocker-compose stop
でAutoMuteUsを停止します。
新しいAutoMuteUsへの取得データの読み込み
新しくインストールしてきたAutoMuteUsのdocker-compose.ymlのあるディレクトリに移動した後、先ほどと同様にDBを格納しているコンテナの情報を確認しておきます。
$ docker-compose up # AutoMuteUs起動
$ docker ps # 各構成要素のコンテナ名確認
また、移行中の予期せぬDBへの書き込みをなくすためにDB以外のdockerを停止しておきます。
$ docker stop <automuteus自体のdokerのID>
$ docker stop <galuctusのdokerのID>
PostgreSQLへの読み込み
$ docker cp hogehoge.dump <postgresのコンテナ名>:/.
$ docker cp hogehoge_schema.dump <postgresのコンテナ名>:/.
$ docekr exec -it <postgresのコンテナ名> sh
-----<以下コンテナ内>-----
$ psql -h localhost -U <> -f hogehoge_schema.dump <>
$ psql -h localhost -U <> -f hogehoge.dump <>
Redisへの読み込み
$ docker cp dump.rdb <redisのコンテナ名>:/.
$ docekr exec -it <redisのコンテナ名> sh
-----<以下コンテナ内>-----
$ mv /data/dump.rdb /data/dump.rdb.bu # バックアップ
$ mv dump.rdb /data/dump.rdb
上記で移行は完了です。
HerokuにホスティングしたAutoMuteUsにデータを移行する
AutoMuteUsはheroku上にホスティングするためのリポジトリをk-tahiroさんという方が作成して公開してくださっています(heroku-docker-automuteus)。heroku上にホスティングしたAutoMuteUsへのデータ移行も行ったのですが、こちらではいくつか追加の作業が必要になりました。
AWS S3のセットアップ
HerokuのPostgresにdumpファイルからデータをリストアするには、httpでアクセスできるURLにデータを置いておく必要があります。今回は、Herokuの公式が勧めているAWSのS3を使います。
https://devcenter.heroku.com/articles/heroku-postgres-import-export
AWSへアカウントを登録し、ブラウザからS3に先ほど作成したPostgres、RedisのDBダンプファイルをアップロードします。
アップロードしたデータへのアクセスは、AWSの提供している署名付きURLの機能を使って行います。各データへの署名付きURLの作成方法はいくつかありますが、今回はAWS CLI2を使って行います。
- AWS CLI2 のインストール
https://docs.aws.amazon.com/cli/latest/reference/s3/presign.html
インストール後にaws configure
でアクセスキーとシークレットアクセスID、リージョンを適切に設定します。アクセスキーとシークレットアクセスIDはブラウザから触れるAWSマネジメントコンソールの右上の自分のアカウント名のボタン>マイセキュリティ資格情報から確認、もしくは作成できます。
-
AWS CLI2を使用した署名付きURLの作成
https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3/presign.html
aws s3 presign s3://<バケットの名前>/hogehoge.dump
等で各ダンプファイルについて署名付きURLを作成します。 -
署名付きURLを使ったHerokuのPostgresのRestore
$ heroku pg:backups:restore '<SIGNED URL>' DATABASE_URL
Postgresのスキーマとデータの順で、S3のダンプファイルからのデータの取り込みを行います。
DATABASE_URLはプレースホルダではなくそのままこの文字列を入力します。
Redisに関してはデータを移し忘れたのですが、特に問題なく運用できたので、必ずしも移行する必要はなさそうです。
他参考資料
-
署名付きURLを使用したオブジェクトの共有
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/ShareObjectPreSignedURL.html -
UNIX時間への変換
http://kujiira.com/tools/date -
Postgresダンプファイルのフォーマット指定
https://stackoverflow.com/questions/61151338/cannot-restore-postgres-dump-on-heroku