herokuのアップデートで動かなくなったWebサービスを直したときの話

前に日記を書いたときに作りはじめたWebサービス,YTJukeに手を加えようと思ったら,"Application Error"と表示されてうまく動作しない状態になっていたので,そこからもとの状態に戻したときの試行錯誤の話です.

直接ハマった所は1箇所だけで,何ともしょうもない話なのですが,

herokuにおけるデータベースのURL変数を,SHARED_DATABASE_URLとしていたのが良くなかった

ということでした.

当初,ログを読むと,こんなのが出ていました.

$ heroku logs 
## 2012-12-26T10:58:24+00:00 app[web.1]: /app/app.js:20
## 2012-12-26T10:58:24+00:00 app[web.1]:   client.query("SELECT tablename from pg_tables where tablename = '" + baseTab
## 2012-12-26T10:58:24+00:00 app[web.1]:          ^
## 2012-12-26T10:58:24+00:00 app[web.1]: TypeError: Cannot call method 'query' of null

データベースへの接続ができていないとのことだったので,もしかして,postgres9.2にバージョンアップしたという件かと思ったのですが,違いました.

Heroku Postgres | Heroku Dev Center
公式によれば,process.env.DATABASE_URLと記述すべきとのことです.
以前は,SHARED_DATABASE_URLも,特に設定しなければこれと同じ値になっていたのでしょう.今は,変数自体が無いようでした.

$ heroku config | grep DATABASE
## DATABASE_URL:                  postgres://chkctcjn(アドレスが書かれていたが,略)


他にも,いくつか細々としたところでハマったので,一応書いておきます.

ローカル環境のnodeのバージョンをあげたので,依存関係がおかしくなっていた

これはpackage.jsonとnpmコマンドでいろいろ調整です.
バージョンが合っていないとこんなのが出るので,どちらかに合わせる.

$ npm install exress
## npm WARN engine express@2.4.7: wanted: {"node":">= 0.4.1 < 0.5.0"} (current: {"node":"v0.8.15","npm":"1.1.66"})

expressを最新版(3.0.5)にしたら仕様がいろいろと変わって動かなくなった

Express - api reference
express3になって,関数名やファイル構成など,仕様があちこち変わったみたいです.
私はlayout.ejsを読み込まない仕様になっていることに気づかずにハマりました.
package.jsonに,express2.5系を指定したら問題なく動作しました.

Heroku Toolbeltを使うようにしたら,tapsでのデータベース転送がうまくいかなくなった

(gem版とtapsの組み合わせは動作するので,移行などしなければハマることもなかったのですが...)
以前は,gem版のherokuを使っていて,tapsでデータベースを転送していました.
tapsを使って開発環境のデータベースをHerokuにインポートする - (゚∀゚)o彡 sasata299's blog
しかし,gem版のherokuをつかっていたら,こんなメッセージが出てきたので,Toolbeltに移行しました.

$ sudo gem install heroku
##   !    The `heroku` gem has been deprecated and replaced with the Heroku Toolbelt.
##   !    Download and install from: https://toolbelt.heroku.com
##   !    For API access, see: https://github.com/heroku/heroku.rb

もう古いからToolbeltに乗り換えなさい,とのことです.
Heroku Toolbelt
で,DLしてインストール後,tapsを使ってみると,うまくいかない.

$ heroku db:push postgres://pgsqladmin:(パスワード)@localhost/ytplaydb --app ytjuke
##    !    Taps Load Error: cannot load such file -- taps/operation
##    !    You may need to install or update the taps gem to use db commands.
##    !    On most systems this will be:
##    !    
##    !    sudo gem install taps

いや,インストールしてますけどもね.関連付けがうまくいっていないようです.
調べてみると,今は別の方法が推奨されているみたいです.
Using `pg:transfer` to Migrate Postgres Databases - Higher Order Heroku
これでやっと,うまくいきました.


本当にやりたかったメンテナンスは,これからです.