はじめに
先日、metabase(構築したのは自分ではない)を別サーバーに移行することがありました。
既存環境にて登録済みのユーザーやクエリを別サーバーに移行する点で、
いまいちそれっぽい情報が見つからず、手間取ったので手順を書いておきます。
やりたいこと
- metabaseを別サーバーに移行する
- 移行対象はmetabaseに登録してあるユーザー情報とクエリなど諸々の設定
前提など
公式のdocker imageを使用して、既存環境が構築されている
(それ以外の環境の場合は、やることとしては大体一緒かもしれませんが調べてないので不明です)
公式が書いた下記の記事を参考にして進めています。
metabase: "Running Metabase on Docker" > Mounting a mapped file storage volumeの箇所
ざっくり手順
- 設定ファイルが格納されているディレクトリをコンテナから引っこ抜く(デフォルトは
/metabase.db
) - 移行先のサーバーに1.で抜いた設定ファイルが格納されているディレクトリを置き、
docker run -v
などでマウントしてmetabaseを起動する - 起動後は必要に応じて、参照するDBの向き先を変更する
手順
1. 設定ファイルが格納されているディレクトリを引っこ抜く
まずマウントされているか確認
// マウントされていたらホスト側に設定ファイルが入ったディレクトリがあるはずなので、そのディレクトリを移行先に持っていく。
// 仮に、記事通りのコマンドで、マウントして起動されていた場合、`docker inspect ~~~` を叩くと下記の通りになる
$ docker run -d -p 3000:3000 -v ~/metabase-data:/metabase-data -e "MB_DB_FILE=/metabase-data/metabase.db" --name metabase metabase/metabase
$ docker inspect metabaseのコンテナID |grep -E "Source|Destination"
"Source": "/metabase-data", // ホスト側
"Destination": "/metabase-data", // コンテナ側
マウントしていない場合、デフォルトではルート直下にmetabase.dbというディレクトリがあるので、このディレクトリをホスト側にコピーする
マウントせずにコンテナを立ち上げてみた場合こうなります
$ docker run -d -p 3000:3000 --name metabase metabase/metabase
// ルートにmetabase.dbというディレクトリが確認できる
$ docker container exec -ti metabase ls /metabase.db
metabase.db.mv.db metabase.db.trace.db
ホスト側にコピーするコマンドはこれ(一応)
$ docker cp metabase:/metabase.db .
$ tree
.
└── metabase.db
├── metabase.db.mv.db
└── metabase.db.trace.db
2. 移行先でmetabaseを起動する
あとは移行先の任意のディレクトリにmetabase.dbを配置して、下記のコマンドが動くようマウントしてコンテナを立ち上げる
$ docker run -d -p 3000:3000 -v ~/metabase-data:/metabase-data -e "MB_DB_FILE=/metabase-data/metabase.db" --name metabase metabase/metabase
記事のコマンド通りにするなら、
あらかじめ下記のように、~/metabase-dataの下にmetabase.dbを置くディレクトリ構成にし、metabase-detaをマウントする
$ tree -a ~/metabase-data
metabase-data
└── metabase.db
├── metabase.db.mv.db
└── metabase.db.trace.db
3. 起動後
- 移行前のmetabaseから参照先のDBが変わっていないのであれば、動作確認して終わり
- ステージングから本番へ、ユーザーやクエリだけ移動するようなケースであれば向き先のDBを変更して終わり