何の話?
CentOS 8 + Apache 2.4 + Phusion Passenger 6.0 で,ActiveRecord を使った Sinatra アプリを動かしていた。
Ruby のバージョンは 2.7.1 だが,たぶんこのバージョンはあまり関係無い。
Passenger 6.0.4 では動いていたのに 6.0.6 では,本番(production)環境で起動すらしなくなった。
手許(ローカル)ではちゃんと動作している。
Apache のエラーログ(/var/log/httpd/error_log)には以下のように出ていた。
'production' database is not configured. Available: [] (ActiveRecord::AdapterNotSpecified)
原因
どうも Passenger 6.0.5 で導入された変更が原因のようだ。
ここに issue が上がっている。
https://github.com/phusion/passenger/issues/2281
同様の問題は Sinatra 以外でも起こりうるが,Rails では起こらない(たぶん)。
死んだコード
件の Sinatra アプリは,SQLite3 データベースにあらかじめ入れておいたデータを検索して表示するだけのごく簡単なもの。
データベースファイルは,とくに production 用とか development 用とか分けていない。
接続のところは
ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: db_file)
てな感じに書いていた。
ローカル変数 db_file
には,SQLite3 ファイルのパスが代入されている。
修正
どうも,ActiveRecord::Base.configurations
をセットしてやらなければならないようなので,上記を
ActiveRecord::Base.configurations = {
"production" => {"adapter" => "sqlite3", "database" => db_file },
"development" => {"adapter" => "sqlite3", "database" => db_file },
}
ActiveRecord::Base.establish_connection
のように変えた。
これで本番環境でも動くようになった。