mirror of
https://github.com/jwinterm/modoboa.git
synced 2026-10-17 05:41:25 +02:00
Removed useless attempt to update DomainAdmins group with correct permissions (it is done when fixtures are loaded).
588 lines
18 KiB
Plaintext
588 lines
18 KiB
Plaintext
Installation
|
|
============
|
|
|
|
Requirements
|
|
------------
|
|
|
|
- Python version 2.6+
|
|
- `Django version 1.2+ <http://docs.djangoproject.com/en/dev/intro/install/#intro-install>`_
|
|
- `south version 0.7+ <http://south.aeracode.org/>`_
|
|
|
|
For extensions (mandatories since 0.8.2):
|
|
|
|
- `mysqldb python module <http://mysql-python.sourceforge.net/>`_
|
|
- `lxml python module <http://codespeak.net/lxml/>`_
|
|
- `pycrypto python module <http://www.dlitz.net/software/pycrypto/>`_
|
|
- `rrdtool python binding <http://oss.oetiker.ch/rrdtool/>`_
|
|
- `ckeditor version 3.4.1+ <http://ckeditor.com/>`_
|
|
|
|
How to install
|
|
--------------
|
|
|
|
Download the latest Modoboa's tarball and extract it::
|
|
|
|
$ tar xzf modoboa-<version>.tar.gz
|
|
$ mv modoboa-<version> modoboa
|
|
|
|
Then, enter the *modoboa* directory, create a *settings.py* file (you can
|
|
use *settings-sample.py* as a model). Specify database relative
|
|
informations. You must choose between mysql and postgresql, other
|
|
types are not supported by major email projects like *postfix* or
|
|
*dovecot*.
|
|
|
|
Create a database with the name you specified in *settings.py*. Make
|
|
sure your database is using UTF8 as a default charset. If not, you
|
|
will surely have problems (with MySQL at least). You will probably
|
|
need to install a python database backend (like MySQLdb).
|
|
|
|
Initialize the database by running the following command::
|
|
|
|
$ python manage.py syncdb
|
|
|
|
It will let you create the default super adminstrator.
|
|
|
|
Since version 0.8, Modoboa is using *south* to handle schema
|
|
migrations. To finish the database initialization, you must
|
|
apply existing migrations like this::
|
|
|
|
$ python manage.py migrate
|
|
|
|
Time zone and language
|
|
^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
Modoboa is available in english, french and german. You can choose
|
|
which language to use by modifying the ``LANGUAGE_CODE`` variable inside
|
|
*settings.py*::
|
|
|
|
LANGUAGE_CODE = 'en-US' # English
|
|
# or
|
|
LANGUAGE_CODE = 'fr-FR' # French
|
|
# or
|
|
LANGUAGE_CODE = 'de-DE' # German
|
|
|
|
You can also specify your time zone by modifying the ``TIME_ZONE``
|
|
variable. For example::
|
|
|
|
TIME_ZONE = 'Europe/Paris'
|
|
|
|
Host configuration
|
|
^^^^^^^^^^^^^^^^^^
|
|
|
|
Before using Modoboa, you must create a group and a user that will be
|
|
used to store emails on the host filesystem. There is only one
|
|
group/user needed because we are in a virtual hosting configuration
|
|
(ie. users with non-UNIX accounts).
|
|
|
|
For example, create a vmail group::
|
|
|
|
$ groupadd vmail
|
|
|
|
Then create a vmail user::
|
|
|
|
$ useradd -g vmail -d /var/vmail -m vmail
|
|
|
|
At last, the system user used to run modoboa will need permissions to
|
|
manipulate directories in vmail's homedir. To do so, edit the */etc/sudoers*
|
|
file and add the following inside::
|
|
|
|
<user_that_runs_modoboa> ALL=(vmail) NOPASSWD: ALL
|
|
|
|
Testing installation
|
|
^^^^^^^^^^^^^^^^^^^^
|
|
|
|
As a typical Django application, Modoboa can be tested using a simple web
|
|
server. Just run this command to start it::
|
|
|
|
$ python manage.py runserver
|
|
|
|
You will be able to play with Modoboa by looking at
|
|
http://<youraddress>:8000/modoboa/admin/.
|
|
|
|
How to upgrade
|
|
--------------
|
|
|
|
First, decompress the new tarball at the same location than your
|
|
current installation. Then, check if the new version you're installing
|
|
requires a migration.
|
|
|
|
**NB: Before executing a schema migration, I recommend that you make a copy of your
|
|
existing database.**
|
|
|
|
0.8.3: admin application refactoring and more
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
#. Migrate the *admin* application::
|
|
|
|
$ python manage.py migrate admin
|
|
|
|
|
|
0.8.2: ckeditor integration and more
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
#. Migrate the admin applicaton::
|
|
|
|
$ python manage.py migrate admin
|
|
|
|
#. Update your config file and add all extensions to ``INSTALLED_APPS``
|
|
(even those you are not going to use).
|
|
#. Inside the *<modoboa_dir>/templates/* directory, remove all symbolic links.
|
|
#. Download the latest release of ckeditor and extract it into *<modoboa_dir>/static/js/*. It should create a new directory named *ckeditor*.
|
|
#. Update the following variables inside *settings.py*::
|
|
|
|
MEDIA_ROOT = os.path.join(MODOBOA_DIR, '/static')
|
|
MEDIA_URL = '/static/'
|
|
|
|
#. Then, add the following variable: ``MODOBOA_WEBPATH = 'modoboa/'``
|
|
#. Delete the following variables: ``STATIC_ROOTDIR`` and
|
|
``TEMPLATE_CONTEXT_PROCESSORS``.
|
|
#. Finally, add ``modoboa.lib.middleware.ExtControlMiddleware`` to
|
|
``MIDDLEWARE_CLASSES``.
|
|
|
|
0.8.1 : project renamed
|
|
^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
#. First, rename the *mailng* directory to *modoboa* and copy all the
|
|
content from *modoboa-0.8.1* to *modoboa*.
|
|
#. Edit *settings.py* and replace all occurences of mailng by
|
|
modoboa. Make sure you don't modify the ``DATABASE`` section as you're
|
|
not going to rename your database.
|
|
#. Rename the ``MAILNG_DIR`` variable to ``MODOBOA_DIR``.
|
|
#. Add ``'django.contrib.messages.middleware.MessageMiddleware'`` to
|
|
``MIDDLEWARE_CLASSES`` and ``'django.contrib.messages'`` to
|
|
``INSTALLED_APPS``. Save your modifications.
|
|
#. Run the following command::
|
|
|
|
$ python manage.py syncdb
|
|
|
|
#. For all activated extensions, run the following command::
|
|
|
|
$ export PYTHONPATH=<modoboa_dir>/..=
|
|
$ DJANGO_SETTINGS_MODULE=modoboa.settings <modoboa_dir>/scripts/extension.py <extension> on
|
|
|
|
#. Update your webserver configuration and restart it.
|
|
|
|
0.8 : SQL migration needed
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
Before you start the migration, make sure you have updated your
|
|
``INSTALLED_APPS`` variable and that it contains at least::
|
|
|
|
INSTALLED_APPS = (
|
|
# Django's stuff before
|
|
|
|
'south',
|
|
'mailng',
|
|
'mailng.lib',
|
|
'mailng.admin',
|
|
'mailng.userprefs',
|
|
)
|
|
|
|
Starting with 0.8, mailng.main doesn't exist anymore. You must remove
|
|
it from your ``INSTALLED_APPS``.
|
|
|
|
Finally, run the following commands::
|
|
|
|
$ python manage.py syncdb
|
|
$ python manage.py convert_to_south
|
|
$ python manage.py migrate --all 0001 --fake
|
|
$ python manage.py migrate --all 0002
|
|
|
|
0.7 : no SQL modifications
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
0.6 : no SQL modifications
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
Integrating Modoboa with other softwares
|
|
========================================
|
|
|
|
Postfix
|
|
-------
|
|
|
|
First, define the following map files on your server (it should work with
|
|
*postfix* versions >= 2.2):
|
|
|
|
``/etc/postfix/sql-domains.cf``::
|
|
|
|
user = <user>
|
|
password = <password>
|
|
dbname = <database>
|
|
hosts = 127.0.0.1
|
|
query = SELECT name FROM admin_domain WHERE name='%s' AND enabled='1'
|
|
|
|
``/etc/postfix/sql-mailboxes.cf``::
|
|
|
|
user = <user>
|
|
password = <password>
|
|
dbname = <database>
|
|
hosts = 127.0.0.1
|
|
query = SELECT path FROM admin_mailbox WHERE full_address = '%s'
|
|
|
|
``/etc/postfix/sql-aliases.cf``::
|
|
|
|
user = <user>
|
|
password = <password>
|
|
dbname = <database>
|
|
hosts = 127.0.0.1
|
|
query = SELECT t3.full_address FROM admin_alias AS t1, admin_alias_mboxes AS t2, admin_mailbox AS t3 WHERE t1.full_address='%s' AND t1.id=t2.alias_id AND t2.mailbox_id=t3.id AND t1.enabled='1'
|
|
|
|
Then, use the following configuration in the */etc/postfix/main.cf* file
|
|
(this is just one possible configuration)::
|
|
|
|
# Stuff before
|
|
mailbox_transport = virtual
|
|
home_mailbox = .maildir/
|
|
maildrop_destination_recipient_limit = 1
|
|
virtual_minimum_uid = <vmail user id>
|
|
virtual_gid_maps = static:<vmail group id>
|
|
virtual_uid_maps = static:<vmail user id>
|
|
virtual_mailbox_base = /var/vmail
|
|
|
|
relay_domains =
|
|
virtual_mailbox_domains = mysql:/etc/postfix/sql-domains.cf
|
|
virtual_mailbox_maps = mysql:/etc/postfix/sql-mailboxes.cf
|
|
virtual_alias_maps = mysql:/etc/postfix/sql-aliases.cf
|
|
# Stuff after
|
|
|
|
NB: Modoboa supports both maildir and mbox formats. You can specify
|
|
which format to use by modifying the MAILBOX_TYPE parameter available
|
|
in the admin panel.
|
|
|
|
Dovecot
|
|
-------
|
|
|
|
If you are using the *maildir* format to store mailboxes, add the
|
|
following line into Dovecot's main config file
|
|
(*/etc/dovecot/dovecot.conf*)::
|
|
|
|
mail_location = maildir:<path_to_mailboxes>/%d/%n/.maildir
|
|
|
|
If you are using the mbox format, add the following::
|
|
|
|
mail_location = mbox:<path_to_mailboxes>/%d/%n/:INBOX=<path_to_mailboxes>/%d/%n/Inbox
|
|
|
|
To make the authentication work, edit *dovecot.conf* and add the
|
|
following content inside::
|
|
|
|
auth default {
|
|
# ... stuff before
|
|
|
|
passdb sql {
|
|
# Path for SQL configuration file, see /etc/dovecot/dovecot-sql.conf for
|
|
# example
|
|
args = /etc/dovecot/dovecot-sql.conf
|
|
}
|
|
|
|
userdb sql {
|
|
# Path for SQL configuration file
|
|
args = /etc/dovecot/dovecot-sql.conf
|
|
}
|
|
|
|
# ... stuff after
|
|
}
|
|
|
|
Be sure to activate only one backend (per type) inside your configuration
|
|
(just comment the other ones).
|
|
|
|
Then, edit your */etc/dovecot/dovecot-sql.conf* and modify following lines::
|
|
|
|
driver = mysql
|
|
connect = host=<mysqld socket> dbname=<database> user=<user> password=<password>
|
|
default_pass_scheme = CRYPT
|
|
password_query = SELECT full_address AS user, password FROM admin_mailbox WHERE full_address = '%u'
|
|
user_query = SELECT path AS home, uid, gid FROM admin_mailbox WHERE full_address = '%u'
|
|
|
|
Enable quotas support
|
|
^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
Put the following lines inside the *dovecot.conf* file::
|
|
|
|
protocol imap {
|
|
mail_plugins = quota imap_quota
|
|
}
|
|
|
|
Before continuing, you need to know which quota backend must be used
|
|
(function of mailboxes format):
|
|
|
|
* mbox : backend=dirsize,
|
|
* maildir : backend=maildir.
|
|
|
|
If you use version prior to 1.1, add also the following configuration::
|
|
|
|
plugin {
|
|
# 10 MB default quota limit
|
|
quota = <backend>:storage=10240
|
|
}
|
|
|
|
Then, modify the above query inside *dovecot-sql.conf* as follow to
|
|
activate per user quotas::
|
|
|
|
user_query = SELECT path AS home, uid, gid, concat('<backend>:storage=', quota / 1024) AS quota FROM admin_mailbox WHERE full_address = '%u'
|
|
|
|
If you are not using MySQL, you will have to replace the ``concat``
|
|
function call with something working with your database.
|
|
|
|
For version >= 1.1, put the following configuration inside the *dovecot.conf* file::
|
|
|
|
plugin {
|
|
# Default 10M storage limit with an extra 5M limit when saving to Trash.
|
|
quota = <backend>:User quota
|
|
quota_rule = *:storage=10M
|
|
quota_rule2 = Trash:storage=5M
|
|
}
|
|
|
|
Then, modify the above query inside *dovecot-sql.conf* to activate
|
|
user quotas::
|
|
|
|
user_query = SELECT path AS home, uid, gid, concat('*:storage=', quota, 'M') AS quota_rule FROM admin_mailbox WHERE full_address = '%u'
|
|
|
|
How to serve Modoboa behind a webserver
|
|
=======================================
|
|
|
|
Apache 2
|
|
--------
|
|
|
|
First, make sure that both *apache2* and *mod_python* are installed on
|
|
your server.
|
|
|
|
Create a new virtualhost in your Apache configuration and put the
|
|
following inside::
|
|
|
|
<VirtualHost *:80>
|
|
<Location "/">
|
|
SetHandler mod_python
|
|
PythonHandler django.core.handlers.modpython
|
|
PythonPath "['<path to directory that contains modoboa dir>'] + sys.path"
|
|
SetEnv DJANGO_SETTINGS_MODULE modoboa.settings
|
|
</Location>
|
|
Alias "/static" "<path to modoboa dir>/static"
|
|
<Location "/static/">
|
|
SetHandler None
|
|
</Location>
|
|
</VirtualHost>
|
|
|
|
This is one possible configuration. Note that you will certainly need more
|
|
configuration in order to launch Apache.
|
|
|
|
Using default plugins
|
|
=====================
|
|
|
|
Enable or disable a plugin
|
|
--------------------------
|
|
|
|
Starting with 0.8.2, Modoboa provides an online panel to control
|
|
plugins activation:
|
|
|
|
* To activate a plugin, go to the *admin -> settings -> extensions* page,
|
|
check the corresponding box and click on the *Apply* button.
|
|
* To deactivate a plugin, go to the *admin -> settings -> extensions* page,
|
|
uncheck the corresponding box and click on the *Apply* button.
|
|
|
|
Amavisd-new quarantine
|
|
----------------------
|
|
|
|
This plugin allows you and your users to handle *amavisd-new* SQL
|
|
quarantine. You can consult messages and/or release or delete them.
|
|
|
|
First, you need to specify where the database that contains the
|
|
quarantine is. Inside *settings.py*, add a new connection to the
|
|
``DB_CONNECTIONS`` variable like this::
|
|
|
|
DB_CONNECTIONS = {
|
|
"amavis_quarantine" : {"driver" : "mysql",
|
|
"host" : "<your_host>",
|
|
"dbname" : "<amavis_dbname>",
|
|
"login" : "<user>",
|
|
"password" : "<password>"}
|
|
}
|
|
|
|
|
|
Replace values between ``<>`` with yours.
|
|
|
|
When viewing messages, you can choose to display links (addresses,
|
|
images). In order to display images correctly, you need to create a
|
|
*tmp* directory under *static/* for storing them. For example::
|
|
|
|
$ mkdir <modoboa_dir>/static/tmp
|
|
|
|
To be able to release messages, first take a look at this page:
|
|
http://www.ijs.si/software/amavisd/amavisd-new-docs.html#quar-release. It
|
|
explains how to configure *amavisd-new* to listen somewhere for the
|
|
AM.PDP protocol. This protocol is used to send release requests.
|
|
|
|
Below is an example of a working configuration::
|
|
|
|
$interface_policy{'SOCK'} = 'AM.PDP-SOCK';
|
|
$interface_policy{'9998'} = 'AM.PDP-INET';
|
|
|
|
$policy_bank{'AM.PDP-SOCK'} = {
|
|
protocol => 'AM.PDP',
|
|
auth_required_release => 0,
|
|
};
|
|
$policy_bank{'AM.PDP-INET'} = {
|
|
protocol => 'AM.PDP',
|
|
inet_acl => [qw( 127.0.0.1 [::1] )],
|
|
};
|
|
|
|
Don't forget to update the ``inet_acl`` list if you plan to release from
|
|
the network.
|
|
|
|
Once *amavisd-new* is configured, just tell Modoboa where it can find the
|
|
"release server" by modifying the following parameters in the admin panel::
|
|
|
|
# "unix" or "inet"
|
|
AM_PDP_MODE = "inet"
|
|
|
|
# "unix" mode only
|
|
AM_PDP_SOCKET = "/var/amavis/amavisd.sock"
|
|
|
|
# "inet" mode only
|
|
AM_PDP_HOST = "127.0.0.1"
|
|
AM_PDP_PORT = 9998
|
|
|
|
Last point, Modoboa provides a simple script that periodically purges
|
|
the quarantine database. If you want to use it, you can add the
|
|
following line inside root's crontab::
|
|
|
|
0 0 * * * PYTHONPATH=<modoboa_dir/..> \
|
|
DJANGO_SETTINGS_MODULE=modoboa.settings \
|
|
<modoboa_dir>/extensions/amavis_quarantine/cleanup.py
|
|
|
|
Replace ``modoboa_dir`` with the installation path of Modoboa.
|
|
|
|
By default, messages older than 14 days are automatically purged. You
|
|
can modify this value by changing the ``MAX_MESSAGES_AGE`` parameter
|
|
in the admin panel.
|
|
|
|
Graphical statistics
|
|
--------------------
|
|
|
|
This plugin allows you to collect various statistics about emails
|
|
traffic on your server. It parses log file to collect information and
|
|
then generates graphics using the PNG format.
|
|
|
|
First, adapt the following parameters to your environnement::
|
|
|
|
# Path to mail log file
|
|
LOGFILE = "/var/log/mail.log"
|
|
|
|
# Path to directory where rrd files are stored
|
|
RRD_ROOTDIR = "/tmp/modoboa"
|
|
|
|
# Path to directory where png files are stored
|
|
IMG_ROOTDIR = "<modoboa_dir>/static/graphs"
|
|
|
|
Make sure the directories that will contain those files exist. If not,
|
|
create them before going further. For example (according to the previous
|
|
parameters)::
|
|
|
|
$ mkdir /tmp/modoboa
|
|
$ mkdir <modoboa_dir>/static/graphs
|
|
|
|
To finish, you need to collect information periodically in order to
|
|
feed the rrd files. To do so, just add the following line into root's
|
|
crontab::
|
|
|
|
*/5 * * * * PYTHONPATH=<modoboa_dir/..> DJANGO_SETTINGS_MODULE=modoboa.settings <modoboa_dir>/scripts/stats/logparser.py
|
|
|
|
Replace ``modoboa_dir`` with the installation path of Modoboa.
|
|
|
|
Graphics will be automatically created after each parsing.
|
|
|
|
Postifx auto-reply messages
|
|
---------------------------
|
|
|
|
Since version 0.6, mail users can define an auto-reply message with Modoboa.
|
|
|
|
Then run the following commands to update Modoboa SQL schema and content::
|
|
|
|
$ python manage.py syncdb
|
|
$ python manage.py migrate postfix-autoreply
|
|
$ export PYTHONPATH=$PWD/..
|
|
$ DJANGO_SETTINGS_MODULE=modoboa.settings ./scripts/postfix_autoreply/upgrade_autoreply.py
|
|
|
|
The user that executes the autoreply script needs to access
|
|
*settings.py*. You must apply proper permissions on this file. For
|
|
example, if *settings.py* belongs to *www-data:www-data*, you can add the
|
|
*vmail* user to the *www-data* group and set the read permission for the
|
|
group.
|
|
|
|
To make Postfix understand this feature, you need to update your configuration
|
|
files as follow:
|
|
|
|
``/etc/postfix/main.cf``::
|
|
|
|
transport_maps = mysql:/etc/postfix/maps/sql-transport.cf
|
|
virtual_alias_maps = mysql:/etc/postfix/maps/sql-aliases.cf
|
|
mysql:/etc/postfix/maps/sql-autoreplies.cf
|
|
|
|
``/etc/postfix/master.cf``::
|
|
|
|
autoreply unix - n n - - pipe
|
|
flags= user=vmail:<group> argv=<path_to_modoboa>/scripts/postfix_autoreply/autoreply $sender $mailbox
|
|
|
|
Then, create new map files with the following content:
|
|
|
|
``/etc/postfix/maps/sql-transport.cf``::
|
|
|
|
user = <user>
|
|
password = <password>
|
|
dbname = <database>
|
|
hosts = 127.0.0.1
|
|
query = SELECT method FROM postfix_autoreply_transport WHERE domain='%s'
|
|
|
|
``/etc/postfix/maps/sql-autoreplies.cf``::
|
|
|
|
user = <user>
|
|
password = <password>
|
|
dbname = <database>
|
|
hosts = 127.0.0.1
|
|
query = SELECT full_address, autoreply_address FROM postfix_autoreply_alias WHERE full_address='%s'
|
|
|
|
Finally, edit the *autoreply* shell script located inside the
|
|
*scripts* directory and change the value of ``BASEDIR``. (just put absolute path
|
|
of the directory where Modoboa is installed)
|
|
|
|
NB: auto-reply messages are just sent one time per sender for a
|
|
pre-defined time period. By default, this period is equal to 1 day
|
|
(86400s), you can adjust this value by modifying the AUTOREPLY_TIMEOUT
|
|
parameter available in the admin panel.
|
|
|
|
NB: Make sure that both *autoreply* and *autoreply.py* scripts (located
|
|
inside the *scripts/postfix_autoreply* directory) have good
|
|
permissions (ie. 0755).
|
|
|
|
Webmail
|
|
-------
|
|
|
|
Modoboa provides a simple webmail component (you can browse, read and
|
|
compose messages). With this feature, it is possible to deploy an almost
|
|
standalone emails platform just with Modoboa.
|
|
|
|
Sometimes, inline images are integrated inside emails. To display
|
|
them, Modoboa stores images into a temporary directory. Make sure the
|
|
following path exists. If not, create it::
|
|
|
|
$ mkdir <path_to_modoboa>/static/tmp
|
|
|
|
The user that is running Modoboa will need the write permission inside
|
|
this directory.
|
|
|
|
Next, go to the admin panel and modify the following parameters in
|
|
order to communicate with your IMAP and SMTP servers::
|
|
|
|
IMAP_SECURED = no
|
|
IMAP_SERVER = 127.0.0.1
|
|
IMAP_PORT = 143
|
|
|
|
SMTP_SECURED = no
|
|
SMTP_AUTHENTICATION = no
|
|
SMTP_SERVER = 127.0.0.1
|
|
SMTP_PORT = 25
|
|
|
|
Last but not least, modify the SECRET_KEY parameter and choose a new
|
|
value (exactly 16 characters). This key is really important, it is
|
|
used to encrypt/decrypt user passwords stored inside sessions.
|
|
|
|
Do not communicate this key to anyone!!
|