Railsのproduction環境のDB周りでハマった
未解決。 一応解決した。続き記事は末尾。
よくわからなすぎて悲しい気持ちになってきたのでこれメモって寝る。
明日起きたら解決策閃いてたらいいな。
環境
$ cat /etc/redhat-release CentOS release 6.6 (Final) $ bundle exec ruby -v ruby 2.2.0p0 (2014-12-25 revision 49005) [x86_64-linux] $ bundle exec rails -v Rails 4.2.1
事象
これが失敗する。(以下、ユーザ名・パスワード等一部加工してる)
$ bin/rake db:migrate RAILS_ENV=production rake aborted! Mysql2::Error: Access denied for user 'myuser'@'localhost' (using password: YES) -e:1:in `<main>' Tasks: TOP => db:migrate (See full trace by running task with --trace)
production環境では$DATABASE_URL
で接続内容を設定したいのに、database.ymlのdefault
部分の値(development,test環境で使用しているユーザ名やパスワード)が使われている。その結果、production環境ではこれらのユーザは未作成のため失敗してる。
database.yml(抜粋)
default: &default adapter: mysql2 encoding: utf8 pool: 5 username: myuser password: myuserpass socket: /tmp/mysql.sock ... production: <<: *default url: <%= ENV['DATABASE_URL'] %> socket: /var/lib/mysql/mysql.sock
$DATABASE_URL
の値
$ echo $DATABASE_URL mysql2://productionuser:productionpass@localhost/production_database
謎なのは、このままの設定でdb:create
は成功すること。
$ bin/rake db:create RAILS_ENV=production (0.4ms) CREATE DATABASE `production_database` DEFAULT CHARACTER SET `utf8` COLLATE `utf8_unicode_ci`
db:create
とdb:migrate
ではこの辺挙動が違うのだろうか?
試しにusername, passwordをコメントアウトしてみると、エラー内容が
Mysql2::Error: Access denied for user 'root'@'localhost' (using password: NO)
という感じになる。
もちろんproduction:
以下にusername, password, databaseをベタ書きすればうまくいくのかもしれないけど、そうじゃない感。
解決策
なぞ。
もう今日は元気ないので明日は以下を読むとこから始めよう。。
Rails アプリケーションを設定する — Rails ガイド
まとめ
なんか疲れてて単純ミスのような気もするし、自力では解決困難なガチのやつの気もする。誰か助けてください。。