herokuのDBがデフォルトというか無料で使えるのがPostgreSQLで、環境を揃えるのと今までSQLite3とMySQLしか使った事しかなかったので勉強のためにPostgreSQLをセットアップする。

2015/01/20:以前より理解が深まったので加筆・修正しました

環境は

  • Ubuntu 14.04 LTS(vagrant+virtualbox)
  • PostgreSQL 9.3.5
  • Ruby 2.1.5
  • Rails 4.1.8
// PostgreSQLをインストール
$ sudo apt-get install postgresql

// 無事インストールできたらバージョンを確認
$ psql --version // psql (PostgreSQL) 9.3.5

postgresqlのスーパーユーザーであるpostgresユーザーを新しく作る。

// ユーザーを作成する
$ sudo passwd postgres

// パスワードを設定しろと言われるので、入力する
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully

更にUbuntuの中のpostgresユーザーのパスワード設定以外にデータベースのユーザーのパスワードを設定する必要がある(上のsudo passwd postgresの他に設定する必要がある)

// ユーザーをpostgresに切り替える
$ su postgres

// PostgreSQLに接続する
$ psql
psql (9.3.5)
Type "help" for help.

// データベースのパスワードを設定する
postgres=# alter user postgres with password 'password';

// 「ALTER ROLE」と表示されたらok
ALTER ROLE

// データベースを抜ける
$ \q

PostgreSQL自体はインストールしたので、Railsのプロジェクトに移動し、develop環境のsqlite3などを外したりして、bundle installしてみる。(ちなみにこの時、postgresユーザーのままで「bundleつかえねーから」と言われて、「えっ?」と戸惑う。exitでvagrantユーザーに戻った)

source 'https://rubygems.org'
ruby '2.1.5'

gem 'rails', '4.1.8'
gem 'pg', '0.15.1'

gem 'sass-rails', '~> 4.0.3'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.0.0'
gem 'jquery-rails'
gem 'turbolinks'
gem 'jbuilder', '~> 2.0'

group :test do
  gem 'selenium-webdriver', '2.35.1'
  gem 'capybara', '2.1.0'
end

group :doc do
  gem 'sdoc', '~> 0.4.0'
end

group :development do
  gem 'spring'
  gem 'rspec-rails', '2.13.1'
end

group :production do
  gem 'rails_12factor', '0.0.2'
end

しかしこれが転ける。

Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    /home/vagrant/.rbenv/versions/2.1.5/bin/ruby extconf.rb
checking for pg_config... yes
Using config values from /usr/bin/pg_config
You need to install postgresql-server-dev-X.Y for building a server-side extension or libpq-dev for building a client-side application.
You need to install postgresql-server-dev-X.Y for building a server-side extension or libpq-dev for building a client-side application.
checking for libpq-fe.h... no
Can't find the 'libpq-fe.h header
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

checking for libpq-fe.hとやらが無いと怒られた。読んでみると「You need to install postgresql-server-dev-X.Y for building a server-side extension or libpq-dev for building a client-side application.You need to install postgresql-server-dev-X.Y for building a server-side extension or libpq-dev for building a client-side application.」と重要な事なので2回言われてる。なのでクライアントサイドの案内に書いてあるlibpq-devを入れてみる。

$ sudo apt-get install libpq-dev

インストールできたら再度bundle install

Your bundle is complete!
Gems in the group production were not installed.
Use `bundle show [gemname]` to see where a bundled gem is installed.

gemは無事インストールが完了した。

で、Railsのconfig/database.ymlを編集する。余談だけどdatabase.ymlってデフォルトだと全部SQLite3。だけどheroku pushするとPostgreSQL使うんだね。だったら極端な話、herokuしか使う気がないならproduction部分書かなくてもいいんじゃw

default: &default
  adapter: postgresql
  encoding: utf8
  pool: 5
  timeout: 5000

development:
  <<: *default
  database: RAILS_APP_NAME_development
  username: 
  password: 

当然だけどusernameとpasswordは設定したユーザー名などを入力する。このパスワードは先ほどpsqlで接続した時に設定したデータベースユーザーのパスワードなので要注意。

今はherokuに上げるつもりだからユーザー名とか全然適当に済ましてるけど、他のサーバーに自分でデプロイとかする場合はしっかりユーザーとパスワードを設定した方が良いね。

で、これでrake db:createしようとしたらまたエラー。

Couldn't create database for {"adapter"=>"postgresql", "encoding"=>"utf8", "pool"=>5, "timeout"=>5000, "database"=>"RAILS_APP_NAME_development", "username"=>USERNAME, "password"=>PASSWORD}

おう……。なかなかうまく行かせてくれないね。

調べてみると、/etc/postgresql/9.3/main/pg_hba.confの中身を編集しないといけないらしい。

$ sudo vim /etc/postgresql/9.3/main/pg_hba.conf

そうすると、local all postgres peerとかlocal all all peerとか色々書いてある。これをmd5にしろだのtrustにしろだの色々な設定の仕方が載っていて焦る。

左辺はアクセス元の情報か。ローカルだったら○○、外部からだったらみたいな○○みたいな設定ができそう。右辺のpeerというのは存在するデータベースユーザーならログインできる状態で、md5というのがパスワード必須な状態というかユーザーとパスワードがあってれば接続できる。trustは誰でも何でも接続できるといった具合か?

Railsで使うにはmd5が良いみたいなので、peerとなっている部分をmd5に変更してみる。

そしてこの後またrake db:createで転けてる。

「うーん……うーん……」と色々再起動とかやっててようやく分かったのが、再起動とかした後だけど、設定をしっかりリロードしないといけない事だった。

$ sudo service postgresql reload

これでようやくrake db:createが実行できた!やった!結構大変だったよorz

$rake db:create
$rake db:migrate
$rails s

無事Railsの起動を確認。はー、なかなか大変だった。けど、これでメジャーなSQLite3、MySQL、PostgreSQLは開発環境で動かせるようになった。herokuに上げる前提だったらこれからはPostgreSQLで開発しよう。その時はrails new APP_NAME -d postgresqlで。