subDimension

accessing PostgreSQL from a remote client

Previously I went through the steps I took to install and configure PostgreSQL. I set this up on my web server machine through SSH.

My Mac also has the psql client installed on it (out of the box!) but by default PostgreSQL is configured to refuse connections from remote hosts.

Changing this was fairly simple, although I did encounter one gotcha.

First, you need to change the server config file to tell PostgreSQL where to listen, I found mine in /etc/postgresql/8.4/main/postgresql.conf, about 3 ‘screens’ down is this line:

#listen_addresses = 'localhost'         # what IP address(es) to listen on;
                                        # comma-separated list of addresses;
                                        # defaults to 'localhost', '*' = all
                                        # (change requires restart)

I removed the # and rather than changing localhost to *, I entered the external IP of the server. It doesn’t really make a lot of difference, but I try to keep things as specific as I can (when I remember).

The last comment was the gotcha. It took me a few round-trips and puzzled stares until I realised that this is the difference between:

$ sudo /etc/init.d/postgresql reload

and:

$ sudo /etc/init.d/postgresql restart

for some applications, these are synonyms, but not this one.

our old friend /etc/postgresql/8.4/main/pg_hba.conf also needs tweaking to tell PostgreSQL what kind of users to let in:

# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD

# "local" is for Unix domain socket connections only
local   all         all                               ident
# IPv4 local connections:
host    all         all         198.51.100.0/32       md5
#host   all         all         127.0.0.1/32          md5

198.51.100.0 is my home static IP (it’s not actually, but that’s where I typed my actual IP address) so only connections from my home network will be let in. This time, just reloading the config works for these settings:

$ sudo /etc/init.d/postgresql reload

Now I can connect to my database directly, rather than having to SSH in first. I’m not sure it makes much difference in the grand scheme of things, but it feels neater.