外部仕様はこちら
PR
https://github.com/weseek/growi/pull/6727 external_link
内部仕様
基本方針
G2G Transfer 機能は、MongoDB 内のデータと添付ファイルを自動で移行する機能。MongoDB のデータは既存の Export/Import の機能を流用し、添付ファイルの転送は新規で実装する。
移行開始から完了までの処理フロー
- 移行先で発行した移行キー(Transfer key string)を body に含めて
POST /_api/v3/g2g-transfer/
を叩く - 移行キーをパースして
TransferKey vo
を生成 - 移行元 GROWI が移行先 GROWI の
GET /_api/v3/g2g-transfer/growi-info/
を叩いてバリデーションや移行に使用する情報を取得- 同時に移行先で添付ファイルアップロード先ストレージに触れるかどうかチェックし、
/growi-info/
のレスポンスに含める(未実装)- 書き込みまでチェックできるとベストだけど、めんどくさそうならとりあえず読み込み (listFiles とか) だけでも、credential の正当性はチェックできそう(syunsuke)
- 同時に移行先で添付ファイルアップロード先ストレージに触れるかどうかチェックし、
- 移行可能かをチェック
- 移行開始
MongoDB データの自動 Export/Import
フロー
- Export service で zip ファイルを生成
- axios で移行先 GROWI に zip ファイルを転送
- 解凍して Import service でデータインポートを行う
適宜適切にバリデーションを行う。
添付ファイルの自動転送
フロー
- Attachment document を cursor で取得
- 1件ずつ document に紐づいている添付ファイルを転送する
クライアントに進行状況を通知する
socket.io で随時 emit し、クライアントで進行状況を表示する
要検討項目
- MongoDB のデータと添付ファイルを非同期的に転送するか、同期的に転送するか
- 非同期的に行うとメモリ不足の可能性が高まるはずなので、同期的に行うのがシンプルでいいかなあとは思っている
- リトライ時のどこまで終わっているのかのチェックも MongoDB => 添付ファイルの順でできてシンプル
- そもそも MongoDB さえ終わっていれば GROWI は動くというのもある
- どっちでもいいかなー(syunsuke)
- 添付ファイルの転送は何本か並行で走らせられるようにすると、ちょっとスピードアップするかも?本数はユーザによる調整ができると良さげ(syunsuke)
- これはやって良さそう(taichi)
- リトライ処理
startTransfer
前にどこまで終わっているかを確認して必要な分だけを転送するようにする
Routes と Services の解説
Routes
移行元サーバーの Routes は pushRouter
に、移行先サーバーの Routes は receiveRouter
に登録している
-
receiveRouter
POST /
- MongoDB の Export された zip ファイルを受け取って Import までを行う
/mongo
に改名した方がいいかも
POST /attachment
- 添付ファイルの転送の受け口
GET /growi-info
- 移行先 GROWI の移行に必要な情報を計算して返す
- 同時にストレージが使用可能かもチェックする
POST /generate-key
- 移行キーを発行する
-
pushRouter
POST /transfer
- 移行開始を指示する
- 移行に必要なオプションを body に含める
/start-transfer
の方が直感的かも。それか/
でもいいかも
Service
移行元のインターフェース & 実装は interface Pusher
& class G2GTransferPusherService
に、移行先のインターフェース & 実装は interface Receiver
& class G2GTransferReceiverService
にある