rails から PostgreSQL にアクセスできる設定を行う。
まず、pgadmin からアクセスできるようにしよう。
デフォルトでは postgres ユーザのパスワードが分からないので、パスワードを設定する。
sudo passwd postgres で好きなパスワードを設定する。(今回は仮に12345とする)
次に su - postgres で postgres ユーザになり、PostgreSQL にログインする。
$ psql template1
template1 =# alter user postgres with password '12345';
template1 =# \q
つまり、パスワードを合わせておくということ。
これで pgadmin を立ち上げると postgres ユーザとして localhost のサーバを登録できるはず。
せっかくなので、ここでデータベースとログインロールを作っておこう。
pgadmin から GUI で作ることもできる。(割愛)
postgres ユーザで psql でログイン。
psql =# createdb test;
psql =# create role rails with login password '98765';
psql =# \q
先に rails のプロジェクトも作っておこう。
$ rails test -d postgresql
database.yml を変更しておこう。
development:
adapter: postgresql
encoding: utf8
database: test
pool: 5
username: rails
password: 98765
次に pg_hba.conf を修正する。
ファイルは /etc/postgresql/8.4/main/pg_hba.conf にあった。
見つからない場合、sudo find / "pg_hba.conf" -type f でもやってみよう。
sudo vim /etc/postgresql/8.4/main/pg_hba.conf と vim を起動する。
すると下記のような設定になっていた。
# Database administrative login by UNIX sockets
local all postgres ident
# "local" is for Unix domain socket connections only
local all all ident
# IPv4 local connections:
host all all 127.0.0.1/32 md5
# IPv6 local connections:
host all all ::1/128 md5
このままではパスワードでログインできないので、パスワードでログインできるように設定する。
で、ここでハマった。
事前調査の結果、"rails では TCP socket でアクセスするので、local じゃなくて host を変更する"と認識していた。
#host all all 127.0.0.1/32 md5
host all all 127.0.0.1/32 password
と変更すればいい、って情報があったのでこの一行を編集し PostgreSQL を再起動した。
$ sudo /etc/init.d/postgresql-8.4 restart
しかし、マイグレーションが失敗する。
手動でテーブル作って、script/console からデータの登録や取得をしようとしても失敗する。
で、悩みつつあれこれトライ&エラーを繰り返してみた結果、結局こういうことだった。
・database.yml で host: localhost 設定がされていれば、TCP socket を使用する。
・host: localhost 設定がされていない(host 設定がない)場合、UNIX socket を使用する。
つまり、デフォルトで作られた設定ファイルには host 設定がなかったので、
local all all ident
の設定で接続しようとしていた。
#local all all ident
local all all password
と変更してやると、接続できマイグレーションも実行できた。
しかし、開発環境は別にどちらでもいいが、本番などは外部サーバにアクセスすることも多々あるし、一律 TCP での設定にしておいたほうがいいかなーと思ったので、database.yml に host: localhost の設定を追加して、host 設定の方を password にすることにした。
これで、rails から PostgreSQL に接続する設定(+α)は終了。