ローカルにホスティングしたAutoMuteUsをバージョンアップする


## 背景
仲間内でAmongUsを遊ぶ機会があり、その時のために[AutoMuteUs](https://github.com/denverquane/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のあるディレクトリに移動した後

```sh
$ docker-compose up # AutoMuteUs起動
$ docker ps # 各構成要素のコンテナ名確認
```
で各コンテナの情報を確認しておきます。

### PostgreSQLからの取得

```sh
$ 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 .
```

- 参考：https://torazuka.hatenablog.com/entry/20100415/pg

### Redisからの取得
```sh
$ docekr exec -it <redisのコンテナ名> sh
-----<以下コンテナ内>-----
$ redis-cli save
----<以下コンテナ外>----
# dumpしたデータをdocker外に持ち出す
$ docker cp <コンテナID>:/data/dump.rdb .
```

- 参考：  https://papix.hatenablog.com/entry/2015/08/11/202045

必要なデータが手に入ったので`docker-compose stop`でAutoMuteUsを停止します。

## 新しいAutoMuteUsへの取得データの読み込み
新しくインストールしてきたAutoMuteUsのdocker-compose.ymlのあるディレクトリに移動した後、先ほどと同様にDBを格納しているコンテナの情報を確認しておきます。

```sh
$ docker-compose up # AutoMuteUs起動
$ docker ps # 各構成要素のコンテナ名確認
```

また、移行中の予期せぬDBへの書き込みをなくすためにDB以外のdockerを停止しておきます。

```sh
$ docker stop <automuteus自体のdokerのID>
$ docker stop <galuctusのdokerのID>
```

### PostgreSQLへの読み込み
```sh
$ 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への読み込み
```sh
$ 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](https://github.com/denverquane/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

```sh
$ 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

- Signed URL
https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-creating-signed-url-canned-policy.html
 - UNIX時間への変換
 http://kujiira.com/tools/date

- Postgresダンプファイルのフォーマット指定
https://stackoverflow.com/questions/61151338/cannot-restore-postgres-dump-on-heroku