In Lion Server Apple has moved from MySQL to PostgreSQL. You may find yourself in a situation as I have where you wish to use a web application that requires a database (WordPress for example), but don't wish to install MySQL when the PostgreSQL server you have will do fine. There are a number of sources out there on how to get this done, but the information seems to be scattered across different corners of the internet. In particular these two links contain all the information included in this post, but sifting through them was a bit of a pain for me. For this reason I thought I would give my take on how to get this done.
In short we are going to get PostgreSQL up and running, create a super user, create a new database to be used with an application, create a user for that application, and finally give that user access to the database. A quick note, throughout the code in this article you will find entries that are prepended by either lionserver:~ or databasename=#, these are command prompts and are not meant to be typed in, but rather serve to distinguish commands from output.
First up we need to make sure that the PostgreSQL server is running. We're going to do this with the command serveradmin. serveradmin is a command line tool that allows you to control the various services that Lion Server has to offer. In case you haven't used this tool before lets get a flavor of how it works.
lionserver:~ serveradmin
Usage: serveradmin [-dhvx] [list | start | stop | status | fullstatus | settings | command] [ [ = ]]
-h, --help display this message
-v, --version display version info
-d, --debug print command
-x, --xml print output as XML plist
Examples:
serveradmin list
--Lists all services
serveradmin start afp
--Starts afp server
serveradmin stop ftp
--Stops ftp server
serveradmin status web
--Returns current status of the web server
serveradmin fullstatus web
--Returns more complete status of the web server
serveradmin settings afp
--Returns all afp configuration parameters
serveradmin settings afp:guestAccess
--Returns afp guestAccess attribute
serveradmin settings afp:guestAccess = yes
--Sets afp guestAccess to true
serveradmin settings
--Takes settings commands like above from stdin
serveradmin command afp:command = getConnectedUsers
--Used to perform service specific commands
serveradmin command
--Takes stdin to define generic command that requires other parameters
Ok that's great now we see that there is a list function lets try that.
lionserver:~ serveradmin list
serveradmin must be run as root
That's ok, we just need to run this command with a sudo
.
lionserver:~ sudo serveradmin list
Password:
accounts
addressbook
afp
bonjour
calendar
certs
config
devicemgr
dhcp
dirserv
dns
filebrowser
info
ipfilter
jabber
mail
nat
netboot
network
nfs
notification
pcast
pcastlibrary
postgres
radius
sharing
signaler
smb
swupdate
vpn
web
wiki
xgrid
xsan
There it is the service is called postgres. Remember when we took a look how the command worked? The usage info told us that we can start services, let's try that.
lionserver:~ sudo serveradmin start postgres
postgres:state = "RUNNING"
And now PostgreSQL is running! Great, now comes the tricky part. Lion Server
has a special user that has access to the PostgreSQL server, the user name is
_postgres
. But personally I don’t want to have to remember to log in as this
other user every time I want to manipulate PostgreSQL. So let's create a
PostgreSQL user for our username. First we need to log into PostgreSQL
lionserver:~ sudo -u _postgres psql template1
Then once in PostgreSQL we are going to create a role with the same username as
our login, for the purposes of this tutorial we will use username and a
randomly generated password QEGNRWXvxewJ42LdD. Then we will exit out of
PostgreSQL with the \q
command.
template1=# CREATE ROLE username WITH superuser password 'QEGNRWXvxewJ42LdD';
template1=# \q
Next we want to add our login username to the PostgreSQL Users Group. The
easiest way to do this is to download the Server Admin Tools package. Launch
the tool and launch the Workgroups application, in the menu bar click View ->
Workgroups. You will need to login with an administrator account. Then in the
Workgroups application you will click View -> Show System Records. This will
expand the visible list to show everything. Find your login user, and then
click the Groups Tab. Find the PostgreSQL Users group and add it. Now you can
execute the psql
command without fiddling around with the _postgres
user.
By default, Lion Server will launch the postgres service with the option
listen_addresses=""
, but our web app needs to connect to the service through
an IP address. So fire up your favorite text editor and point it towards
/System/Library/LaunchDaemons/org.postgresql.postgres.plist
. In this file you
want to hunt down the line,
listen_addresses=
and replace it with
listen_addresses="127.0.0.1"
Finally we are ready to create our database and application user. Your particular web application may have its own directions on this, if so you should be done with this tutorial. But we will continue to complete a database setup for WordPress.
We'll create our database with the convenient command createdb
, create
wordpressuser
with the command createuser
and then login to the database.
lionserver:~ createdb wordpressdb
lionserver:~ createuser
Enter name of role to add: wordpressuser
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) n
Shall the new role be allowed to create more new roles? (y/n) n
lionserver:~ psql -d wordpressdb
Once in PostgreSQL we'll give wordpressuser
permissions on wordpressdb
and assign a randomly generated password.
wordpressdb=# GRANT ALL privileges ON DATABASE wordpressdb TO wordpressuse;
wordpressdb=# ALTER ROLE wordpressuser password 'NvUrYgnz4DRfbXm7y';
wordpressdb=# \q
And we’re done!