Installing PostgreSQL for Rails 3.1 on Lion

Average reading time is

Instructions for installing and configuring PostgreSQL on a fresh Lion installation for use in Rails 3.1

I recently tried to generate a new Rails 3.1 application based on PostgreSQL on a fresh installation of Lion, and ran into a nasty permission denied issue.

After piecing together the full solution, I thought a blog post might be helpful for anyone else attempting the same task. The overview of the problem is that Lion now ships with a PostgreSQL server, so you have to jump through a couple of hoops if you want to use the one provided by Homebrew.

Problem!

I started by installing PostgreSQL through Homebrew:

# brew install postgresql
# initdb /usr/local/var/postgres
# mkdir -p ~/Library/LaunchAgents
# cp /usr/local/Cellar/postgresql/9.0.4/org.postgresql.postgres.plist ~/Library/LaunchAgents/
# launchctl load -w ~/Library/LaunchAgents/org.postgresql.postgres.plist

And then I generated a new Rails 3.1 application, configured to use the PostgreSQL adapter:

# rails new myapp -D postgresql
  ...bunch of stuff...
  run bundle install (which installs the pg gem)

I started to see signs of woe when the PostgreSQL commandline tools failed:

createuser myapp -s
createuser: could not connect to database postgres: could not connect to server: Permission denied
    Is the server running locally and accepting
    connections on Unix domain socket "/var/pgsql_socket/.s.PGSQL.5432"?

…and, when seeing this in the logs after starting the rails server:

PGError (could not connect to server: Permission denied
	Is the server running locally and accepting
	connections on Unix domain socket "/var/pgsql_socket/.s.PGSQL.5432"?
):

Solution!

Well, I figured out the problem after a bunch of googling. Turns out I had two PostgreSQL servers stomping on each other. The solution is two simple steps, but the order is important!

Step one: update the path to give preference to the Homebrew PostgreSQL installation. My $PATH statement in my .bashrc looked like this:

PATH=$PATH:/usr/local/bin

But /usr/local/bin needs to be first:

PATH=/usr/local/bin:$PATH

Now createuser works (since we're calling the right one), but that won't fix the rails server connection issue. Turns out pg saw the system server when we installed it. So the second step is simply to reinstall pg:

gem uninstall pg
gem install pg

And life was again happy.

Much love to the Stack Overflow conversation that suggested most of this solution.

Feel free to submit corrections via github