2010/05/15

ubuntu 10.04 に rails 開発環境を作る - PostgreSQL 設定編

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 に接続する設定(+α)は終了。

0 件のコメント :

コメントを投稿