Installing PostgreSQL on Mac OS X 10.5 Leopard
Some Background
I'm a big fan of the compile-it-yourself approach to installing UNIX software under Mac OS X. I like the control it affords, and the ability to know exactly what I'm installing and where it is being installed.
This tutorial is an attempt to provide a comprehensive guide to the installation of PostgreSQL from source on the Mac. I've used this process on my own system, though software has a tendency to change quickly, so if some part of it fails to produce the expected outcome, please let me know.
Download and Compile the Source
Since we'll be compiling from source, you'll need to have the Mac OS X developer tools installed before proceding. If needed, they can found on your Mac OS X installation disc, or on Apple's developer site.
First, download and extract the PostgesSQL source code.
curl -O http://ftp7.us.postgresql.org/pub/postgresql/source/v8.3.4/postgresql-8.3.4.tar.gz
tar xzvf postgresql-8.3.4.tar.gz
Then, run the following from within the root of the source directory to configure, build, and install it:
cd postgresql-8.3.4
./configure --enable-thread-safety --with-bonjour
make
sudo make install
This will install PostrgreSQL 8.3.4, which was the latest version at the time of this writing. You may want to check for a more recent version and use that instead.
Create a User and Group
Leopard makes use of directory services for its user accounts and groups. While this is a powerful feature, it also makes some simple tasks—like creating new users—into a somewhat painful process.
First, you'll need to find an unused user and group ID. Use the following commands to list the IDs for the users and groups on your system.
dscl . -list /Groups PrimaryGroupID | awk '{print $2}' | sort -n
dscl . -list /Users UniqueID | awk '{print $2}' | sort -n
For the purposes of this tutorial, let's assume an ID of 113 for both the user and the group.
Since the Leopard convention is to prefix system accounts with an underscore, use the following commands to create a user called _postgres:
sudo dscl . create /Users/_postgres UniqueID 113
sudo dscl . create /Users/_postgres PrimaryGroupID 113
sudo dscl . create /Users/_postgres NFSHomeDirectory /usr/local/pgsql/
sudo dscl . create /Users/_postgres RealName "PostgreSQL Server"
sudo dscl . create /Users/_postgres Password "*"
sudo dscl . append /Users/_postgres RecordName postgres
Then, create the _postgres group:
sudo dscl . create /Groups/_postgres
sudo dscl . create /Groups/_postgres PrimaryGroupID 113
sudo dscl . append /Groups/_postgres RecordName postgres
sudo dscl . create /Groups/_postgres RealName "PostgreSQL Users"
Initialize the Database
While PostgreSQL has been installed at this point, it still needs to be initialized with an empty database and some default configuration files.
sudo mkdir /usr/local/pgsql/data
sudo chown postgres:postgres /usr/local/pgsql/data
cd /usr/local/pgsql/bin
sudo -u postgres ./initdb -D /usr/local/pgsql/data -U postgres -W -A md5
This will prompt you for the superuser password and initialize the authentication method to MD5.
Create a launchd Launch Agent
With Tiger, Apple introduced launchd as a replacement for init and xinetd in Mac OS X. In this case, the change makes our lives a little easier. In order to ensure that PostgreSQL is started up during boot, create the file /Library/LaunchDaemons/org.postgresql.postmaster.plist with the following contents:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>org.postgresql.postmaster</string>
<key>RunAtLoad</key>
<true />
<key>UserName</key>
<string>_postgres</string>
<key>GroupName</key>
<string>_postgres</string>
<key>EnvironmentVariables</key>
<dict>
<key>PGDATA</key>
<string>/usr/local/pgsql/data</string>
</dict>
<key>ProgramArguments</key>
<array>
<string>/usr/local/pgsql/bin/postmaster</string>
</array>
<key>StandardOutPath</key>
<string>/usr/local/pgsql/logfile</string>
<key>StandardErrorPath</key>
<string>/usr/local/pgsql/logfile</string>
</dict>
</plist>
Issuing this command will load the new launch agent and start up the server for the first time:
sudo launchctl load /Library/LaunchDaemons/org.postgresql.postmaster.plist
If you need to restart the daemon, use the following commands:
sudo launchctl stop org.postgresql.postmaster
sudo launchctl start org.postgresql.postmaster
Make Sure it Works
We'll now attempt to connect to the database. Enter your password when prompted.
/usr/local/pgsql/bin/psql -U postgres template1
You should then see a prompt that looks like this:
template1=#
Typing \q will exit the console.
Create a User and a Database
Creating users and databases can be done from the command line.
/usr/local/pgsql/bin/createuser -U postgres -S -d -R -P myuser
/usr/local/pgsql/bin/createdb -U myuser mydb
This will create a user named myuser that may create new databases, but is not a superuser and may not create new roles, and a new database named mydb that is owned by myuser.
Install the Ruby Gem
If you're a Ruby developer you may want to install the postgres gem, as well.
sudo env ARCHFLAGS='-arch i386' gem install postgres
The arch flag values should be set to ppc if you're not using an Intel Mac.
Use It
That should wrap things up. You now have a fully functional PostgreSQL installation that's ready for whatever schema you may throw at it next.