トップ 最新

ただのにっき

2015-02-06(金) [長年日記]

Heroku上のtDiaryへデータを移行する

ブラウザでポチポチするだけでHeroku上にtDiaryをデプロイできるようになったわけだが、従来からレンタルサーバ的な場所でtDiaryを運用していた人にとってはデータを移行できなければ意味がないだろう。これもいちおうできるようになっている。が、さすがにこれをブラウザだけでやるのは難しいので、unix系システム上でコマンドラインを使うことになる。まぁ、現時点でtDiaryを運用してる人はそういう環境にはそんなに困らない……はず。

必要なコマンドは ruby、git、bundler。それぞれ最新のものをご用意下さい。また、同一ホスト上に既存のtDiaryのデータ(@data_path配下)が揃っている必要があります。

まずは GitHubからtdiary-coreを入手してherokuブランチへ:

% git clone http://github.com/tdiary/tdiary-core.git
% cd tdiary-core
% git checkout heroku

bundlerで必要なパッケージを入手すると、tdiary-mongodb-convertコマンドが使えるようになる(←今回使いたいのはコレ):

% bundle install --path vendor/bundle   (←けっこう時間かかる)
% bundle exec tdiary-mongodb-convert
Usage: tdiary-mongodb-convert [options] <data_path>
    -c, --conf=CONF                  store only tdiary.conf
    -s, --style=STYLE                style path
    -m, --mongo=URL                  URL of mongoDB

tdiary-mongodb-convertはtDiaryのデフォルト形式(テキスト)のデータを、MongoDBにアップロードするコマンド。アップロードをするにあたって、現在Herokuで使っているMongoDBの接続先情報を得ておく*1。ブラウザでHerokuを開いて、前回作成したアプリの「Settings」をクリック:

「Config Variables」にある「Reveal Config Vars」をクリックするといろんなプラグインの設定が出てくるので、「MONGOLAB_URI」の値(mongodb:で始まってる長い文字列)を控えておく。

さて、まずはtDiaryの設定をアップロードする。@data_pathの下にある方のtdiary.conf。これを-cオプションに指定する:

% bundle exec tdiary-mongodb-convert -c 【@data_pathのパス】/tdiary.conf -m 【先ほど控えたmongoDBのパス】
    :
    :

ちゃんとアップロードできたかどうかは、HerokuのResourcesタブからMongoLabに飛ぶとconfというCollectionがあることで確認できる。なお、現在使っているものをそのままアップロードすると日記の編集などでエラーになる場合がある。その場合はtdiary.confをエディタで開いて、@base_urlやCSRF関連の設定を削除してからやり直すと良い(このへんはバッドノウハウなのでなんとかしたいところ)。

続いてデータ本体をアップロードする:

% bundle exec tdiary-mongodb-convert -s ./lib/tdiary/style -m 【先ほど控えたmongoDBのパス】 【@data_pathのパス】
    :
    :

長年日記をつけてる場合はここでけっこうな時間がかかるので、のんびり待とう。これでデータのアップロードは完了したはず。サイトにアクセスして、プラグインまわりのチェックをしましょう。

この「けっこうな時間」の部分、ネットワーク越しにアメリカにあるDBサーバとやりとりしてるせいなので、実はローカルにMongoDBを立ててそこに向けてアップロードすればかなり短縮できる(対Herokuで5分かかったデータがローカル相手だと数秒で済んだ)。あとはmongoexport / mongoimportコマンドでHerokuの方に移せば良い。後述するカテゴリの問題もこれで解決できる。

それから、DBに入るのは日記の本文だけなので、imageプラグインによる画像は元環境に残ったままだ。これをどうするかはけっこうな問題なんだけど、ある程度の期間運用してきた日記の場合はHerokuに送る量じゃないので、別の方法で解決しないといけない。今後つける日記ではオンライン写真サービスを使うことで代替できるのだけど(個人的なオススメはpicasaプラグイン。あとはたぶんflickrプラグインも使えるんじゃないかな)、過去の分はどっかに置いて、リンクを貼り直さないといけない。tDiary.Netではこんなプラグインを書いて、(imageプラグインの指定はそのままで)旧サーバにある画像を指すように書き換えている*2

で、さきほど触れたカテゴリの問題だけど、移転先にはカテゴリインデックスがない。ので、カテゴリプラグインの設定画面から再作成をすればいいのだけど、これもまた時間がかかる上に、Herokuは30秒でタイムアウトしてしまうので、ブラウザからはエラーに見えるのだ。ただ、処理自体は動き続けているはずなので、Herokuに処理を殺されないようにたまにアクセスしながら待つと良い。MongoLabのpluginコレクションが従来のカテゴリの数くらいになれば完了だ。もちろん、いったんローカルで動かせる場合は、こっちで再作成してからDBをコピーするのが快適だ。

Tags: tDiary heroku

*1 herokuコマンドを使い慣れている人は「heroku config:get MONGOLAB_URI -a アプリ名」を実行してもよい。

*2 ちょっと改造すれば他の環境でも使えるはず。旧imageと併用できないことに注意。