Zotonic has the capability of serving more than one site at a time. You can have multiple sites enabled, each with its own set of templates, database and dispatch rules. Each site has its own hostname.
Create a site
First, prepare the database. In your terminal, connect to PostgreSQL:
$ sudo -u postgres psql (enter your OS password)
And create a database user for Zotonic. You may want to change the password:
postgres=# CREATE USER zotonic WITH PASSWORD 'zotonic';
Now, either give this user create rights to have Zotonic automatically create the database for you (recommended):
postgres=# ALTER USER zotonic CREATEDB;
Or create the site database manually:
postgres=# CREATE DATABASE zotonic WITH OWNER = zotonic ENCODING = 'UTF8';
postgres=# GRANT ALL ON DATABASE zotonic TO zotonic;
And quit postgres:
Now that there is a database Zotonic can be started. We do this in debug mode so that all console output is visible:
$ bin/zotonic debug
In a new terminal window, edit your
/etc/hosts file, adding an entry for
site hostname) to point at your local host:
Create a new Zotonic site, based on the ‘blog’ skeleton site:
$ bin/zotonic addsite -s blog yoursite
Finally, point your browser to https://yoursite.test:8443 to see your new site.
The browser will ask to accept a self-signed certificate. Zotonic generates a
self-signed certificate for every site. These are stored in
You can log into the admin at https://yoursite.test:8443/admin using the username
with the password that you can find in your site’s configuration. Use for this the command:
$ bin/zotonic siteconfig yoursite
The configuration is stored in the file
in the zotonic user directory.
You can stop Zotonic by typing twice Ctrl-C at the Erlang command prompt.
If you want to start Zotonic in the background then use:
$ bin/zotonic start
This can be stopped with:
$ bin/zotonic stop
Anatomy of a site
A Zotonic site is a folder which lives in the zotonic user directory and contains at least:
priv/zotonic_site.configfile: sets the site’s hostname and other parameters
src/sitename.erlfile: initialises the site.
src/sitename.app.srcfile: an OTP app source file
In fact, a site is a special type of module. Like modules, sites usually contain additional resources such as templates, dispatch rules and data . Unlike modules, however, sites have their own hostname and database connection.