Roland's homepage

My random knot in the Web

Installing Plone via the unified installer

After having installed the plone CMS from ports and playing with it for a while, I found out that extensions can only really be added via the so-called buildout mechanism, which was kind of hard to understand if you don't use it in the first place! So I decided to ditch the install via ports, and go for a buildout in my server jail. The first step was to download the latest unified installer for the latest stable release (at the time of writing, Plone-3.3.5-UnifiedInstaller.tgz) from

For reasons mentioned in the following links, I decided to install as root, and to use the ZEO client/server setup. I did decide to use the libz library that is part of the base system, and the jpeg port that I already have installed instead of having the installer build separate copies.

The installation was pretty easy;

server# cd tmp
server# tar xf Plone-3.3.5-UnifiedInstaller.tgz
server# cd Plone-3.3.5-UnifiedInstaller/
server# ./ zeo --libz=no --libjpeg=no
Plone successfully installed at /usr/local/Plone
See /usr/local/Plone/zeocluster/README.txt
for startup instructions

Use the account information below to log into the Zope Management Interface
The account has full 'Manager' privileges.

  Username: admin
  Password: nAjPbZge

It is important to note this password. You'll need it to log in. As per instructions, I read the /usr/local/Plone/zeocluster/README.txt file. The first thing it advised me was to check /usr/local/Plone/zeocluster/buildout.cfg to see if I wanted to change anything. Since my server jail runs on a local IP address (, I edited buildout.cfg to change the zeo-address under the [buildout] heading from to Having read the documentation, I decided to also add the Products.CacheSetup egg CacheFu to make plone faster. These changes made it necessary to run ./bin/buildout, which automatically downloaded any needed components.

The installation process created a plone user and group on my system. Since the ZEO server wanted to run under its own user, I added a zeo user as well. I changed the entries in /etc/master.password so that they looked like this:

plone:*:1003:1003::0:0:Plone Admin:/var/empty:/usr/sbin/nologin
zeo:*:1004:1004::0:0:Zeo Server:/var/empty:/usr/sbin/nologin

(As always on FreeBSD after making changes to /etc/master.password, it is necessary to run the command pwd_mkdb -p /etc/master.passwd, see the pwd_mkdb manual page.)

It turned out the server (running as user zeo didn't have access to the directory /usr/local/Plone/zeocluster/var/zeoserver, where it wanted to put a PID-file and a logfile, because that was owned by root. Ditto for the /usr/local/Plone/zeocluster/var/filestorage directory. So I fixed that;

server# chown zeo /usr/local/Plone/zeocluster/var/zeoserver
server# chown zeo /usr/local/Plone/zeocluster/var/filestorage

Now I could start the server for the first time;

server# /usr/local/Plone/zeocluster/bin/plonectl start
zeoserver: . daemon process started, pid=39058
This is the first start of this instance.
Creating Data.fs and a Plone site.
We only need to do this once, but it takes some time.
Creating Plone site at /Plone in ZODB...
Installed Plone standard content
Finished adding Plone site
client1: . daemon process started, pid=39062
client2: . daemon process started, pid=39066

The site creation is only run once, so at the next start, you will only see the notifications of the server and clients startup.

To go to the site, I pointed my browser to

Stopping the server goes as follows;

server# /usr/local/Plone/zeocluster/bin/plonectl stop
zeoserver: . . . . . . . . . . daemon process stopped
client1: . . . . . daemon process stopped
client2: . . . . daemon process stopped

I'll be experimenting with building a site for documentation next.