light log

学んだこととか

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:createdb:migrateではこの辺挙動が違うのだろうか?

試しにusername, passwordをコメントアウトしてみると、エラー内容が

Mysql2::Error: Access denied for user 'root'@'localhost' (using password: NO)

という感じになる。

もちろんproduction:以下にusername, password, databaseをベタ書きすればうまくいくのかもしれないけど、そうじゃない感。

解決策

なぞ。

もう今日は元気ないので明日は以下を読むとこから始めよう。。

Rails アプリケーションを設定する — Rails ガイド

まとめ

なんか疲れてて単純ミスのような気もするし、自力では解決困難なガチのやつの気もする。誰か助けてください。。

続き書いた

yamacent.hatenablog.com