59
Modoboa Documentation Release 1.10.0 Antoine Nguyen Oct 05, 2020

Modoboa Documentation

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Modoboa Documentation

Modoboa DocumentationRelease 1100

Antoine Nguyen

Oct 05 2020

Contents

1 Overview 3

2 Table of contents 5

i

ii

Modoboa Documentation Release 1100

Contents 1

Modoboa Documentation Release 1100

2 Contents

CHAPTER 1

Overview

Modoboa is a mail hosting and management platform including a modern and simplified Web User Interface designedto work with Postfix and Dovecot

It is extensible by nature and comes with a lot of additional extensions

Name Description Documentationmodoboa-amavis A frontend for Amavis httpsmodoboa-amavisreadthedocs

iomodoboa-dmarc A set of tools to use DMARC httpsgithubcommodoboa

modoboa-dmarcmodoboa-imap-migration

Migrate mailboxes from an existing server usingIMAP (and offlineimap)

httpsgithubcommodoboamodoboa-imap-migration

modoboa-pdfcredentials

Generate PDF documents containing account cre-dentials

httpsgithubcommodoboamodoboa-pdfcredentials

modoboa-pfxadmin-migrate

A tool to migrate from Postfixadmin httpsgithubcommodoboamodoboa-pfxadmin-migrate

modoboa-postfix-autoreply

Away message editor (postfix compatible) httpsmodoboa-postfix-autoreplyreadthedocsio

modoboa-radicale A frontend for Radicale httpsmodoboa-radicalereadthedocsio

modoboa-sievefilters

A Sieve filters (rules) editor httpsmodoboa-sievefiltersreadthedocsio

modoboa-stats Graphical statistics (message traffic and more) httpsmodoboa-statsreadthedocsiomodoboa-webmail A simple webmail httpsmodoboa-webmail

readthedocsio

3

Modoboa Documentation Release 1100

4 Chapter 1 Overview

CHAPTER 2

Table of contents

21 Installation

211 Requirements

You will need a Server to perform well with at least

bull CPU 2

bull RAM 2GB

bull Disk 10GB

bull Python 3

Note Heads up for modoboa versions 115 and later

Python 2 support has been dropped with modoboa version 115 If you still have Python 2 installed on your systemeither uninstall it or force modoboa user to run with Python 3

212 Recommended way

If you start from scratch and want to deploy a complete mail server you will love the modoboa installer It is theeasiest and the quickest way to setup a fully functional server (modoboa postfix dovecot amavis and more) on onemachine

Warning For now only Debian and CentOS based Linux distributions are supported We do our best to improvecompatibility but if you use another Linux or a UNIX system you will have to install Modoboa manually

To use it just run the following commands in your terminal

5

Modoboa Documentation Release 1100

gt git clone httpsgithubcommodoboamodoboa-installergt cd modoboa-installergt sudo runpy ltyour domaingt

if you get this warning - lsquousrbinenv lsquopythonrsquo No such file or directoryrsquo do make sure sure python is installed onyour server Sometimes python is installed but the installer canrsquot detect it or which python version to run especiallyon a debian based system Then run this command first

gt sudo apt-get install python-virtualenv python-pip

Wait a few minutes and yoursquore done o

213 Manual installation

For those who need a manual installation or who just want to setup a specific part here are the steps you must follow

Modoboa

This section describes the installation of the web interface (a Django project)

Prepare the system

First of all we recommend the following context

bull A dedicated system user

bull A virtual environment to install the application because it will isolate it (and its dependencies) from the rest ofyour system

The following example illustrates how to realize this on Debian-based distributions using virtualenv

apt-get install virtualenv python3-pip useradd modoboa create a dedicated user su -l modoboa log in as the newly created user$ virtualenv --python python3 env create the virtual environment$ source envbinactivate activate the virtual environment

Modoboa depends on external tools and some of them require compilation so you need a compiler and a few C librariesMake sure to install the following system packages according to your distribution

Debian Ubuntubuild-essential python3-dev libxml2-dev libxslt-dev libjpeg-dev librrd-dev rrdtool libffi-dev libssl-dev

CentOSgcc gcc-c++ python3-devel libxml2-devel libxslt-devel libjpeg-turbo-devel rrdtool-devel rrdtool libffi-devel

Note Alternatively you could rely on your distribution packages for the Modoboa dependencies which requirecompilation - eg psycopg2 - if the version is compatible In this case you have to create your virtual environmentwith the --system-site-packages option

Then install Modoboa by running

6 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(env)$ pip install modoboa

Database

Warning This documentation does not cover the installation of a database server but only the setup of a functionaldatabase that Modoboa will use

Thanks to Django Modoboa is compatible with the following databases

bull PostgreSQL

bull MySQL MariaDB

bull SQLite

Since the last one does not require particular actions only the first two ones are described You should also read thenotes for those database backends on the official Django documentation

PostgreSQL

Install the corresponding Python binding

(env)$ pip install psycopg2

Note Alternatively you can install the python3-psycopg2 package instead on Debian-based distributions ifyour virtual environment was created with --system-site-packages option

Then create a user and a database For example to create the modoboa database owned by a modoboa user run thefollowing commands on your PostgreSQL server

sudo -l -u postgres createuser --no-createdb modoboa sudo -l -u postgres createdb --owner=modoboa modoboa

MySQL MariaDB

Install the corresponding Python binding

(env)$ pip install mysqlclient

Note Alternatively you can install the python3-mysqldb package instead on Debian-based distributions if yourvirtual environment was created with --system-site-packages option

Note MariaDB 102 (and newer) require mysqlclient 1311 (or newer)

Then create a user and a database For example to create the modoboa database owned by a modoboa user run thefollowing SQL commands

21 Installation 7

Modoboa Documentation Release 1100

CREATE DATABASE modoboaCREATE USER modoboalocalhost IDENTIFIED BY my-strong-password-hereGRANT ALL PRIVILEGES ON modoboa TO modoboalocalhost

Deploy an instance

modoboa-adminpy is a command line tool that lets you deploy a ready-to-use Modoboa site To create a newinstance into instance you just have to run the following command

(env)$ modoboa-adminpy deploy instance --collectstatic --domain lthostname of your servergt --dburl defaultltdatabase urlgt

Note You can install additional extensions during the deploy process To do so use the --extensions op-tion which accepts a list of names as argument (--extensions ext1 ext2 ) If you want to install allextensions just use the all keyword like this --extensions all

If you choose to install extensions one at a time you will have to add their names in settingspy to MODOBOA_APPSAlso ensure that you have the line from modoboa_amavissettings import at the end of this file

The list of available extensions can be found on the index page Instructions to install them are available on eachextensions page

Note You can specify more than one database connection using the --dburl option Multiple connections aredifferentiated by a prefix

The primary connection must use the default prefix (as shown in the example above) For the amavis exten-sion use the amavis prefix For example --dburl defaultltdatabase urlgt amavisltdatabaseurlgt

A database url should meet the following syntax ltmysql|postgresgt[userpass][hostport]dbname OR sqlitefullpathtoyourdatabasefilesqlite

The command will ask you a few questions answer them and yoursquore done

If you need a silent installation (eg if yoursquore using Salt-Stack Ansible or whatever) itrsquos possible to supply thedatabase credentials as command line arguments

You can consult the complete option list by running the following command

(env)$ modoboa-adminpy help deploy

Cron jobs

A few recurring jobs must be configured to make Modoboa works as expected

Create a new file for example etccrondmodoboa and put the following content inside

Modoboa specific cron jobsPYTHON=ltpath to Python binary inside the virtual environmentgtINSTANCE=ltpath to Modoboa instancegt

(continues on next page)

8 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

Operations on mailboxes

vmail $PYTHON $INSTANCEmanagepy handle_mailbox_operations

Generate DKIM keys (they will belong to the user running this job)

root umask 077 ampamp $PYTHON $INSTANCEmanagepy modo manage_dkim_rarr˓keys

Sessions table cleanup0 0 modoboa $PYTHON $INSTANCEmanagepy clearsessions Logs table cleanup0 0 modoboa $PYTHON $INSTANCEmanagepy cleanlogs DNSBL checks

30 modoboa $PYTHON $INSTANCEmanagepy modo check_mx Public API communication0 modoboa $PYTHON $INSTANCEmanagepy communicate_with_public_api

Policy daemon

Modoboa comes with a built-in Policy Daemon for Postfix Current features are

bull Define daily sending limits for domains andor accounts

A redis server is required to run this new daemon

You can launch it manually using the following command

(env)gt python managepy policy_daemon

But we recommend an automatic start using systemd or supervisor Here is a configuration example forsupervisor

[programpolicyd]autostart=trueautorestart=truecommand=srvmodoboaenvbinpython srvmodoboainstancemanagepy policy_daemondirectory=srvmodoboaredirect_stderr=trueuser=modoboanumprocs=1

It will listen by default on 127001 and port 9999 The policy daemon wonrsquot do anything unless you tell postfixto use it

Now you can continue to the Web server section

Web server

Note The following instructions are meant to help you get your site up and running quickly However it is notpossible for the people contributing documentation to Modoboa to test every single combination of web server wsgiserver distribution etc So it is possible that your installation of uwsgi or nginx or Apache or what-have-you worksdifferently Keep this in mind

21 Installation 9

Modoboa Documentation Release 1100

Apache2

First make sure that mod_wsgi is installed on your server

Create a new virtualhost in your Apache configuration and put the following content inside

ltVirtualHost 80gtServerName ltyour valuegtDocumentRoot ltmodoboa_instance_pathgt

Alias media ltmodoboa_instance_pathgtmedialtDirectory ltmodoboa_instance_pathgtmediagtOrder denyallowAllow from all

ltDirectorygt

Alias sitestatic ltmodoboa_instance_pathgtsitestaticltDirectory ltmodoboa_instance_pathgtsitestaticgtOrder denyallowAllow from all

ltDirectorygt

WSGIScriptAlias ltmodoboa_instance_pathgtltinstance_namegtwsgipy

Pass Authorization header to enable API usageWSGIPassAuthorization On

ltVirtualHostgt

This is just one possible configuration

To use mod_wsgi daemon mode add the two following directives just under WSGIScriptAlias

WSGIDaemonProcess examplecom python-path=ltmodoboa_instancegtltvirtualenv pathgtlibrarr˓python37site-packagesWSGIProcessGroup examplecom

Replace values between ltgt with yours If you donrsquot use a virtualenv just remove the last part of theWSGIDaemonProcess directive

Note You will certainly need more configuration in order to launch Apache

Now you can go the Dovecot section to continue the installation

Nginx

This section covers two different ways of running Modoboa behind Nginx using a WSGI application server Choosethe one you prefer between Green Unicorn or uWSGI

In both cases yoursquoll need to download and install nginx

Green Unicorn

Firstly Download and install gunicorn Then use the following sample gunicorn configuration (create a new filenamed gunicornconfpy inside Modoboarsquos root dir)

10 Chapter 2 Table of contents

Modoboa Documentation Release 1100

backlog = 2048bind = unixvarrungunicornmodoboasockpidfile = varrungunicornmodoboapiddaemon = Truedebug = Falseworkers = 2logfile = varloggunicornmodoboalogloglevel = info

To start gunicorn execute the following commands

$ cd ltmodoboa dirgt$ gunicorn -c gunicornconfpy ltmodoboa dirgtwsgiapplication

Now the nginx part Just create a new virtual host and use the following configuration

upstream modoboa server unixvarrungunicornmodoboasock fail_timeout=0

server listen 443 sslssl onkeepalive_timeout 70

server_name lthost fqdngtroot ltmodoboa_instance_pathgt

access_log varlognginxlthost fqdngtaccesslogerror_log varlognginxlthost fqdngterrorlog

ssl_certificate ltssl certificate for your sitegtssl_certificate_key ltssl certificate key for your sitegt

location sitestatic autoindex on

location media autoindex on

location proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_forproxy_set_header Host $http_hostproxy_redirect offproxy_set_header X-Forwarded-Protocol sslproxy_pass httpmodoboa

If you do not plan to use SSL then change the listen directive to listen 80 and delete each of the followingdirectives

ssl onkeepalive_timeout 70ssl_certificate ltssl certificate for your sitegt

(continues on next page)

21 Installation 11

Modoboa Documentation Release 1100

(continued from previous page)

ssl_certificate_key ltssl certificate key for your sitegtproxy_set_header X-Forwarded-Protocol ssl

If you do plan to use SSL yoursquoll have to generate a certificate and a key This article contains information about howto do it

Paste this content to your configuration (replace values between ltgt with yours) and restart nginx

Now you can go the Dovecot section to continue the installation

uWSGI

The following setup is meant to get you started quickly You should read the documentation of both nginx and uwsgito understand how to optimize their configuration for your site

The Django documentation includes the following warning regarding uwsgi

Warning Use uwsgi 126 or newer If you do not you will run into problems Modoboa will fail in obscureways

To use this setup first download and install uwsgi

Here is a sample nginx configuration

server listen 443 sslssl onkeepalive_timeout 70

server_name lthost fqdngtroot ltmodoboas settings dirgt

ssl_certificate ltssl certificate for your sitegtssl_certificate_key ltssl certificate key for your sitegt

access_log varlognginxlthost fqdngtaccesslogerror_log varlognginxlthost fqdngterrorlog

location ltmodoboas root urlgtsitestatic autoindex onalias ltlocation of sitestatic on your file systemgt

Whether or not Modoboa uses a media directory depends on how you configured Modoboa It does not hurt to have thislocation ltmodoboas root urlgtmedia

autoindex onalias ltlocation of media on your file systemgt

This denies access to any file that begins with ht Apaches htaccess and htpasswd are such files A Modoboa installed from scratch would not contain any such files but you never know what the future holds

(continues on next page)

12 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

location ~ ht deny all

location ltmodobas root urlgt include uwsgi_paramsuwsgi_pass ltuwsgi portgtuwsgi_param UWSGI_SCRIPT ltmodoboa instance namegtwsgiapplicationuwsgi_param UWSGI_SCHEME https

ltmodoboa instance namegt must be replaced by the value you used when you deployed your instance

If you do not plan to use SSL then change the listen directive to listen 80 and delete each of the followingdirectives

ssl onkeepalive_timeout 70ssl_certificate ltssl certificate for your sitegtssl_certificate_key ltssl certificate key for your sitegtuwsgi_param UWSGI_SCHEME https

If you do plan to use SSL yoursquoll have to generate a certificate and a key This article contains information about howto do it

Make sure to replace the ltgt in the sample configuration with appropriate values Here are some explanations forthe cases that may not be completely self-explanatory

ltmodoboas settings dirgt Where Modoboarsquos settingspy resides This is also where thesitestatic and media directories reside

ltmodoboas root urlgt This is the URL which will be the root of your Modoboa site at your domain For in-stance if your Modoboa installation is reachable at at httpsfoomodoboa then ltmodoboas rooturlgt is modoboa In this case you probably also have to set the alias directives to point to where Mod-oboarsquos sitestatic and media directories are because otherwise nginx wonrsquot be able to find them

If Modoboa is at the root of your domain then ltmodoboa root urlgt is an empty string and can be deletedfrom the configuration above In this case you probably do not need the alias directives

ltuwsgi portgt The location where uwsig is listening It could be a unix domain socket or an addressport combi-nation Ubuntu configures uwsgi so that the port is

unixrunuwsgiappltapp namegtsocket

where ltapp namegt is the name of the application

Your uwsgi configuration should be

[uwsgi] Not needed when using uwsgi from pip plugins = pythonchdir = ltmodoboas top dirgtmodule = ltnamegtwsgiapplicationmaster = trueharakiri = 60processes = 4vhost = trueno-default-app = true

21 Installation 13

Modoboa Documentation Release 1100

The plugins directive should be turned on if you use a uwsgi installation that requires it If uwsgi was installed frompip it does not require it In the configuration above

ltmodoboas top dirgt The directory where managepy resides This directory is the parent of ltmodoboassettings dirgt

ltnamegt The name that you passed to modoboa-adminpy deploy when you created your Modoboa instance

Now you can go the Dovecot section to continue the installation

Dovecot

Modoboa requires Dovecot 2+ to work so the following documentation is suitable for this combination

In this section we assume dovecotrsquos configuration resides in etcdovecot all pathes will be relative to thisdirectory

Mailboxes

First edit the confd10-mailconf and set the mail_location variable

maildirmail_location = maildir~maildir

Then edit the inbox namespace and add the following lines

inbox = yes

mailbox Drafts auto = subscribespecial_use = Drafts

mailbox Junk

auto = subscribespecial_use = Junk

mailbox Sent

auto = subscribespecial_use = Sent

mailbox Trash

auto = subscribespecial_use = Trash

With dovecot 21+ it ensures all the special mailboxes will be automaticaly created for new accounts

For dovecot 20 and older use the autocreate plugin

Operations on the file system

14 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning Modoboa needs to access the dovecot binary to check its version To find the binary path weuse the which command first and then try known locations (usrsbindovecot and usrlocalsbindovecot) If you installed dovecot in a custom location please tell us where the binary is by usingthe DOVECOT_LOOKUP_PATH setting (see settingspy)

Three operation types are considered

1 Mailbox creation

2 Mailbox renaming

3 Mailbox deletion

The first one is managed by Dovecot The last two ones may be managed by Modoboa if it can access the file systemwhere the mailboxes are stored (see General parameters to activate this feature)

Those operations are treated asynchronously by a cron script For example when you rename an e-mail addressthrough the web UI the associated mailbox on the file system is not modified directly Instead of that a renameorder is created for this mailbox The mailbox will be considered unavailable until the order is executed (see Postfixconfiguration)

Edit the crontab of the user who owns the mailboxes on the file system

$ crontab -u ltusergt -e

And add the following line inside

python ltmodoboa_sitegtmanagepy handle_mailbox_operations

Warning The cron script must be executed by the system user owning the mailboxes

Warning The user running the cron script must have access to the settingspy file of the modoboa instance

The result of each order is recorded into Modoboarsquos log Go to Modoboa gt Logs to consult them

Authentication

To make the authentication work edit the confd10-authconf and uncomment the following line at the end

include auth-systemconfextinclude auth-sqlconfextinclude auth-ldapconfextinclude auth-passwdfileconfextinclude auth-checkpasswordconfextinclude auth-vpopmailconfextinclude auth-staticconfext

Then edit the confdauth-sqlconfext file and add the following content inside

passdb sql driver = sql Path for SQL configuration file see example-configdovecot-sqlconfext

(continues on next page)

21 Installation 15

Modoboa Documentation Release 1100

(continued from previous page)

args = etcdovecotdovecot-sqlconfext

userdb sql driver = sqlargs = etcdovecotdovecot-sqlconfext

Make sure to activate only one backend (per type) inside your configuration (just comment the other ones)

Edit the dovecot-sqlconfext and modify the configuration according to your database engine

MySQL users

driver = mysql

connect = host=ltmysqld socketgt dbname=ltdatabasegt user=ltusergt password=ltpasswordgt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user WHERE email=Lu andrarr˓is_active=1

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid concat(bytes= mbquota M) AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

PostgreSQL users

driver = pgsql

connect = host=ltpostgres socketgt dbname=ltdatabasegt user=ltusergt password=ltpasswordgt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user u INNER JOIN admin_rarr˓mailbox mb ON uid=mbuser_id INNER JOIN admin_domain dom ON mbdomain_id=domidrarr˓WHERE uemail=Lu AND uis_active AND domenabled

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid bytes= || mbquota || M AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

16 Chapter 2 Table of contents

Modoboa Documentation Release 1100

SQLite users

driver = sqlite

connect = ltpath to the sqlite db filegt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user u INNER JOIN admin_rarr˓mailbox mb ON uid=mbuser_id INNER JOIN admin_domain dom ON mbdomain_id=domidrarr˓WHERE uemail=Lu AND uis_active=1 AND domenabled=1

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid (bytes= || mbquota || M) AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

Note Replace values between ltgt with yours

LDAP

To make the LDAP authentication work edit the confd10-authconf and uncomment the following line atthe end

include auth-ldapconfext

Then edit the confdauth-ldapconfext and edit the passdb section as following You should comment theuserdb section which will be managed by SQL with modoboa database

passdb driver = ldap

Path for LDAP configuration file see example-configdovecot-ldapconfextargs = etcdovecotdovecot-ldapconfext

userdb driver = ldapargs = etcdovecotdovecot-ldapconfext

Default fields can be used to specify defaults that LDAP may overridedefault_fields = home=homevirtualu

Your own dovecot LDAP configuration file is now etcdovecotdovecot-ldapconfext You can addyour default LDAP conf in it following the official documentation

Synchronize dovecot LDAP conf with modoboa LDAP conf

To make dovecot LDAP configuration synchronized with modoboa LDAP configuration you should create a dedicateddovecot conf file At the end of your dovecot configuration file (dovecot-ldapconfext) add the following

21 Installation 17

Modoboa Documentation Release 1100

line

include_try dovecot-modoboaconfext

Then set modoboa parameter Enable Dovecot LDAP sync to Yes Then set the Dovecot LDAP config file following theprevious step (etcdovecotdovecot-modoboaconfext in the example)

The last step is to add the command update_dovecot_conf to the cron job of modoboa Then each time your modoboaLDAP configuration is updated your dovecot LDAP configuration will also be

LMTP

Local Mail Transport Protocol is used to let Postfix deliver messages to Dovecot

First make sure the protocol is activated by looking at the protocols setting (generally inside dovecotconf)It should be similar to the following example

protocols = imap pop3 lmtp

Then open the confd10-masterconf look for lmtp service definition and add the following content inside

service lmtp stuff beforeunix_listener varspoolpostfixprivatedovecot-lmtp mode = 0600user = postfixgroup = postfix

stuff after

We assume here that Postfix is chrooted within varspoolpostfix

Finally open the confd20-lmtpconf and modify it as follows

protocol lmtp postmaster_address = postmasterltdomaingtmail_plugins = $mail_plugins quota sieve

Replace ltdomaingt by the appropriate value

Note If you donrsquot plan to apply quota or to use filters just adapt the content of the mail_plugins setting

Quota

Modoboa lets adminstrators define per-domain andor per-account limits (quota) It also lists the current quota usageof each account Those features require Dovecot to be configured in a specific way

Inside confd10-mailconf add the quota plugin to the default activated ones

mail_plugins = quota

Inside confd10-masterconf update the dict service to set proper permissions

18 Chapter 2 Table of contents

Modoboa Documentation Release 1100

service dict If dict proxy is used mail processes should have access to its socket For example mode=0660 group=vmail and global mail_access_groups=vmailunix_listener dict mode = 0600user = ltuser owning mailboxesgtgroup =

Inside confd20-imapconf activate the imap_quota plugin

protocol imap

mail_plugins = $mail_plugins imap_quota

Inside dovecotconf activate the quota SQL dictionary backend

dict quota = ltdrivergtetcdovecotdovecot-dict-sqlconfext

Inside confd90-quotaconf activate the quota dictionary backend

plugin quota = dictUser quotaproxyquota

It will tell Dovecot to keep quota usage in the SQL dictionary

Finally edit the dovecot-dict-sqlconfext file and put the following content inside

connect = host=ltdb hostgt dbname=ltdb namegt user=ltdb usergt password=ltpasswordgt SQLite users connect = pathtothedatabasedb

map pattern = privquotastoragetable = admin_quotausername_field = usernamevalue_field = bytes

map

pattern = privquotamessagestable = admin_quotausername_field = usernamevalue_field = messages

PostgreSQL users

21 Installation 19

Modoboa Documentation Release 1100

Database schema update

The admin_quota table is created by Django but unfortunately it doesnrsquot support DEFAULT constraints (it onlysimulates them when the ORM is used) As PostgreSQL is a bit strict about constraint violations you must executethe following query manually

db=gt ALTER TABLE admin_quota ALTER COLUMN bytes SET DEFAULT 0db=gt ALTER TABLE admin_quota ALTER COLUMN messages SET DEFAULT 0

Trigger

As indicated on Dovecotrsquos wiki you need a trigger to properly update the quota

A working copy of this trigger is available on Github

Download this file and copy it on the server running postgres Then execute the following commands

$ su - postgres$ psql [modoboa database] lt pathtomodoboa_postgres_triggersql$ exit

Replace [modoboa database] by the appropriate value

Forcing recalculation

For existing installations Dovecot (gt 2) offers a command to recalculate the current quota usages For example if youwant to update all usages run the following command

$ doveadm quota recalc -A

Be carefull it can take a while to execute

ManageSieveSieve

Modoboa lets users define filtering rules from the web interface To do so it requires ManageSieve to be activated onyour server

Inside confd20-managesieveconf make sure the following lines are uncommented

protocols = $protocols sieve

service managesieve-login

service managesieve

protocol sieve

20 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Messages filtering using Sieve is done by the LDA

Inside confd15-ldaconf activate the sieve plugin like this

protocol lda Space separated list of plugins to load (default is global mail_plugins)mail_plugins = $mail_plugins sieve

Finally configure the sieve plugin by editing the confd90-sieveconf file Put the follwing caontent inside

plugin Location of the active script When ManageSieve is used this is actually a symlink pointing to the active script in the sieve storage directorysieve = ~dovecotsieve

The path to the directory where the personal Sieve scripts are stored For ManageSieve this is where the uploaded scripts are storedsieve_dir = ~sieve

Restart Dovecot

Now you can go to the Postfix section to finish the installation

Last-login tracking

To update the last_login attribute of an account after a succesful IMAP or POP3 login you can configure apost-login script

Open confd10-masterconf add the following configuration (imap and pop3 services are already definedyou just need to update them)

service imap executable = imap postlogin

service pop3 executable = pop3 postlogin

service postlogin executable = script-login usrlocalbinpostloginshuser = modoboaunix_listener postlogin

Then you must create a script named usrlocalbinpostloginsh According to your database enginethe content will differ

PostgreSQL

21 Installation 21

Modoboa Documentation Release 1100

binsh

psql -c UPDATE core_user SET last_login=now() WHERE username=$USER gt devnull

exec $

MySQL

binsh

DBNAME=XXXDBUSER=XXXDBPASSWORD=XXX

echo UPDATE core_user SET last_login=now() WHERE username=$USER | mysql -urarr˓$DBUSER -p$DBPASSWORD $DBNAME

exec $

Postfix

This section gives an example about building a simple virtual hosting configuration with Postfix Refer to the officialdocumentation for more explanation

Map files

You first need to create configuration files (or map files) that will be used by Postfix to lookup into Modoboa tables

To automaticaly generate the requested map files and store them in a directory run the following command

gt cd ltmodoboa_instance_pathgtgt python managepy generate_postfix_maps --destdir ltdirectorygt

ltdirectorygt is the directory where the files will be stored Answer the few questions and yoursquore done

Configuration

Use the following configuration in the etcpostfixmaincf file (this is just one possible configuration)

Stuff beforevirtual_transport = lmtpunixprivatedovecot-lmtp

virtual_mailbox_domains = ltdrivergtetcpostfixsql-domainscfvirtual_alias_domains = ltdrivergtetcpostfixsql-domain-aliasescfvirtual_alias_maps = ltdrivergtetcpostfixsql-aliasescf

relay_domains = ltdrivergtetcpostfixsql-relaydomainscftransport_maps =

ltdrivergtetcpostfixsql-transportcfltdrivergtetcpostfixsql-spliteddomains-transportcf

(continues on next page)

22 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

smtpd_recipient_restrictions = check_recipient_access

ltdrivergtetcpostfixsql-maintaincfltdrivergtetcpostfixsql-relay-recipient-verificationcf

permit_mynetworksreject_unauth_destinationreject_unverified_recipient

smtpd_sender_login_maps = ltdrivergtetcpostfixsql-sender-login-mapcf

smtpd_sender_restrictions =reject_sender_login_mismatch

Stuff after

Replace ltdrivergt by the name of the database you use

Restart Postfix

Policy daemon

If you want to enable the built-in policy daemon add the following content to the etcpostfixmaincf file

smtpd_recipient_restrictions = check_policy_service inet1270019999

And reload postfix

Note The check_policy_service line must be placed before the permit_mynetworks one otherwise thedaemon wonrsquot be called

OpenDKIM

Modoboa can generate DKIM keys for the hosted domains but it wonrsquot sign or check messages To do that you needa dedicated software like OpenDKIM

Note The cron job in charge of creating DKIM keys must be run using the same user than OpenDKIM (ie opendkimin most cases)

Database

Since keys related information is stored in Modoboarsquos database you need to tell OpenDKIM how it can access it

First make sure to install the required additional packages on your system (libopendbx1- on debian baseddistributions or opendbx- on CentOS the complete name depends on your database engine)

Then insert the following SQL view into Modoboarsquos database

21 Installation 23

Modoboa Documentation Release 1100

PostgreSQL

CREATE OR REPLACE VIEW dkim AS (SELECT id name as domain_name dkim_private_key_path AS private_key_path

dkim_key_selector AS selectorFROM admin_domain WHERE enable_dkim

)

MySQLMariaDB

CREATE OR REPLACE VIEW dkim AS (SELECT id name as domain_name dkim_private_key_path AS private_key_path

dkim_key_selector AS selectorFROM admin_domain WHERE enable_dkim=1

)

Configuration

You should find OpenDKIMrsquos configuration file at etcopendkimconf

Add the following content to it

KeyTable dsnltdrivergtltusergtltpasswordgtltdb hostgtltdb namegttable=dkimrarr˓keycol=iddatacol=domain_nameselectorprivate_key_pathSigningTable dsnltdrivergtltusergtltpasswordgtltdb hostgtltdb namegttable=dkimrarr˓keycol=domain_namedatacol=idSocket inet12345localhost

Replace values between ltgt by yours Accepted values for driver are pgsql or mysql Make sure the user youspecify has read permission on the view created previously

If you run a debian based system make sure to adjust the following setting in the etcdefaultopendkim file

SOCKET=inet12345localhost

Eventually reload OpenDKIM

Postfix integration

Add the following lines to the etcpostfixmaincf file

smtpd_milters = inet12700112345non_smtpd_milters = inet12700112345milter_default_action = acceptmilter_content_timeout = 30s

and reload postfix

Extensions

Only few commands are needed to add a new extension to your setup

24 Chapter 2 Table of contents

Modoboa Documentation Release 1100

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install ltEXTENSIONgt==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Then restart your web server

22 Upgrade

221 Modoboa

Warning The new version you are going to install may need to modify your database Before you start makesure to backup everything

Most of the time upgrading your installation to a newer Modoboa version only requires a few actions In every caseyou will need to apply the general procedure first and then check if the version you are installing requires specificactions

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install modoboa==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Once done check if the version you are installing requires Specific instructions

Finally restart your web server

Sometimes you might need to upgrade postfix map files too To do so just run the generate_postfix_mapscommand on the same directory than the one used for installation (etcpostfix by default)

Make sure to use root privileges and run the following command

gt python managepy generate_postfix_maps --destdir ltdirectorygt

Then reload postfix

22 Upgrade 25

Modoboa Documentation Release 1100

222 Extensions

If a new version is available for an extension yoursquore using it is recommanded to install it Upgrading an extensions ispretty and the procedure is almost the same than the one used for Modoboa

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install ltEXTENSIONgt==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Finally restart your web server

It is a generic upgrade procedure which will be enough most of the time but it is generally a good idea to check theassociated documentation

223 Rebuild Virtual Environment

Sometimes when upgrading your Operating System (eg from Ubuntu 1704 to Ubuntu 1710) your virtual environmentrunning modoboa can get corrupted Your first response will be to panic but fear not The solution is in this document

First things first

Recover your database password

You will need to recover your database password (if using mysql or postgresql) You will find this in etcpostfixsql-aliasescf or any file with sql-cf in the etcpostfix directory

Make note of this as you will need it when reconfiguring modoboa

Reinstall Modoboa

Start out by backup up your modoboa settings file located in the modoboa instance directory (srvmodoboainstanceinstancesettingspy if you used the default installer configuration) This contains your currentconfiguration

Next you want to remove all current modoboa files

After doing this follow the manual installation instructions for Modoboa only as everything should be working prop-erly

After this completes simply restore your backed up settings file to srvinstanceinstancesettingspy(if you used installer default configuration) You will then need to reinstall your extensions

You can find which plugins you had in your settingspy file under the MODOBOA_APPS variable

Instructions to install extensions can also be found here

Once you have completed this step you will need to run the following commands

26 Chapter 2 Table of contents

Modoboa Documentation Release 1100

gt (env) $ cd ltinstance_dirgtgt (env) $ python managepy migrategt (env) $ python managepy collectstatic

You will then see a message similar to

You have requested to collect static files at the destinationlocation as specified in your settings

srvmodoboainstancesitestatic

This will overwrite existing filesAre you sure you want to do this

Type yes to continue or no to cancel

You will want to answer yes here then simply restart the uwsgi process with service uwsgi restart andyou should be up and running again

Simply log into your modoboa web panel and verify that your extensions and webmail box is working

224 Information

Rebuild instructions from httpshelppythonanywherecompagesRebuildingVirtualenvs

225 Specific instructions

1160

A new policy daemon has been added

Make sure to have a Redis instance running on your server

Add modoboapolicyd to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboapolicyd

)

Add the following settings to your settingspy file

REDIS_HOST = ltIP or hostname heregtREDIS_PORT = 6379REDIS_QUOTA_DB = 0REDIS_URL = redisformat(REDIS_HOST REDIS_PORT REDIS_QUOTA_DB)

Once done you can start the policy daemon using the following commands

22 Upgrade 27

Modoboa Documentation Release 1100

gt python managepy policy_daemon

Donrsquot forget to configure _policyd_config if you want to use this feature

The modoboa-stats plugin has been merged into the core

Add modoboamaillog to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboapolicydmodoboamaillog

)

And remove any reference to modoboa_stats in this same variable

1150

This version drops Python 2 support so donrsquot forget to update all the extensions you use

Warning If you upgrade an existing python 2 installation you will need to create a new Python 3 virtualenvironment You can remove the existing virtual environment and replace it by the new one so you wonrsquot have tomodify your configuration files

Add the following new setting

DISABLE_DASHBOARD_EXTERNAL_QUERIES = False

Reload uwsgigunicornapache depending on your setup

Finally Make sure to use root privileges and run the following command

gt python managepy generate_postfix_maps --destdir ltdirectorygt

Then reload postfix

1140

This release introduces an optional LDAP synchronization process If you want to use it please follow the dedicatedprocedure

1131

Upgrade postfix maps files as follows

28 Chapter 2 Table of contents

Modoboa Documentation Release 1100

gt python managepy generate_postfix_maps --destdir ltpathgt --force-overwrite

1130

Add modoboadnstools to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstools

)

Add the following new settings

CSRF_COOKIE_SECURE = TrueSESSION_COOKIE_SECURE = True

modoboa-postfix-autoreply 150

Edit the etcpostfixmaincf file and remove the sql-autoreplies-transportcf map from thetransport_maps if present Remove the corresponding proxy_read_maps entry if relevant

Reload postfix

1100

Warning Upgrade installed extensions BEFORE running check or migrate commands

Upgrade all your installed plugins to the following versions

Warning If you use the amavis plugin make sure to include its configuration as follows into settingspy

from modoboa_amavis import settings as modoboa_amavis_settingsmodoboa_amavis_settingsapply(globals())

22 Upgrade 29

Modoboa Documentation Release 1100

Name Versionmodoboa-amavis 120modoboa-contacts 050modoboa-dmarc 110modoboa-imap-migration 120modoboa-pdfcredentials 130modoboa-postfix-autoreply 140modoboa-radicale 120modoboa-sievefilters 140modoboa-stats 140modoboa-webmail 140

Edit the settingspy file and apply the following modifications

Add modoboatransport to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparameters

)

Replace the following line

MIDDLEWARE_CLASSES = (

by

MIDDLEWARE = (

Update postfix map files as follows

gt rm -f ltpathgtmodoboa-postfix-mapschkgt python managepy generate_postfix_maps --force --destdir ltpathgt

Then modify postfixrsquos configuration as follows

smtpd_sender_login_maps =ltdrivergtltpathgtsql-sender-login-mapcf

transport_maps =ltdrivergtltpathgtsql-transportcfltdrivergtltpathgtsql-spliteddomains-transportcf other map files

Replace ltdrivergt and ltpathgt by your values

If transport_maps contains sql-relaydomains-transportcf remove it

30 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning If you make use of postfixrsquos proxymap server you must also update the proxy_read_maps setting

Reload postfix

Add the following cron job in order to generate DKIM keys

Generate DKIM keys (they will belong to the user running this job)

root $PYTHON $INSTANCEmanagepy modorarr˓manage_dkim_keys

190

If you want to manage inactive accounts look at Cleaning inactive accounts

183

Edit the settingspy file and replace the following line

BASE_DIR = ospathdirname(ospathdirname(__file__))

by

BASE_DIR = ospathrealpath(ospathdirname(ospathdirname(__file__)))

180

Modoboa now relies on Djangorsquos builtin password validation system to validate user passwords instead ofdjango-passwords

Remove django-passwords from your system

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt pip uninstall django-passwords

Edit the settingspy file and remove the following content

django-passwords

PASSWORD_MIN_LENGTH = 8

PASSWORD_COMPLEXITY = UPPER 1LOWER 1DIGITS 1

Add the following lines

Password validation rulesAUTH_PASSWORD_VALIDATORS = [

NAME djangocontribauthpassword_validation

rarr˓UserAttributeSimilarityValidator (continues on next page)

22 Upgrade 31

Modoboa Documentation Release 1100

(continued from previous page)

NAME djangocontribauthpassword_validationMinimumLengthValidator

NAME djangocontribauthpassword_validationCommonPasswordValidator

NAME djangocontribauthpassword_validationNumericPasswordValidator

NAME modoboacorepassword_validationComplexityValidatorOPTIONS

upper 1lower 1digits 1specials 0

]

172

API documentation has evolved (because of the upgrade to Django Rest Framework 36) and CKeditor is now embed-ded by default (thanks to the django-ckeditor package) Some configuration changes are required

Edit your settingspy file and apply the following modifications

bull Update the INSTALLED_APPS variable as follows

INSTALLED_APPS = (djangocontribauthdjangocontribcontenttypesdjangocontribsessionsdjangocontribmessagesdjangocontribsitesdjangocontribstaticfilesreversionckeditorckeditor_uploaderrest_frameworkrest_frameworkauthtoken

)

bull Update the REST_FRAMEWORK variable as follows

REST_FRAMEWORK = DEFAULT_AUTHENTICATION_CLASSES (

rest_frameworkauthenticationTokenAuthenticationrest_frameworkauthenticationSessionAuthentication

)

bull Remove the SWAGGER_SETTINGS variable

bull Add the following content

32 Chapter 2 Table of contents

Modoboa Documentation Release 1100

CKeditor

CKEDITOR_UPLOAD_PATH = uploads

CKEDITOR_IMAGE_BACKEND = pillow

CKEDITOR_RESTRICT_BY_USER = True

CKEDITOR_BROWSE_SHOW_DIRS = True

CKEDITOR_ALLOW_NONIMAGE_FILES = False

CKEDITOR_CONFIGS = default

allowedContent Truetoolbar Modoboawidth Nonetoolbar_Modoboa [

[Bold Italic Underline][JustifyLeft JustifyCenter JustifyRight JustifyBlock][BidiLtr BidiRtl Language][NumberedList BulletedList - Outdent Indent][Undo Redo][Link Unlink Anchor - Smiley][TextColor BGColor - Source][Font FontSize][Image ][SpellChecker]

]

Donrsquot forget to run the following command

gt python managepy collectstatic

171

If you used 170 for a fresh installation please run the following commands

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy load_initial_data

170

This version requires Django gt= 110 so you need to make some modifications It also brings internal API changeswhich are not backward compatible so installed extensions must be upgraded too

First of all deactivate all installed extensions (edit the settingspy file and comment the corresponding lines inMODOBOA_APPS)

Edit the urlspy file of your local instance and replace its content by the following one

22 Upgrade 33

Modoboa Documentation Release 1100

from djangoconfurls import include url

urlpatterns = [url(r include(modoboaurls))

]

Edit the settingspy and apply the following changes

bull Add modoboaparameters to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboarelaydomainsmodoboalimitsmodoboaparameters Modoboa extensions here

)

bull Add modoboacoremiddlewareLocalConfigMiddleware to MIDDLEWARE_CLASSES

MIDDLEWARE_CLASSES = (djangocontribsessionsmiddlewareSessionMiddlewaredjangomiddlewarecommonCommonMiddlewaredjangomiddlewarecsrfCsrfViewMiddlewaredjangocontribauthmiddlewareAuthenticationMiddlewaredjangocontribmessagesmiddlewareMessageMiddlewaredjangomiddlewarelocaleLocaleMiddlewaredjangomiddlewareclickjackingXFrameOptionsMiddlewaremodoboacoremiddlewareLocalConfigMiddlewaremodoboalibmiddlewareAjaxLoginRedirectmodoboalibmiddlewareCommonExceptionCatchermodoboalibmiddlewareRequestCatcherMiddleware

)

bull Modoboa used to provide a custom authentication backend (modoboalibauthbackendsSimpleBackend) but it has been removed Replace it as follows

AUTHENTICATION_BACKENDS = ( Other backends beforedjangocontribauthbackendsModelBackend

)

bull Remove TEMPLATE_CONTEXT_PROCESSORS and replace it by

TEMPLATES = [

BACKEND djangotemplatebackendsdjangoDjangoTemplatesDIRS []APP_DIRS TrueOPTIONS

context_processors [djangotemplatecontext_processorsdebugdjangotemplatecontext_processorsrequestdjangocontribauthcontext_processorsauth

(continues on next page)

34 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

djangotemplatecontext_processorsi18ndjangotemplatecontext_processorsmediadjangotemplatecontext_processorsstaticdjangotemplatecontext_processorstzdjangocontribmessagescontext_processorsmessagesmodoboacorecontext_processorstop_notifications

]debug False

]

Run the following commands (load virtualenv if you use one)

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstatic

Finally upgrade your extensions and reactivate them

Name Versionmodoboa-amavis 110modoboa-dmarc 100modoboa-imap-migration 110modoboa-pdfcredentials 110modoboa-postfix-autoreply 120modoboa-radicale 110modoboa-sievefilters 110modoboa-stats 110modoboa-webmail 110

Command line shortcuts

$ pip install modoboa-amavis==110$ pip install modoboa-dmarc==100$ pip install modoboa-imap-migration==110$ pip install modoboa-pdfcredentials==110$ pip install modoboa-postfix-autoreply==120$ pip install modoboa-radicale==110$ pip install modoboa-sievefilters==110$ pip install modoboa-stats==110$ pip install modoboa-webmail==110

And please make sure you use the latest version of the django-versionfield2 package

$ pip install -U django-versionfield2

Notes about quota changes and resellers

Reseller users now have a quota option in Resources tab This is the quota that a reseller can share between all itsdomains

22 Upgrade 35

Modoboa Documentation Release 1100

There are two quotas for a domain in the new version

1 Quota amp

2 Default mailbox quota

[1] Quota quota shared between mailboxes This quota is shared between all the mailboxes of this domain This valuecannot exceed resellerrsquos quota and hence cannot be 0(unlimited) if reseller has finite quota

[2] Default mailbox quota default quota applied to mailboxes This quota is the default quota applied to new mail-boxes This value cannot exceed Quota[1] and hence cannot be 0(unlimited) if Quota[1] is finite

161

First of all update postfix map files as follows

gt python managepy generate_postfix_maps --destdir ltpathgt --force-overwrite

Then modify postfixrsquos configuration as follows

smtpd_sender_login_maps =ltdrivergtltpathgtsql-sender-login-mailboxescfltdrivergtltpathgtsql-sender-login-aliasescfltdrivergtltpathgtsql-sender-login-mailboxes-extracf

Replace ltdrivergt and ltpathgt by your values

Finally reload postfix

This release also deprecates some internal functions As a result several extensions has been updated to maintain thecompatibility If you enabled the notification service yoursquoll find the list of available updates directly in your Modoboaconsole

For the others here is the list

Name Versionmodoboa-amavis 1010modoboa-postfix-autoreply 117modoboa-radicale 105modoboa-stats 109

Command line shortcut

$ pip install modoboa-amavis==1010$ pip install modoboa-postfix-autoreply==117$ pip install modoboa-radicale==105$ pip install modoboa-stats==109

160

Warning You have to upgrade extensions due to coreUser model attribute change (usergroup to userrole) Oth-erwise you will have an internal error after upgrade In particular modoboa-amavisd modoboa-stats modoboa-postfix-autoreply are concerned

36 Chapter 2 Table of contents

Modoboa Documentation Release 1100

An interesting feature brougth by this version is the capability to make different checks about MX records Forexample Modoboa can query main DNSBL providers for every defined domain With this you will quickly know ifone the domains you manage is listed or not To activate it add the following line to your crontab

30 ltoptional_virtualenv_pathgtpython ltmodoboa_instance_dirgtmanagepy modorarr˓check_mx

The communication with Modoboa public API has been reworked Instead of sending direct synchronous queries (forexample to check new versions) a cron job has been added To activate it add the following line to your crontab

0 ltoptional_virtualenv_pathgtpython ltmodoboa_instance_dirgtmanagepyrarr˓communicate_with_public_api

Please also note that public API now uses TLS so you must update your configuration as follows

MODOBOA_API_URL = httpsapimodoboaorg1

Finally it is now possible to declare additional sender addresses on a per-account basis You need to update your postfixconfiguration in order to use this functionality Just edit the maincf file and change the following parameter

smtpd_sender_login_maps =ltdrivergtetcpostfixsql-sender-login-mailboxescfltdrivergtetcpostfixsql-sender-login-aliasescfltdrivergtetcpostfixsql-sender-login-mailboxes-extracf

150

The API has been greatly improved and a documentation is now available To enable it addrest_framework_swagger to the INSTALLED_APPS variable in settingspy as follows

INSTALLED_APPS = (djangocontribauthdjangocontribcontenttypesdjangocontribsessionsdjangocontribmessagesdjangocontribsitesdjangocontribstaticfilesreversionrest_frameworkauthtokenrest_framework_swagger

)

Then add the following content into settingspy just after the REST_FRAMEWORK variable

SWAGGER_SETTINGS = is_authenticated Falseapi_version 10exclude_namespaces []info

contact contactmodoboacomdescription (Modoboa API requires a valid token)title Modoboa API

Yoursquore done The documentation is now available at the following address

22 Upgrade 37

Modoboa Documentation Release 1100

httpltyour instance addressgtdocsapi

Finally if you find a TEMPLATE_CONTEXT_PROCESSORS variable in your settingspy file make sure it lookslike this

TEMPLATE_CONTEXT_PROCESSORS = global_settingsTEMPLATE_CONTEXT_PROCESSORS + [modoboacorecontext_processorstop_notifications

]

140

Warning Please make sure to use Modoboa 135 with an up-to-date database before an upgrade to 140

Warning Do not follow the regular upgrade procedure for this version

Some extension have been moved back into the main repository The main reason for that is that using Modoboawithout them doesnrsquot make sense

First of all you must rename the following applications listed inside the MODOBOA_APPS variable

Old name New namemodoboa_admin modoboaadminmodoboa_admin_limits modoboalimitsmodoboa_admin_relaydomains modoboarelaydomains

Then apply the following steps

1 Uninstall old extensions

$ pip uninstall modoboa-admin modoboa-admin-limits modoboa-admin-relaydomains

2 Install all extension updates using pip (check the Modoboa gt Information page)

3 Manually migrate database

$ cd ltinstance_dirgt$ python managepy migrate auth$ python managepy migrate admin 0001 --fake$ python managepy migrate admin$ python managepy migrate limits 0001 --fake$ python managepy migrate relaydomains 0001 --fake$ python managepy migrate

4 Finally update static files

$ python managepy collectstatic

This version also introduces a REST API To enable it

1 Add rest_frameworkauthtoken to the INSTALLED_APPS variable

2 Add the following configuration inside settingspy

38 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Rest framework settings

REST_FRAMEWORK = DEFAULT_AUTHENTICATION_CLASSES (

rest_frameworkauthenticationTokenAuthentication)DEFAULT_PERMISSION_CLASSES (

rest_frameworkpermissionsIsAuthenticated)

3 Run the following command

$ python managepy migrate

135

To enhance security Modoboa now checks the strength of user passwords lthttpsgithubcomdstufftdjango-passwordsgt_

To use this feature add the following configuration into the settingspy file

django-passwords

PASSWORD_MIN_LENGTH = 8

PASSWORD_COMPLEXITY = UPPER 1LOWER 1DIGITS 1

132

Modoboa now uses the atomic requests mode to preserve database consistency (reference)

To enable it update the DATABASES variable in settingspy as follows

DATABASES = default

stuff beforeATOMIC_REQUESTS True

amavis

stuff beforeATOMIC_REQUESTS True

130

This release does not bring awesome new features but it is a necessary bridge to the future of Modoboa All extensionsnow have their own git repository and the deploy process has been updated to reflect this change

22 Upgrade 39

Modoboa Documentation Release 1100

Another important update is the use of Django 17 Besides its new features the migration system has been reworkedand is now more robust than before

Before we begin with the procedure here is a table showing old extension names and their new name

Old name New package name New module namemodoboaextensionsadmin modoboa-admin modoboa_adminmodoboaextensionslimits modoboa-admin-limits modoboa_admin_limitsmodoboaextensionspostfix_autoreply modoboa-postfix-autoreply modoboa_postfix_autoreplymodoboaextensionspostfix_relay_domains modoboa-admin-relaydomains modoboa_admin_relaydomainsmodoboaextensionsradicale modoboa-radicale modoboa_radicalemodoboaextensionssievefilters modoboa-sievefilters modoboa_sievefiltersmodoboaextensionsstats modoboa-stats modoboa_statsmodoboaextensionswebmail modoboa-webmail modoboa_webmail

Here are the required steps

1 Install the extensions using pip (look at the second column in the table above)

$ pip install ltthe extensions you wantgt

2 Remove south from INSTALLED_APPS

3 Rename old extension names inside MODOBOA_APPS (look at the third column in the table above)

4 Remove modoboalibmiddlewareExtControlMiddleware from MIDDLEWARE_CLASSES

5 Change DATABASE_ROUTERS to

DATABASE_ROUTERS = [modoboa_amavisdbrouterAmavisRouter]

6 Run the following commands

$ cd ltmodoboa_instance_dirgt$ python managepy migrate

7 Reply yes to the question

8 Run the following commands

$ python managepy load_initial_data$ python managepy collectstatic

9 The cleanup job has been renamed in Django so you have to modify your crontab entry

- 0 0 ltmodoboa_sitegtmanagepy cleanup+ 0 0 ltmodoboa_sitegtmanagepy clearsessions

120

A new notification service let administrators know about new Modoboa versions To activate it you need to updatethe TEMPLATE_CONTEXT_PROCESSORS variable like this

from djangoconf import global_settings

TEMPLATE_CONTEXT_PROCESSORS = global_settingsTEMPLATE_CONTEXT_PROCESSORS + (

(continues on next page)

40 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

modoboacorecontext_processorstop_notifications)

and to define the new MODOBOA_API_URL variable

MODOBOA_API_URL = httpapimodoboaorg1

The location of external static files has changed To use them add a new path to the STATICFILES_DIRS

Additional locations of static filesSTATICFILES_DIRS = (

Put strings here like homehtmlstatic or Cwwwdjangostatic Always use forward slashes even on Windows Dont forget to use absolute paths not relative pathsltpathtomodoboainstalldirgtbower_components

)

Run the following commands to define the hostname of your instance

$ cd ltmodoboa_instance_dirgt$ python managepy set_default_site lthostnamegt

If you plan to use the Radicale extension

1 Add modoboaextensionsradicale to the MODOBOA_APPS variable

2 Run the following commands

$ cd ltmodoboa_instance_dirgt$ python managepy syncdb

Warning You also have to note that the sitestatic directory has moved from ltpath to your sitesdirgt to ltmodoboas root urlgt (itrsquos probably the parent directory) You have to adapt your web serverconfiguration to reflect this change

23 Configuration

231 Online parameters

Modoboa provides online panels to modify internal parameters There are two available levels

bull Application level global parameters define how the application behaves Available at Modoboa gt Parameters

bull User level per user customization Available at User gt Settings gt Preferences

Regardless level parameters are displayed using tabs each tab corresponding to one application

General parameters

The admin application exposes several parameters they are presented below

23 Configuration 41

Modoboa Documentation Release 1100

Name Tab Description Default valueAuthentication type General The backend used for au-

thenticationLocal

Default password scheme General Scheme used to cryptmailbox passwords

crypt

Rounds General Number of rounds (onlyused by sha256cryptand sha512crypt) Mustbe between 1000 and999999999 inclusive

70000

Secret key General A key used to encryptusersrsquo password in ses-sions

random value

Sender address General Email address used tosend notifications

Enable communication General Enable communicationwith Modoboa public API

yes

Check new versions General Automatically checks if anewer version is available

yes

Send statistics General Send statistics to Mod-oboa public API (countersand used extensions)

yes

Top notifications check in-terval

General Interval between two topnotification checks (inseconds)

30

Maximum log record age General The maximum age in daysof a log record

365

Items per page General Number of displayeditems per page

30

Default top redirection General The default redirectionused when no applicationis specified

userprefs

Enable MX checks Admin Check that every domainhas a valid MX record

yes

Valid MXs Admin A list of IP or networkaddress every MX shouldmatch A warning will besent if a record does notrespect this it

Enable DNSBL checks Admin Check every domainagainst major DNSBLproviders

yes

DKIM keys storage direc-tory

AdminPath to a directory where DKIM

generated keys willbe stored

Default DKIM key length Admin The default size (in bits)for new keys

2048

Handle mailboxes onfilesystem

Admin Rename or remove mail-boxes on the filesystemwhen they get renamed orremoved within Modoboa

no

Mailboxes owner Admin The UNIX account whoowns mailboxes on thefilesystem

vmail

Default domain quota Admin Default quota (in MB) ap-plied to freshly createddomains with no valuespecified A value of 0means no quota

0

Automatic accountremoval

Admin When a mailbox is re-moved also remove theassociated account

no

Automatic do-mainmailbox creation

Admin Create a domain and amailbox when an accountis automatically created

yes

42 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Note If you are not familiar with virtual domain hosting you should take a look at postfixrsquos documentation ThisHow to also contains useful information

Note A random secret key will be generated each time the Parameters page is refreshed and until you save parametersat least once

Note Specific LDAP parameters are also available see LDAP authentication

232 Media files

Modoboa uses a specific directory to upload files (ie when the webmail is in use) or to create ones (ex graphical statis-tics) This directory is named media and is located inside modoboarsquos installation directory (called modoboa_sitein this documentation)

To work properly the system user which runs modoboa (www-data apache whatever) must have write access tothis directory

233 Customization

Custom logo

You have the possibility to use a custom logo instead of the default one on the login page

To do so open the settingspy file and add a MODOBOA_CUSTOM_LOGO variable This variable must containthe relative URL of your logo under MEDIA_URL For example

MODOBOA_CUSTOM_LOGO = ospathjoin(MEDIA_URL custom_logopng)

Then copy your logo file into the directory indicated by MEDIA_ROOT

234 Host configuration

Note This section is only relevant when Modoboa handles mailboxes renaming and removal from the filesystem

To manipulate mailboxes on the filesystem you must allow the user who runs Modoboa to execute commands as theuser who owns mailboxes

To do so edit the etcsudoers file and add the following inside

ltuser_that_runs_modoboagt ALL=(ltmailboxes ownergt) NOPASSWD ALL

Replace values between ltgt by the ones you use

23 Configuration 43

Modoboa Documentation Release 1100

235 Time zone and language

Modoboa is available in many languages

To specify the default language to use edit the settingspy file and modify the LANGUAGE_CODE variable

LANGUAGE_CODE = fr or en for english etc

Note Each user has the possibility to define the language he prefers

In the same configuration file specify the timezone to use by modifying the TIME_ZONE variable For example

TIME_ZONE = EuropeParis

236 Sessions management

Modoboa uses Djangorsquos session framework to store per-user information

Few parameters need to be set in the settingspy configuration file to make Modoboa behave as expected

SESSION_EXPIRE_AT_BROWSER_CLOSE = False Default value

This parameter is optional but you must ensure it is set to False (the default value)

The default configuration file provided by the modoboa-adminpy command is properly configured

237 Logging authentication

To trace login attempts to the web interface Modoboa uses python SysLogHandler so you can see them in your syslogauthentication log file (varlogauthlog in most cases)

Depending on your configuration you may have to edit the settingspy file and add lsquoaddressrsquo lsquodevlogrsquo to thelogging section

syslog-auth class logginghandlersSysLogHandlerfacility SysLogHandlerLOG_AUTHaddress devlogformatter syslog

238 External authentication

LDAP

Modoboa supports external LDAP authentication using the following extra components

bull Python LDAP client

bull Django LDAP authentication backend

If you want to use this feature you must first install those components

44 Chapter 2 Table of contents

Modoboa Documentation Release 1100

$ pip install python-ldap django-auth-ldap

Then all you have to do is to modify the settingspy file Add a new authentication backend to the AUTHENTI-CATION_BACKENDS variable like this

AUTHENTICATION_BACKENDS = (modoboalibauthbackendsLDAPBackend modoboalibauthbackendsLDAPSecondaryBackend Useful for a fallback

rarr˓mechanismdjangocontribauthbackendsModelBackend

)

Finally go to Modoboa gt Parameters gt General and set Authentication type to LDAP

From there new parameters will appear to let you configure the way Modoboa should connect to your LDAP serverThey are described just below

Name Description De-faultvalue

Server address The IP address of the DNS name of the LDAP server local-host

Server port The TCP port number used by the LDAP server 389Use a secureconnection

Use an SSLTLS connection to access the LDAP server no

Authenticationmethod

Choose the authentication method to use Directbind

User DN tem-plate (directbind mode)

The template used to construct a userrsquos DN It should contain one placeholder (ie(user)s)

Bind BN The distinguished name to use when binding to the LDAP server Leave empty for ananonymous bind

Bind password The password to use when binding to the LDAP server (with lsquoBind DNrsquo)Search base The distinguished name of the search baseSearch filter An optional filter string (eg lsquo(objectClass=person)rsquo) In order to be valid it must be

enclosed in parentheses(mail=(user)s)

Passwordattribute

The attribute used to store user passwords user-Pass-word

Active Direc-tory

Tell if the LDAP server is an Active Directory one no

Administratorgroups

Members of those LDAP Posix groups will be created ad domain administrators Uselsquorsquo characters to separate groups

Group type The type of group used by your LDAP directory Posix-Group

Groups searchbase

The distinguished name of the search base used to find groups

Do-mainmailboxcreation

Automatically create a domain and a mailbox when a new user is created just after thefirst successful authentication You will generally want to disable this feature whenthe relay domains extension is in use

yes

If you need additional parameters you will find a detailed documentation here

Once the authentication is properly configured the users defined in your LDAP directory will be able to connect to

23 Configuration 45

Modoboa Documentation Release 1100

Modoboa the associated domain and mailboxes will be automatically created if needed

The first time a user connects to Modoboa a local account is created if the LDAP username is a valid email addressBy default this account belongs to the SimpleUsers group and it has a mailbox

To automatically create domain administrators you can use the Administrator groups setting If a LDAP user belongsto one the listed groups its local account will belong to the DomainAdmins group In this case the username is notnecessarily an email address

Users will also be able to update their LDAP password directly from Modoboa

Note Modoboa doesnrsquot provide any synchronization mechanism once a user is registered into the database Anymodification done from the directory to a user account will not be reported to Modoboa (an email address change forexample) Currently the only solution is to manually delete the Modoboa record it will be recreated on the next userlogin

SMTP

It is possible to use an existing SMTP server as an authentication source To enable this feature edit the settingspy file and change the following setting

AUTHENTICATION_BACKENDS = (modoboalibauthbackendsSMTPBackenddjangocontribauthbackendsModelBackend

)

SMTP server location can be customized using the following settings

AUTH_SMTP_SERVER_ADDRESS = localhostAUTH_SMTP_SERVER_PORT = 25AUTH_SMTP_SECURED_MODE = None ssl or starttls are accepted

239 LDAP synchronization

Modoboa can synchronize accounts with an LDAP directory (tested with OpenLDAP) but this feature is not enabledby default To activate it add modoboaldapsync to MODOBOA_APPS in the settingspy file

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboaldapsync

)

and enable it from the admin panel

46 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning Make sure to install additional requirements otherwise it wonrsquot work

The following parameters are available and must be filled

Name Description Defaultvalue

Enable LDAP synchro-nization

Control LDAP synchronization state no

Bind DN The DN of a user with write permission to createupdate accountsBind password The associated passwordAccount DN template The template used to build account DNs (must contain a (user)s

placeholder

2310 Database maintenance

Cleaning the logs table

Modoboa logs administrator specific actions into the database A clean-up script is provided to automatically removeoldest records The maximum log record age can be configured through the online panel

To use it you can setup a cron job to run every night

0 0 ltmodoboa_sitegtmanagepy cleanlogs Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy cleanlogs

Cleaning the session table

Django does not provide automatic purging Therefore itrsquos your job to purge expired sessions on a regular basis

Django provides a sample clean-up script django-adminpy clearsessions That script deletes any sessionin the session table whose expire_date is in the past

For example you could setup a cron job to run this script every night

0 0 ltmodoboa_sitegtmanagepy clearsessions Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy clearsessions

Cleaning inactive accounts

Thanks to Last-login tracking it is now possible to monitor inactive accounts An account is considered inactive if nologin has been recorded for the last 30 days (this value can be changed through the admin panel)

A management command is available to disable or delete inactive accounts For example you could setup a cron jobto run it every night

23 Configuration 47

Modoboa Documentation Release 1100

0 0 ltmodoboa_sitegtmanagepy clean_inactive_accounts Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy clean_inactive_rarr˓accounts

The default behaviour is to disable accounts You can delete them using the --delete option

24 Moving to Modoboa

You have an existing platform and yoursquod like to move to Modoboa the following tools could help you

241 From postfixadmin

A dedicated command allows you to convert an existing postfixadmin database to a Modoboa one Consult the docu-mentation to know more about the process

242 Using CSV files

Modoboa allows you to import any object (domain domain alias mailbox and alias) using a simple CSV file encodedusing UTF8 Each line corresponds to a single object and must respect one of the following format

domain ltname stringgt ltquota integergt ltdefault mailbox quota integergt ltenabledrarr˓booleangtdomainalias ltname stringgt lttargeted domain stringgt ltenabled booleangtrelaydomain ltname stringgt lttarget host stringgt lttarget port integergt ltservicerarr˓stringgt ltenabled booleangt ltverify recipients booleangtaccount ltloginname stringgt ltpassword stringgt ltfirst name stringgt ltlast namerarr˓stringgt ltenabled booleangt ltgroup stringgt ltaddress stringgt ltquota integergt [rarr˓ltdomain stringgt ]alias ltaddress stringgt ltenabled booleangt ltrecipient stringgt

Boolean fields accept the following values true 1 yes y (case insensitive) Any other value will be evaluated asfalse

Warning The order does matter Objects are created sequencially so a domain must be created before itsmailboxes and aliases and a mailbox must created before its alias(es)

To actually import such a file

gt sudo -u ltmodoboa_usergt -igt source ltvirtualenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy modo import ltyour filegt

Available options can be listed using the following command

gt python managepy modo import -h

48 Chapter 2 Table of contents

Modoboa Documentation Release 1100

25 REST API

To ease the integration with external sources (software or other) Modoboa provides a REST API

Every installed instance comes with a ready-to-use API and a documentation You will find them using the followingurl patterns

bull API httplthostnamegtapiv1

bull Documentation httplthostnamegtdocsapi

An example of this documentation is available on the official demo

Using this API requires an authentication and for now only a token based authentication is supported To get a validtoken log-in to your instance with a super administrator go to Settings gt API and activate the API access Press theUpdate button and wait until the page is reloaded the token will be displayed

To make valid API calls every requests you send must embed this token within an Authorization HTTP header likethis

Authorization Token ltYOUR_TOKENgt

and the content type of those requests must be applicationjson

26 How to contribute

Contributions are always welcome If you want to submit a patch please respect the following rules

bull Open a pull request on the appropriate repository

bull Respect PEP8

bull Document your patch and respect PEP 257

bull Add unit tests and make sure the global coverage does not decrease

If all those steps are validated your contribution will generally be integrated

261 Table of contents

25 REST API 49

Modoboa Documentation Release 1100

Useful tips

You would like to work on Modoboa but you donrsquot know where to start Yoursquore at the right place Browse this pageto learn useful tips

Docker

A docker image is available for developers To use it you must install docker and docker-compose first

Then just run the following command

$ docker-compose up

It will start the docker environment and make a Modoboa instance available at httplocalhost8000

If you donrsquot want to use docker or need a more complex development setup go to the next section

Prepare a virtual environment

A virtual environment is a good way to setup a development environment on your machine

To do so run the following commands

$ python3 -m venv ltpathgt$ source ltpathgtbinactivate$ git clone httpsgithubcommodoboamodoboagit$ cd modoboa$ python setuppy develop$ pip install -r dev-requirementstxt

The develop command creates a symbolic link to your local copy so any modification you make will be automati-cally available in your environment no need to copy them

Deploy an instance for development

Warning Make sure to create a database before running this step The format of the database url is also describedin this page

Now that you have a running environment yoursquore ready to deploy a test instance

$ cd ltpathgt$ modoboa-adminpy deploy --dburl defaultltdatabase urlgt --domain localhost --develrarr˓instance$ python managepy runserver

Yoursquore ready to go You should be able to access Modoboa at httplocalhost8000 usingadminpassword as credentials

Manage static files

Modoboa uses bower (thanks to django-bower) to manage its CSS and javascript dependencies

50 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Those dependencies are listed in a file called dev_settingspy located inside the ltpath_to_local_copygtmodoboacore directory

If you want to add a new dependency just complete the BOWER_INSTALLED_APPS parameter and run the followingcommand

$ python managepy bower install

It will download and store the required files into the ltpath_to_local_copygtmodoboabower_components directory

Test your modifications

If you deployed a specific instance for your development needs you can run the tests suite as follows

gt python managepy test modoboacore modoboalib modoboaadmin modoboalimits modoboararr˓relaydomains

Otherwise you can run the tests suite from the repository using tox

Start a basic Modoboa instance

From the repository run the following command to launch a simple instance with a few fixtures

gt tox -e serve

You can use adminpassword to log in

Build the documentation

If you need to modify the documenation and want to see the result you can build it as follows

gt tox -e docgt firefox toxdoctmphtmlindexhtml

FAQ

bower command is missing in managepy

bower command is missing in managepy if you donrsquot use the --devel option of the modoboa-adminpydeploy command

To fix it regenerate your instance or update your settingspy file manually Look at devmode in httpsgithubcomtonioomodoboablobmastermodoboacorecommandstemplatessettingspytpl

Create a new plugin

Introduction

Modoboa offers a plugin API to expand its capabilities The current implementation provides the following possibili-ties

26 How to contribute 51

Modoboa Documentation Release 1100

bull Expand navigation by adding entry points to your plugin inside the GUI

bull Access and modify administrative objects (domains mailboxes etc)

bull Register callback actions for specific events

Plugins are nothing more than Django applications with an extra piece of code that integrates them into Modoboa Themodo_extensionpy file will contain a complete description of the plugin

bull Admin and user parameters

bull Custom menu entries

The communication between both applications is provided by Django signals

The following subsections describe the plugin architecture and explain how you can create your own

The required glue

To create a new plugin just start a new django application like this (into Modoboarsquos directory)

$ python managepy startapp

Then you need to register this application using the provided API Just copypaste the following example into themodo_extensionpy file of the future extension

from modoboacoreextensions import ModoExtension exts_pool

class MyExtension(ModoExtension)My custom Modoboa extension

name = myextlabel = My Extensionversion = 01description = A descriptionurl = myext_root_location optional name is used if not defined

def load(self)This method is called when Modoboa loads available and activated plugins

Declare parameters and register events herepass

def load_initial_data(self)Optional provide initial data for your extension herepass

exts_poolregister_extension(MyExtension)

Once done simply add your extensionrsquos module name to the MODOBOA_APPS variable located inside settingspy Finally run the following commands

$ python managepy migrate$ python managepy load_initial_data$ python managepy collectstatic

52 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Parameters

A plugin can declare its own parameters There are two levels available

bull lsquoGlobalrsquo parameters used to configure the plugin editable inside the Admin gt Settings gt Parameters page

bull lsquoUserrsquo parameters per-user parameters (or preferences) editable inside the Options gt Preferences page

Playing with parameters

Parameters are defined using Django forms and Modoboa adds two special forms you can inherit depending on thelevel of parameter(s) you want to add

bull modoboaparametersformsAdminParametersForm for general parameters

bull modoboaparametersformsUserParametersForm for user parameters

To register new parameters add the following line into the load method of your plugin class

from modoboaparameters import tools as param_toolsparam_toolsregistryadd(

LEVEL YourForm ugettext_lazy(Title))

Replace LEVEL by global or user

Custom role permissions

Modoboa uses Djangorsquos internal permission system Administrative roles are nothing more than groups (Groupinstances)

An extension can add new permissions to a group by listening to the extra_role_permissions signal Here isan example

from djangodispatch import receiverfrom modoboacore import signals as core_signals

PERMISSIONS = Resellers [

(relaydomains relaydomain add_relaydomain)(relaydomains relaydomain change_relaydomain)(relaydomains relaydomain delete_relaydomain)(relaydomains service add_service)(relaydomains service change_service)(relaydomains service delete_service)

]

receiver(core_signalsextra_role_permissions)def extra_role_permissions(sender role kwargs)

Add permissions to the Resellers groupreturn constantsPERMISSIONSget(role [])

Extending admin forms

The forms used to edit objects (account domain etc) through the admin panel are composed of tabs You can extendthem (ie add new tabs) in a pretty easy way thanks to custom signals

26 How to contribute 53

Modoboa Documentation Release 1100

Account

To add a new tab to the account edition form define new listeners (handlers) for the following signals

bull modoboaadminsignalsextra_account_forms

bull modoboaadminsignalsget_account_form_instances

bull modoboaadminsignalscheck_extra_account_form (optional)

Example

from djangodispatch import receiverfrom modoboaadmin import signals as admin_signals

receiver(admin_signalsextra_account_forms)def extra_account_form(sender user account kwargs)

return [id tabid title Title cls MyFormClass

]

receiver(admin_signalsget_account_form_instances)def fill_my_tab(sender user account kwargs)

return id my_instance

Domain

To add a new tab to the domain edition form define new listeners (handlers) for the following signals

bull modoboaadminsignalsextra_domain_forms

bull modoboaadminsignalsget_domain_form_instances

Example

from djangodispatch import receiverfrom modoboaadmin import signals as admin_signals

receiver(admin_signalsextra_domain_forms)def extra_account_form(sender user domain kwargs)

return [id tabid title Title cls MyFormClass

]

receiver(admin_signalsget_domain_form_instances)def fill_my_tab(sender user domain kwargs)

return id my_instance

27 Contributors

bull Antidot

bull Bearstech

bull CAP-REL

54 Chapter 2 Table of contents

Modoboa Documentation Release 1100

bull Dalnix

27 Contributors 55

  • Overview
  • Table of contents
Page 2: Modoboa Documentation

Contents

1 Overview 3

2 Table of contents 5

i

ii

Modoboa Documentation Release 1100

Contents 1

Modoboa Documentation Release 1100

2 Contents

CHAPTER 1

Overview

Modoboa is a mail hosting and management platform including a modern and simplified Web User Interface designedto work with Postfix and Dovecot

It is extensible by nature and comes with a lot of additional extensions

Name Description Documentationmodoboa-amavis A frontend for Amavis httpsmodoboa-amavisreadthedocs

iomodoboa-dmarc A set of tools to use DMARC httpsgithubcommodoboa

modoboa-dmarcmodoboa-imap-migration

Migrate mailboxes from an existing server usingIMAP (and offlineimap)

httpsgithubcommodoboamodoboa-imap-migration

modoboa-pdfcredentials

Generate PDF documents containing account cre-dentials

httpsgithubcommodoboamodoboa-pdfcredentials

modoboa-pfxadmin-migrate

A tool to migrate from Postfixadmin httpsgithubcommodoboamodoboa-pfxadmin-migrate

modoboa-postfix-autoreply

Away message editor (postfix compatible) httpsmodoboa-postfix-autoreplyreadthedocsio

modoboa-radicale A frontend for Radicale httpsmodoboa-radicalereadthedocsio

modoboa-sievefilters

A Sieve filters (rules) editor httpsmodoboa-sievefiltersreadthedocsio

modoboa-stats Graphical statistics (message traffic and more) httpsmodoboa-statsreadthedocsiomodoboa-webmail A simple webmail httpsmodoboa-webmail

readthedocsio

3

Modoboa Documentation Release 1100

4 Chapter 1 Overview

CHAPTER 2

Table of contents

21 Installation

211 Requirements

You will need a Server to perform well with at least

bull CPU 2

bull RAM 2GB

bull Disk 10GB

bull Python 3

Note Heads up for modoboa versions 115 and later

Python 2 support has been dropped with modoboa version 115 If you still have Python 2 installed on your systemeither uninstall it or force modoboa user to run with Python 3

212 Recommended way

If you start from scratch and want to deploy a complete mail server you will love the modoboa installer It is theeasiest and the quickest way to setup a fully functional server (modoboa postfix dovecot amavis and more) on onemachine

Warning For now only Debian and CentOS based Linux distributions are supported We do our best to improvecompatibility but if you use another Linux or a UNIX system you will have to install Modoboa manually

To use it just run the following commands in your terminal

5

Modoboa Documentation Release 1100

gt git clone httpsgithubcommodoboamodoboa-installergt cd modoboa-installergt sudo runpy ltyour domaingt

if you get this warning - lsquousrbinenv lsquopythonrsquo No such file or directoryrsquo do make sure sure python is installed onyour server Sometimes python is installed but the installer canrsquot detect it or which python version to run especiallyon a debian based system Then run this command first

gt sudo apt-get install python-virtualenv python-pip

Wait a few minutes and yoursquore done o

213 Manual installation

For those who need a manual installation or who just want to setup a specific part here are the steps you must follow

Modoboa

This section describes the installation of the web interface (a Django project)

Prepare the system

First of all we recommend the following context

bull A dedicated system user

bull A virtual environment to install the application because it will isolate it (and its dependencies) from the rest ofyour system

The following example illustrates how to realize this on Debian-based distributions using virtualenv

apt-get install virtualenv python3-pip useradd modoboa create a dedicated user su -l modoboa log in as the newly created user$ virtualenv --python python3 env create the virtual environment$ source envbinactivate activate the virtual environment

Modoboa depends on external tools and some of them require compilation so you need a compiler and a few C librariesMake sure to install the following system packages according to your distribution

Debian Ubuntubuild-essential python3-dev libxml2-dev libxslt-dev libjpeg-dev librrd-dev rrdtool libffi-dev libssl-dev

CentOSgcc gcc-c++ python3-devel libxml2-devel libxslt-devel libjpeg-turbo-devel rrdtool-devel rrdtool libffi-devel

Note Alternatively you could rely on your distribution packages for the Modoboa dependencies which requirecompilation - eg psycopg2 - if the version is compatible In this case you have to create your virtual environmentwith the --system-site-packages option

Then install Modoboa by running

6 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(env)$ pip install modoboa

Database

Warning This documentation does not cover the installation of a database server but only the setup of a functionaldatabase that Modoboa will use

Thanks to Django Modoboa is compatible with the following databases

bull PostgreSQL

bull MySQL MariaDB

bull SQLite

Since the last one does not require particular actions only the first two ones are described You should also read thenotes for those database backends on the official Django documentation

PostgreSQL

Install the corresponding Python binding

(env)$ pip install psycopg2

Note Alternatively you can install the python3-psycopg2 package instead on Debian-based distributions ifyour virtual environment was created with --system-site-packages option

Then create a user and a database For example to create the modoboa database owned by a modoboa user run thefollowing commands on your PostgreSQL server

sudo -l -u postgres createuser --no-createdb modoboa sudo -l -u postgres createdb --owner=modoboa modoboa

MySQL MariaDB

Install the corresponding Python binding

(env)$ pip install mysqlclient

Note Alternatively you can install the python3-mysqldb package instead on Debian-based distributions if yourvirtual environment was created with --system-site-packages option

Note MariaDB 102 (and newer) require mysqlclient 1311 (or newer)

Then create a user and a database For example to create the modoboa database owned by a modoboa user run thefollowing SQL commands

21 Installation 7

Modoboa Documentation Release 1100

CREATE DATABASE modoboaCREATE USER modoboalocalhost IDENTIFIED BY my-strong-password-hereGRANT ALL PRIVILEGES ON modoboa TO modoboalocalhost

Deploy an instance

modoboa-adminpy is a command line tool that lets you deploy a ready-to-use Modoboa site To create a newinstance into instance you just have to run the following command

(env)$ modoboa-adminpy deploy instance --collectstatic --domain lthostname of your servergt --dburl defaultltdatabase urlgt

Note You can install additional extensions during the deploy process To do so use the --extensions op-tion which accepts a list of names as argument (--extensions ext1 ext2 ) If you want to install allextensions just use the all keyword like this --extensions all

If you choose to install extensions one at a time you will have to add their names in settingspy to MODOBOA_APPSAlso ensure that you have the line from modoboa_amavissettings import at the end of this file

The list of available extensions can be found on the index page Instructions to install them are available on eachextensions page

Note You can specify more than one database connection using the --dburl option Multiple connections aredifferentiated by a prefix

The primary connection must use the default prefix (as shown in the example above) For the amavis exten-sion use the amavis prefix For example --dburl defaultltdatabase urlgt amavisltdatabaseurlgt

A database url should meet the following syntax ltmysql|postgresgt[userpass][hostport]dbname OR sqlitefullpathtoyourdatabasefilesqlite

The command will ask you a few questions answer them and yoursquore done

If you need a silent installation (eg if yoursquore using Salt-Stack Ansible or whatever) itrsquos possible to supply thedatabase credentials as command line arguments

You can consult the complete option list by running the following command

(env)$ modoboa-adminpy help deploy

Cron jobs

A few recurring jobs must be configured to make Modoboa works as expected

Create a new file for example etccrondmodoboa and put the following content inside

Modoboa specific cron jobsPYTHON=ltpath to Python binary inside the virtual environmentgtINSTANCE=ltpath to Modoboa instancegt

(continues on next page)

8 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

Operations on mailboxes

vmail $PYTHON $INSTANCEmanagepy handle_mailbox_operations

Generate DKIM keys (they will belong to the user running this job)

root umask 077 ampamp $PYTHON $INSTANCEmanagepy modo manage_dkim_rarr˓keys

Sessions table cleanup0 0 modoboa $PYTHON $INSTANCEmanagepy clearsessions Logs table cleanup0 0 modoboa $PYTHON $INSTANCEmanagepy cleanlogs DNSBL checks

30 modoboa $PYTHON $INSTANCEmanagepy modo check_mx Public API communication0 modoboa $PYTHON $INSTANCEmanagepy communicate_with_public_api

Policy daemon

Modoboa comes with a built-in Policy Daemon for Postfix Current features are

bull Define daily sending limits for domains andor accounts

A redis server is required to run this new daemon

You can launch it manually using the following command

(env)gt python managepy policy_daemon

But we recommend an automatic start using systemd or supervisor Here is a configuration example forsupervisor

[programpolicyd]autostart=trueautorestart=truecommand=srvmodoboaenvbinpython srvmodoboainstancemanagepy policy_daemondirectory=srvmodoboaredirect_stderr=trueuser=modoboanumprocs=1

It will listen by default on 127001 and port 9999 The policy daemon wonrsquot do anything unless you tell postfixto use it

Now you can continue to the Web server section

Web server

Note The following instructions are meant to help you get your site up and running quickly However it is notpossible for the people contributing documentation to Modoboa to test every single combination of web server wsgiserver distribution etc So it is possible that your installation of uwsgi or nginx or Apache or what-have-you worksdifferently Keep this in mind

21 Installation 9

Modoboa Documentation Release 1100

Apache2

First make sure that mod_wsgi is installed on your server

Create a new virtualhost in your Apache configuration and put the following content inside

ltVirtualHost 80gtServerName ltyour valuegtDocumentRoot ltmodoboa_instance_pathgt

Alias media ltmodoboa_instance_pathgtmedialtDirectory ltmodoboa_instance_pathgtmediagtOrder denyallowAllow from all

ltDirectorygt

Alias sitestatic ltmodoboa_instance_pathgtsitestaticltDirectory ltmodoboa_instance_pathgtsitestaticgtOrder denyallowAllow from all

ltDirectorygt

WSGIScriptAlias ltmodoboa_instance_pathgtltinstance_namegtwsgipy

Pass Authorization header to enable API usageWSGIPassAuthorization On

ltVirtualHostgt

This is just one possible configuration

To use mod_wsgi daemon mode add the two following directives just under WSGIScriptAlias

WSGIDaemonProcess examplecom python-path=ltmodoboa_instancegtltvirtualenv pathgtlibrarr˓python37site-packagesWSGIProcessGroup examplecom

Replace values between ltgt with yours If you donrsquot use a virtualenv just remove the last part of theWSGIDaemonProcess directive

Note You will certainly need more configuration in order to launch Apache

Now you can go the Dovecot section to continue the installation

Nginx

This section covers two different ways of running Modoboa behind Nginx using a WSGI application server Choosethe one you prefer between Green Unicorn or uWSGI

In both cases yoursquoll need to download and install nginx

Green Unicorn

Firstly Download and install gunicorn Then use the following sample gunicorn configuration (create a new filenamed gunicornconfpy inside Modoboarsquos root dir)

10 Chapter 2 Table of contents

Modoboa Documentation Release 1100

backlog = 2048bind = unixvarrungunicornmodoboasockpidfile = varrungunicornmodoboapiddaemon = Truedebug = Falseworkers = 2logfile = varloggunicornmodoboalogloglevel = info

To start gunicorn execute the following commands

$ cd ltmodoboa dirgt$ gunicorn -c gunicornconfpy ltmodoboa dirgtwsgiapplication

Now the nginx part Just create a new virtual host and use the following configuration

upstream modoboa server unixvarrungunicornmodoboasock fail_timeout=0

server listen 443 sslssl onkeepalive_timeout 70

server_name lthost fqdngtroot ltmodoboa_instance_pathgt

access_log varlognginxlthost fqdngtaccesslogerror_log varlognginxlthost fqdngterrorlog

ssl_certificate ltssl certificate for your sitegtssl_certificate_key ltssl certificate key for your sitegt

location sitestatic autoindex on

location media autoindex on

location proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_forproxy_set_header Host $http_hostproxy_redirect offproxy_set_header X-Forwarded-Protocol sslproxy_pass httpmodoboa

If you do not plan to use SSL then change the listen directive to listen 80 and delete each of the followingdirectives

ssl onkeepalive_timeout 70ssl_certificate ltssl certificate for your sitegt

(continues on next page)

21 Installation 11

Modoboa Documentation Release 1100

(continued from previous page)

ssl_certificate_key ltssl certificate key for your sitegtproxy_set_header X-Forwarded-Protocol ssl

If you do plan to use SSL yoursquoll have to generate a certificate and a key This article contains information about howto do it

Paste this content to your configuration (replace values between ltgt with yours) and restart nginx

Now you can go the Dovecot section to continue the installation

uWSGI

The following setup is meant to get you started quickly You should read the documentation of both nginx and uwsgito understand how to optimize their configuration for your site

The Django documentation includes the following warning regarding uwsgi

Warning Use uwsgi 126 or newer If you do not you will run into problems Modoboa will fail in obscureways

To use this setup first download and install uwsgi

Here is a sample nginx configuration

server listen 443 sslssl onkeepalive_timeout 70

server_name lthost fqdngtroot ltmodoboas settings dirgt

ssl_certificate ltssl certificate for your sitegtssl_certificate_key ltssl certificate key for your sitegt

access_log varlognginxlthost fqdngtaccesslogerror_log varlognginxlthost fqdngterrorlog

location ltmodoboas root urlgtsitestatic autoindex onalias ltlocation of sitestatic on your file systemgt

Whether or not Modoboa uses a media directory depends on how you configured Modoboa It does not hurt to have thislocation ltmodoboas root urlgtmedia

autoindex onalias ltlocation of media on your file systemgt

This denies access to any file that begins with ht Apaches htaccess and htpasswd are such files A Modoboa installed from scratch would not contain any such files but you never know what the future holds

(continues on next page)

12 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

location ~ ht deny all

location ltmodobas root urlgt include uwsgi_paramsuwsgi_pass ltuwsgi portgtuwsgi_param UWSGI_SCRIPT ltmodoboa instance namegtwsgiapplicationuwsgi_param UWSGI_SCHEME https

ltmodoboa instance namegt must be replaced by the value you used when you deployed your instance

If you do not plan to use SSL then change the listen directive to listen 80 and delete each of the followingdirectives

ssl onkeepalive_timeout 70ssl_certificate ltssl certificate for your sitegtssl_certificate_key ltssl certificate key for your sitegtuwsgi_param UWSGI_SCHEME https

If you do plan to use SSL yoursquoll have to generate a certificate and a key This article contains information about howto do it

Make sure to replace the ltgt in the sample configuration with appropriate values Here are some explanations forthe cases that may not be completely self-explanatory

ltmodoboas settings dirgt Where Modoboarsquos settingspy resides This is also where thesitestatic and media directories reside

ltmodoboas root urlgt This is the URL which will be the root of your Modoboa site at your domain For in-stance if your Modoboa installation is reachable at at httpsfoomodoboa then ltmodoboas rooturlgt is modoboa In this case you probably also have to set the alias directives to point to where Mod-oboarsquos sitestatic and media directories are because otherwise nginx wonrsquot be able to find them

If Modoboa is at the root of your domain then ltmodoboa root urlgt is an empty string and can be deletedfrom the configuration above In this case you probably do not need the alias directives

ltuwsgi portgt The location where uwsig is listening It could be a unix domain socket or an addressport combi-nation Ubuntu configures uwsgi so that the port is

unixrunuwsgiappltapp namegtsocket

where ltapp namegt is the name of the application

Your uwsgi configuration should be

[uwsgi] Not needed when using uwsgi from pip plugins = pythonchdir = ltmodoboas top dirgtmodule = ltnamegtwsgiapplicationmaster = trueharakiri = 60processes = 4vhost = trueno-default-app = true

21 Installation 13

Modoboa Documentation Release 1100

The plugins directive should be turned on if you use a uwsgi installation that requires it If uwsgi was installed frompip it does not require it In the configuration above

ltmodoboas top dirgt The directory where managepy resides This directory is the parent of ltmodoboassettings dirgt

ltnamegt The name that you passed to modoboa-adminpy deploy when you created your Modoboa instance

Now you can go the Dovecot section to continue the installation

Dovecot

Modoboa requires Dovecot 2+ to work so the following documentation is suitable for this combination

In this section we assume dovecotrsquos configuration resides in etcdovecot all pathes will be relative to thisdirectory

Mailboxes

First edit the confd10-mailconf and set the mail_location variable

maildirmail_location = maildir~maildir

Then edit the inbox namespace and add the following lines

inbox = yes

mailbox Drafts auto = subscribespecial_use = Drafts

mailbox Junk

auto = subscribespecial_use = Junk

mailbox Sent

auto = subscribespecial_use = Sent

mailbox Trash

auto = subscribespecial_use = Trash

With dovecot 21+ it ensures all the special mailboxes will be automaticaly created for new accounts

For dovecot 20 and older use the autocreate plugin

Operations on the file system

14 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning Modoboa needs to access the dovecot binary to check its version To find the binary path weuse the which command first and then try known locations (usrsbindovecot and usrlocalsbindovecot) If you installed dovecot in a custom location please tell us where the binary is by usingthe DOVECOT_LOOKUP_PATH setting (see settingspy)

Three operation types are considered

1 Mailbox creation

2 Mailbox renaming

3 Mailbox deletion

The first one is managed by Dovecot The last two ones may be managed by Modoboa if it can access the file systemwhere the mailboxes are stored (see General parameters to activate this feature)

Those operations are treated asynchronously by a cron script For example when you rename an e-mail addressthrough the web UI the associated mailbox on the file system is not modified directly Instead of that a renameorder is created for this mailbox The mailbox will be considered unavailable until the order is executed (see Postfixconfiguration)

Edit the crontab of the user who owns the mailboxes on the file system

$ crontab -u ltusergt -e

And add the following line inside

python ltmodoboa_sitegtmanagepy handle_mailbox_operations

Warning The cron script must be executed by the system user owning the mailboxes

Warning The user running the cron script must have access to the settingspy file of the modoboa instance

The result of each order is recorded into Modoboarsquos log Go to Modoboa gt Logs to consult them

Authentication

To make the authentication work edit the confd10-authconf and uncomment the following line at the end

include auth-systemconfextinclude auth-sqlconfextinclude auth-ldapconfextinclude auth-passwdfileconfextinclude auth-checkpasswordconfextinclude auth-vpopmailconfextinclude auth-staticconfext

Then edit the confdauth-sqlconfext file and add the following content inside

passdb sql driver = sql Path for SQL configuration file see example-configdovecot-sqlconfext

(continues on next page)

21 Installation 15

Modoboa Documentation Release 1100

(continued from previous page)

args = etcdovecotdovecot-sqlconfext

userdb sql driver = sqlargs = etcdovecotdovecot-sqlconfext

Make sure to activate only one backend (per type) inside your configuration (just comment the other ones)

Edit the dovecot-sqlconfext and modify the configuration according to your database engine

MySQL users

driver = mysql

connect = host=ltmysqld socketgt dbname=ltdatabasegt user=ltusergt password=ltpasswordgt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user WHERE email=Lu andrarr˓is_active=1

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid concat(bytes= mbquota M) AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

PostgreSQL users

driver = pgsql

connect = host=ltpostgres socketgt dbname=ltdatabasegt user=ltusergt password=ltpasswordgt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user u INNER JOIN admin_rarr˓mailbox mb ON uid=mbuser_id INNER JOIN admin_domain dom ON mbdomain_id=domidrarr˓WHERE uemail=Lu AND uis_active AND domenabled

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid bytes= || mbquota || M AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

16 Chapter 2 Table of contents

Modoboa Documentation Release 1100

SQLite users

driver = sqlite

connect = ltpath to the sqlite db filegt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user u INNER JOIN admin_rarr˓mailbox mb ON uid=mbuser_id INNER JOIN admin_domain dom ON mbdomain_id=domidrarr˓WHERE uemail=Lu AND uis_active=1 AND domenabled=1

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid (bytes= || mbquota || M) AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

Note Replace values between ltgt with yours

LDAP

To make the LDAP authentication work edit the confd10-authconf and uncomment the following line atthe end

include auth-ldapconfext

Then edit the confdauth-ldapconfext and edit the passdb section as following You should comment theuserdb section which will be managed by SQL with modoboa database

passdb driver = ldap

Path for LDAP configuration file see example-configdovecot-ldapconfextargs = etcdovecotdovecot-ldapconfext

userdb driver = ldapargs = etcdovecotdovecot-ldapconfext

Default fields can be used to specify defaults that LDAP may overridedefault_fields = home=homevirtualu

Your own dovecot LDAP configuration file is now etcdovecotdovecot-ldapconfext You can addyour default LDAP conf in it following the official documentation

Synchronize dovecot LDAP conf with modoboa LDAP conf

To make dovecot LDAP configuration synchronized with modoboa LDAP configuration you should create a dedicateddovecot conf file At the end of your dovecot configuration file (dovecot-ldapconfext) add the following

21 Installation 17

Modoboa Documentation Release 1100

line

include_try dovecot-modoboaconfext

Then set modoboa parameter Enable Dovecot LDAP sync to Yes Then set the Dovecot LDAP config file following theprevious step (etcdovecotdovecot-modoboaconfext in the example)

The last step is to add the command update_dovecot_conf to the cron job of modoboa Then each time your modoboaLDAP configuration is updated your dovecot LDAP configuration will also be

LMTP

Local Mail Transport Protocol is used to let Postfix deliver messages to Dovecot

First make sure the protocol is activated by looking at the protocols setting (generally inside dovecotconf)It should be similar to the following example

protocols = imap pop3 lmtp

Then open the confd10-masterconf look for lmtp service definition and add the following content inside

service lmtp stuff beforeunix_listener varspoolpostfixprivatedovecot-lmtp mode = 0600user = postfixgroup = postfix

stuff after

We assume here that Postfix is chrooted within varspoolpostfix

Finally open the confd20-lmtpconf and modify it as follows

protocol lmtp postmaster_address = postmasterltdomaingtmail_plugins = $mail_plugins quota sieve

Replace ltdomaingt by the appropriate value

Note If you donrsquot plan to apply quota or to use filters just adapt the content of the mail_plugins setting

Quota

Modoboa lets adminstrators define per-domain andor per-account limits (quota) It also lists the current quota usageof each account Those features require Dovecot to be configured in a specific way

Inside confd10-mailconf add the quota plugin to the default activated ones

mail_plugins = quota

Inside confd10-masterconf update the dict service to set proper permissions

18 Chapter 2 Table of contents

Modoboa Documentation Release 1100

service dict If dict proxy is used mail processes should have access to its socket For example mode=0660 group=vmail and global mail_access_groups=vmailunix_listener dict mode = 0600user = ltuser owning mailboxesgtgroup =

Inside confd20-imapconf activate the imap_quota plugin

protocol imap

mail_plugins = $mail_plugins imap_quota

Inside dovecotconf activate the quota SQL dictionary backend

dict quota = ltdrivergtetcdovecotdovecot-dict-sqlconfext

Inside confd90-quotaconf activate the quota dictionary backend

plugin quota = dictUser quotaproxyquota

It will tell Dovecot to keep quota usage in the SQL dictionary

Finally edit the dovecot-dict-sqlconfext file and put the following content inside

connect = host=ltdb hostgt dbname=ltdb namegt user=ltdb usergt password=ltpasswordgt SQLite users connect = pathtothedatabasedb

map pattern = privquotastoragetable = admin_quotausername_field = usernamevalue_field = bytes

map

pattern = privquotamessagestable = admin_quotausername_field = usernamevalue_field = messages

PostgreSQL users

21 Installation 19

Modoboa Documentation Release 1100

Database schema update

The admin_quota table is created by Django but unfortunately it doesnrsquot support DEFAULT constraints (it onlysimulates them when the ORM is used) As PostgreSQL is a bit strict about constraint violations you must executethe following query manually

db=gt ALTER TABLE admin_quota ALTER COLUMN bytes SET DEFAULT 0db=gt ALTER TABLE admin_quota ALTER COLUMN messages SET DEFAULT 0

Trigger

As indicated on Dovecotrsquos wiki you need a trigger to properly update the quota

A working copy of this trigger is available on Github

Download this file and copy it on the server running postgres Then execute the following commands

$ su - postgres$ psql [modoboa database] lt pathtomodoboa_postgres_triggersql$ exit

Replace [modoboa database] by the appropriate value

Forcing recalculation

For existing installations Dovecot (gt 2) offers a command to recalculate the current quota usages For example if youwant to update all usages run the following command

$ doveadm quota recalc -A

Be carefull it can take a while to execute

ManageSieveSieve

Modoboa lets users define filtering rules from the web interface To do so it requires ManageSieve to be activated onyour server

Inside confd20-managesieveconf make sure the following lines are uncommented

protocols = $protocols sieve

service managesieve-login

service managesieve

protocol sieve

20 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Messages filtering using Sieve is done by the LDA

Inside confd15-ldaconf activate the sieve plugin like this

protocol lda Space separated list of plugins to load (default is global mail_plugins)mail_plugins = $mail_plugins sieve

Finally configure the sieve plugin by editing the confd90-sieveconf file Put the follwing caontent inside

plugin Location of the active script When ManageSieve is used this is actually a symlink pointing to the active script in the sieve storage directorysieve = ~dovecotsieve

The path to the directory where the personal Sieve scripts are stored For ManageSieve this is where the uploaded scripts are storedsieve_dir = ~sieve

Restart Dovecot

Now you can go to the Postfix section to finish the installation

Last-login tracking

To update the last_login attribute of an account after a succesful IMAP or POP3 login you can configure apost-login script

Open confd10-masterconf add the following configuration (imap and pop3 services are already definedyou just need to update them)

service imap executable = imap postlogin

service pop3 executable = pop3 postlogin

service postlogin executable = script-login usrlocalbinpostloginshuser = modoboaunix_listener postlogin

Then you must create a script named usrlocalbinpostloginsh According to your database enginethe content will differ

PostgreSQL

21 Installation 21

Modoboa Documentation Release 1100

binsh

psql -c UPDATE core_user SET last_login=now() WHERE username=$USER gt devnull

exec $

MySQL

binsh

DBNAME=XXXDBUSER=XXXDBPASSWORD=XXX

echo UPDATE core_user SET last_login=now() WHERE username=$USER | mysql -urarr˓$DBUSER -p$DBPASSWORD $DBNAME

exec $

Postfix

This section gives an example about building a simple virtual hosting configuration with Postfix Refer to the officialdocumentation for more explanation

Map files

You first need to create configuration files (or map files) that will be used by Postfix to lookup into Modoboa tables

To automaticaly generate the requested map files and store them in a directory run the following command

gt cd ltmodoboa_instance_pathgtgt python managepy generate_postfix_maps --destdir ltdirectorygt

ltdirectorygt is the directory where the files will be stored Answer the few questions and yoursquore done

Configuration

Use the following configuration in the etcpostfixmaincf file (this is just one possible configuration)

Stuff beforevirtual_transport = lmtpunixprivatedovecot-lmtp

virtual_mailbox_domains = ltdrivergtetcpostfixsql-domainscfvirtual_alias_domains = ltdrivergtetcpostfixsql-domain-aliasescfvirtual_alias_maps = ltdrivergtetcpostfixsql-aliasescf

relay_domains = ltdrivergtetcpostfixsql-relaydomainscftransport_maps =

ltdrivergtetcpostfixsql-transportcfltdrivergtetcpostfixsql-spliteddomains-transportcf

(continues on next page)

22 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

smtpd_recipient_restrictions = check_recipient_access

ltdrivergtetcpostfixsql-maintaincfltdrivergtetcpostfixsql-relay-recipient-verificationcf

permit_mynetworksreject_unauth_destinationreject_unverified_recipient

smtpd_sender_login_maps = ltdrivergtetcpostfixsql-sender-login-mapcf

smtpd_sender_restrictions =reject_sender_login_mismatch

Stuff after

Replace ltdrivergt by the name of the database you use

Restart Postfix

Policy daemon

If you want to enable the built-in policy daemon add the following content to the etcpostfixmaincf file

smtpd_recipient_restrictions = check_policy_service inet1270019999

And reload postfix

Note The check_policy_service line must be placed before the permit_mynetworks one otherwise thedaemon wonrsquot be called

OpenDKIM

Modoboa can generate DKIM keys for the hosted domains but it wonrsquot sign or check messages To do that you needa dedicated software like OpenDKIM

Note The cron job in charge of creating DKIM keys must be run using the same user than OpenDKIM (ie opendkimin most cases)

Database

Since keys related information is stored in Modoboarsquos database you need to tell OpenDKIM how it can access it

First make sure to install the required additional packages on your system (libopendbx1- on debian baseddistributions or opendbx- on CentOS the complete name depends on your database engine)

Then insert the following SQL view into Modoboarsquos database

21 Installation 23

Modoboa Documentation Release 1100

PostgreSQL

CREATE OR REPLACE VIEW dkim AS (SELECT id name as domain_name dkim_private_key_path AS private_key_path

dkim_key_selector AS selectorFROM admin_domain WHERE enable_dkim

)

MySQLMariaDB

CREATE OR REPLACE VIEW dkim AS (SELECT id name as domain_name dkim_private_key_path AS private_key_path

dkim_key_selector AS selectorFROM admin_domain WHERE enable_dkim=1

)

Configuration

You should find OpenDKIMrsquos configuration file at etcopendkimconf

Add the following content to it

KeyTable dsnltdrivergtltusergtltpasswordgtltdb hostgtltdb namegttable=dkimrarr˓keycol=iddatacol=domain_nameselectorprivate_key_pathSigningTable dsnltdrivergtltusergtltpasswordgtltdb hostgtltdb namegttable=dkimrarr˓keycol=domain_namedatacol=idSocket inet12345localhost

Replace values between ltgt by yours Accepted values for driver are pgsql or mysql Make sure the user youspecify has read permission on the view created previously

If you run a debian based system make sure to adjust the following setting in the etcdefaultopendkim file

SOCKET=inet12345localhost

Eventually reload OpenDKIM

Postfix integration

Add the following lines to the etcpostfixmaincf file

smtpd_milters = inet12700112345non_smtpd_milters = inet12700112345milter_default_action = acceptmilter_content_timeout = 30s

and reload postfix

Extensions

Only few commands are needed to add a new extension to your setup

24 Chapter 2 Table of contents

Modoboa Documentation Release 1100

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install ltEXTENSIONgt==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Then restart your web server

22 Upgrade

221 Modoboa

Warning The new version you are going to install may need to modify your database Before you start makesure to backup everything

Most of the time upgrading your installation to a newer Modoboa version only requires a few actions In every caseyou will need to apply the general procedure first and then check if the version you are installing requires specificactions

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install modoboa==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Once done check if the version you are installing requires Specific instructions

Finally restart your web server

Sometimes you might need to upgrade postfix map files too To do so just run the generate_postfix_mapscommand on the same directory than the one used for installation (etcpostfix by default)

Make sure to use root privileges and run the following command

gt python managepy generate_postfix_maps --destdir ltdirectorygt

Then reload postfix

22 Upgrade 25

Modoboa Documentation Release 1100

222 Extensions

If a new version is available for an extension yoursquore using it is recommanded to install it Upgrading an extensions ispretty and the procedure is almost the same than the one used for Modoboa

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install ltEXTENSIONgt==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Finally restart your web server

It is a generic upgrade procedure which will be enough most of the time but it is generally a good idea to check theassociated documentation

223 Rebuild Virtual Environment

Sometimes when upgrading your Operating System (eg from Ubuntu 1704 to Ubuntu 1710) your virtual environmentrunning modoboa can get corrupted Your first response will be to panic but fear not The solution is in this document

First things first

Recover your database password

You will need to recover your database password (if using mysql or postgresql) You will find this in etcpostfixsql-aliasescf or any file with sql-cf in the etcpostfix directory

Make note of this as you will need it when reconfiguring modoboa

Reinstall Modoboa

Start out by backup up your modoboa settings file located in the modoboa instance directory (srvmodoboainstanceinstancesettingspy if you used the default installer configuration) This contains your currentconfiguration

Next you want to remove all current modoboa files

After doing this follow the manual installation instructions for Modoboa only as everything should be working prop-erly

After this completes simply restore your backed up settings file to srvinstanceinstancesettingspy(if you used installer default configuration) You will then need to reinstall your extensions

You can find which plugins you had in your settingspy file under the MODOBOA_APPS variable

Instructions to install extensions can also be found here

Once you have completed this step you will need to run the following commands

26 Chapter 2 Table of contents

Modoboa Documentation Release 1100

gt (env) $ cd ltinstance_dirgtgt (env) $ python managepy migrategt (env) $ python managepy collectstatic

You will then see a message similar to

You have requested to collect static files at the destinationlocation as specified in your settings

srvmodoboainstancesitestatic

This will overwrite existing filesAre you sure you want to do this

Type yes to continue or no to cancel

You will want to answer yes here then simply restart the uwsgi process with service uwsgi restart andyou should be up and running again

Simply log into your modoboa web panel and verify that your extensions and webmail box is working

224 Information

Rebuild instructions from httpshelppythonanywherecompagesRebuildingVirtualenvs

225 Specific instructions

1160

A new policy daemon has been added

Make sure to have a Redis instance running on your server

Add modoboapolicyd to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboapolicyd

)

Add the following settings to your settingspy file

REDIS_HOST = ltIP or hostname heregtREDIS_PORT = 6379REDIS_QUOTA_DB = 0REDIS_URL = redisformat(REDIS_HOST REDIS_PORT REDIS_QUOTA_DB)

Once done you can start the policy daemon using the following commands

22 Upgrade 27

Modoboa Documentation Release 1100

gt python managepy policy_daemon

Donrsquot forget to configure _policyd_config if you want to use this feature

The modoboa-stats plugin has been merged into the core

Add modoboamaillog to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboapolicydmodoboamaillog

)

And remove any reference to modoboa_stats in this same variable

1150

This version drops Python 2 support so donrsquot forget to update all the extensions you use

Warning If you upgrade an existing python 2 installation you will need to create a new Python 3 virtualenvironment You can remove the existing virtual environment and replace it by the new one so you wonrsquot have tomodify your configuration files

Add the following new setting

DISABLE_DASHBOARD_EXTERNAL_QUERIES = False

Reload uwsgigunicornapache depending on your setup

Finally Make sure to use root privileges and run the following command

gt python managepy generate_postfix_maps --destdir ltdirectorygt

Then reload postfix

1140

This release introduces an optional LDAP synchronization process If you want to use it please follow the dedicatedprocedure

1131

Upgrade postfix maps files as follows

28 Chapter 2 Table of contents

Modoboa Documentation Release 1100

gt python managepy generate_postfix_maps --destdir ltpathgt --force-overwrite

1130

Add modoboadnstools to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstools

)

Add the following new settings

CSRF_COOKIE_SECURE = TrueSESSION_COOKIE_SECURE = True

modoboa-postfix-autoreply 150

Edit the etcpostfixmaincf file and remove the sql-autoreplies-transportcf map from thetransport_maps if present Remove the corresponding proxy_read_maps entry if relevant

Reload postfix

1100

Warning Upgrade installed extensions BEFORE running check or migrate commands

Upgrade all your installed plugins to the following versions

Warning If you use the amavis plugin make sure to include its configuration as follows into settingspy

from modoboa_amavis import settings as modoboa_amavis_settingsmodoboa_amavis_settingsapply(globals())

22 Upgrade 29

Modoboa Documentation Release 1100

Name Versionmodoboa-amavis 120modoboa-contacts 050modoboa-dmarc 110modoboa-imap-migration 120modoboa-pdfcredentials 130modoboa-postfix-autoreply 140modoboa-radicale 120modoboa-sievefilters 140modoboa-stats 140modoboa-webmail 140

Edit the settingspy file and apply the following modifications

Add modoboatransport to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparameters

)

Replace the following line

MIDDLEWARE_CLASSES = (

by

MIDDLEWARE = (

Update postfix map files as follows

gt rm -f ltpathgtmodoboa-postfix-mapschkgt python managepy generate_postfix_maps --force --destdir ltpathgt

Then modify postfixrsquos configuration as follows

smtpd_sender_login_maps =ltdrivergtltpathgtsql-sender-login-mapcf

transport_maps =ltdrivergtltpathgtsql-transportcfltdrivergtltpathgtsql-spliteddomains-transportcf other map files

Replace ltdrivergt and ltpathgt by your values

If transport_maps contains sql-relaydomains-transportcf remove it

30 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning If you make use of postfixrsquos proxymap server you must also update the proxy_read_maps setting

Reload postfix

Add the following cron job in order to generate DKIM keys

Generate DKIM keys (they will belong to the user running this job)

root $PYTHON $INSTANCEmanagepy modorarr˓manage_dkim_keys

190

If you want to manage inactive accounts look at Cleaning inactive accounts

183

Edit the settingspy file and replace the following line

BASE_DIR = ospathdirname(ospathdirname(__file__))

by

BASE_DIR = ospathrealpath(ospathdirname(ospathdirname(__file__)))

180

Modoboa now relies on Djangorsquos builtin password validation system to validate user passwords instead ofdjango-passwords

Remove django-passwords from your system

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt pip uninstall django-passwords

Edit the settingspy file and remove the following content

django-passwords

PASSWORD_MIN_LENGTH = 8

PASSWORD_COMPLEXITY = UPPER 1LOWER 1DIGITS 1

Add the following lines

Password validation rulesAUTH_PASSWORD_VALIDATORS = [

NAME djangocontribauthpassword_validation

rarr˓UserAttributeSimilarityValidator (continues on next page)

22 Upgrade 31

Modoboa Documentation Release 1100

(continued from previous page)

NAME djangocontribauthpassword_validationMinimumLengthValidator

NAME djangocontribauthpassword_validationCommonPasswordValidator

NAME djangocontribauthpassword_validationNumericPasswordValidator

NAME modoboacorepassword_validationComplexityValidatorOPTIONS

upper 1lower 1digits 1specials 0

]

172

API documentation has evolved (because of the upgrade to Django Rest Framework 36) and CKeditor is now embed-ded by default (thanks to the django-ckeditor package) Some configuration changes are required

Edit your settingspy file and apply the following modifications

bull Update the INSTALLED_APPS variable as follows

INSTALLED_APPS = (djangocontribauthdjangocontribcontenttypesdjangocontribsessionsdjangocontribmessagesdjangocontribsitesdjangocontribstaticfilesreversionckeditorckeditor_uploaderrest_frameworkrest_frameworkauthtoken

)

bull Update the REST_FRAMEWORK variable as follows

REST_FRAMEWORK = DEFAULT_AUTHENTICATION_CLASSES (

rest_frameworkauthenticationTokenAuthenticationrest_frameworkauthenticationSessionAuthentication

)

bull Remove the SWAGGER_SETTINGS variable

bull Add the following content

32 Chapter 2 Table of contents

Modoboa Documentation Release 1100

CKeditor

CKEDITOR_UPLOAD_PATH = uploads

CKEDITOR_IMAGE_BACKEND = pillow

CKEDITOR_RESTRICT_BY_USER = True

CKEDITOR_BROWSE_SHOW_DIRS = True

CKEDITOR_ALLOW_NONIMAGE_FILES = False

CKEDITOR_CONFIGS = default

allowedContent Truetoolbar Modoboawidth Nonetoolbar_Modoboa [

[Bold Italic Underline][JustifyLeft JustifyCenter JustifyRight JustifyBlock][BidiLtr BidiRtl Language][NumberedList BulletedList - Outdent Indent][Undo Redo][Link Unlink Anchor - Smiley][TextColor BGColor - Source][Font FontSize][Image ][SpellChecker]

]

Donrsquot forget to run the following command

gt python managepy collectstatic

171

If you used 170 for a fresh installation please run the following commands

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy load_initial_data

170

This version requires Django gt= 110 so you need to make some modifications It also brings internal API changeswhich are not backward compatible so installed extensions must be upgraded too

First of all deactivate all installed extensions (edit the settingspy file and comment the corresponding lines inMODOBOA_APPS)

Edit the urlspy file of your local instance and replace its content by the following one

22 Upgrade 33

Modoboa Documentation Release 1100

from djangoconfurls import include url

urlpatterns = [url(r include(modoboaurls))

]

Edit the settingspy and apply the following changes

bull Add modoboaparameters to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboarelaydomainsmodoboalimitsmodoboaparameters Modoboa extensions here

)

bull Add modoboacoremiddlewareLocalConfigMiddleware to MIDDLEWARE_CLASSES

MIDDLEWARE_CLASSES = (djangocontribsessionsmiddlewareSessionMiddlewaredjangomiddlewarecommonCommonMiddlewaredjangomiddlewarecsrfCsrfViewMiddlewaredjangocontribauthmiddlewareAuthenticationMiddlewaredjangocontribmessagesmiddlewareMessageMiddlewaredjangomiddlewarelocaleLocaleMiddlewaredjangomiddlewareclickjackingXFrameOptionsMiddlewaremodoboacoremiddlewareLocalConfigMiddlewaremodoboalibmiddlewareAjaxLoginRedirectmodoboalibmiddlewareCommonExceptionCatchermodoboalibmiddlewareRequestCatcherMiddleware

)

bull Modoboa used to provide a custom authentication backend (modoboalibauthbackendsSimpleBackend) but it has been removed Replace it as follows

AUTHENTICATION_BACKENDS = ( Other backends beforedjangocontribauthbackendsModelBackend

)

bull Remove TEMPLATE_CONTEXT_PROCESSORS and replace it by

TEMPLATES = [

BACKEND djangotemplatebackendsdjangoDjangoTemplatesDIRS []APP_DIRS TrueOPTIONS

context_processors [djangotemplatecontext_processorsdebugdjangotemplatecontext_processorsrequestdjangocontribauthcontext_processorsauth

(continues on next page)

34 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

djangotemplatecontext_processorsi18ndjangotemplatecontext_processorsmediadjangotemplatecontext_processorsstaticdjangotemplatecontext_processorstzdjangocontribmessagescontext_processorsmessagesmodoboacorecontext_processorstop_notifications

]debug False

]

Run the following commands (load virtualenv if you use one)

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstatic

Finally upgrade your extensions and reactivate them

Name Versionmodoboa-amavis 110modoboa-dmarc 100modoboa-imap-migration 110modoboa-pdfcredentials 110modoboa-postfix-autoreply 120modoboa-radicale 110modoboa-sievefilters 110modoboa-stats 110modoboa-webmail 110

Command line shortcuts

$ pip install modoboa-amavis==110$ pip install modoboa-dmarc==100$ pip install modoboa-imap-migration==110$ pip install modoboa-pdfcredentials==110$ pip install modoboa-postfix-autoreply==120$ pip install modoboa-radicale==110$ pip install modoboa-sievefilters==110$ pip install modoboa-stats==110$ pip install modoboa-webmail==110

And please make sure you use the latest version of the django-versionfield2 package

$ pip install -U django-versionfield2

Notes about quota changes and resellers

Reseller users now have a quota option in Resources tab This is the quota that a reseller can share between all itsdomains

22 Upgrade 35

Modoboa Documentation Release 1100

There are two quotas for a domain in the new version

1 Quota amp

2 Default mailbox quota

[1] Quota quota shared between mailboxes This quota is shared between all the mailboxes of this domain This valuecannot exceed resellerrsquos quota and hence cannot be 0(unlimited) if reseller has finite quota

[2] Default mailbox quota default quota applied to mailboxes This quota is the default quota applied to new mail-boxes This value cannot exceed Quota[1] and hence cannot be 0(unlimited) if Quota[1] is finite

161

First of all update postfix map files as follows

gt python managepy generate_postfix_maps --destdir ltpathgt --force-overwrite

Then modify postfixrsquos configuration as follows

smtpd_sender_login_maps =ltdrivergtltpathgtsql-sender-login-mailboxescfltdrivergtltpathgtsql-sender-login-aliasescfltdrivergtltpathgtsql-sender-login-mailboxes-extracf

Replace ltdrivergt and ltpathgt by your values

Finally reload postfix

This release also deprecates some internal functions As a result several extensions has been updated to maintain thecompatibility If you enabled the notification service yoursquoll find the list of available updates directly in your Modoboaconsole

For the others here is the list

Name Versionmodoboa-amavis 1010modoboa-postfix-autoreply 117modoboa-radicale 105modoboa-stats 109

Command line shortcut

$ pip install modoboa-amavis==1010$ pip install modoboa-postfix-autoreply==117$ pip install modoboa-radicale==105$ pip install modoboa-stats==109

160

Warning You have to upgrade extensions due to coreUser model attribute change (usergroup to userrole) Oth-erwise you will have an internal error after upgrade In particular modoboa-amavisd modoboa-stats modoboa-postfix-autoreply are concerned

36 Chapter 2 Table of contents

Modoboa Documentation Release 1100

An interesting feature brougth by this version is the capability to make different checks about MX records Forexample Modoboa can query main DNSBL providers for every defined domain With this you will quickly know ifone the domains you manage is listed or not To activate it add the following line to your crontab

30 ltoptional_virtualenv_pathgtpython ltmodoboa_instance_dirgtmanagepy modorarr˓check_mx

The communication with Modoboa public API has been reworked Instead of sending direct synchronous queries (forexample to check new versions) a cron job has been added To activate it add the following line to your crontab

0 ltoptional_virtualenv_pathgtpython ltmodoboa_instance_dirgtmanagepyrarr˓communicate_with_public_api

Please also note that public API now uses TLS so you must update your configuration as follows

MODOBOA_API_URL = httpsapimodoboaorg1

Finally it is now possible to declare additional sender addresses on a per-account basis You need to update your postfixconfiguration in order to use this functionality Just edit the maincf file and change the following parameter

smtpd_sender_login_maps =ltdrivergtetcpostfixsql-sender-login-mailboxescfltdrivergtetcpostfixsql-sender-login-aliasescfltdrivergtetcpostfixsql-sender-login-mailboxes-extracf

150

The API has been greatly improved and a documentation is now available To enable it addrest_framework_swagger to the INSTALLED_APPS variable in settingspy as follows

INSTALLED_APPS = (djangocontribauthdjangocontribcontenttypesdjangocontribsessionsdjangocontribmessagesdjangocontribsitesdjangocontribstaticfilesreversionrest_frameworkauthtokenrest_framework_swagger

)

Then add the following content into settingspy just after the REST_FRAMEWORK variable

SWAGGER_SETTINGS = is_authenticated Falseapi_version 10exclude_namespaces []info

contact contactmodoboacomdescription (Modoboa API requires a valid token)title Modoboa API

Yoursquore done The documentation is now available at the following address

22 Upgrade 37

Modoboa Documentation Release 1100

httpltyour instance addressgtdocsapi

Finally if you find a TEMPLATE_CONTEXT_PROCESSORS variable in your settingspy file make sure it lookslike this

TEMPLATE_CONTEXT_PROCESSORS = global_settingsTEMPLATE_CONTEXT_PROCESSORS + [modoboacorecontext_processorstop_notifications

]

140

Warning Please make sure to use Modoboa 135 with an up-to-date database before an upgrade to 140

Warning Do not follow the regular upgrade procedure for this version

Some extension have been moved back into the main repository The main reason for that is that using Modoboawithout them doesnrsquot make sense

First of all you must rename the following applications listed inside the MODOBOA_APPS variable

Old name New namemodoboa_admin modoboaadminmodoboa_admin_limits modoboalimitsmodoboa_admin_relaydomains modoboarelaydomains

Then apply the following steps

1 Uninstall old extensions

$ pip uninstall modoboa-admin modoboa-admin-limits modoboa-admin-relaydomains

2 Install all extension updates using pip (check the Modoboa gt Information page)

3 Manually migrate database

$ cd ltinstance_dirgt$ python managepy migrate auth$ python managepy migrate admin 0001 --fake$ python managepy migrate admin$ python managepy migrate limits 0001 --fake$ python managepy migrate relaydomains 0001 --fake$ python managepy migrate

4 Finally update static files

$ python managepy collectstatic

This version also introduces a REST API To enable it

1 Add rest_frameworkauthtoken to the INSTALLED_APPS variable

2 Add the following configuration inside settingspy

38 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Rest framework settings

REST_FRAMEWORK = DEFAULT_AUTHENTICATION_CLASSES (

rest_frameworkauthenticationTokenAuthentication)DEFAULT_PERMISSION_CLASSES (

rest_frameworkpermissionsIsAuthenticated)

3 Run the following command

$ python managepy migrate

135

To enhance security Modoboa now checks the strength of user passwords lthttpsgithubcomdstufftdjango-passwordsgt_

To use this feature add the following configuration into the settingspy file

django-passwords

PASSWORD_MIN_LENGTH = 8

PASSWORD_COMPLEXITY = UPPER 1LOWER 1DIGITS 1

132

Modoboa now uses the atomic requests mode to preserve database consistency (reference)

To enable it update the DATABASES variable in settingspy as follows

DATABASES = default

stuff beforeATOMIC_REQUESTS True

amavis

stuff beforeATOMIC_REQUESTS True

130

This release does not bring awesome new features but it is a necessary bridge to the future of Modoboa All extensionsnow have their own git repository and the deploy process has been updated to reflect this change

22 Upgrade 39

Modoboa Documentation Release 1100

Another important update is the use of Django 17 Besides its new features the migration system has been reworkedand is now more robust than before

Before we begin with the procedure here is a table showing old extension names and their new name

Old name New package name New module namemodoboaextensionsadmin modoboa-admin modoboa_adminmodoboaextensionslimits modoboa-admin-limits modoboa_admin_limitsmodoboaextensionspostfix_autoreply modoboa-postfix-autoreply modoboa_postfix_autoreplymodoboaextensionspostfix_relay_domains modoboa-admin-relaydomains modoboa_admin_relaydomainsmodoboaextensionsradicale modoboa-radicale modoboa_radicalemodoboaextensionssievefilters modoboa-sievefilters modoboa_sievefiltersmodoboaextensionsstats modoboa-stats modoboa_statsmodoboaextensionswebmail modoboa-webmail modoboa_webmail

Here are the required steps

1 Install the extensions using pip (look at the second column in the table above)

$ pip install ltthe extensions you wantgt

2 Remove south from INSTALLED_APPS

3 Rename old extension names inside MODOBOA_APPS (look at the third column in the table above)

4 Remove modoboalibmiddlewareExtControlMiddleware from MIDDLEWARE_CLASSES

5 Change DATABASE_ROUTERS to

DATABASE_ROUTERS = [modoboa_amavisdbrouterAmavisRouter]

6 Run the following commands

$ cd ltmodoboa_instance_dirgt$ python managepy migrate

7 Reply yes to the question

8 Run the following commands

$ python managepy load_initial_data$ python managepy collectstatic

9 The cleanup job has been renamed in Django so you have to modify your crontab entry

- 0 0 ltmodoboa_sitegtmanagepy cleanup+ 0 0 ltmodoboa_sitegtmanagepy clearsessions

120

A new notification service let administrators know about new Modoboa versions To activate it you need to updatethe TEMPLATE_CONTEXT_PROCESSORS variable like this

from djangoconf import global_settings

TEMPLATE_CONTEXT_PROCESSORS = global_settingsTEMPLATE_CONTEXT_PROCESSORS + (

(continues on next page)

40 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

modoboacorecontext_processorstop_notifications)

and to define the new MODOBOA_API_URL variable

MODOBOA_API_URL = httpapimodoboaorg1

The location of external static files has changed To use them add a new path to the STATICFILES_DIRS

Additional locations of static filesSTATICFILES_DIRS = (

Put strings here like homehtmlstatic or Cwwwdjangostatic Always use forward slashes even on Windows Dont forget to use absolute paths not relative pathsltpathtomodoboainstalldirgtbower_components

)

Run the following commands to define the hostname of your instance

$ cd ltmodoboa_instance_dirgt$ python managepy set_default_site lthostnamegt

If you plan to use the Radicale extension

1 Add modoboaextensionsradicale to the MODOBOA_APPS variable

2 Run the following commands

$ cd ltmodoboa_instance_dirgt$ python managepy syncdb

Warning You also have to note that the sitestatic directory has moved from ltpath to your sitesdirgt to ltmodoboas root urlgt (itrsquos probably the parent directory) You have to adapt your web serverconfiguration to reflect this change

23 Configuration

231 Online parameters

Modoboa provides online panels to modify internal parameters There are two available levels

bull Application level global parameters define how the application behaves Available at Modoboa gt Parameters

bull User level per user customization Available at User gt Settings gt Preferences

Regardless level parameters are displayed using tabs each tab corresponding to one application

General parameters

The admin application exposes several parameters they are presented below

23 Configuration 41

Modoboa Documentation Release 1100

Name Tab Description Default valueAuthentication type General The backend used for au-

thenticationLocal

Default password scheme General Scheme used to cryptmailbox passwords

crypt

Rounds General Number of rounds (onlyused by sha256cryptand sha512crypt) Mustbe between 1000 and999999999 inclusive

70000

Secret key General A key used to encryptusersrsquo password in ses-sions

random value

Sender address General Email address used tosend notifications

Enable communication General Enable communicationwith Modoboa public API

yes

Check new versions General Automatically checks if anewer version is available

yes

Send statistics General Send statistics to Mod-oboa public API (countersand used extensions)

yes

Top notifications check in-terval

General Interval between two topnotification checks (inseconds)

30

Maximum log record age General The maximum age in daysof a log record

365

Items per page General Number of displayeditems per page

30

Default top redirection General The default redirectionused when no applicationis specified

userprefs

Enable MX checks Admin Check that every domainhas a valid MX record

yes

Valid MXs Admin A list of IP or networkaddress every MX shouldmatch A warning will besent if a record does notrespect this it

Enable DNSBL checks Admin Check every domainagainst major DNSBLproviders

yes

DKIM keys storage direc-tory

AdminPath to a directory where DKIM

generated keys willbe stored

Default DKIM key length Admin The default size (in bits)for new keys

2048

Handle mailboxes onfilesystem

Admin Rename or remove mail-boxes on the filesystemwhen they get renamed orremoved within Modoboa

no

Mailboxes owner Admin The UNIX account whoowns mailboxes on thefilesystem

vmail

Default domain quota Admin Default quota (in MB) ap-plied to freshly createddomains with no valuespecified A value of 0means no quota

0

Automatic accountremoval

Admin When a mailbox is re-moved also remove theassociated account

no

Automatic do-mainmailbox creation

Admin Create a domain and amailbox when an accountis automatically created

yes

42 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Note If you are not familiar with virtual domain hosting you should take a look at postfixrsquos documentation ThisHow to also contains useful information

Note A random secret key will be generated each time the Parameters page is refreshed and until you save parametersat least once

Note Specific LDAP parameters are also available see LDAP authentication

232 Media files

Modoboa uses a specific directory to upload files (ie when the webmail is in use) or to create ones (ex graphical statis-tics) This directory is named media and is located inside modoboarsquos installation directory (called modoboa_sitein this documentation)

To work properly the system user which runs modoboa (www-data apache whatever) must have write access tothis directory

233 Customization

Custom logo

You have the possibility to use a custom logo instead of the default one on the login page

To do so open the settingspy file and add a MODOBOA_CUSTOM_LOGO variable This variable must containthe relative URL of your logo under MEDIA_URL For example

MODOBOA_CUSTOM_LOGO = ospathjoin(MEDIA_URL custom_logopng)

Then copy your logo file into the directory indicated by MEDIA_ROOT

234 Host configuration

Note This section is only relevant when Modoboa handles mailboxes renaming and removal from the filesystem

To manipulate mailboxes on the filesystem you must allow the user who runs Modoboa to execute commands as theuser who owns mailboxes

To do so edit the etcsudoers file and add the following inside

ltuser_that_runs_modoboagt ALL=(ltmailboxes ownergt) NOPASSWD ALL

Replace values between ltgt by the ones you use

23 Configuration 43

Modoboa Documentation Release 1100

235 Time zone and language

Modoboa is available in many languages

To specify the default language to use edit the settingspy file and modify the LANGUAGE_CODE variable

LANGUAGE_CODE = fr or en for english etc

Note Each user has the possibility to define the language he prefers

In the same configuration file specify the timezone to use by modifying the TIME_ZONE variable For example

TIME_ZONE = EuropeParis

236 Sessions management

Modoboa uses Djangorsquos session framework to store per-user information

Few parameters need to be set in the settingspy configuration file to make Modoboa behave as expected

SESSION_EXPIRE_AT_BROWSER_CLOSE = False Default value

This parameter is optional but you must ensure it is set to False (the default value)

The default configuration file provided by the modoboa-adminpy command is properly configured

237 Logging authentication

To trace login attempts to the web interface Modoboa uses python SysLogHandler so you can see them in your syslogauthentication log file (varlogauthlog in most cases)

Depending on your configuration you may have to edit the settingspy file and add lsquoaddressrsquo lsquodevlogrsquo to thelogging section

syslog-auth class logginghandlersSysLogHandlerfacility SysLogHandlerLOG_AUTHaddress devlogformatter syslog

238 External authentication

LDAP

Modoboa supports external LDAP authentication using the following extra components

bull Python LDAP client

bull Django LDAP authentication backend

If you want to use this feature you must first install those components

44 Chapter 2 Table of contents

Modoboa Documentation Release 1100

$ pip install python-ldap django-auth-ldap

Then all you have to do is to modify the settingspy file Add a new authentication backend to the AUTHENTI-CATION_BACKENDS variable like this

AUTHENTICATION_BACKENDS = (modoboalibauthbackendsLDAPBackend modoboalibauthbackendsLDAPSecondaryBackend Useful for a fallback

rarr˓mechanismdjangocontribauthbackendsModelBackend

)

Finally go to Modoboa gt Parameters gt General and set Authentication type to LDAP

From there new parameters will appear to let you configure the way Modoboa should connect to your LDAP serverThey are described just below

Name Description De-faultvalue

Server address The IP address of the DNS name of the LDAP server local-host

Server port The TCP port number used by the LDAP server 389Use a secureconnection

Use an SSLTLS connection to access the LDAP server no

Authenticationmethod

Choose the authentication method to use Directbind

User DN tem-plate (directbind mode)

The template used to construct a userrsquos DN It should contain one placeholder (ie(user)s)

Bind BN The distinguished name to use when binding to the LDAP server Leave empty for ananonymous bind

Bind password The password to use when binding to the LDAP server (with lsquoBind DNrsquo)Search base The distinguished name of the search baseSearch filter An optional filter string (eg lsquo(objectClass=person)rsquo) In order to be valid it must be

enclosed in parentheses(mail=(user)s)

Passwordattribute

The attribute used to store user passwords user-Pass-word

Active Direc-tory

Tell if the LDAP server is an Active Directory one no

Administratorgroups

Members of those LDAP Posix groups will be created ad domain administrators Uselsquorsquo characters to separate groups

Group type The type of group used by your LDAP directory Posix-Group

Groups searchbase

The distinguished name of the search base used to find groups

Do-mainmailboxcreation

Automatically create a domain and a mailbox when a new user is created just after thefirst successful authentication You will generally want to disable this feature whenthe relay domains extension is in use

yes

If you need additional parameters you will find a detailed documentation here

Once the authentication is properly configured the users defined in your LDAP directory will be able to connect to

23 Configuration 45

Modoboa Documentation Release 1100

Modoboa the associated domain and mailboxes will be automatically created if needed

The first time a user connects to Modoboa a local account is created if the LDAP username is a valid email addressBy default this account belongs to the SimpleUsers group and it has a mailbox

To automatically create domain administrators you can use the Administrator groups setting If a LDAP user belongsto one the listed groups its local account will belong to the DomainAdmins group In this case the username is notnecessarily an email address

Users will also be able to update their LDAP password directly from Modoboa

Note Modoboa doesnrsquot provide any synchronization mechanism once a user is registered into the database Anymodification done from the directory to a user account will not be reported to Modoboa (an email address change forexample) Currently the only solution is to manually delete the Modoboa record it will be recreated on the next userlogin

SMTP

It is possible to use an existing SMTP server as an authentication source To enable this feature edit the settingspy file and change the following setting

AUTHENTICATION_BACKENDS = (modoboalibauthbackendsSMTPBackenddjangocontribauthbackendsModelBackend

)

SMTP server location can be customized using the following settings

AUTH_SMTP_SERVER_ADDRESS = localhostAUTH_SMTP_SERVER_PORT = 25AUTH_SMTP_SECURED_MODE = None ssl or starttls are accepted

239 LDAP synchronization

Modoboa can synchronize accounts with an LDAP directory (tested with OpenLDAP) but this feature is not enabledby default To activate it add modoboaldapsync to MODOBOA_APPS in the settingspy file

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboaldapsync

)

and enable it from the admin panel

46 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning Make sure to install additional requirements otherwise it wonrsquot work

The following parameters are available and must be filled

Name Description Defaultvalue

Enable LDAP synchro-nization

Control LDAP synchronization state no

Bind DN The DN of a user with write permission to createupdate accountsBind password The associated passwordAccount DN template The template used to build account DNs (must contain a (user)s

placeholder

2310 Database maintenance

Cleaning the logs table

Modoboa logs administrator specific actions into the database A clean-up script is provided to automatically removeoldest records The maximum log record age can be configured through the online panel

To use it you can setup a cron job to run every night

0 0 ltmodoboa_sitegtmanagepy cleanlogs Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy cleanlogs

Cleaning the session table

Django does not provide automatic purging Therefore itrsquos your job to purge expired sessions on a regular basis

Django provides a sample clean-up script django-adminpy clearsessions That script deletes any sessionin the session table whose expire_date is in the past

For example you could setup a cron job to run this script every night

0 0 ltmodoboa_sitegtmanagepy clearsessions Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy clearsessions

Cleaning inactive accounts

Thanks to Last-login tracking it is now possible to monitor inactive accounts An account is considered inactive if nologin has been recorded for the last 30 days (this value can be changed through the admin panel)

A management command is available to disable or delete inactive accounts For example you could setup a cron jobto run it every night

23 Configuration 47

Modoboa Documentation Release 1100

0 0 ltmodoboa_sitegtmanagepy clean_inactive_accounts Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy clean_inactive_rarr˓accounts

The default behaviour is to disable accounts You can delete them using the --delete option

24 Moving to Modoboa

You have an existing platform and yoursquod like to move to Modoboa the following tools could help you

241 From postfixadmin

A dedicated command allows you to convert an existing postfixadmin database to a Modoboa one Consult the docu-mentation to know more about the process

242 Using CSV files

Modoboa allows you to import any object (domain domain alias mailbox and alias) using a simple CSV file encodedusing UTF8 Each line corresponds to a single object and must respect one of the following format

domain ltname stringgt ltquota integergt ltdefault mailbox quota integergt ltenabledrarr˓booleangtdomainalias ltname stringgt lttargeted domain stringgt ltenabled booleangtrelaydomain ltname stringgt lttarget host stringgt lttarget port integergt ltservicerarr˓stringgt ltenabled booleangt ltverify recipients booleangtaccount ltloginname stringgt ltpassword stringgt ltfirst name stringgt ltlast namerarr˓stringgt ltenabled booleangt ltgroup stringgt ltaddress stringgt ltquota integergt [rarr˓ltdomain stringgt ]alias ltaddress stringgt ltenabled booleangt ltrecipient stringgt

Boolean fields accept the following values true 1 yes y (case insensitive) Any other value will be evaluated asfalse

Warning The order does matter Objects are created sequencially so a domain must be created before itsmailboxes and aliases and a mailbox must created before its alias(es)

To actually import such a file

gt sudo -u ltmodoboa_usergt -igt source ltvirtualenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy modo import ltyour filegt

Available options can be listed using the following command

gt python managepy modo import -h

48 Chapter 2 Table of contents

Modoboa Documentation Release 1100

25 REST API

To ease the integration with external sources (software or other) Modoboa provides a REST API

Every installed instance comes with a ready-to-use API and a documentation You will find them using the followingurl patterns

bull API httplthostnamegtapiv1

bull Documentation httplthostnamegtdocsapi

An example of this documentation is available on the official demo

Using this API requires an authentication and for now only a token based authentication is supported To get a validtoken log-in to your instance with a super administrator go to Settings gt API and activate the API access Press theUpdate button and wait until the page is reloaded the token will be displayed

To make valid API calls every requests you send must embed this token within an Authorization HTTP header likethis

Authorization Token ltYOUR_TOKENgt

and the content type of those requests must be applicationjson

26 How to contribute

Contributions are always welcome If you want to submit a patch please respect the following rules

bull Open a pull request on the appropriate repository

bull Respect PEP8

bull Document your patch and respect PEP 257

bull Add unit tests and make sure the global coverage does not decrease

If all those steps are validated your contribution will generally be integrated

261 Table of contents

25 REST API 49

Modoboa Documentation Release 1100

Useful tips

You would like to work on Modoboa but you donrsquot know where to start Yoursquore at the right place Browse this pageto learn useful tips

Docker

A docker image is available for developers To use it you must install docker and docker-compose first

Then just run the following command

$ docker-compose up

It will start the docker environment and make a Modoboa instance available at httplocalhost8000

If you donrsquot want to use docker or need a more complex development setup go to the next section

Prepare a virtual environment

A virtual environment is a good way to setup a development environment on your machine

To do so run the following commands

$ python3 -m venv ltpathgt$ source ltpathgtbinactivate$ git clone httpsgithubcommodoboamodoboagit$ cd modoboa$ python setuppy develop$ pip install -r dev-requirementstxt

The develop command creates a symbolic link to your local copy so any modification you make will be automati-cally available in your environment no need to copy them

Deploy an instance for development

Warning Make sure to create a database before running this step The format of the database url is also describedin this page

Now that you have a running environment yoursquore ready to deploy a test instance

$ cd ltpathgt$ modoboa-adminpy deploy --dburl defaultltdatabase urlgt --domain localhost --develrarr˓instance$ python managepy runserver

Yoursquore ready to go You should be able to access Modoboa at httplocalhost8000 usingadminpassword as credentials

Manage static files

Modoboa uses bower (thanks to django-bower) to manage its CSS and javascript dependencies

50 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Those dependencies are listed in a file called dev_settingspy located inside the ltpath_to_local_copygtmodoboacore directory

If you want to add a new dependency just complete the BOWER_INSTALLED_APPS parameter and run the followingcommand

$ python managepy bower install

It will download and store the required files into the ltpath_to_local_copygtmodoboabower_components directory

Test your modifications

If you deployed a specific instance for your development needs you can run the tests suite as follows

gt python managepy test modoboacore modoboalib modoboaadmin modoboalimits modoboararr˓relaydomains

Otherwise you can run the tests suite from the repository using tox

Start a basic Modoboa instance

From the repository run the following command to launch a simple instance with a few fixtures

gt tox -e serve

You can use adminpassword to log in

Build the documentation

If you need to modify the documenation and want to see the result you can build it as follows

gt tox -e docgt firefox toxdoctmphtmlindexhtml

FAQ

bower command is missing in managepy

bower command is missing in managepy if you donrsquot use the --devel option of the modoboa-adminpydeploy command

To fix it regenerate your instance or update your settingspy file manually Look at devmode in httpsgithubcomtonioomodoboablobmastermodoboacorecommandstemplatessettingspytpl

Create a new plugin

Introduction

Modoboa offers a plugin API to expand its capabilities The current implementation provides the following possibili-ties

26 How to contribute 51

Modoboa Documentation Release 1100

bull Expand navigation by adding entry points to your plugin inside the GUI

bull Access and modify administrative objects (domains mailboxes etc)

bull Register callback actions for specific events

Plugins are nothing more than Django applications with an extra piece of code that integrates them into Modoboa Themodo_extensionpy file will contain a complete description of the plugin

bull Admin and user parameters

bull Custom menu entries

The communication between both applications is provided by Django signals

The following subsections describe the plugin architecture and explain how you can create your own

The required glue

To create a new plugin just start a new django application like this (into Modoboarsquos directory)

$ python managepy startapp

Then you need to register this application using the provided API Just copypaste the following example into themodo_extensionpy file of the future extension

from modoboacoreextensions import ModoExtension exts_pool

class MyExtension(ModoExtension)My custom Modoboa extension

name = myextlabel = My Extensionversion = 01description = A descriptionurl = myext_root_location optional name is used if not defined

def load(self)This method is called when Modoboa loads available and activated plugins

Declare parameters and register events herepass

def load_initial_data(self)Optional provide initial data for your extension herepass

exts_poolregister_extension(MyExtension)

Once done simply add your extensionrsquos module name to the MODOBOA_APPS variable located inside settingspy Finally run the following commands

$ python managepy migrate$ python managepy load_initial_data$ python managepy collectstatic

52 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Parameters

A plugin can declare its own parameters There are two levels available

bull lsquoGlobalrsquo parameters used to configure the plugin editable inside the Admin gt Settings gt Parameters page

bull lsquoUserrsquo parameters per-user parameters (or preferences) editable inside the Options gt Preferences page

Playing with parameters

Parameters are defined using Django forms and Modoboa adds two special forms you can inherit depending on thelevel of parameter(s) you want to add

bull modoboaparametersformsAdminParametersForm for general parameters

bull modoboaparametersformsUserParametersForm for user parameters

To register new parameters add the following line into the load method of your plugin class

from modoboaparameters import tools as param_toolsparam_toolsregistryadd(

LEVEL YourForm ugettext_lazy(Title))

Replace LEVEL by global or user

Custom role permissions

Modoboa uses Djangorsquos internal permission system Administrative roles are nothing more than groups (Groupinstances)

An extension can add new permissions to a group by listening to the extra_role_permissions signal Here isan example

from djangodispatch import receiverfrom modoboacore import signals as core_signals

PERMISSIONS = Resellers [

(relaydomains relaydomain add_relaydomain)(relaydomains relaydomain change_relaydomain)(relaydomains relaydomain delete_relaydomain)(relaydomains service add_service)(relaydomains service change_service)(relaydomains service delete_service)

]

receiver(core_signalsextra_role_permissions)def extra_role_permissions(sender role kwargs)

Add permissions to the Resellers groupreturn constantsPERMISSIONSget(role [])

Extending admin forms

The forms used to edit objects (account domain etc) through the admin panel are composed of tabs You can extendthem (ie add new tabs) in a pretty easy way thanks to custom signals

26 How to contribute 53

Modoboa Documentation Release 1100

Account

To add a new tab to the account edition form define new listeners (handlers) for the following signals

bull modoboaadminsignalsextra_account_forms

bull modoboaadminsignalsget_account_form_instances

bull modoboaadminsignalscheck_extra_account_form (optional)

Example

from djangodispatch import receiverfrom modoboaadmin import signals as admin_signals

receiver(admin_signalsextra_account_forms)def extra_account_form(sender user account kwargs)

return [id tabid title Title cls MyFormClass

]

receiver(admin_signalsget_account_form_instances)def fill_my_tab(sender user account kwargs)

return id my_instance

Domain

To add a new tab to the domain edition form define new listeners (handlers) for the following signals

bull modoboaadminsignalsextra_domain_forms

bull modoboaadminsignalsget_domain_form_instances

Example

from djangodispatch import receiverfrom modoboaadmin import signals as admin_signals

receiver(admin_signalsextra_domain_forms)def extra_account_form(sender user domain kwargs)

return [id tabid title Title cls MyFormClass

]

receiver(admin_signalsget_domain_form_instances)def fill_my_tab(sender user domain kwargs)

return id my_instance

27 Contributors

bull Antidot

bull Bearstech

bull CAP-REL

54 Chapter 2 Table of contents

Modoboa Documentation Release 1100

bull Dalnix

27 Contributors 55

  • Overview
  • Table of contents
Page 3: Modoboa Documentation

ii

Modoboa Documentation Release 1100

Contents 1

Modoboa Documentation Release 1100

2 Contents

CHAPTER 1

Overview

Modoboa is a mail hosting and management platform including a modern and simplified Web User Interface designedto work with Postfix and Dovecot

It is extensible by nature and comes with a lot of additional extensions

Name Description Documentationmodoboa-amavis A frontend for Amavis httpsmodoboa-amavisreadthedocs

iomodoboa-dmarc A set of tools to use DMARC httpsgithubcommodoboa

modoboa-dmarcmodoboa-imap-migration

Migrate mailboxes from an existing server usingIMAP (and offlineimap)

httpsgithubcommodoboamodoboa-imap-migration

modoboa-pdfcredentials

Generate PDF documents containing account cre-dentials

httpsgithubcommodoboamodoboa-pdfcredentials

modoboa-pfxadmin-migrate

A tool to migrate from Postfixadmin httpsgithubcommodoboamodoboa-pfxadmin-migrate

modoboa-postfix-autoreply

Away message editor (postfix compatible) httpsmodoboa-postfix-autoreplyreadthedocsio

modoboa-radicale A frontend for Radicale httpsmodoboa-radicalereadthedocsio

modoboa-sievefilters

A Sieve filters (rules) editor httpsmodoboa-sievefiltersreadthedocsio

modoboa-stats Graphical statistics (message traffic and more) httpsmodoboa-statsreadthedocsiomodoboa-webmail A simple webmail httpsmodoboa-webmail

readthedocsio

3

Modoboa Documentation Release 1100

4 Chapter 1 Overview

CHAPTER 2

Table of contents

21 Installation

211 Requirements

You will need a Server to perform well with at least

bull CPU 2

bull RAM 2GB

bull Disk 10GB

bull Python 3

Note Heads up for modoboa versions 115 and later

Python 2 support has been dropped with modoboa version 115 If you still have Python 2 installed on your systemeither uninstall it or force modoboa user to run with Python 3

212 Recommended way

If you start from scratch and want to deploy a complete mail server you will love the modoboa installer It is theeasiest and the quickest way to setup a fully functional server (modoboa postfix dovecot amavis and more) on onemachine

Warning For now only Debian and CentOS based Linux distributions are supported We do our best to improvecompatibility but if you use another Linux or a UNIX system you will have to install Modoboa manually

To use it just run the following commands in your terminal

5

Modoboa Documentation Release 1100

gt git clone httpsgithubcommodoboamodoboa-installergt cd modoboa-installergt sudo runpy ltyour domaingt

if you get this warning - lsquousrbinenv lsquopythonrsquo No such file or directoryrsquo do make sure sure python is installed onyour server Sometimes python is installed but the installer canrsquot detect it or which python version to run especiallyon a debian based system Then run this command first

gt sudo apt-get install python-virtualenv python-pip

Wait a few minutes and yoursquore done o

213 Manual installation

For those who need a manual installation or who just want to setup a specific part here are the steps you must follow

Modoboa

This section describes the installation of the web interface (a Django project)

Prepare the system

First of all we recommend the following context

bull A dedicated system user

bull A virtual environment to install the application because it will isolate it (and its dependencies) from the rest ofyour system

The following example illustrates how to realize this on Debian-based distributions using virtualenv

apt-get install virtualenv python3-pip useradd modoboa create a dedicated user su -l modoboa log in as the newly created user$ virtualenv --python python3 env create the virtual environment$ source envbinactivate activate the virtual environment

Modoboa depends on external tools and some of them require compilation so you need a compiler and a few C librariesMake sure to install the following system packages according to your distribution

Debian Ubuntubuild-essential python3-dev libxml2-dev libxslt-dev libjpeg-dev librrd-dev rrdtool libffi-dev libssl-dev

CentOSgcc gcc-c++ python3-devel libxml2-devel libxslt-devel libjpeg-turbo-devel rrdtool-devel rrdtool libffi-devel

Note Alternatively you could rely on your distribution packages for the Modoboa dependencies which requirecompilation - eg psycopg2 - if the version is compatible In this case you have to create your virtual environmentwith the --system-site-packages option

Then install Modoboa by running

6 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(env)$ pip install modoboa

Database

Warning This documentation does not cover the installation of a database server but only the setup of a functionaldatabase that Modoboa will use

Thanks to Django Modoboa is compatible with the following databases

bull PostgreSQL

bull MySQL MariaDB

bull SQLite

Since the last one does not require particular actions only the first two ones are described You should also read thenotes for those database backends on the official Django documentation

PostgreSQL

Install the corresponding Python binding

(env)$ pip install psycopg2

Note Alternatively you can install the python3-psycopg2 package instead on Debian-based distributions ifyour virtual environment was created with --system-site-packages option

Then create a user and a database For example to create the modoboa database owned by a modoboa user run thefollowing commands on your PostgreSQL server

sudo -l -u postgres createuser --no-createdb modoboa sudo -l -u postgres createdb --owner=modoboa modoboa

MySQL MariaDB

Install the corresponding Python binding

(env)$ pip install mysqlclient

Note Alternatively you can install the python3-mysqldb package instead on Debian-based distributions if yourvirtual environment was created with --system-site-packages option

Note MariaDB 102 (and newer) require mysqlclient 1311 (or newer)

Then create a user and a database For example to create the modoboa database owned by a modoboa user run thefollowing SQL commands

21 Installation 7

Modoboa Documentation Release 1100

CREATE DATABASE modoboaCREATE USER modoboalocalhost IDENTIFIED BY my-strong-password-hereGRANT ALL PRIVILEGES ON modoboa TO modoboalocalhost

Deploy an instance

modoboa-adminpy is a command line tool that lets you deploy a ready-to-use Modoboa site To create a newinstance into instance you just have to run the following command

(env)$ modoboa-adminpy deploy instance --collectstatic --domain lthostname of your servergt --dburl defaultltdatabase urlgt

Note You can install additional extensions during the deploy process To do so use the --extensions op-tion which accepts a list of names as argument (--extensions ext1 ext2 ) If you want to install allextensions just use the all keyword like this --extensions all

If you choose to install extensions one at a time you will have to add their names in settingspy to MODOBOA_APPSAlso ensure that you have the line from modoboa_amavissettings import at the end of this file

The list of available extensions can be found on the index page Instructions to install them are available on eachextensions page

Note You can specify more than one database connection using the --dburl option Multiple connections aredifferentiated by a prefix

The primary connection must use the default prefix (as shown in the example above) For the amavis exten-sion use the amavis prefix For example --dburl defaultltdatabase urlgt amavisltdatabaseurlgt

A database url should meet the following syntax ltmysql|postgresgt[userpass][hostport]dbname OR sqlitefullpathtoyourdatabasefilesqlite

The command will ask you a few questions answer them and yoursquore done

If you need a silent installation (eg if yoursquore using Salt-Stack Ansible or whatever) itrsquos possible to supply thedatabase credentials as command line arguments

You can consult the complete option list by running the following command

(env)$ modoboa-adminpy help deploy

Cron jobs

A few recurring jobs must be configured to make Modoboa works as expected

Create a new file for example etccrondmodoboa and put the following content inside

Modoboa specific cron jobsPYTHON=ltpath to Python binary inside the virtual environmentgtINSTANCE=ltpath to Modoboa instancegt

(continues on next page)

8 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

Operations on mailboxes

vmail $PYTHON $INSTANCEmanagepy handle_mailbox_operations

Generate DKIM keys (they will belong to the user running this job)

root umask 077 ampamp $PYTHON $INSTANCEmanagepy modo manage_dkim_rarr˓keys

Sessions table cleanup0 0 modoboa $PYTHON $INSTANCEmanagepy clearsessions Logs table cleanup0 0 modoboa $PYTHON $INSTANCEmanagepy cleanlogs DNSBL checks

30 modoboa $PYTHON $INSTANCEmanagepy modo check_mx Public API communication0 modoboa $PYTHON $INSTANCEmanagepy communicate_with_public_api

Policy daemon

Modoboa comes with a built-in Policy Daemon for Postfix Current features are

bull Define daily sending limits for domains andor accounts

A redis server is required to run this new daemon

You can launch it manually using the following command

(env)gt python managepy policy_daemon

But we recommend an automatic start using systemd or supervisor Here is a configuration example forsupervisor

[programpolicyd]autostart=trueautorestart=truecommand=srvmodoboaenvbinpython srvmodoboainstancemanagepy policy_daemondirectory=srvmodoboaredirect_stderr=trueuser=modoboanumprocs=1

It will listen by default on 127001 and port 9999 The policy daemon wonrsquot do anything unless you tell postfixto use it

Now you can continue to the Web server section

Web server

Note The following instructions are meant to help you get your site up and running quickly However it is notpossible for the people contributing documentation to Modoboa to test every single combination of web server wsgiserver distribution etc So it is possible that your installation of uwsgi or nginx or Apache or what-have-you worksdifferently Keep this in mind

21 Installation 9

Modoboa Documentation Release 1100

Apache2

First make sure that mod_wsgi is installed on your server

Create a new virtualhost in your Apache configuration and put the following content inside

ltVirtualHost 80gtServerName ltyour valuegtDocumentRoot ltmodoboa_instance_pathgt

Alias media ltmodoboa_instance_pathgtmedialtDirectory ltmodoboa_instance_pathgtmediagtOrder denyallowAllow from all

ltDirectorygt

Alias sitestatic ltmodoboa_instance_pathgtsitestaticltDirectory ltmodoboa_instance_pathgtsitestaticgtOrder denyallowAllow from all

ltDirectorygt

WSGIScriptAlias ltmodoboa_instance_pathgtltinstance_namegtwsgipy

Pass Authorization header to enable API usageWSGIPassAuthorization On

ltVirtualHostgt

This is just one possible configuration

To use mod_wsgi daemon mode add the two following directives just under WSGIScriptAlias

WSGIDaemonProcess examplecom python-path=ltmodoboa_instancegtltvirtualenv pathgtlibrarr˓python37site-packagesWSGIProcessGroup examplecom

Replace values between ltgt with yours If you donrsquot use a virtualenv just remove the last part of theWSGIDaemonProcess directive

Note You will certainly need more configuration in order to launch Apache

Now you can go the Dovecot section to continue the installation

Nginx

This section covers two different ways of running Modoboa behind Nginx using a WSGI application server Choosethe one you prefer between Green Unicorn or uWSGI

In both cases yoursquoll need to download and install nginx

Green Unicorn

Firstly Download and install gunicorn Then use the following sample gunicorn configuration (create a new filenamed gunicornconfpy inside Modoboarsquos root dir)

10 Chapter 2 Table of contents

Modoboa Documentation Release 1100

backlog = 2048bind = unixvarrungunicornmodoboasockpidfile = varrungunicornmodoboapiddaemon = Truedebug = Falseworkers = 2logfile = varloggunicornmodoboalogloglevel = info

To start gunicorn execute the following commands

$ cd ltmodoboa dirgt$ gunicorn -c gunicornconfpy ltmodoboa dirgtwsgiapplication

Now the nginx part Just create a new virtual host and use the following configuration

upstream modoboa server unixvarrungunicornmodoboasock fail_timeout=0

server listen 443 sslssl onkeepalive_timeout 70

server_name lthost fqdngtroot ltmodoboa_instance_pathgt

access_log varlognginxlthost fqdngtaccesslogerror_log varlognginxlthost fqdngterrorlog

ssl_certificate ltssl certificate for your sitegtssl_certificate_key ltssl certificate key for your sitegt

location sitestatic autoindex on

location media autoindex on

location proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_forproxy_set_header Host $http_hostproxy_redirect offproxy_set_header X-Forwarded-Protocol sslproxy_pass httpmodoboa

If you do not plan to use SSL then change the listen directive to listen 80 and delete each of the followingdirectives

ssl onkeepalive_timeout 70ssl_certificate ltssl certificate for your sitegt

(continues on next page)

21 Installation 11

Modoboa Documentation Release 1100

(continued from previous page)

ssl_certificate_key ltssl certificate key for your sitegtproxy_set_header X-Forwarded-Protocol ssl

If you do plan to use SSL yoursquoll have to generate a certificate and a key This article contains information about howto do it

Paste this content to your configuration (replace values between ltgt with yours) and restart nginx

Now you can go the Dovecot section to continue the installation

uWSGI

The following setup is meant to get you started quickly You should read the documentation of both nginx and uwsgito understand how to optimize their configuration for your site

The Django documentation includes the following warning regarding uwsgi

Warning Use uwsgi 126 or newer If you do not you will run into problems Modoboa will fail in obscureways

To use this setup first download and install uwsgi

Here is a sample nginx configuration

server listen 443 sslssl onkeepalive_timeout 70

server_name lthost fqdngtroot ltmodoboas settings dirgt

ssl_certificate ltssl certificate for your sitegtssl_certificate_key ltssl certificate key for your sitegt

access_log varlognginxlthost fqdngtaccesslogerror_log varlognginxlthost fqdngterrorlog

location ltmodoboas root urlgtsitestatic autoindex onalias ltlocation of sitestatic on your file systemgt

Whether or not Modoboa uses a media directory depends on how you configured Modoboa It does not hurt to have thislocation ltmodoboas root urlgtmedia

autoindex onalias ltlocation of media on your file systemgt

This denies access to any file that begins with ht Apaches htaccess and htpasswd are such files A Modoboa installed from scratch would not contain any such files but you never know what the future holds

(continues on next page)

12 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

location ~ ht deny all

location ltmodobas root urlgt include uwsgi_paramsuwsgi_pass ltuwsgi portgtuwsgi_param UWSGI_SCRIPT ltmodoboa instance namegtwsgiapplicationuwsgi_param UWSGI_SCHEME https

ltmodoboa instance namegt must be replaced by the value you used when you deployed your instance

If you do not plan to use SSL then change the listen directive to listen 80 and delete each of the followingdirectives

ssl onkeepalive_timeout 70ssl_certificate ltssl certificate for your sitegtssl_certificate_key ltssl certificate key for your sitegtuwsgi_param UWSGI_SCHEME https

If you do plan to use SSL yoursquoll have to generate a certificate and a key This article contains information about howto do it

Make sure to replace the ltgt in the sample configuration with appropriate values Here are some explanations forthe cases that may not be completely self-explanatory

ltmodoboas settings dirgt Where Modoboarsquos settingspy resides This is also where thesitestatic and media directories reside

ltmodoboas root urlgt This is the URL which will be the root of your Modoboa site at your domain For in-stance if your Modoboa installation is reachable at at httpsfoomodoboa then ltmodoboas rooturlgt is modoboa In this case you probably also have to set the alias directives to point to where Mod-oboarsquos sitestatic and media directories are because otherwise nginx wonrsquot be able to find them

If Modoboa is at the root of your domain then ltmodoboa root urlgt is an empty string and can be deletedfrom the configuration above In this case you probably do not need the alias directives

ltuwsgi portgt The location where uwsig is listening It could be a unix domain socket or an addressport combi-nation Ubuntu configures uwsgi so that the port is

unixrunuwsgiappltapp namegtsocket

where ltapp namegt is the name of the application

Your uwsgi configuration should be

[uwsgi] Not needed when using uwsgi from pip plugins = pythonchdir = ltmodoboas top dirgtmodule = ltnamegtwsgiapplicationmaster = trueharakiri = 60processes = 4vhost = trueno-default-app = true

21 Installation 13

Modoboa Documentation Release 1100

The plugins directive should be turned on if you use a uwsgi installation that requires it If uwsgi was installed frompip it does not require it In the configuration above

ltmodoboas top dirgt The directory where managepy resides This directory is the parent of ltmodoboassettings dirgt

ltnamegt The name that you passed to modoboa-adminpy deploy when you created your Modoboa instance

Now you can go the Dovecot section to continue the installation

Dovecot

Modoboa requires Dovecot 2+ to work so the following documentation is suitable for this combination

In this section we assume dovecotrsquos configuration resides in etcdovecot all pathes will be relative to thisdirectory

Mailboxes

First edit the confd10-mailconf and set the mail_location variable

maildirmail_location = maildir~maildir

Then edit the inbox namespace and add the following lines

inbox = yes

mailbox Drafts auto = subscribespecial_use = Drafts

mailbox Junk

auto = subscribespecial_use = Junk

mailbox Sent

auto = subscribespecial_use = Sent

mailbox Trash

auto = subscribespecial_use = Trash

With dovecot 21+ it ensures all the special mailboxes will be automaticaly created for new accounts

For dovecot 20 and older use the autocreate plugin

Operations on the file system

14 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning Modoboa needs to access the dovecot binary to check its version To find the binary path weuse the which command first and then try known locations (usrsbindovecot and usrlocalsbindovecot) If you installed dovecot in a custom location please tell us where the binary is by usingthe DOVECOT_LOOKUP_PATH setting (see settingspy)

Three operation types are considered

1 Mailbox creation

2 Mailbox renaming

3 Mailbox deletion

The first one is managed by Dovecot The last two ones may be managed by Modoboa if it can access the file systemwhere the mailboxes are stored (see General parameters to activate this feature)

Those operations are treated asynchronously by a cron script For example when you rename an e-mail addressthrough the web UI the associated mailbox on the file system is not modified directly Instead of that a renameorder is created for this mailbox The mailbox will be considered unavailable until the order is executed (see Postfixconfiguration)

Edit the crontab of the user who owns the mailboxes on the file system

$ crontab -u ltusergt -e

And add the following line inside

python ltmodoboa_sitegtmanagepy handle_mailbox_operations

Warning The cron script must be executed by the system user owning the mailboxes

Warning The user running the cron script must have access to the settingspy file of the modoboa instance

The result of each order is recorded into Modoboarsquos log Go to Modoboa gt Logs to consult them

Authentication

To make the authentication work edit the confd10-authconf and uncomment the following line at the end

include auth-systemconfextinclude auth-sqlconfextinclude auth-ldapconfextinclude auth-passwdfileconfextinclude auth-checkpasswordconfextinclude auth-vpopmailconfextinclude auth-staticconfext

Then edit the confdauth-sqlconfext file and add the following content inside

passdb sql driver = sql Path for SQL configuration file see example-configdovecot-sqlconfext

(continues on next page)

21 Installation 15

Modoboa Documentation Release 1100

(continued from previous page)

args = etcdovecotdovecot-sqlconfext

userdb sql driver = sqlargs = etcdovecotdovecot-sqlconfext

Make sure to activate only one backend (per type) inside your configuration (just comment the other ones)

Edit the dovecot-sqlconfext and modify the configuration according to your database engine

MySQL users

driver = mysql

connect = host=ltmysqld socketgt dbname=ltdatabasegt user=ltusergt password=ltpasswordgt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user WHERE email=Lu andrarr˓is_active=1

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid concat(bytes= mbquota M) AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

PostgreSQL users

driver = pgsql

connect = host=ltpostgres socketgt dbname=ltdatabasegt user=ltusergt password=ltpasswordgt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user u INNER JOIN admin_rarr˓mailbox mb ON uid=mbuser_id INNER JOIN admin_domain dom ON mbdomain_id=domidrarr˓WHERE uemail=Lu AND uis_active AND domenabled

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid bytes= || mbquota || M AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

16 Chapter 2 Table of contents

Modoboa Documentation Release 1100

SQLite users

driver = sqlite

connect = ltpath to the sqlite db filegt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user u INNER JOIN admin_rarr˓mailbox mb ON uid=mbuser_id INNER JOIN admin_domain dom ON mbdomain_id=domidrarr˓WHERE uemail=Lu AND uis_active=1 AND domenabled=1

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid (bytes= || mbquota || M) AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

Note Replace values between ltgt with yours

LDAP

To make the LDAP authentication work edit the confd10-authconf and uncomment the following line atthe end

include auth-ldapconfext

Then edit the confdauth-ldapconfext and edit the passdb section as following You should comment theuserdb section which will be managed by SQL with modoboa database

passdb driver = ldap

Path for LDAP configuration file see example-configdovecot-ldapconfextargs = etcdovecotdovecot-ldapconfext

userdb driver = ldapargs = etcdovecotdovecot-ldapconfext

Default fields can be used to specify defaults that LDAP may overridedefault_fields = home=homevirtualu

Your own dovecot LDAP configuration file is now etcdovecotdovecot-ldapconfext You can addyour default LDAP conf in it following the official documentation

Synchronize dovecot LDAP conf with modoboa LDAP conf

To make dovecot LDAP configuration synchronized with modoboa LDAP configuration you should create a dedicateddovecot conf file At the end of your dovecot configuration file (dovecot-ldapconfext) add the following

21 Installation 17

Modoboa Documentation Release 1100

line

include_try dovecot-modoboaconfext

Then set modoboa parameter Enable Dovecot LDAP sync to Yes Then set the Dovecot LDAP config file following theprevious step (etcdovecotdovecot-modoboaconfext in the example)

The last step is to add the command update_dovecot_conf to the cron job of modoboa Then each time your modoboaLDAP configuration is updated your dovecot LDAP configuration will also be

LMTP

Local Mail Transport Protocol is used to let Postfix deliver messages to Dovecot

First make sure the protocol is activated by looking at the protocols setting (generally inside dovecotconf)It should be similar to the following example

protocols = imap pop3 lmtp

Then open the confd10-masterconf look for lmtp service definition and add the following content inside

service lmtp stuff beforeunix_listener varspoolpostfixprivatedovecot-lmtp mode = 0600user = postfixgroup = postfix

stuff after

We assume here that Postfix is chrooted within varspoolpostfix

Finally open the confd20-lmtpconf and modify it as follows

protocol lmtp postmaster_address = postmasterltdomaingtmail_plugins = $mail_plugins quota sieve

Replace ltdomaingt by the appropriate value

Note If you donrsquot plan to apply quota or to use filters just adapt the content of the mail_plugins setting

Quota

Modoboa lets adminstrators define per-domain andor per-account limits (quota) It also lists the current quota usageof each account Those features require Dovecot to be configured in a specific way

Inside confd10-mailconf add the quota plugin to the default activated ones

mail_plugins = quota

Inside confd10-masterconf update the dict service to set proper permissions

18 Chapter 2 Table of contents

Modoboa Documentation Release 1100

service dict If dict proxy is used mail processes should have access to its socket For example mode=0660 group=vmail and global mail_access_groups=vmailunix_listener dict mode = 0600user = ltuser owning mailboxesgtgroup =

Inside confd20-imapconf activate the imap_quota plugin

protocol imap

mail_plugins = $mail_plugins imap_quota

Inside dovecotconf activate the quota SQL dictionary backend

dict quota = ltdrivergtetcdovecotdovecot-dict-sqlconfext

Inside confd90-quotaconf activate the quota dictionary backend

plugin quota = dictUser quotaproxyquota

It will tell Dovecot to keep quota usage in the SQL dictionary

Finally edit the dovecot-dict-sqlconfext file and put the following content inside

connect = host=ltdb hostgt dbname=ltdb namegt user=ltdb usergt password=ltpasswordgt SQLite users connect = pathtothedatabasedb

map pattern = privquotastoragetable = admin_quotausername_field = usernamevalue_field = bytes

map

pattern = privquotamessagestable = admin_quotausername_field = usernamevalue_field = messages

PostgreSQL users

21 Installation 19

Modoboa Documentation Release 1100

Database schema update

The admin_quota table is created by Django but unfortunately it doesnrsquot support DEFAULT constraints (it onlysimulates them when the ORM is used) As PostgreSQL is a bit strict about constraint violations you must executethe following query manually

db=gt ALTER TABLE admin_quota ALTER COLUMN bytes SET DEFAULT 0db=gt ALTER TABLE admin_quota ALTER COLUMN messages SET DEFAULT 0

Trigger

As indicated on Dovecotrsquos wiki you need a trigger to properly update the quota

A working copy of this trigger is available on Github

Download this file and copy it on the server running postgres Then execute the following commands

$ su - postgres$ psql [modoboa database] lt pathtomodoboa_postgres_triggersql$ exit

Replace [modoboa database] by the appropriate value

Forcing recalculation

For existing installations Dovecot (gt 2) offers a command to recalculate the current quota usages For example if youwant to update all usages run the following command

$ doveadm quota recalc -A

Be carefull it can take a while to execute

ManageSieveSieve

Modoboa lets users define filtering rules from the web interface To do so it requires ManageSieve to be activated onyour server

Inside confd20-managesieveconf make sure the following lines are uncommented

protocols = $protocols sieve

service managesieve-login

service managesieve

protocol sieve

20 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Messages filtering using Sieve is done by the LDA

Inside confd15-ldaconf activate the sieve plugin like this

protocol lda Space separated list of plugins to load (default is global mail_plugins)mail_plugins = $mail_plugins sieve

Finally configure the sieve plugin by editing the confd90-sieveconf file Put the follwing caontent inside

plugin Location of the active script When ManageSieve is used this is actually a symlink pointing to the active script in the sieve storage directorysieve = ~dovecotsieve

The path to the directory where the personal Sieve scripts are stored For ManageSieve this is where the uploaded scripts are storedsieve_dir = ~sieve

Restart Dovecot

Now you can go to the Postfix section to finish the installation

Last-login tracking

To update the last_login attribute of an account after a succesful IMAP or POP3 login you can configure apost-login script

Open confd10-masterconf add the following configuration (imap and pop3 services are already definedyou just need to update them)

service imap executable = imap postlogin

service pop3 executable = pop3 postlogin

service postlogin executable = script-login usrlocalbinpostloginshuser = modoboaunix_listener postlogin

Then you must create a script named usrlocalbinpostloginsh According to your database enginethe content will differ

PostgreSQL

21 Installation 21

Modoboa Documentation Release 1100

binsh

psql -c UPDATE core_user SET last_login=now() WHERE username=$USER gt devnull

exec $

MySQL

binsh

DBNAME=XXXDBUSER=XXXDBPASSWORD=XXX

echo UPDATE core_user SET last_login=now() WHERE username=$USER | mysql -urarr˓$DBUSER -p$DBPASSWORD $DBNAME

exec $

Postfix

This section gives an example about building a simple virtual hosting configuration with Postfix Refer to the officialdocumentation for more explanation

Map files

You first need to create configuration files (or map files) that will be used by Postfix to lookup into Modoboa tables

To automaticaly generate the requested map files and store them in a directory run the following command

gt cd ltmodoboa_instance_pathgtgt python managepy generate_postfix_maps --destdir ltdirectorygt

ltdirectorygt is the directory where the files will be stored Answer the few questions and yoursquore done

Configuration

Use the following configuration in the etcpostfixmaincf file (this is just one possible configuration)

Stuff beforevirtual_transport = lmtpunixprivatedovecot-lmtp

virtual_mailbox_domains = ltdrivergtetcpostfixsql-domainscfvirtual_alias_domains = ltdrivergtetcpostfixsql-domain-aliasescfvirtual_alias_maps = ltdrivergtetcpostfixsql-aliasescf

relay_domains = ltdrivergtetcpostfixsql-relaydomainscftransport_maps =

ltdrivergtetcpostfixsql-transportcfltdrivergtetcpostfixsql-spliteddomains-transportcf

(continues on next page)

22 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

smtpd_recipient_restrictions = check_recipient_access

ltdrivergtetcpostfixsql-maintaincfltdrivergtetcpostfixsql-relay-recipient-verificationcf

permit_mynetworksreject_unauth_destinationreject_unverified_recipient

smtpd_sender_login_maps = ltdrivergtetcpostfixsql-sender-login-mapcf

smtpd_sender_restrictions =reject_sender_login_mismatch

Stuff after

Replace ltdrivergt by the name of the database you use

Restart Postfix

Policy daemon

If you want to enable the built-in policy daemon add the following content to the etcpostfixmaincf file

smtpd_recipient_restrictions = check_policy_service inet1270019999

And reload postfix

Note The check_policy_service line must be placed before the permit_mynetworks one otherwise thedaemon wonrsquot be called

OpenDKIM

Modoboa can generate DKIM keys for the hosted domains but it wonrsquot sign or check messages To do that you needa dedicated software like OpenDKIM

Note The cron job in charge of creating DKIM keys must be run using the same user than OpenDKIM (ie opendkimin most cases)

Database

Since keys related information is stored in Modoboarsquos database you need to tell OpenDKIM how it can access it

First make sure to install the required additional packages on your system (libopendbx1- on debian baseddistributions or opendbx- on CentOS the complete name depends on your database engine)

Then insert the following SQL view into Modoboarsquos database

21 Installation 23

Modoboa Documentation Release 1100

PostgreSQL

CREATE OR REPLACE VIEW dkim AS (SELECT id name as domain_name dkim_private_key_path AS private_key_path

dkim_key_selector AS selectorFROM admin_domain WHERE enable_dkim

)

MySQLMariaDB

CREATE OR REPLACE VIEW dkim AS (SELECT id name as domain_name dkim_private_key_path AS private_key_path

dkim_key_selector AS selectorFROM admin_domain WHERE enable_dkim=1

)

Configuration

You should find OpenDKIMrsquos configuration file at etcopendkimconf

Add the following content to it

KeyTable dsnltdrivergtltusergtltpasswordgtltdb hostgtltdb namegttable=dkimrarr˓keycol=iddatacol=domain_nameselectorprivate_key_pathSigningTable dsnltdrivergtltusergtltpasswordgtltdb hostgtltdb namegttable=dkimrarr˓keycol=domain_namedatacol=idSocket inet12345localhost

Replace values between ltgt by yours Accepted values for driver are pgsql or mysql Make sure the user youspecify has read permission on the view created previously

If you run a debian based system make sure to adjust the following setting in the etcdefaultopendkim file

SOCKET=inet12345localhost

Eventually reload OpenDKIM

Postfix integration

Add the following lines to the etcpostfixmaincf file

smtpd_milters = inet12700112345non_smtpd_milters = inet12700112345milter_default_action = acceptmilter_content_timeout = 30s

and reload postfix

Extensions

Only few commands are needed to add a new extension to your setup

24 Chapter 2 Table of contents

Modoboa Documentation Release 1100

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install ltEXTENSIONgt==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Then restart your web server

22 Upgrade

221 Modoboa

Warning The new version you are going to install may need to modify your database Before you start makesure to backup everything

Most of the time upgrading your installation to a newer Modoboa version only requires a few actions In every caseyou will need to apply the general procedure first and then check if the version you are installing requires specificactions

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install modoboa==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Once done check if the version you are installing requires Specific instructions

Finally restart your web server

Sometimes you might need to upgrade postfix map files too To do so just run the generate_postfix_mapscommand on the same directory than the one used for installation (etcpostfix by default)

Make sure to use root privileges and run the following command

gt python managepy generate_postfix_maps --destdir ltdirectorygt

Then reload postfix

22 Upgrade 25

Modoboa Documentation Release 1100

222 Extensions

If a new version is available for an extension yoursquore using it is recommanded to install it Upgrading an extensions ispretty and the procedure is almost the same than the one used for Modoboa

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install ltEXTENSIONgt==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Finally restart your web server

It is a generic upgrade procedure which will be enough most of the time but it is generally a good idea to check theassociated documentation

223 Rebuild Virtual Environment

Sometimes when upgrading your Operating System (eg from Ubuntu 1704 to Ubuntu 1710) your virtual environmentrunning modoboa can get corrupted Your first response will be to panic but fear not The solution is in this document

First things first

Recover your database password

You will need to recover your database password (if using mysql or postgresql) You will find this in etcpostfixsql-aliasescf or any file with sql-cf in the etcpostfix directory

Make note of this as you will need it when reconfiguring modoboa

Reinstall Modoboa

Start out by backup up your modoboa settings file located in the modoboa instance directory (srvmodoboainstanceinstancesettingspy if you used the default installer configuration) This contains your currentconfiguration

Next you want to remove all current modoboa files

After doing this follow the manual installation instructions for Modoboa only as everything should be working prop-erly

After this completes simply restore your backed up settings file to srvinstanceinstancesettingspy(if you used installer default configuration) You will then need to reinstall your extensions

You can find which plugins you had in your settingspy file under the MODOBOA_APPS variable

Instructions to install extensions can also be found here

Once you have completed this step you will need to run the following commands

26 Chapter 2 Table of contents

Modoboa Documentation Release 1100

gt (env) $ cd ltinstance_dirgtgt (env) $ python managepy migrategt (env) $ python managepy collectstatic

You will then see a message similar to

You have requested to collect static files at the destinationlocation as specified in your settings

srvmodoboainstancesitestatic

This will overwrite existing filesAre you sure you want to do this

Type yes to continue or no to cancel

You will want to answer yes here then simply restart the uwsgi process with service uwsgi restart andyou should be up and running again

Simply log into your modoboa web panel and verify that your extensions and webmail box is working

224 Information

Rebuild instructions from httpshelppythonanywherecompagesRebuildingVirtualenvs

225 Specific instructions

1160

A new policy daemon has been added

Make sure to have a Redis instance running on your server

Add modoboapolicyd to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboapolicyd

)

Add the following settings to your settingspy file

REDIS_HOST = ltIP or hostname heregtREDIS_PORT = 6379REDIS_QUOTA_DB = 0REDIS_URL = redisformat(REDIS_HOST REDIS_PORT REDIS_QUOTA_DB)

Once done you can start the policy daemon using the following commands

22 Upgrade 27

Modoboa Documentation Release 1100

gt python managepy policy_daemon

Donrsquot forget to configure _policyd_config if you want to use this feature

The modoboa-stats plugin has been merged into the core

Add modoboamaillog to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboapolicydmodoboamaillog

)

And remove any reference to modoboa_stats in this same variable

1150

This version drops Python 2 support so donrsquot forget to update all the extensions you use

Warning If you upgrade an existing python 2 installation you will need to create a new Python 3 virtualenvironment You can remove the existing virtual environment and replace it by the new one so you wonrsquot have tomodify your configuration files

Add the following new setting

DISABLE_DASHBOARD_EXTERNAL_QUERIES = False

Reload uwsgigunicornapache depending on your setup

Finally Make sure to use root privileges and run the following command

gt python managepy generate_postfix_maps --destdir ltdirectorygt

Then reload postfix

1140

This release introduces an optional LDAP synchronization process If you want to use it please follow the dedicatedprocedure

1131

Upgrade postfix maps files as follows

28 Chapter 2 Table of contents

Modoboa Documentation Release 1100

gt python managepy generate_postfix_maps --destdir ltpathgt --force-overwrite

1130

Add modoboadnstools to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstools

)

Add the following new settings

CSRF_COOKIE_SECURE = TrueSESSION_COOKIE_SECURE = True

modoboa-postfix-autoreply 150

Edit the etcpostfixmaincf file and remove the sql-autoreplies-transportcf map from thetransport_maps if present Remove the corresponding proxy_read_maps entry if relevant

Reload postfix

1100

Warning Upgrade installed extensions BEFORE running check or migrate commands

Upgrade all your installed plugins to the following versions

Warning If you use the amavis plugin make sure to include its configuration as follows into settingspy

from modoboa_amavis import settings as modoboa_amavis_settingsmodoboa_amavis_settingsapply(globals())

22 Upgrade 29

Modoboa Documentation Release 1100

Name Versionmodoboa-amavis 120modoboa-contacts 050modoboa-dmarc 110modoboa-imap-migration 120modoboa-pdfcredentials 130modoboa-postfix-autoreply 140modoboa-radicale 120modoboa-sievefilters 140modoboa-stats 140modoboa-webmail 140

Edit the settingspy file and apply the following modifications

Add modoboatransport to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparameters

)

Replace the following line

MIDDLEWARE_CLASSES = (

by

MIDDLEWARE = (

Update postfix map files as follows

gt rm -f ltpathgtmodoboa-postfix-mapschkgt python managepy generate_postfix_maps --force --destdir ltpathgt

Then modify postfixrsquos configuration as follows

smtpd_sender_login_maps =ltdrivergtltpathgtsql-sender-login-mapcf

transport_maps =ltdrivergtltpathgtsql-transportcfltdrivergtltpathgtsql-spliteddomains-transportcf other map files

Replace ltdrivergt and ltpathgt by your values

If transport_maps contains sql-relaydomains-transportcf remove it

30 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning If you make use of postfixrsquos proxymap server you must also update the proxy_read_maps setting

Reload postfix

Add the following cron job in order to generate DKIM keys

Generate DKIM keys (they will belong to the user running this job)

root $PYTHON $INSTANCEmanagepy modorarr˓manage_dkim_keys

190

If you want to manage inactive accounts look at Cleaning inactive accounts

183

Edit the settingspy file and replace the following line

BASE_DIR = ospathdirname(ospathdirname(__file__))

by

BASE_DIR = ospathrealpath(ospathdirname(ospathdirname(__file__)))

180

Modoboa now relies on Djangorsquos builtin password validation system to validate user passwords instead ofdjango-passwords

Remove django-passwords from your system

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt pip uninstall django-passwords

Edit the settingspy file and remove the following content

django-passwords

PASSWORD_MIN_LENGTH = 8

PASSWORD_COMPLEXITY = UPPER 1LOWER 1DIGITS 1

Add the following lines

Password validation rulesAUTH_PASSWORD_VALIDATORS = [

NAME djangocontribauthpassword_validation

rarr˓UserAttributeSimilarityValidator (continues on next page)

22 Upgrade 31

Modoboa Documentation Release 1100

(continued from previous page)

NAME djangocontribauthpassword_validationMinimumLengthValidator

NAME djangocontribauthpassword_validationCommonPasswordValidator

NAME djangocontribauthpassword_validationNumericPasswordValidator

NAME modoboacorepassword_validationComplexityValidatorOPTIONS

upper 1lower 1digits 1specials 0

]

172

API documentation has evolved (because of the upgrade to Django Rest Framework 36) and CKeditor is now embed-ded by default (thanks to the django-ckeditor package) Some configuration changes are required

Edit your settingspy file and apply the following modifications

bull Update the INSTALLED_APPS variable as follows

INSTALLED_APPS = (djangocontribauthdjangocontribcontenttypesdjangocontribsessionsdjangocontribmessagesdjangocontribsitesdjangocontribstaticfilesreversionckeditorckeditor_uploaderrest_frameworkrest_frameworkauthtoken

)

bull Update the REST_FRAMEWORK variable as follows

REST_FRAMEWORK = DEFAULT_AUTHENTICATION_CLASSES (

rest_frameworkauthenticationTokenAuthenticationrest_frameworkauthenticationSessionAuthentication

)

bull Remove the SWAGGER_SETTINGS variable

bull Add the following content

32 Chapter 2 Table of contents

Modoboa Documentation Release 1100

CKeditor

CKEDITOR_UPLOAD_PATH = uploads

CKEDITOR_IMAGE_BACKEND = pillow

CKEDITOR_RESTRICT_BY_USER = True

CKEDITOR_BROWSE_SHOW_DIRS = True

CKEDITOR_ALLOW_NONIMAGE_FILES = False

CKEDITOR_CONFIGS = default

allowedContent Truetoolbar Modoboawidth Nonetoolbar_Modoboa [

[Bold Italic Underline][JustifyLeft JustifyCenter JustifyRight JustifyBlock][BidiLtr BidiRtl Language][NumberedList BulletedList - Outdent Indent][Undo Redo][Link Unlink Anchor - Smiley][TextColor BGColor - Source][Font FontSize][Image ][SpellChecker]

]

Donrsquot forget to run the following command

gt python managepy collectstatic

171

If you used 170 for a fresh installation please run the following commands

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy load_initial_data

170

This version requires Django gt= 110 so you need to make some modifications It also brings internal API changeswhich are not backward compatible so installed extensions must be upgraded too

First of all deactivate all installed extensions (edit the settingspy file and comment the corresponding lines inMODOBOA_APPS)

Edit the urlspy file of your local instance and replace its content by the following one

22 Upgrade 33

Modoboa Documentation Release 1100

from djangoconfurls import include url

urlpatterns = [url(r include(modoboaurls))

]

Edit the settingspy and apply the following changes

bull Add modoboaparameters to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboarelaydomainsmodoboalimitsmodoboaparameters Modoboa extensions here

)

bull Add modoboacoremiddlewareLocalConfigMiddleware to MIDDLEWARE_CLASSES

MIDDLEWARE_CLASSES = (djangocontribsessionsmiddlewareSessionMiddlewaredjangomiddlewarecommonCommonMiddlewaredjangomiddlewarecsrfCsrfViewMiddlewaredjangocontribauthmiddlewareAuthenticationMiddlewaredjangocontribmessagesmiddlewareMessageMiddlewaredjangomiddlewarelocaleLocaleMiddlewaredjangomiddlewareclickjackingXFrameOptionsMiddlewaremodoboacoremiddlewareLocalConfigMiddlewaremodoboalibmiddlewareAjaxLoginRedirectmodoboalibmiddlewareCommonExceptionCatchermodoboalibmiddlewareRequestCatcherMiddleware

)

bull Modoboa used to provide a custom authentication backend (modoboalibauthbackendsSimpleBackend) but it has been removed Replace it as follows

AUTHENTICATION_BACKENDS = ( Other backends beforedjangocontribauthbackendsModelBackend

)

bull Remove TEMPLATE_CONTEXT_PROCESSORS and replace it by

TEMPLATES = [

BACKEND djangotemplatebackendsdjangoDjangoTemplatesDIRS []APP_DIRS TrueOPTIONS

context_processors [djangotemplatecontext_processorsdebugdjangotemplatecontext_processorsrequestdjangocontribauthcontext_processorsauth

(continues on next page)

34 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

djangotemplatecontext_processorsi18ndjangotemplatecontext_processorsmediadjangotemplatecontext_processorsstaticdjangotemplatecontext_processorstzdjangocontribmessagescontext_processorsmessagesmodoboacorecontext_processorstop_notifications

]debug False

]

Run the following commands (load virtualenv if you use one)

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstatic

Finally upgrade your extensions and reactivate them

Name Versionmodoboa-amavis 110modoboa-dmarc 100modoboa-imap-migration 110modoboa-pdfcredentials 110modoboa-postfix-autoreply 120modoboa-radicale 110modoboa-sievefilters 110modoboa-stats 110modoboa-webmail 110

Command line shortcuts

$ pip install modoboa-amavis==110$ pip install modoboa-dmarc==100$ pip install modoboa-imap-migration==110$ pip install modoboa-pdfcredentials==110$ pip install modoboa-postfix-autoreply==120$ pip install modoboa-radicale==110$ pip install modoboa-sievefilters==110$ pip install modoboa-stats==110$ pip install modoboa-webmail==110

And please make sure you use the latest version of the django-versionfield2 package

$ pip install -U django-versionfield2

Notes about quota changes and resellers

Reseller users now have a quota option in Resources tab This is the quota that a reseller can share between all itsdomains

22 Upgrade 35

Modoboa Documentation Release 1100

There are two quotas for a domain in the new version

1 Quota amp

2 Default mailbox quota

[1] Quota quota shared between mailboxes This quota is shared between all the mailboxes of this domain This valuecannot exceed resellerrsquos quota and hence cannot be 0(unlimited) if reseller has finite quota

[2] Default mailbox quota default quota applied to mailboxes This quota is the default quota applied to new mail-boxes This value cannot exceed Quota[1] and hence cannot be 0(unlimited) if Quota[1] is finite

161

First of all update postfix map files as follows

gt python managepy generate_postfix_maps --destdir ltpathgt --force-overwrite

Then modify postfixrsquos configuration as follows

smtpd_sender_login_maps =ltdrivergtltpathgtsql-sender-login-mailboxescfltdrivergtltpathgtsql-sender-login-aliasescfltdrivergtltpathgtsql-sender-login-mailboxes-extracf

Replace ltdrivergt and ltpathgt by your values

Finally reload postfix

This release also deprecates some internal functions As a result several extensions has been updated to maintain thecompatibility If you enabled the notification service yoursquoll find the list of available updates directly in your Modoboaconsole

For the others here is the list

Name Versionmodoboa-amavis 1010modoboa-postfix-autoreply 117modoboa-radicale 105modoboa-stats 109

Command line shortcut

$ pip install modoboa-amavis==1010$ pip install modoboa-postfix-autoreply==117$ pip install modoboa-radicale==105$ pip install modoboa-stats==109

160

Warning You have to upgrade extensions due to coreUser model attribute change (usergroup to userrole) Oth-erwise you will have an internal error after upgrade In particular modoboa-amavisd modoboa-stats modoboa-postfix-autoreply are concerned

36 Chapter 2 Table of contents

Modoboa Documentation Release 1100

An interesting feature brougth by this version is the capability to make different checks about MX records Forexample Modoboa can query main DNSBL providers for every defined domain With this you will quickly know ifone the domains you manage is listed or not To activate it add the following line to your crontab

30 ltoptional_virtualenv_pathgtpython ltmodoboa_instance_dirgtmanagepy modorarr˓check_mx

The communication with Modoboa public API has been reworked Instead of sending direct synchronous queries (forexample to check new versions) a cron job has been added To activate it add the following line to your crontab

0 ltoptional_virtualenv_pathgtpython ltmodoboa_instance_dirgtmanagepyrarr˓communicate_with_public_api

Please also note that public API now uses TLS so you must update your configuration as follows

MODOBOA_API_URL = httpsapimodoboaorg1

Finally it is now possible to declare additional sender addresses on a per-account basis You need to update your postfixconfiguration in order to use this functionality Just edit the maincf file and change the following parameter

smtpd_sender_login_maps =ltdrivergtetcpostfixsql-sender-login-mailboxescfltdrivergtetcpostfixsql-sender-login-aliasescfltdrivergtetcpostfixsql-sender-login-mailboxes-extracf

150

The API has been greatly improved and a documentation is now available To enable it addrest_framework_swagger to the INSTALLED_APPS variable in settingspy as follows

INSTALLED_APPS = (djangocontribauthdjangocontribcontenttypesdjangocontribsessionsdjangocontribmessagesdjangocontribsitesdjangocontribstaticfilesreversionrest_frameworkauthtokenrest_framework_swagger

)

Then add the following content into settingspy just after the REST_FRAMEWORK variable

SWAGGER_SETTINGS = is_authenticated Falseapi_version 10exclude_namespaces []info

contact contactmodoboacomdescription (Modoboa API requires a valid token)title Modoboa API

Yoursquore done The documentation is now available at the following address

22 Upgrade 37

Modoboa Documentation Release 1100

httpltyour instance addressgtdocsapi

Finally if you find a TEMPLATE_CONTEXT_PROCESSORS variable in your settingspy file make sure it lookslike this

TEMPLATE_CONTEXT_PROCESSORS = global_settingsTEMPLATE_CONTEXT_PROCESSORS + [modoboacorecontext_processorstop_notifications

]

140

Warning Please make sure to use Modoboa 135 with an up-to-date database before an upgrade to 140

Warning Do not follow the regular upgrade procedure for this version

Some extension have been moved back into the main repository The main reason for that is that using Modoboawithout them doesnrsquot make sense

First of all you must rename the following applications listed inside the MODOBOA_APPS variable

Old name New namemodoboa_admin modoboaadminmodoboa_admin_limits modoboalimitsmodoboa_admin_relaydomains modoboarelaydomains

Then apply the following steps

1 Uninstall old extensions

$ pip uninstall modoboa-admin modoboa-admin-limits modoboa-admin-relaydomains

2 Install all extension updates using pip (check the Modoboa gt Information page)

3 Manually migrate database

$ cd ltinstance_dirgt$ python managepy migrate auth$ python managepy migrate admin 0001 --fake$ python managepy migrate admin$ python managepy migrate limits 0001 --fake$ python managepy migrate relaydomains 0001 --fake$ python managepy migrate

4 Finally update static files

$ python managepy collectstatic

This version also introduces a REST API To enable it

1 Add rest_frameworkauthtoken to the INSTALLED_APPS variable

2 Add the following configuration inside settingspy

38 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Rest framework settings

REST_FRAMEWORK = DEFAULT_AUTHENTICATION_CLASSES (

rest_frameworkauthenticationTokenAuthentication)DEFAULT_PERMISSION_CLASSES (

rest_frameworkpermissionsIsAuthenticated)

3 Run the following command

$ python managepy migrate

135

To enhance security Modoboa now checks the strength of user passwords lthttpsgithubcomdstufftdjango-passwordsgt_

To use this feature add the following configuration into the settingspy file

django-passwords

PASSWORD_MIN_LENGTH = 8

PASSWORD_COMPLEXITY = UPPER 1LOWER 1DIGITS 1

132

Modoboa now uses the atomic requests mode to preserve database consistency (reference)

To enable it update the DATABASES variable in settingspy as follows

DATABASES = default

stuff beforeATOMIC_REQUESTS True

amavis

stuff beforeATOMIC_REQUESTS True

130

This release does not bring awesome new features but it is a necessary bridge to the future of Modoboa All extensionsnow have their own git repository and the deploy process has been updated to reflect this change

22 Upgrade 39

Modoboa Documentation Release 1100

Another important update is the use of Django 17 Besides its new features the migration system has been reworkedand is now more robust than before

Before we begin with the procedure here is a table showing old extension names and their new name

Old name New package name New module namemodoboaextensionsadmin modoboa-admin modoboa_adminmodoboaextensionslimits modoboa-admin-limits modoboa_admin_limitsmodoboaextensionspostfix_autoreply modoboa-postfix-autoreply modoboa_postfix_autoreplymodoboaextensionspostfix_relay_domains modoboa-admin-relaydomains modoboa_admin_relaydomainsmodoboaextensionsradicale modoboa-radicale modoboa_radicalemodoboaextensionssievefilters modoboa-sievefilters modoboa_sievefiltersmodoboaextensionsstats modoboa-stats modoboa_statsmodoboaextensionswebmail modoboa-webmail modoboa_webmail

Here are the required steps

1 Install the extensions using pip (look at the second column in the table above)

$ pip install ltthe extensions you wantgt

2 Remove south from INSTALLED_APPS

3 Rename old extension names inside MODOBOA_APPS (look at the third column in the table above)

4 Remove modoboalibmiddlewareExtControlMiddleware from MIDDLEWARE_CLASSES

5 Change DATABASE_ROUTERS to

DATABASE_ROUTERS = [modoboa_amavisdbrouterAmavisRouter]

6 Run the following commands

$ cd ltmodoboa_instance_dirgt$ python managepy migrate

7 Reply yes to the question

8 Run the following commands

$ python managepy load_initial_data$ python managepy collectstatic

9 The cleanup job has been renamed in Django so you have to modify your crontab entry

- 0 0 ltmodoboa_sitegtmanagepy cleanup+ 0 0 ltmodoboa_sitegtmanagepy clearsessions

120

A new notification service let administrators know about new Modoboa versions To activate it you need to updatethe TEMPLATE_CONTEXT_PROCESSORS variable like this

from djangoconf import global_settings

TEMPLATE_CONTEXT_PROCESSORS = global_settingsTEMPLATE_CONTEXT_PROCESSORS + (

(continues on next page)

40 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

modoboacorecontext_processorstop_notifications)

and to define the new MODOBOA_API_URL variable

MODOBOA_API_URL = httpapimodoboaorg1

The location of external static files has changed To use them add a new path to the STATICFILES_DIRS

Additional locations of static filesSTATICFILES_DIRS = (

Put strings here like homehtmlstatic or Cwwwdjangostatic Always use forward slashes even on Windows Dont forget to use absolute paths not relative pathsltpathtomodoboainstalldirgtbower_components

)

Run the following commands to define the hostname of your instance

$ cd ltmodoboa_instance_dirgt$ python managepy set_default_site lthostnamegt

If you plan to use the Radicale extension

1 Add modoboaextensionsradicale to the MODOBOA_APPS variable

2 Run the following commands

$ cd ltmodoboa_instance_dirgt$ python managepy syncdb

Warning You also have to note that the sitestatic directory has moved from ltpath to your sitesdirgt to ltmodoboas root urlgt (itrsquos probably the parent directory) You have to adapt your web serverconfiguration to reflect this change

23 Configuration

231 Online parameters

Modoboa provides online panels to modify internal parameters There are two available levels

bull Application level global parameters define how the application behaves Available at Modoboa gt Parameters

bull User level per user customization Available at User gt Settings gt Preferences

Regardless level parameters are displayed using tabs each tab corresponding to one application

General parameters

The admin application exposes several parameters they are presented below

23 Configuration 41

Modoboa Documentation Release 1100

Name Tab Description Default valueAuthentication type General The backend used for au-

thenticationLocal

Default password scheme General Scheme used to cryptmailbox passwords

crypt

Rounds General Number of rounds (onlyused by sha256cryptand sha512crypt) Mustbe between 1000 and999999999 inclusive

70000

Secret key General A key used to encryptusersrsquo password in ses-sions

random value

Sender address General Email address used tosend notifications

Enable communication General Enable communicationwith Modoboa public API

yes

Check new versions General Automatically checks if anewer version is available

yes

Send statistics General Send statistics to Mod-oboa public API (countersand used extensions)

yes

Top notifications check in-terval

General Interval between two topnotification checks (inseconds)

30

Maximum log record age General The maximum age in daysof a log record

365

Items per page General Number of displayeditems per page

30

Default top redirection General The default redirectionused when no applicationis specified

userprefs

Enable MX checks Admin Check that every domainhas a valid MX record

yes

Valid MXs Admin A list of IP or networkaddress every MX shouldmatch A warning will besent if a record does notrespect this it

Enable DNSBL checks Admin Check every domainagainst major DNSBLproviders

yes

DKIM keys storage direc-tory

AdminPath to a directory where DKIM

generated keys willbe stored

Default DKIM key length Admin The default size (in bits)for new keys

2048

Handle mailboxes onfilesystem

Admin Rename or remove mail-boxes on the filesystemwhen they get renamed orremoved within Modoboa

no

Mailboxes owner Admin The UNIX account whoowns mailboxes on thefilesystem

vmail

Default domain quota Admin Default quota (in MB) ap-plied to freshly createddomains with no valuespecified A value of 0means no quota

0

Automatic accountremoval

Admin When a mailbox is re-moved also remove theassociated account

no

Automatic do-mainmailbox creation

Admin Create a domain and amailbox when an accountis automatically created

yes

42 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Note If you are not familiar with virtual domain hosting you should take a look at postfixrsquos documentation ThisHow to also contains useful information

Note A random secret key will be generated each time the Parameters page is refreshed and until you save parametersat least once

Note Specific LDAP parameters are also available see LDAP authentication

232 Media files

Modoboa uses a specific directory to upload files (ie when the webmail is in use) or to create ones (ex graphical statis-tics) This directory is named media and is located inside modoboarsquos installation directory (called modoboa_sitein this documentation)

To work properly the system user which runs modoboa (www-data apache whatever) must have write access tothis directory

233 Customization

Custom logo

You have the possibility to use a custom logo instead of the default one on the login page

To do so open the settingspy file and add a MODOBOA_CUSTOM_LOGO variable This variable must containthe relative URL of your logo under MEDIA_URL For example

MODOBOA_CUSTOM_LOGO = ospathjoin(MEDIA_URL custom_logopng)

Then copy your logo file into the directory indicated by MEDIA_ROOT

234 Host configuration

Note This section is only relevant when Modoboa handles mailboxes renaming and removal from the filesystem

To manipulate mailboxes on the filesystem you must allow the user who runs Modoboa to execute commands as theuser who owns mailboxes

To do so edit the etcsudoers file and add the following inside

ltuser_that_runs_modoboagt ALL=(ltmailboxes ownergt) NOPASSWD ALL

Replace values between ltgt by the ones you use

23 Configuration 43

Modoboa Documentation Release 1100

235 Time zone and language

Modoboa is available in many languages

To specify the default language to use edit the settingspy file and modify the LANGUAGE_CODE variable

LANGUAGE_CODE = fr or en for english etc

Note Each user has the possibility to define the language he prefers

In the same configuration file specify the timezone to use by modifying the TIME_ZONE variable For example

TIME_ZONE = EuropeParis

236 Sessions management

Modoboa uses Djangorsquos session framework to store per-user information

Few parameters need to be set in the settingspy configuration file to make Modoboa behave as expected

SESSION_EXPIRE_AT_BROWSER_CLOSE = False Default value

This parameter is optional but you must ensure it is set to False (the default value)

The default configuration file provided by the modoboa-adminpy command is properly configured

237 Logging authentication

To trace login attempts to the web interface Modoboa uses python SysLogHandler so you can see them in your syslogauthentication log file (varlogauthlog in most cases)

Depending on your configuration you may have to edit the settingspy file and add lsquoaddressrsquo lsquodevlogrsquo to thelogging section

syslog-auth class logginghandlersSysLogHandlerfacility SysLogHandlerLOG_AUTHaddress devlogformatter syslog

238 External authentication

LDAP

Modoboa supports external LDAP authentication using the following extra components

bull Python LDAP client

bull Django LDAP authentication backend

If you want to use this feature you must first install those components

44 Chapter 2 Table of contents

Modoboa Documentation Release 1100

$ pip install python-ldap django-auth-ldap

Then all you have to do is to modify the settingspy file Add a new authentication backend to the AUTHENTI-CATION_BACKENDS variable like this

AUTHENTICATION_BACKENDS = (modoboalibauthbackendsLDAPBackend modoboalibauthbackendsLDAPSecondaryBackend Useful for a fallback

rarr˓mechanismdjangocontribauthbackendsModelBackend

)

Finally go to Modoboa gt Parameters gt General and set Authentication type to LDAP

From there new parameters will appear to let you configure the way Modoboa should connect to your LDAP serverThey are described just below

Name Description De-faultvalue

Server address The IP address of the DNS name of the LDAP server local-host

Server port The TCP port number used by the LDAP server 389Use a secureconnection

Use an SSLTLS connection to access the LDAP server no

Authenticationmethod

Choose the authentication method to use Directbind

User DN tem-plate (directbind mode)

The template used to construct a userrsquos DN It should contain one placeholder (ie(user)s)

Bind BN The distinguished name to use when binding to the LDAP server Leave empty for ananonymous bind

Bind password The password to use when binding to the LDAP server (with lsquoBind DNrsquo)Search base The distinguished name of the search baseSearch filter An optional filter string (eg lsquo(objectClass=person)rsquo) In order to be valid it must be

enclosed in parentheses(mail=(user)s)

Passwordattribute

The attribute used to store user passwords user-Pass-word

Active Direc-tory

Tell if the LDAP server is an Active Directory one no

Administratorgroups

Members of those LDAP Posix groups will be created ad domain administrators Uselsquorsquo characters to separate groups

Group type The type of group used by your LDAP directory Posix-Group

Groups searchbase

The distinguished name of the search base used to find groups

Do-mainmailboxcreation

Automatically create a domain and a mailbox when a new user is created just after thefirst successful authentication You will generally want to disable this feature whenthe relay domains extension is in use

yes

If you need additional parameters you will find a detailed documentation here

Once the authentication is properly configured the users defined in your LDAP directory will be able to connect to

23 Configuration 45

Modoboa Documentation Release 1100

Modoboa the associated domain and mailboxes will be automatically created if needed

The first time a user connects to Modoboa a local account is created if the LDAP username is a valid email addressBy default this account belongs to the SimpleUsers group and it has a mailbox

To automatically create domain administrators you can use the Administrator groups setting If a LDAP user belongsto one the listed groups its local account will belong to the DomainAdmins group In this case the username is notnecessarily an email address

Users will also be able to update their LDAP password directly from Modoboa

Note Modoboa doesnrsquot provide any synchronization mechanism once a user is registered into the database Anymodification done from the directory to a user account will not be reported to Modoboa (an email address change forexample) Currently the only solution is to manually delete the Modoboa record it will be recreated on the next userlogin

SMTP

It is possible to use an existing SMTP server as an authentication source To enable this feature edit the settingspy file and change the following setting

AUTHENTICATION_BACKENDS = (modoboalibauthbackendsSMTPBackenddjangocontribauthbackendsModelBackend

)

SMTP server location can be customized using the following settings

AUTH_SMTP_SERVER_ADDRESS = localhostAUTH_SMTP_SERVER_PORT = 25AUTH_SMTP_SECURED_MODE = None ssl or starttls are accepted

239 LDAP synchronization

Modoboa can synchronize accounts with an LDAP directory (tested with OpenLDAP) but this feature is not enabledby default To activate it add modoboaldapsync to MODOBOA_APPS in the settingspy file

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboaldapsync

)

and enable it from the admin panel

46 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning Make sure to install additional requirements otherwise it wonrsquot work

The following parameters are available and must be filled

Name Description Defaultvalue

Enable LDAP synchro-nization

Control LDAP synchronization state no

Bind DN The DN of a user with write permission to createupdate accountsBind password The associated passwordAccount DN template The template used to build account DNs (must contain a (user)s

placeholder

2310 Database maintenance

Cleaning the logs table

Modoboa logs administrator specific actions into the database A clean-up script is provided to automatically removeoldest records The maximum log record age can be configured through the online panel

To use it you can setup a cron job to run every night

0 0 ltmodoboa_sitegtmanagepy cleanlogs Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy cleanlogs

Cleaning the session table

Django does not provide automatic purging Therefore itrsquos your job to purge expired sessions on a regular basis

Django provides a sample clean-up script django-adminpy clearsessions That script deletes any sessionin the session table whose expire_date is in the past

For example you could setup a cron job to run this script every night

0 0 ltmodoboa_sitegtmanagepy clearsessions Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy clearsessions

Cleaning inactive accounts

Thanks to Last-login tracking it is now possible to monitor inactive accounts An account is considered inactive if nologin has been recorded for the last 30 days (this value can be changed through the admin panel)

A management command is available to disable or delete inactive accounts For example you could setup a cron jobto run it every night

23 Configuration 47

Modoboa Documentation Release 1100

0 0 ltmodoboa_sitegtmanagepy clean_inactive_accounts Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy clean_inactive_rarr˓accounts

The default behaviour is to disable accounts You can delete them using the --delete option

24 Moving to Modoboa

You have an existing platform and yoursquod like to move to Modoboa the following tools could help you

241 From postfixadmin

A dedicated command allows you to convert an existing postfixadmin database to a Modoboa one Consult the docu-mentation to know more about the process

242 Using CSV files

Modoboa allows you to import any object (domain domain alias mailbox and alias) using a simple CSV file encodedusing UTF8 Each line corresponds to a single object and must respect one of the following format

domain ltname stringgt ltquota integergt ltdefault mailbox quota integergt ltenabledrarr˓booleangtdomainalias ltname stringgt lttargeted domain stringgt ltenabled booleangtrelaydomain ltname stringgt lttarget host stringgt lttarget port integergt ltservicerarr˓stringgt ltenabled booleangt ltverify recipients booleangtaccount ltloginname stringgt ltpassword stringgt ltfirst name stringgt ltlast namerarr˓stringgt ltenabled booleangt ltgroup stringgt ltaddress stringgt ltquota integergt [rarr˓ltdomain stringgt ]alias ltaddress stringgt ltenabled booleangt ltrecipient stringgt

Boolean fields accept the following values true 1 yes y (case insensitive) Any other value will be evaluated asfalse

Warning The order does matter Objects are created sequencially so a domain must be created before itsmailboxes and aliases and a mailbox must created before its alias(es)

To actually import such a file

gt sudo -u ltmodoboa_usergt -igt source ltvirtualenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy modo import ltyour filegt

Available options can be listed using the following command

gt python managepy modo import -h

48 Chapter 2 Table of contents

Modoboa Documentation Release 1100

25 REST API

To ease the integration with external sources (software or other) Modoboa provides a REST API

Every installed instance comes with a ready-to-use API and a documentation You will find them using the followingurl patterns

bull API httplthostnamegtapiv1

bull Documentation httplthostnamegtdocsapi

An example of this documentation is available on the official demo

Using this API requires an authentication and for now only a token based authentication is supported To get a validtoken log-in to your instance with a super administrator go to Settings gt API and activate the API access Press theUpdate button and wait until the page is reloaded the token will be displayed

To make valid API calls every requests you send must embed this token within an Authorization HTTP header likethis

Authorization Token ltYOUR_TOKENgt

and the content type of those requests must be applicationjson

26 How to contribute

Contributions are always welcome If you want to submit a patch please respect the following rules

bull Open a pull request on the appropriate repository

bull Respect PEP8

bull Document your patch and respect PEP 257

bull Add unit tests and make sure the global coverage does not decrease

If all those steps are validated your contribution will generally be integrated

261 Table of contents

25 REST API 49

Modoboa Documentation Release 1100

Useful tips

You would like to work on Modoboa but you donrsquot know where to start Yoursquore at the right place Browse this pageto learn useful tips

Docker

A docker image is available for developers To use it you must install docker and docker-compose first

Then just run the following command

$ docker-compose up

It will start the docker environment and make a Modoboa instance available at httplocalhost8000

If you donrsquot want to use docker or need a more complex development setup go to the next section

Prepare a virtual environment

A virtual environment is a good way to setup a development environment on your machine

To do so run the following commands

$ python3 -m venv ltpathgt$ source ltpathgtbinactivate$ git clone httpsgithubcommodoboamodoboagit$ cd modoboa$ python setuppy develop$ pip install -r dev-requirementstxt

The develop command creates a symbolic link to your local copy so any modification you make will be automati-cally available in your environment no need to copy them

Deploy an instance for development

Warning Make sure to create a database before running this step The format of the database url is also describedin this page

Now that you have a running environment yoursquore ready to deploy a test instance

$ cd ltpathgt$ modoboa-adminpy deploy --dburl defaultltdatabase urlgt --domain localhost --develrarr˓instance$ python managepy runserver

Yoursquore ready to go You should be able to access Modoboa at httplocalhost8000 usingadminpassword as credentials

Manage static files

Modoboa uses bower (thanks to django-bower) to manage its CSS and javascript dependencies

50 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Those dependencies are listed in a file called dev_settingspy located inside the ltpath_to_local_copygtmodoboacore directory

If you want to add a new dependency just complete the BOWER_INSTALLED_APPS parameter and run the followingcommand

$ python managepy bower install

It will download and store the required files into the ltpath_to_local_copygtmodoboabower_components directory

Test your modifications

If you deployed a specific instance for your development needs you can run the tests suite as follows

gt python managepy test modoboacore modoboalib modoboaadmin modoboalimits modoboararr˓relaydomains

Otherwise you can run the tests suite from the repository using tox

Start a basic Modoboa instance

From the repository run the following command to launch a simple instance with a few fixtures

gt tox -e serve

You can use adminpassword to log in

Build the documentation

If you need to modify the documenation and want to see the result you can build it as follows

gt tox -e docgt firefox toxdoctmphtmlindexhtml

FAQ

bower command is missing in managepy

bower command is missing in managepy if you donrsquot use the --devel option of the modoboa-adminpydeploy command

To fix it regenerate your instance or update your settingspy file manually Look at devmode in httpsgithubcomtonioomodoboablobmastermodoboacorecommandstemplatessettingspytpl

Create a new plugin

Introduction

Modoboa offers a plugin API to expand its capabilities The current implementation provides the following possibili-ties

26 How to contribute 51

Modoboa Documentation Release 1100

bull Expand navigation by adding entry points to your plugin inside the GUI

bull Access and modify administrative objects (domains mailboxes etc)

bull Register callback actions for specific events

Plugins are nothing more than Django applications with an extra piece of code that integrates them into Modoboa Themodo_extensionpy file will contain a complete description of the plugin

bull Admin and user parameters

bull Custom menu entries

The communication between both applications is provided by Django signals

The following subsections describe the plugin architecture and explain how you can create your own

The required glue

To create a new plugin just start a new django application like this (into Modoboarsquos directory)

$ python managepy startapp

Then you need to register this application using the provided API Just copypaste the following example into themodo_extensionpy file of the future extension

from modoboacoreextensions import ModoExtension exts_pool

class MyExtension(ModoExtension)My custom Modoboa extension

name = myextlabel = My Extensionversion = 01description = A descriptionurl = myext_root_location optional name is used if not defined

def load(self)This method is called when Modoboa loads available and activated plugins

Declare parameters and register events herepass

def load_initial_data(self)Optional provide initial data for your extension herepass

exts_poolregister_extension(MyExtension)

Once done simply add your extensionrsquos module name to the MODOBOA_APPS variable located inside settingspy Finally run the following commands

$ python managepy migrate$ python managepy load_initial_data$ python managepy collectstatic

52 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Parameters

A plugin can declare its own parameters There are two levels available

bull lsquoGlobalrsquo parameters used to configure the plugin editable inside the Admin gt Settings gt Parameters page

bull lsquoUserrsquo parameters per-user parameters (or preferences) editable inside the Options gt Preferences page

Playing with parameters

Parameters are defined using Django forms and Modoboa adds two special forms you can inherit depending on thelevel of parameter(s) you want to add

bull modoboaparametersformsAdminParametersForm for general parameters

bull modoboaparametersformsUserParametersForm for user parameters

To register new parameters add the following line into the load method of your plugin class

from modoboaparameters import tools as param_toolsparam_toolsregistryadd(

LEVEL YourForm ugettext_lazy(Title))

Replace LEVEL by global or user

Custom role permissions

Modoboa uses Djangorsquos internal permission system Administrative roles are nothing more than groups (Groupinstances)

An extension can add new permissions to a group by listening to the extra_role_permissions signal Here isan example

from djangodispatch import receiverfrom modoboacore import signals as core_signals

PERMISSIONS = Resellers [

(relaydomains relaydomain add_relaydomain)(relaydomains relaydomain change_relaydomain)(relaydomains relaydomain delete_relaydomain)(relaydomains service add_service)(relaydomains service change_service)(relaydomains service delete_service)

]

receiver(core_signalsextra_role_permissions)def extra_role_permissions(sender role kwargs)

Add permissions to the Resellers groupreturn constantsPERMISSIONSget(role [])

Extending admin forms

The forms used to edit objects (account domain etc) through the admin panel are composed of tabs You can extendthem (ie add new tabs) in a pretty easy way thanks to custom signals

26 How to contribute 53

Modoboa Documentation Release 1100

Account

To add a new tab to the account edition form define new listeners (handlers) for the following signals

bull modoboaadminsignalsextra_account_forms

bull modoboaadminsignalsget_account_form_instances

bull modoboaadminsignalscheck_extra_account_form (optional)

Example

from djangodispatch import receiverfrom modoboaadmin import signals as admin_signals

receiver(admin_signalsextra_account_forms)def extra_account_form(sender user account kwargs)

return [id tabid title Title cls MyFormClass

]

receiver(admin_signalsget_account_form_instances)def fill_my_tab(sender user account kwargs)

return id my_instance

Domain

To add a new tab to the domain edition form define new listeners (handlers) for the following signals

bull modoboaadminsignalsextra_domain_forms

bull modoboaadminsignalsget_domain_form_instances

Example

from djangodispatch import receiverfrom modoboaadmin import signals as admin_signals

receiver(admin_signalsextra_domain_forms)def extra_account_form(sender user domain kwargs)

return [id tabid title Title cls MyFormClass

]

receiver(admin_signalsget_domain_form_instances)def fill_my_tab(sender user domain kwargs)

return id my_instance

27 Contributors

bull Antidot

bull Bearstech

bull CAP-REL

54 Chapter 2 Table of contents

Modoboa Documentation Release 1100

bull Dalnix

27 Contributors 55

  • Overview
  • Table of contents
Page 4: Modoboa Documentation

Modoboa Documentation Release 1100

Contents 1

Modoboa Documentation Release 1100

2 Contents

CHAPTER 1

Overview

Modoboa is a mail hosting and management platform including a modern and simplified Web User Interface designedto work with Postfix and Dovecot

It is extensible by nature and comes with a lot of additional extensions

Name Description Documentationmodoboa-amavis A frontend for Amavis httpsmodoboa-amavisreadthedocs

iomodoboa-dmarc A set of tools to use DMARC httpsgithubcommodoboa

modoboa-dmarcmodoboa-imap-migration

Migrate mailboxes from an existing server usingIMAP (and offlineimap)

httpsgithubcommodoboamodoboa-imap-migration

modoboa-pdfcredentials

Generate PDF documents containing account cre-dentials

httpsgithubcommodoboamodoboa-pdfcredentials

modoboa-pfxadmin-migrate

A tool to migrate from Postfixadmin httpsgithubcommodoboamodoboa-pfxadmin-migrate

modoboa-postfix-autoreply

Away message editor (postfix compatible) httpsmodoboa-postfix-autoreplyreadthedocsio

modoboa-radicale A frontend for Radicale httpsmodoboa-radicalereadthedocsio

modoboa-sievefilters

A Sieve filters (rules) editor httpsmodoboa-sievefiltersreadthedocsio

modoboa-stats Graphical statistics (message traffic and more) httpsmodoboa-statsreadthedocsiomodoboa-webmail A simple webmail httpsmodoboa-webmail

readthedocsio

3

Modoboa Documentation Release 1100

4 Chapter 1 Overview

CHAPTER 2

Table of contents

21 Installation

211 Requirements

You will need a Server to perform well with at least

bull CPU 2

bull RAM 2GB

bull Disk 10GB

bull Python 3

Note Heads up for modoboa versions 115 and later

Python 2 support has been dropped with modoboa version 115 If you still have Python 2 installed on your systemeither uninstall it or force modoboa user to run with Python 3

212 Recommended way

If you start from scratch and want to deploy a complete mail server you will love the modoboa installer It is theeasiest and the quickest way to setup a fully functional server (modoboa postfix dovecot amavis and more) on onemachine

Warning For now only Debian and CentOS based Linux distributions are supported We do our best to improvecompatibility but if you use another Linux or a UNIX system you will have to install Modoboa manually

To use it just run the following commands in your terminal

5

Modoboa Documentation Release 1100

gt git clone httpsgithubcommodoboamodoboa-installergt cd modoboa-installergt sudo runpy ltyour domaingt

if you get this warning - lsquousrbinenv lsquopythonrsquo No such file or directoryrsquo do make sure sure python is installed onyour server Sometimes python is installed but the installer canrsquot detect it or which python version to run especiallyon a debian based system Then run this command first

gt sudo apt-get install python-virtualenv python-pip

Wait a few minutes and yoursquore done o

213 Manual installation

For those who need a manual installation or who just want to setup a specific part here are the steps you must follow

Modoboa

This section describes the installation of the web interface (a Django project)

Prepare the system

First of all we recommend the following context

bull A dedicated system user

bull A virtual environment to install the application because it will isolate it (and its dependencies) from the rest ofyour system

The following example illustrates how to realize this on Debian-based distributions using virtualenv

apt-get install virtualenv python3-pip useradd modoboa create a dedicated user su -l modoboa log in as the newly created user$ virtualenv --python python3 env create the virtual environment$ source envbinactivate activate the virtual environment

Modoboa depends on external tools and some of them require compilation so you need a compiler and a few C librariesMake sure to install the following system packages according to your distribution

Debian Ubuntubuild-essential python3-dev libxml2-dev libxslt-dev libjpeg-dev librrd-dev rrdtool libffi-dev libssl-dev

CentOSgcc gcc-c++ python3-devel libxml2-devel libxslt-devel libjpeg-turbo-devel rrdtool-devel rrdtool libffi-devel

Note Alternatively you could rely on your distribution packages for the Modoboa dependencies which requirecompilation - eg psycopg2 - if the version is compatible In this case you have to create your virtual environmentwith the --system-site-packages option

Then install Modoboa by running

6 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(env)$ pip install modoboa

Database

Warning This documentation does not cover the installation of a database server but only the setup of a functionaldatabase that Modoboa will use

Thanks to Django Modoboa is compatible with the following databases

bull PostgreSQL

bull MySQL MariaDB

bull SQLite

Since the last one does not require particular actions only the first two ones are described You should also read thenotes for those database backends on the official Django documentation

PostgreSQL

Install the corresponding Python binding

(env)$ pip install psycopg2

Note Alternatively you can install the python3-psycopg2 package instead on Debian-based distributions ifyour virtual environment was created with --system-site-packages option

Then create a user and a database For example to create the modoboa database owned by a modoboa user run thefollowing commands on your PostgreSQL server

sudo -l -u postgres createuser --no-createdb modoboa sudo -l -u postgres createdb --owner=modoboa modoboa

MySQL MariaDB

Install the corresponding Python binding

(env)$ pip install mysqlclient

Note Alternatively you can install the python3-mysqldb package instead on Debian-based distributions if yourvirtual environment was created with --system-site-packages option

Note MariaDB 102 (and newer) require mysqlclient 1311 (or newer)

Then create a user and a database For example to create the modoboa database owned by a modoboa user run thefollowing SQL commands

21 Installation 7

Modoboa Documentation Release 1100

CREATE DATABASE modoboaCREATE USER modoboalocalhost IDENTIFIED BY my-strong-password-hereGRANT ALL PRIVILEGES ON modoboa TO modoboalocalhost

Deploy an instance

modoboa-adminpy is a command line tool that lets you deploy a ready-to-use Modoboa site To create a newinstance into instance you just have to run the following command

(env)$ modoboa-adminpy deploy instance --collectstatic --domain lthostname of your servergt --dburl defaultltdatabase urlgt

Note You can install additional extensions during the deploy process To do so use the --extensions op-tion which accepts a list of names as argument (--extensions ext1 ext2 ) If you want to install allextensions just use the all keyword like this --extensions all

If you choose to install extensions one at a time you will have to add their names in settingspy to MODOBOA_APPSAlso ensure that you have the line from modoboa_amavissettings import at the end of this file

The list of available extensions can be found on the index page Instructions to install them are available on eachextensions page

Note You can specify more than one database connection using the --dburl option Multiple connections aredifferentiated by a prefix

The primary connection must use the default prefix (as shown in the example above) For the amavis exten-sion use the amavis prefix For example --dburl defaultltdatabase urlgt amavisltdatabaseurlgt

A database url should meet the following syntax ltmysql|postgresgt[userpass][hostport]dbname OR sqlitefullpathtoyourdatabasefilesqlite

The command will ask you a few questions answer them and yoursquore done

If you need a silent installation (eg if yoursquore using Salt-Stack Ansible or whatever) itrsquos possible to supply thedatabase credentials as command line arguments

You can consult the complete option list by running the following command

(env)$ modoboa-adminpy help deploy

Cron jobs

A few recurring jobs must be configured to make Modoboa works as expected

Create a new file for example etccrondmodoboa and put the following content inside

Modoboa specific cron jobsPYTHON=ltpath to Python binary inside the virtual environmentgtINSTANCE=ltpath to Modoboa instancegt

(continues on next page)

8 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

Operations on mailboxes

vmail $PYTHON $INSTANCEmanagepy handle_mailbox_operations

Generate DKIM keys (they will belong to the user running this job)

root umask 077 ampamp $PYTHON $INSTANCEmanagepy modo manage_dkim_rarr˓keys

Sessions table cleanup0 0 modoboa $PYTHON $INSTANCEmanagepy clearsessions Logs table cleanup0 0 modoboa $PYTHON $INSTANCEmanagepy cleanlogs DNSBL checks

30 modoboa $PYTHON $INSTANCEmanagepy modo check_mx Public API communication0 modoboa $PYTHON $INSTANCEmanagepy communicate_with_public_api

Policy daemon

Modoboa comes with a built-in Policy Daemon for Postfix Current features are

bull Define daily sending limits for domains andor accounts

A redis server is required to run this new daemon

You can launch it manually using the following command

(env)gt python managepy policy_daemon

But we recommend an automatic start using systemd or supervisor Here is a configuration example forsupervisor

[programpolicyd]autostart=trueautorestart=truecommand=srvmodoboaenvbinpython srvmodoboainstancemanagepy policy_daemondirectory=srvmodoboaredirect_stderr=trueuser=modoboanumprocs=1

It will listen by default on 127001 and port 9999 The policy daemon wonrsquot do anything unless you tell postfixto use it

Now you can continue to the Web server section

Web server

Note The following instructions are meant to help you get your site up and running quickly However it is notpossible for the people contributing documentation to Modoboa to test every single combination of web server wsgiserver distribution etc So it is possible that your installation of uwsgi or nginx or Apache or what-have-you worksdifferently Keep this in mind

21 Installation 9

Modoboa Documentation Release 1100

Apache2

First make sure that mod_wsgi is installed on your server

Create a new virtualhost in your Apache configuration and put the following content inside

ltVirtualHost 80gtServerName ltyour valuegtDocumentRoot ltmodoboa_instance_pathgt

Alias media ltmodoboa_instance_pathgtmedialtDirectory ltmodoboa_instance_pathgtmediagtOrder denyallowAllow from all

ltDirectorygt

Alias sitestatic ltmodoboa_instance_pathgtsitestaticltDirectory ltmodoboa_instance_pathgtsitestaticgtOrder denyallowAllow from all

ltDirectorygt

WSGIScriptAlias ltmodoboa_instance_pathgtltinstance_namegtwsgipy

Pass Authorization header to enable API usageWSGIPassAuthorization On

ltVirtualHostgt

This is just one possible configuration

To use mod_wsgi daemon mode add the two following directives just under WSGIScriptAlias

WSGIDaemonProcess examplecom python-path=ltmodoboa_instancegtltvirtualenv pathgtlibrarr˓python37site-packagesWSGIProcessGroup examplecom

Replace values between ltgt with yours If you donrsquot use a virtualenv just remove the last part of theWSGIDaemonProcess directive

Note You will certainly need more configuration in order to launch Apache

Now you can go the Dovecot section to continue the installation

Nginx

This section covers two different ways of running Modoboa behind Nginx using a WSGI application server Choosethe one you prefer between Green Unicorn or uWSGI

In both cases yoursquoll need to download and install nginx

Green Unicorn

Firstly Download and install gunicorn Then use the following sample gunicorn configuration (create a new filenamed gunicornconfpy inside Modoboarsquos root dir)

10 Chapter 2 Table of contents

Modoboa Documentation Release 1100

backlog = 2048bind = unixvarrungunicornmodoboasockpidfile = varrungunicornmodoboapiddaemon = Truedebug = Falseworkers = 2logfile = varloggunicornmodoboalogloglevel = info

To start gunicorn execute the following commands

$ cd ltmodoboa dirgt$ gunicorn -c gunicornconfpy ltmodoboa dirgtwsgiapplication

Now the nginx part Just create a new virtual host and use the following configuration

upstream modoboa server unixvarrungunicornmodoboasock fail_timeout=0

server listen 443 sslssl onkeepalive_timeout 70

server_name lthost fqdngtroot ltmodoboa_instance_pathgt

access_log varlognginxlthost fqdngtaccesslogerror_log varlognginxlthost fqdngterrorlog

ssl_certificate ltssl certificate for your sitegtssl_certificate_key ltssl certificate key for your sitegt

location sitestatic autoindex on

location media autoindex on

location proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_forproxy_set_header Host $http_hostproxy_redirect offproxy_set_header X-Forwarded-Protocol sslproxy_pass httpmodoboa

If you do not plan to use SSL then change the listen directive to listen 80 and delete each of the followingdirectives

ssl onkeepalive_timeout 70ssl_certificate ltssl certificate for your sitegt

(continues on next page)

21 Installation 11

Modoboa Documentation Release 1100

(continued from previous page)

ssl_certificate_key ltssl certificate key for your sitegtproxy_set_header X-Forwarded-Protocol ssl

If you do plan to use SSL yoursquoll have to generate a certificate and a key This article contains information about howto do it

Paste this content to your configuration (replace values between ltgt with yours) and restart nginx

Now you can go the Dovecot section to continue the installation

uWSGI

The following setup is meant to get you started quickly You should read the documentation of both nginx and uwsgito understand how to optimize their configuration for your site

The Django documentation includes the following warning regarding uwsgi

Warning Use uwsgi 126 or newer If you do not you will run into problems Modoboa will fail in obscureways

To use this setup first download and install uwsgi

Here is a sample nginx configuration

server listen 443 sslssl onkeepalive_timeout 70

server_name lthost fqdngtroot ltmodoboas settings dirgt

ssl_certificate ltssl certificate for your sitegtssl_certificate_key ltssl certificate key for your sitegt

access_log varlognginxlthost fqdngtaccesslogerror_log varlognginxlthost fqdngterrorlog

location ltmodoboas root urlgtsitestatic autoindex onalias ltlocation of sitestatic on your file systemgt

Whether or not Modoboa uses a media directory depends on how you configured Modoboa It does not hurt to have thislocation ltmodoboas root urlgtmedia

autoindex onalias ltlocation of media on your file systemgt

This denies access to any file that begins with ht Apaches htaccess and htpasswd are such files A Modoboa installed from scratch would not contain any such files but you never know what the future holds

(continues on next page)

12 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

location ~ ht deny all

location ltmodobas root urlgt include uwsgi_paramsuwsgi_pass ltuwsgi portgtuwsgi_param UWSGI_SCRIPT ltmodoboa instance namegtwsgiapplicationuwsgi_param UWSGI_SCHEME https

ltmodoboa instance namegt must be replaced by the value you used when you deployed your instance

If you do not plan to use SSL then change the listen directive to listen 80 and delete each of the followingdirectives

ssl onkeepalive_timeout 70ssl_certificate ltssl certificate for your sitegtssl_certificate_key ltssl certificate key for your sitegtuwsgi_param UWSGI_SCHEME https

If you do plan to use SSL yoursquoll have to generate a certificate and a key This article contains information about howto do it

Make sure to replace the ltgt in the sample configuration with appropriate values Here are some explanations forthe cases that may not be completely self-explanatory

ltmodoboas settings dirgt Where Modoboarsquos settingspy resides This is also where thesitestatic and media directories reside

ltmodoboas root urlgt This is the URL which will be the root of your Modoboa site at your domain For in-stance if your Modoboa installation is reachable at at httpsfoomodoboa then ltmodoboas rooturlgt is modoboa In this case you probably also have to set the alias directives to point to where Mod-oboarsquos sitestatic and media directories are because otherwise nginx wonrsquot be able to find them

If Modoboa is at the root of your domain then ltmodoboa root urlgt is an empty string and can be deletedfrom the configuration above In this case you probably do not need the alias directives

ltuwsgi portgt The location where uwsig is listening It could be a unix domain socket or an addressport combi-nation Ubuntu configures uwsgi so that the port is

unixrunuwsgiappltapp namegtsocket

where ltapp namegt is the name of the application

Your uwsgi configuration should be

[uwsgi] Not needed when using uwsgi from pip plugins = pythonchdir = ltmodoboas top dirgtmodule = ltnamegtwsgiapplicationmaster = trueharakiri = 60processes = 4vhost = trueno-default-app = true

21 Installation 13

Modoboa Documentation Release 1100

The plugins directive should be turned on if you use a uwsgi installation that requires it If uwsgi was installed frompip it does not require it In the configuration above

ltmodoboas top dirgt The directory where managepy resides This directory is the parent of ltmodoboassettings dirgt

ltnamegt The name that you passed to modoboa-adminpy deploy when you created your Modoboa instance

Now you can go the Dovecot section to continue the installation

Dovecot

Modoboa requires Dovecot 2+ to work so the following documentation is suitable for this combination

In this section we assume dovecotrsquos configuration resides in etcdovecot all pathes will be relative to thisdirectory

Mailboxes

First edit the confd10-mailconf and set the mail_location variable

maildirmail_location = maildir~maildir

Then edit the inbox namespace and add the following lines

inbox = yes

mailbox Drafts auto = subscribespecial_use = Drafts

mailbox Junk

auto = subscribespecial_use = Junk

mailbox Sent

auto = subscribespecial_use = Sent

mailbox Trash

auto = subscribespecial_use = Trash

With dovecot 21+ it ensures all the special mailboxes will be automaticaly created for new accounts

For dovecot 20 and older use the autocreate plugin

Operations on the file system

14 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning Modoboa needs to access the dovecot binary to check its version To find the binary path weuse the which command first and then try known locations (usrsbindovecot and usrlocalsbindovecot) If you installed dovecot in a custom location please tell us where the binary is by usingthe DOVECOT_LOOKUP_PATH setting (see settingspy)

Three operation types are considered

1 Mailbox creation

2 Mailbox renaming

3 Mailbox deletion

The first one is managed by Dovecot The last two ones may be managed by Modoboa if it can access the file systemwhere the mailboxes are stored (see General parameters to activate this feature)

Those operations are treated asynchronously by a cron script For example when you rename an e-mail addressthrough the web UI the associated mailbox on the file system is not modified directly Instead of that a renameorder is created for this mailbox The mailbox will be considered unavailable until the order is executed (see Postfixconfiguration)

Edit the crontab of the user who owns the mailboxes on the file system

$ crontab -u ltusergt -e

And add the following line inside

python ltmodoboa_sitegtmanagepy handle_mailbox_operations

Warning The cron script must be executed by the system user owning the mailboxes

Warning The user running the cron script must have access to the settingspy file of the modoboa instance

The result of each order is recorded into Modoboarsquos log Go to Modoboa gt Logs to consult them

Authentication

To make the authentication work edit the confd10-authconf and uncomment the following line at the end

include auth-systemconfextinclude auth-sqlconfextinclude auth-ldapconfextinclude auth-passwdfileconfextinclude auth-checkpasswordconfextinclude auth-vpopmailconfextinclude auth-staticconfext

Then edit the confdauth-sqlconfext file and add the following content inside

passdb sql driver = sql Path for SQL configuration file see example-configdovecot-sqlconfext

(continues on next page)

21 Installation 15

Modoboa Documentation Release 1100

(continued from previous page)

args = etcdovecotdovecot-sqlconfext

userdb sql driver = sqlargs = etcdovecotdovecot-sqlconfext

Make sure to activate only one backend (per type) inside your configuration (just comment the other ones)

Edit the dovecot-sqlconfext and modify the configuration according to your database engine

MySQL users

driver = mysql

connect = host=ltmysqld socketgt dbname=ltdatabasegt user=ltusergt password=ltpasswordgt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user WHERE email=Lu andrarr˓is_active=1

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid concat(bytes= mbquota M) AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

PostgreSQL users

driver = pgsql

connect = host=ltpostgres socketgt dbname=ltdatabasegt user=ltusergt password=ltpasswordgt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user u INNER JOIN admin_rarr˓mailbox mb ON uid=mbuser_id INNER JOIN admin_domain dom ON mbdomain_id=domidrarr˓WHERE uemail=Lu AND uis_active AND domenabled

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid bytes= || mbquota || M AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

16 Chapter 2 Table of contents

Modoboa Documentation Release 1100

SQLite users

driver = sqlite

connect = ltpath to the sqlite db filegt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user u INNER JOIN admin_rarr˓mailbox mb ON uid=mbuser_id INNER JOIN admin_domain dom ON mbdomain_id=domidrarr˓WHERE uemail=Lu AND uis_active=1 AND domenabled=1

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid (bytes= || mbquota || M) AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

Note Replace values between ltgt with yours

LDAP

To make the LDAP authentication work edit the confd10-authconf and uncomment the following line atthe end

include auth-ldapconfext

Then edit the confdauth-ldapconfext and edit the passdb section as following You should comment theuserdb section which will be managed by SQL with modoboa database

passdb driver = ldap

Path for LDAP configuration file see example-configdovecot-ldapconfextargs = etcdovecotdovecot-ldapconfext

userdb driver = ldapargs = etcdovecotdovecot-ldapconfext

Default fields can be used to specify defaults that LDAP may overridedefault_fields = home=homevirtualu

Your own dovecot LDAP configuration file is now etcdovecotdovecot-ldapconfext You can addyour default LDAP conf in it following the official documentation

Synchronize dovecot LDAP conf with modoboa LDAP conf

To make dovecot LDAP configuration synchronized with modoboa LDAP configuration you should create a dedicateddovecot conf file At the end of your dovecot configuration file (dovecot-ldapconfext) add the following

21 Installation 17

Modoboa Documentation Release 1100

line

include_try dovecot-modoboaconfext

Then set modoboa parameter Enable Dovecot LDAP sync to Yes Then set the Dovecot LDAP config file following theprevious step (etcdovecotdovecot-modoboaconfext in the example)

The last step is to add the command update_dovecot_conf to the cron job of modoboa Then each time your modoboaLDAP configuration is updated your dovecot LDAP configuration will also be

LMTP

Local Mail Transport Protocol is used to let Postfix deliver messages to Dovecot

First make sure the protocol is activated by looking at the protocols setting (generally inside dovecotconf)It should be similar to the following example

protocols = imap pop3 lmtp

Then open the confd10-masterconf look for lmtp service definition and add the following content inside

service lmtp stuff beforeunix_listener varspoolpostfixprivatedovecot-lmtp mode = 0600user = postfixgroup = postfix

stuff after

We assume here that Postfix is chrooted within varspoolpostfix

Finally open the confd20-lmtpconf and modify it as follows

protocol lmtp postmaster_address = postmasterltdomaingtmail_plugins = $mail_plugins quota sieve

Replace ltdomaingt by the appropriate value

Note If you donrsquot plan to apply quota or to use filters just adapt the content of the mail_plugins setting

Quota

Modoboa lets adminstrators define per-domain andor per-account limits (quota) It also lists the current quota usageof each account Those features require Dovecot to be configured in a specific way

Inside confd10-mailconf add the quota plugin to the default activated ones

mail_plugins = quota

Inside confd10-masterconf update the dict service to set proper permissions

18 Chapter 2 Table of contents

Modoboa Documentation Release 1100

service dict If dict proxy is used mail processes should have access to its socket For example mode=0660 group=vmail and global mail_access_groups=vmailunix_listener dict mode = 0600user = ltuser owning mailboxesgtgroup =

Inside confd20-imapconf activate the imap_quota plugin

protocol imap

mail_plugins = $mail_plugins imap_quota

Inside dovecotconf activate the quota SQL dictionary backend

dict quota = ltdrivergtetcdovecotdovecot-dict-sqlconfext

Inside confd90-quotaconf activate the quota dictionary backend

plugin quota = dictUser quotaproxyquota

It will tell Dovecot to keep quota usage in the SQL dictionary

Finally edit the dovecot-dict-sqlconfext file and put the following content inside

connect = host=ltdb hostgt dbname=ltdb namegt user=ltdb usergt password=ltpasswordgt SQLite users connect = pathtothedatabasedb

map pattern = privquotastoragetable = admin_quotausername_field = usernamevalue_field = bytes

map

pattern = privquotamessagestable = admin_quotausername_field = usernamevalue_field = messages

PostgreSQL users

21 Installation 19

Modoboa Documentation Release 1100

Database schema update

The admin_quota table is created by Django but unfortunately it doesnrsquot support DEFAULT constraints (it onlysimulates them when the ORM is used) As PostgreSQL is a bit strict about constraint violations you must executethe following query manually

db=gt ALTER TABLE admin_quota ALTER COLUMN bytes SET DEFAULT 0db=gt ALTER TABLE admin_quota ALTER COLUMN messages SET DEFAULT 0

Trigger

As indicated on Dovecotrsquos wiki you need a trigger to properly update the quota

A working copy of this trigger is available on Github

Download this file and copy it on the server running postgres Then execute the following commands

$ su - postgres$ psql [modoboa database] lt pathtomodoboa_postgres_triggersql$ exit

Replace [modoboa database] by the appropriate value

Forcing recalculation

For existing installations Dovecot (gt 2) offers a command to recalculate the current quota usages For example if youwant to update all usages run the following command

$ doveadm quota recalc -A

Be carefull it can take a while to execute

ManageSieveSieve

Modoboa lets users define filtering rules from the web interface To do so it requires ManageSieve to be activated onyour server

Inside confd20-managesieveconf make sure the following lines are uncommented

protocols = $protocols sieve

service managesieve-login

service managesieve

protocol sieve

20 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Messages filtering using Sieve is done by the LDA

Inside confd15-ldaconf activate the sieve plugin like this

protocol lda Space separated list of plugins to load (default is global mail_plugins)mail_plugins = $mail_plugins sieve

Finally configure the sieve plugin by editing the confd90-sieveconf file Put the follwing caontent inside

plugin Location of the active script When ManageSieve is used this is actually a symlink pointing to the active script in the sieve storage directorysieve = ~dovecotsieve

The path to the directory where the personal Sieve scripts are stored For ManageSieve this is where the uploaded scripts are storedsieve_dir = ~sieve

Restart Dovecot

Now you can go to the Postfix section to finish the installation

Last-login tracking

To update the last_login attribute of an account after a succesful IMAP or POP3 login you can configure apost-login script

Open confd10-masterconf add the following configuration (imap and pop3 services are already definedyou just need to update them)

service imap executable = imap postlogin

service pop3 executable = pop3 postlogin

service postlogin executable = script-login usrlocalbinpostloginshuser = modoboaunix_listener postlogin

Then you must create a script named usrlocalbinpostloginsh According to your database enginethe content will differ

PostgreSQL

21 Installation 21

Modoboa Documentation Release 1100

binsh

psql -c UPDATE core_user SET last_login=now() WHERE username=$USER gt devnull

exec $

MySQL

binsh

DBNAME=XXXDBUSER=XXXDBPASSWORD=XXX

echo UPDATE core_user SET last_login=now() WHERE username=$USER | mysql -urarr˓$DBUSER -p$DBPASSWORD $DBNAME

exec $

Postfix

This section gives an example about building a simple virtual hosting configuration with Postfix Refer to the officialdocumentation for more explanation

Map files

You first need to create configuration files (or map files) that will be used by Postfix to lookup into Modoboa tables

To automaticaly generate the requested map files and store them in a directory run the following command

gt cd ltmodoboa_instance_pathgtgt python managepy generate_postfix_maps --destdir ltdirectorygt

ltdirectorygt is the directory where the files will be stored Answer the few questions and yoursquore done

Configuration

Use the following configuration in the etcpostfixmaincf file (this is just one possible configuration)

Stuff beforevirtual_transport = lmtpunixprivatedovecot-lmtp

virtual_mailbox_domains = ltdrivergtetcpostfixsql-domainscfvirtual_alias_domains = ltdrivergtetcpostfixsql-domain-aliasescfvirtual_alias_maps = ltdrivergtetcpostfixsql-aliasescf

relay_domains = ltdrivergtetcpostfixsql-relaydomainscftransport_maps =

ltdrivergtetcpostfixsql-transportcfltdrivergtetcpostfixsql-spliteddomains-transportcf

(continues on next page)

22 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

smtpd_recipient_restrictions = check_recipient_access

ltdrivergtetcpostfixsql-maintaincfltdrivergtetcpostfixsql-relay-recipient-verificationcf

permit_mynetworksreject_unauth_destinationreject_unverified_recipient

smtpd_sender_login_maps = ltdrivergtetcpostfixsql-sender-login-mapcf

smtpd_sender_restrictions =reject_sender_login_mismatch

Stuff after

Replace ltdrivergt by the name of the database you use

Restart Postfix

Policy daemon

If you want to enable the built-in policy daemon add the following content to the etcpostfixmaincf file

smtpd_recipient_restrictions = check_policy_service inet1270019999

And reload postfix

Note The check_policy_service line must be placed before the permit_mynetworks one otherwise thedaemon wonrsquot be called

OpenDKIM

Modoboa can generate DKIM keys for the hosted domains but it wonrsquot sign or check messages To do that you needa dedicated software like OpenDKIM

Note The cron job in charge of creating DKIM keys must be run using the same user than OpenDKIM (ie opendkimin most cases)

Database

Since keys related information is stored in Modoboarsquos database you need to tell OpenDKIM how it can access it

First make sure to install the required additional packages on your system (libopendbx1- on debian baseddistributions or opendbx- on CentOS the complete name depends on your database engine)

Then insert the following SQL view into Modoboarsquos database

21 Installation 23

Modoboa Documentation Release 1100

PostgreSQL

CREATE OR REPLACE VIEW dkim AS (SELECT id name as domain_name dkim_private_key_path AS private_key_path

dkim_key_selector AS selectorFROM admin_domain WHERE enable_dkim

)

MySQLMariaDB

CREATE OR REPLACE VIEW dkim AS (SELECT id name as domain_name dkim_private_key_path AS private_key_path

dkim_key_selector AS selectorFROM admin_domain WHERE enable_dkim=1

)

Configuration

You should find OpenDKIMrsquos configuration file at etcopendkimconf

Add the following content to it

KeyTable dsnltdrivergtltusergtltpasswordgtltdb hostgtltdb namegttable=dkimrarr˓keycol=iddatacol=domain_nameselectorprivate_key_pathSigningTable dsnltdrivergtltusergtltpasswordgtltdb hostgtltdb namegttable=dkimrarr˓keycol=domain_namedatacol=idSocket inet12345localhost

Replace values between ltgt by yours Accepted values for driver are pgsql or mysql Make sure the user youspecify has read permission on the view created previously

If you run a debian based system make sure to adjust the following setting in the etcdefaultopendkim file

SOCKET=inet12345localhost

Eventually reload OpenDKIM

Postfix integration

Add the following lines to the etcpostfixmaincf file

smtpd_milters = inet12700112345non_smtpd_milters = inet12700112345milter_default_action = acceptmilter_content_timeout = 30s

and reload postfix

Extensions

Only few commands are needed to add a new extension to your setup

24 Chapter 2 Table of contents

Modoboa Documentation Release 1100

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install ltEXTENSIONgt==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Then restart your web server

22 Upgrade

221 Modoboa

Warning The new version you are going to install may need to modify your database Before you start makesure to backup everything

Most of the time upgrading your installation to a newer Modoboa version only requires a few actions In every caseyou will need to apply the general procedure first and then check if the version you are installing requires specificactions

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install modoboa==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Once done check if the version you are installing requires Specific instructions

Finally restart your web server

Sometimes you might need to upgrade postfix map files too To do so just run the generate_postfix_mapscommand on the same directory than the one used for installation (etcpostfix by default)

Make sure to use root privileges and run the following command

gt python managepy generate_postfix_maps --destdir ltdirectorygt

Then reload postfix

22 Upgrade 25

Modoboa Documentation Release 1100

222 Extensions

If a new version is available for an extension yoursquore using it is recommanded to install it Upgrading an extensions ispretty and the procedure is almost the same than the one used for Modoboa

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install ltEXTENSIONgt==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Finally restart your web server

It is a generic upgrade procedure which will be enough most of the time but it is generally a good idea to check theassociated documentation

223 Rebuild Virtual Environment

Sometimes when upgrading your Operating System (eg from Ubuntu 1704 to Ubuntu 1710) your virtual environmentrunning modoboa can get corrupted Your first response will be to panic but fear not The solution is in this document

First things first

Recover your database password

You will need to recover your database password (if using mysql or postgresql) You will find this in etcpostfixsql-aliasescf or any file with sql-cf in the etcpostfix directory

Make note of this as you will need it when reconfiguring modoboa

Reinstall Modoboa

Start out by backup up your modoboa settings file located in the modoboa instance directory (srvmodoboainstanceinstancesettingspy if you used the default installer configuration) This contains your currentconfiguration

Next you want to remove all current modoboa files

After doing this follow the manual installation instructions for Modoboa only as everything should be working prop-erly

After this completes simply restore your backed up settings file to srvinstanceinstancesettingspy(if you used installer default configuration) You will then need to reinstall your extensions

You can find which plugins you had in your settingspy file under the MODOBOA_APPS variable

Instructions to install extensions can also be found here

Once you have completed this step you will need to run the following commands

26 Chapter 2 Table of contents

Modoboa Documentation Release 1100

gt (env) $ cd ltinstance_dirgtgt (env) $ python managepy migrategt (env) $ python managepy collectstatic

You will then see a message similar to

You have requested to collect static files at the destinationlocation as specified in your settings

srvmodoboainstancesitestatic

This will overwrite existing filesAre you sure you want to do this

Type yes to continue or no to cancel

You will want to answer yes here then simply restart the uwsgi process with service uwsgi restart andyou should be up and running again

Simply log into your modoboa web panel and verify that your extensions and webmail box is working

224 Information

Rebuild instructions from httpshelppythonanywherecompagesRebuildingVirtualenvs

225 Specific instructions

1160

A new policy daemon has been added

Make sure to have a Redis instance running on your server

Add modoboapolicyd to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboapolicyd

)

Add the following settings to your settingspy file

REDIS_HOST = ltIP or hostname heregtREDIS_PORT = 6379REDIS_QUOTA_DB = 0REDIS_URL = redisformat(REDIS_HOST REDIS_PORT REDIS_QUOTA_DB)

Once done you can start the policy daemon using the following commands

22 Upgrade 27

Modoboa Documentation Release 1100

gt python managepy policy_daemon

Donrsquot forget to configure _policyd_config if you want to use this feature

The modoboa-stats plugin has been merged into the core

Add modoboamaillog to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboapolicydmodoboamaillog

)

And remove any reference to modoboa_stats in this same variable

1150

This version drops Python 2 support so donrsquot forget to update all the extensions you use

Warning If you upgrade an existing python 2 installation you will need to create a new Python 3 virtualenvironment You can remove the existing virtual environment and replace it by the new one so you wonrsquot have tomodify your configuration files

Add the following new setting

DISABLE_DASHBOARD_EXTERNAL_QUERIES = False

Reload uwsgigunicornapache depending on your setup

Finally Make sure to use root privileges and run the following command

gt python managepy generate_postfix_maps --destdir ltdirectorygt

Then reload postfix

1140

This release introduces an optional LDAP synchronization process If you want to use it please follow the dedicatedprocedure

1131

Upgrade postfix maps files as follows

28 Chapter 2 Table of contents

Modoboa Documentation Release 1100

gt python managepy generate_postfix_maps --destdir ltpathgt --force-overwrite

1130

Add modoboadnstools to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstools

)

Add the following new settings

CSRF_COOKIE_SECURE = TrueSESSION_COOKIE_SECURE = True

modoboa-postfix-autoreply 150

Edit the etcpostfixmaincf file and remove the sql-autoreplies-transportcf map from thetransport_maps if present Remove the corresponding proxy_read_maps entry if relevant

Reload postfix

1100

Warning Upgrade installed extensions BEFORE running check or migrate commands

Upgrade all your installed plugins to the following versions

Warning If you use the amavis plugin make sure to include its configuration as follows into settingspy

from modoboa_amavis import settings as modoboa_amavis_settingsmodoboa_amavis_settingsapply(globals())

22 Upgrade 29

Modoboa Documentation Release 1100

Name Versionmodoboa-amavis 120modoboa-contacts 050modoboa-dmarc 110modoboa-imap-migration 120modoboa-pdfcredentials 130modoboa-postfix-autoreply 140modoboa-radicale 120modoboa-sievefilters 140modoboa-stats 140modoboa-webmail 140

Edit the settingspy file and apply the following modifications

Add modoboatransport to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparameters

)

Replace the following line

MIDDLEWARE_CLASSES = (

by

MIDDLEWARE = (

Update postfix map files as follows

gt rm -f ltpathgtmodoboa-postfix-mapschkgt python managepy generate_postfix_maps --force --destdir ltpathgt

Then modify postfixrsquos configuration as follows

smtpd_sender_login_maps =ltdrivergtltpathgtsql-sender-login-mapcf

transport_maps =ltdrivergtltpathgtsql-transportcfltdrivergtltpathgtsql-spliteddomains-transportcf other map files

Replace ltdrivergt and ltpathgt by your values

If transport_maps contains sql-relaydomains-transportcf remove it

30 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning If you make use of postfixrsquos proxymap server you must also update the proxy_read_maps setting

Reload postfix

Add the following cron job in order to generate DKIM keys

Generate DKIM keys (they will belong to the user running this job)

root $PYTHON $INSTANCEmanagepy modorarr˓manage_dkim_keys

190

If you want to manage inactive accounts look at Cleaning inactive accounts

183

Edit the settingspy file and replace the following line

BASE_DIR = ospathdirname(ospathdirname(__file__))

by

BASE_DIR = ospathrealpath(ospathdirname(ospathdirname(__file__)))

180

Modoboa now relies on Djangorsquos builtin password validation system to validate user passwords instead ofdjango-passwords

Remove django-passwords from your system

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt pip uninstall django-passwords

Edit the settingspy file and remove the following content

django-passwords

PASSWORD_MIN_LENGTH = 8

PASSWORD_COMPLEXITY = UPPER 1LOWER 1DIGITS 1

Add the following lines

Password validation rulesAUTH_PASSWORD_VALIDATORS = [

NAME djangocontribauthpassword_validation

rarr˓UserAttributeSimilarityValidator (continues on next page)

22 Upgrade 31

Modoboa Documentation Release 1100

(continued from previous page)

NAME djangocontribauthpassword_validationMinimumLengthValidator

NAME djangocontribauthpassword_validationCommonPasswordValidator

NAME djangocontribauthpassword_validationNumericPasswordValidator

NAME modoboacorepassword_validationComplexityValidatorOPTIONS

upper 1lower 1digits 1specials 0

]

172

API documentation has evolved (because of the upgrade to Django Rest Framework 36) and CKeditor is now embed-ded by default (thanks to the django-ckeditor package) Some configuration changes are required

Edit your settingspy file and apply the following modifications

bull Update the INSTALLED_APPS variable as follows

INSTALLED_APPS = (djangocontribauthdjangocontribcontenttypesdjangocontribsessionsdjangocontribmessagesdjangocontribsitesdjangocontribstaticfilesreversionckeditorckeditor_uploaderrest_frameworkrest_frameworkauthtoken

)

bull Update the REST_FRAMEWORK variable as follows

REST_FRAMEWORK = DEFAULT_AUTHENTICATION_CLASSES (

rest_frameworkauthenticationTokenAuthenticationrest_frameworkauthenticationSessionAuthentication

)

bull Remove the SWAGGER_SETTINGS variable

bull Add the following content

32 Chapter 2 Table of contents

Modoboa Documentation Release 1100

CKeditor

CKEDITOR_UPLOAD_PATH = uploads

CKEDITOR_IMAGE_BACKEND = pillow

CKEDITOR_RESTRICT_BY_USER = True

CKEDITOR_BROWSE_SHOW_DIRS = True

CKEDITOR_ALLOW_NONIMAGE_FILES = False

CKEDITOR_CONFIGS = default

allowedContent Truetoolbar Modoboawidth Nonetoolbar_Modoboa [

[Bold Italic Underline][JustifyLeft JustifyCenter JustifyRight JustifyBlock][BidiLtr BidiRtl Language][NumberedList BulletedList - Outdent Indent][Undo Redo][Link Unlink Anchor - Smiley][TextColor BGColor - Source][Font FontSize][Image ][SpellChecker]

]

Donrsquot forget to run the following command

gt python managepy collectstatic

171

If you used 170 for a fresh installation please run the following commands

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy load_initial_data

170

This version requires Django gt= 110 so you need to make some modifications It also brings internal API changeswhich are not backward compatible so installed extensions must be upgraded too

First of all deactivate all installed extensions (edit the settingspy file and comment the corresponding lines inMODOBOA_APPS)

Edit the urlspy file of your local instance and replace its content by the following one

22 Upgrade 33

Modoboa Documentation Release 1100

from djangoconfurls import include url

urlpatterns = [url(r include(modoboaurls))

]

Edit the settingspy and apply the following changes

bull Add modoboaparameters to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboarelaydomainsmodoboalimitsmodoboaparameters Modoboa extensions here

)

bull Add modoboacoremiddlewareLocalConfigMiddleware to MIDDLEWARE_CLASSES

MIDDLEWARE_CLASSES = (djangocontribsessionsmiddlewareSessionMiddlewaredjangomiddlewarecommonCommonMiddlewaredjangomiddlewarecsrfCsrfViewMiddlewaredjangocontribauthmiddlewareAuthenticationMiddlewaredjangocontribmessagesmiddlewareMessageMiddlewaredjangomiddlewarelocaleLocaleMiddlewaredjangomiddlewareclickjackingXFrameOptionsMiddlewaremodoboacoremiddlewareLocalConfigMiddlewaremodoboalibmiddlewareAjaxLoginRedirectmodoboalibmiddlewareCommonExceptionCatchermodoboalibmiddlewareRequestCatcherMiddleware

)

bull Modoboa used to provide a custom authentication backend (modoboalibauthbackendsSimpleBackend) but it has been removed Replace it as follows

AUTHENTICATION_BACKENDS = ( Other backends beforedjangocontribauthbackendsModelBackend

)

bull Remove TEMPLATE_CONTEXT_PROCESSORS and replace it by

TEMPLATES = [

BACKEND djangotemplatebackendsdjangoDjangoTemplatesDIRS []APP_DIRS TrueOPTIONS

context_processors [djangotemplatecontext_processorsdebugdjangotemplatecontext_processorsrequestdjangocontribauthcontext_processorsauth

(continues on next page)

34 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

djangotemplatecontext_processorsi18ndjangotemplatecontext_processorsmediadjangotemplatecontext_processorsstaticdjangotemplatecontext_processorstzdjangocontribmessagescontext_processorsmessagesmodoboacorecontext_processorstop_notifications

]debug False

]

Run the following commands (load virtualenv if you use one)

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstatic

Finally upgrade your extensions and reactivate them

Name Versionmodoboa-amavis 110modoboa-dmarc 100modoboa-imap-migration 110modoboa-pdfcredentials 110modoboa-postfix-autoreply 120modoboa-radicale 110modoboa-sievefilters 110modoboa-stats 110modoboa-webmail 110

Command line shortcuts

$ pip install modoboa-amavis==110$ pip install modoboa-dmarc==100$ pip install modoboa-imap-migration==110$ pip install modoboa-pdfcredentials==110$ pip install modoboa-postfix-autoreply==120$ pip install modoboa-radicale==110$ pip install modoboa-sievefilters==110$ pip install modoboa-stats==110$ pip install modoboa-webmail==110

And please make sure you use the latest version of the django-versionfield2 package

$ pip install -U django-versionfield2

Notes about quota changes and resellers

Reseller users now have a quota option in Resources tab This is the quota that a reseller can share between all itsdomains

22 Upgrade 35

Modoboa Documentation Release 1100

There are two quotas for a domain in the new version

1 Quota amp

2 Default mailbox quota

[1] Quota quota shared between mailboxes This quota is shared between all the mailboxes of this domain This valuecannot exceed resellerrsquos quota and hence cannot be 0(unlimited) if reseller has finite quota

[2] Default mailbox quota default quota applied to mailboxes This quota is the default quota applied to new mail-boxes This value cannot exceed Quota[1] and hence cannot be 0(unlimited) if Quota[1] is finite

161

First of all update postfix map files as follows

gt python managepy generate_postfix_maps --destdir ltpathgt --force-overwrite

Then modify postfixrsquos configuration as follows

smtpd_sender_login_maps =ltdrivergtltpathgtsql-sender-login-mailboxescfltdrivergtltpathgtsql-sender-login-aliasescfltdrivergtltpathgtsql-sender-login-mailboxes-extracf

Replace ltdrivergt and ltpathgt by your values

Finally reload postfix

This release also deprecates some internal functions As a result several extensions has been updated to maintain thecompatibility If you enabled the notification service yoursquoll find the list of available updates directly in your Modoboaconsole

For the others here is the list

Name Versionmodoboa-amavis 1010modoboa-postfix-autoreply 117modoboa-radicale 105modoboa-stats 109

Command line shortcut

$ pip install modoboa-amavis==1010$ pip install modoboa-postfix-autoreply==117$ pip install modoboa-radicale==105$ pip install modoboa-stats==109

160

Warning You have to upgrade extensions due to coreUser model attribute change (usergroup to userrole) Oth-erwise you will have an internal error after upgrade In particular modoboa-amavisd modoboa-stats modoboa-postfix-autoreply are concerned

36 Chapter 2 Table of contents

Modoboa Documentation Release 1100

An interesting feature brougth by this version is the capability to make different checks about MX records Forexample Modoboa can query main DNSBL providers for every defined domain With this you will quickly know ifone the domains you manage is listed or not To activate it add the following line to your crontab

30 ltoptional_virtualenv_pathgtpython ltmodoboa_instance_dirgtmanagepy modorarr˓check_mx

The communication with Modoboa public API has been reworked Instead of sending direct synchronous queries (forexample to check new versions) a cron job has been added To activate it add the following line to your crontab

0 ltoptional_virtualenv_pathgtpython ltmodoboa_instance_dirgtmanagepyrarr˓communicate_with_public_api

Please also note that public API now uses TLS so you must update your configuration as follows

MODOBOA_API_URL = httpsapimodoboaorg1

Finally it is now possible to declare additional sender addresses on a per-account basis You need to update your postfixconfiguration in order to use this functionality Just edit the maincf file and change the following parameter

smtpd_sender_login_maps =ltdrivergtetcpostfixsql-sender-login-mailboxescfltdrivergtetcpostfixsql-sender-login-aliasescfltdrivergtetcpostfixsql-sender-login-mailboxes-extracf

150

The API has been greatly improved and a documentation is now available To enable it addrest_framework_swagger to the INSTALLED_APPS variable in settingspy as follows

INSTALLED_APPS = (djangocontribauthdjangocontribcontenttypesdjangocontribsessionsdjangocontribmessagesdjangocontribsitesdjangocontribstaticfilesreversionrest_frameworkauthtokenrest_framework_swagger

)

Then add the following content into settingspy just after the REST_FRAMEWORK variable

SWAGGER_SETTINGS = is_authenticated Falseapi_version 10exclude_namespaces []info

contact contactmodoboacomdescription (Modoboa API requires a valid token)title Modoboa API

Yoursquore done The documentation is now available at the following address

22 Upgrade 37

Modoboa Documentation Release 1100

httpltyour instance addressgtdocsapi

Finally if you find a TEMPLATE_CONTEXT_PROCESSORS variable in your settingspy file make sure it lookslike this

TEMPLATE_CONTEXT_PROCESSORS = global_settingsTEMPLATE_CONTEXT_PROCESSORS + [modoboacorecontext_processorstop_notifications

]

140

Warning Please make sure to use Modoboa 135 with an up-to-date database before an upgrade to 140

Warning Do not follow the regular upgrade procedure for this version

Some extension have been moved back into the main repository The main reason for that is that using Modoboawithout them doesnrsquot make sense

First of all you must rename the following applications listed inside the MODOBOA_APPS variable

Old name New namemodoboa_admin modoboaadminmodoboa_admin_limits modoboalimitsmodoboa_admin_relaydomains modoboarelaydomains

Then apply the following steps

1 Uninstall old extensions

$ pip uninstall modoboa-admin modoboa-admin-limits modoboa-admin-relaydomains

2 Install all extension updates using pip (check the Modoboa gt Information page)

3 Manually migrate database

$ cd ltinstance_dirgt$ python managepy migrate auth$ python managepy migrate admin 0001 --fake$ python managepy migrate admin$ python managepy migrate limits 0001 --fake$ python managepy migrate relaydomains 0001 --fake$ python managepy migrate

4 Finally update static files

$ python managepy collectstatic

This version also introduces a REST API To enable it

1 Add rest_frameworkauthtoken to the INSTALLED_APPS variable

2 Add the following configuration inside settingspy

38 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Rest framework settings

REST_FRAMEWORK = DEFAULT_AUTHENTICATION_CLASSES (

rest_frameworkauthenticationTokenAuthentication)DEFAULT_PERMISSION_CLASSES (

rest_frameworkpermissionsIsAuthenticated)

3 Run the following command

$ python managepy migrate

135

To enhance security Modoboa now checks the strength of user passwords lthttpsgithubcomdstufftdjango-passwordsgt_

To use this feature add the following configuration into the settingspy file

django-passwords

PASSWORD_MIN_LENGTH = 8

PASSWORD_COMPLEXITY = UPPER 1LOWER 1DIGITS 1

132

Modoboa now uses the atomic requests mode to preserve database consistency (reference)

To enable it update the DATABASES variable in settingspy as follows

DATABASES = default

stuff beforeATOMIC_REQUESTS True

amavis

stuff beforeATOMIC_REQUESTS True

130

This release does not bring awesome new features but it is a necessary bridge to the future of Modoboa All extensionsnow have their own git repository and the deploy process has been updated to reflect this change

22 Upgrade 39

Modoboa Documentation Release 1100

Another important update is the use of Django 17 Besides its new features the migration system has been reworkedand is now more robust than before

Before we begin with the procedure here is a table showing old extension names and their new name

Old name New package name New module namemodoboaextensionsadmin modoboa-admin modoboa_adminmodoboaextensionslimits modoboa-admin-limits modoboa_admin_limitsmodoboaextensionspostfix_autoreply modoboa-postfix-autoreply modoboa_postfix_autoreplymodoboaextensionspostfix_relay_domains modoboa-admin-relaydomains modoboa_admin_relaydomainsmodoboaextensionsradicale modoboa-radicale modoboa_radicalemodoboaextensionssievefilters modoboa-sievefilters modoboa_sievefiltersmodoboaextensionsstats modoboa-stats modoboa_statsmodoboaextensionswebmail modoboa-webmail modoboa_webmail

Here are the required steps

1 Install the extensions using pip (look at the second column in the table above)

$ pip install ltthe extensions you wantgt

2 Remove south from INSTALLED_APPS

3 Rename old extension names inside MODOBOA_APPS (look at the third column in the table above)

4 Remove modoboalibmiddlewareExtControlMiddleware from MIDDLEWARE_CLASSES

5 Change DATABASE_ROUTERS to

DATABASE_ROUTERS = [modoboa_amavisdbrouterAmavisRouter]

6 Run the following commands

$ cd ltmodoboa_instance_dirgt$ python managepy migrate

7 Reply yes to the question

8 Run the following commands

$ python managepy load_initial_data$ python managepy collectstatic

9 The cleanup job has been renamed in Django so you have to modify your crontab entry

- 0 0 ltmodoboa_sitegtmanagepy cleanup+ 0 0 ltmodoboa_sitegtmanagepy clearsessions

120

A new notification service let administrators know about new Modoboa versions To activate it you need to updatethe TEMPLATE_CONTEXT_PROCESSORS variable like this

from djangoconf import global_settings

TEMPLATE_CONTEXT_PROCESSORS = global_settingsTEMPLATE_CONTEXT_PROCESSORS + (

(continues on next page)

40 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

modoboacorecontext_processorstop_notifications)

and to define the new MODOBOA_API_URL variable

MODOBOA_API_URL = httpapimodoboaorg1

The location of external static files has changed To use them add a new path to the STATICFILES_DIRS

Additional locations of static filesSTATICFILES_DIRS = (

Put strings here like homehtmlstatic or Cwwwdjangostatic Always use forward slashes even on Windows Dont forget to use absolute paths not relative pathsltpathtomodoboainstalldirgtbower_components

)

Run the following commands to define the hostname of your instance

$ cd ltmodoboa_instance_dirgt$ python managepy set_default_site lthostnamegt

If you plan to use the Radicale extension

1 Add modoboaextensionsradicale to the MODOBOA_APPS variable

2 Run the following commands

$ cd ltmodoboa_instance_dirgt$ python managepy syncdb

Warning You also have to note that the sitestatic directory has moved from ltpath to your sitesdirgt to ltmodoboas root urlgt (itrsquos probably the parent directory) You have to adapt your web serverconfiguration to reflect this change

23 Configuration

231 Online parameters

Modoboa provides online panels to modify internal parameters There are two available levels

bull Application level global parameters define how the application behaves Available at Modoboa gt Parameters

bull User level per user customization Available at User gt Settings gt Preferences

Regardless level parameters are displayed using tabs each tab corresponding to one application

General parameters

The admin application exposes several parameters they are presented below

23 Configuration 41

Modoboa Documentation Release 1100

Name Tab Description Default valueAuthentication type General The backend used for au-

thenticationLocal

Default password scheme General Scheme used to cryptmailbox passwords

crypt

Rounds General Number of rounds (onlyused by sha256cryptand sha512crypt) Mustbe between 1000 and999999999 inclusive

70000

Secret key General A key used to encryptusersrsquo password in ses-sions

random value

Sender address General Email address used tosend notifications

Enable communication General Enable communicationwith Modoboa public API

yes

Check new versions General Automatically checks if anewer version is available

yes

Send statistics General Send statistics to Mod-oboa public API (countersand used extensions)

yes

Top notifications check in-terval

General Interval between two topnotification checks (inseconds)

30

Maximum log record age General The maximum age in daysof a log record

365

Items per page General Number of displayeditems per page

30

Default top redirection General The default redirectionused when no applicationis specified

userprefs

Enable MX checks Admin Check that every domainhas a valid MX record

yes

Valid MXs Admin A list of IP or networkaddress every MX shouldmatch A warning will besent if a record does notrespect this it

Enable DNSBL checks Admin Check every domainagainst major DNSBLproviders

yes

DKIM keys storage direc-tory

AdminPath to a directory where DKIM

generated keys willbe stored

Default DKIM key length Admin The default size (in bits)for new keys

2048

Handle mailboxes onfilesystem

Admin Rename or remove mail-boxes on the filesystemwhen they get renamed orremoved within Modoboa

no

Mailboxes owner Admin The UNIX account whoowns mailboxes on thefilesystem

vmail

Default domain quota Admin Default quota (in MB) ap-plied to freshly createddomains with no valuespecified A value of 0means no quota

0

Automatic accountremoval

Admin When a mailbox is re-moved also remove theassociated account

no

Automatic do-mainmailbox creation

Admin Create a domain and amailbox when an accountis automatically created

yes

42 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Note If you are not familiar with virtual domain hosting you should take a look at postfixrsquos documentation ThisHow to also contains useful information

Note A random secret key will be generated each time the Parameters page is refreshed and until you save parametersat least once

Note Specific LDAP parameters are also available see LDAP authentication

232 Media files

Modoboa uses a specific directory to upload files (ie when the webmail is in use) or to create ones (ex graphical statis-tics) This directory is named media and is located inside modoboarsquos installation directory (called modoboa_sitein this documentation)

To work properly the system user which runs modoboa (www-data apache whatever) must have write access tothis directory

233 Customization

Custom logo

You have the possibility to use a custom logo instead of the default one on the login page

To do so open the settingspy file and add a MODOBOA_CUSTOM_LOGO variable This variable must containthe relative URL of your logo under MEDIA_URL For example

MODOBOA_CUSTOM_LOGO = ospathjoin(MEDIA_URL custom_logopng)

Then copy your logo file into the directory indicated by MEDIA_ROOT

234 Host configuration

Note This section is only relevant when Modoboa handles mailboxes renaming and removal from the filesystem

To manipulate mailboxes on the filesystem you must allow the user who runs Modoboa to execute commands as theuser who owns mailboxes

To do so edit the etcsudoers file and add the following inside

ltuser_that_runs_modoboagt ALL=(ltmailboxes ownergt) NOPASSWD ALL

Replace values between ltgt by the ones you use

23 Configuration 43

Modoboa Documentation Release 1100

235 Time zone and language

Modoboa is available in many languages

To specify the default language to use edit the settingspy file and modify the LANGUAGE_CODE variable

LANGUAGE_CODE = fr or en for english etc

Note Each user has the possibility to define the language he prefers

In the same configuration file specify the timezone to use by modifying the TIME_ZONE variable For example

TIME_ZONE = EuropeParis

236 Sessions management

Modoboa uses Djangorsquos session framework to store per-user information

Few parameters need to be set in the settingspy configuration file to make Modoboa behave as expected

SESSION_EXPIRE_AT_BROWSER_CLOSE = False Default value

This parameter is optional but you must ensure it is set to False (the default value)

The default configuration file provided by the modoboa-adminpy command is properly configured

237 Logging authentication

To trace login attempts to the web interface Modoboa uses python SysLogHandler so you can see them in your syslogauthentication log file (varlogauthlog in most cases)

Depending on your configuration you may have to edit the settingspy file and add lsquoaddressrsquo lsquodevlogrsquo to thelogging section

syslog-auth class logginghandlersSysLogHandlerfacility SysLogHandlerLOG_AUTHaddress devlogformatter syslog

238 External authentication

LDAP

Modoboa supports external LDAP authentication using the following extra components

bull Python LDAP client

bull Django LDAP authentication backend

If you want to use this feature you must first install those components

44 Chapter 2 Table of contents

Modoboa Documentation Release 1100

$ pip install python-ldap django-auth-ldap

Then all you have to do is to modify the settingspy file Add a new authentication backend to the AUTHENTI-CATION_BACKENDS variable like this

AUTHENTICATION_BACKENDS = (modoboalibauthbackendsLDAPBackend modoboalibauthbackendsLDAPSecondaryBackend Useful for a fallback

rarr˓mechanismdjangocontribauthbackendsModelBackend

)

Finally go to Modoboa gt Parameters gt General and set Authentication type to LDAP

From there new parameters will appear to let you configure the way Modoboa should connect to your LDAP serverThey are described just below

Name Description De-faultvalue

Server address The IP address of the DNS name of the LDAP server local-host

Server port The TCP port number used by the LDAP server 389Use a secureconnection

Use an SSLTLS connection to access the LDAP server no

Authenticationmethod

Choose the authentication method to use Directbind

User DN tem-plate (directbind mode)

The template used to construct a userrsquos DN It should contain one placeholder (ie(user)s)

Bind BN The distinguished name to use when binding to the LDAP server Leave empty for ananonymous bind

Bind password The password to use when binding to the LDAP server (with lsquoBind DNrsquo)Search base The distinguished name of the search baseSearch filter An optional filter string (eg lsquo(objectClass=person)rsquo) In order to be valid it must be

enclosed in parentheses(mail=(user)s)

Passwordattribute

The attribute used to store user passwords user-Pass-word

Active Direc-tory

Tell if the LDAP server is an Active Directory one no

Administratorgroups

Members of those LDAP Posix groups will be created ad domain administrators Uselsquorsquo characters to separate groups

Group type The type of group used by your LDAP directory Posix-Group

Groups searchbase

The distinguished name of the search base used to find groups

Do-mainmailboxcreation

Automatically create a domain and a mailbox when a new user is created just after thefirst successful authentication You will generally want to disable this feature whenthe relay domains extension is in use

yes

If you need additional parameters you will find a detailed documentation here

Once the authentication is properly configured the users defined in your LDAP directory will be able to connect to

23 Configuration 45

Modoboa Documentation Release 1100

Modoboa the associated domain and mailboxes will be automatically created if needed

The first time a user connects to Modoboa a local account is created if the LDAP username is a valid email addressBy default this account belongs to the SimpleUsers group and it has a mailbox

To automatically create domain administrators you can use the Administrator groups setting If a LDAP user belongsto one the listed groups its local account will belong to the DomainAdmins group In this case the username is notnecessarily an email address

Users will also be able to update their LDAP password directly from Modoboa

Note Modoboa doesnrsquot provide any synchronization mechanism once a user is registered into the database Anymodification done from the directory to a user account will not be reported to Modoboa (an email address change forexample) Currently the only solution is to manually delete the Modoboa record it will be recreated on the next userlogin

SMTP

It is possible to use an existing SMTP server as an authentication source To enable this feature edit the settingspy file and change the following setting

AUTHENTICATION_BACKENDS = (modoboalibauthbackendsSMTPBackenddjangocontribauthbackendsModelBackend

)

SMTP server location can be customized using the following settings

AUTH_SMTP_SERVER_ADDRESS = localhostAUTH_SMTP_SERVER_PORT = 25AUTH_SMTP_SECURED_MODE = None ssl or starttls are accepted

239 LDAP synchronization

Modoboa can synchronize accounts with an LDAP directory (tested with OpenLDAP) but this feature is not enabledby default To activate it add modoboaldapsync to MODOBOA_APPS in the settingspy file

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboaldapsync

)

and enable it from the admin panel

46 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning Make sure to install additional requirements otherwise it wonrsquot work

The following parameters are available and must be filled

Name Description Defaultvalue

Enable LDAP synchro-nization

Control LDAP synchronization state no

Bind DN The DN of a user with write permission to createupdate accountsBind password The associated passwordAccount DN template The template used to build account DNs (must contain a (user)s

placeholder

2310 Database maintenance

Cleaning the logs table

Modoboa logs administrator specific actions into the database A clean-up script is provided to automatically removeoldest records The maximum log record age can be configured through the online panel

To use it you can setup a cron job to run every night

0 0 ltmodoboa_sitegtmanagepy cleanlogs Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy cleanlogs

Cleaning the session table

Django does not provide automatic purging Therefore itrsquos your job to purge expired sessions on a regular basis

Django provides a sample clean-up script django-adminpy clearsessions That script deletes any sessionin the session table whose expire_date is in the past

For example you could setup a cron job to run this script every night

0 0 ltmodoboa_sitegtmanagepy clearsessions Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy clearsessions

Cleaning inactive accounts

Thanks to Last-login tracking it is now possible to monitor inactive accounts An account is considered inactive if nologin has been recorded for the last 30 days (this value can be changed through the admin panel)

A management command is available to disable or delete inactive accounts For example you could setup a cron jobto run it every night

23 Configuration 47

Modoboa Documentation Release 1100

0 0 ltmodoboa_sitegtmanagepy clean_inactive_accounts Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy clean_inactive_rarr˓accounts

The default behaviour is to disable accounts You can delete them using the --delete option

24 Moving to Modoboa

You have an existing platform and yoursquod like to move to Modoboa the following tools could help you

241 From postfixadmin

A dedicated command allows you to convert an existing postfixadmin database to a Modoboa one Consult the docu-mentation to know more about the process

242 Using CSV files

Modoboa allows you to import any object (domain domain alias mailbox and alias) using a simple CSV file encodedusing UTF8 Each line corresponds to a single object and must respect one of the following format

domain ltname stringgt ltquota integergt ltdefault mailbox quota integergt ltenabledrarr˓booleangtdomainalias ltname stringgt lttargeted domain stringgt ltenabled booleangtrelaydomain ltname stringgt lttarget host stringgt lttarget port integergt ltservicerarr˓stringgt ltenabled booleangt ltverify recipients booleangtaccount ltloginname stringgt ltpassword stringgt ltfirst name stringgt ltlast namerarr˓stringgt ltenabled booleangt ltgroup stringgt ltaddress stringgt ltquota integergt [rarr˓ltdomain stringgt ]alias ltaddress stringgt ltenabled booleangt ltrecipient stringgt

Boolean fields accept the following values true 1 yes y (case insensitive) Any other value will be evaluated asfalse

Warning The order does matter Objects are created sequencially so a domain must be created before itsmailboxes and aliases and a mailbox must created before its alias(es)

To actually import such a file

gt sudo -u ltmodoboa_usergt -igt source ltvirtualenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy modo import ltyour filegt

Available options can be listed using the following command

gt python managepy modo import -h

48 Chapter 2 Table of contents

Modoboa Documentation Release 1100

25 REST API

To ease the integration with external sources (software or other) Modoboa provides a REST API

Every installed instance comes with a ready-to-use API and a documentation You will find them using the followingurl patterns

bull API httplthostnamegtapiv1

bull Documentation httplthostnamegtdocsapi

An example of this documentation is available on the official demo

Using this API requires an authentication and for now only a token based authentication is supported To get a validtoken log-in to your instance with a super administrator go to Settings gt API and activate the API access Press theUpdate button and wait until the page is reloaded the token will be displayed

To make valid API calls every requests you send must embed this token within an Authorization HTTP header likethis

Authorization Token ltYOUR_TOKENgt

and the content type of those requests must be applicationjson

26 How to contribute

Contributions are always welcome If you want to submit a patch please respect the following rules

bull Open a pull request on the appropriate repository

bull Respect PEP8

bull Document your patch and respect PEP 257

bull Add unit tests and make sure the global coverage does not decrease

If all those steps are validated your contribution will generally be integrated

261 Table of contents

25 REST API 49

Modoboa Documentation Release 1100

Useful tips

You would like to work on Modoboa but you donrsquot know where to start Yoursquore at the right place Browse this pageto learn useful tips

Docker

A docker image is available for developers To use it you must install docker and docker-compose first

Then just run the following command

$ docker-compose up

It will start the docker environment and make a Modoboa instance available at httplocalhost8000

If you donrsquot want to use docker or need a more complex development setup go to the next section

Prepare a virtual environment

A virtual environment is a good way to setup a development environment on your machine

To do so run the following commands

$ python3 -m venv ltpathgt$ source ltpathgtbinactivate$ git clone httpsgithubcommodoboamodoboagit$ cd modoboa$ python setuppy develop$ pip install -r dev-requirementstxt

The develop command creates a symbolic link to your local copy so any modification you make will be automati-cally available in your environment no need to copy them

Deploy an instance for development

Warning Make sure to create a database before running this step The format of the database url is also describedin this page

Now that you have a running environment yoursquore ready to deploy a test instance

$ cd ltpathgt$ modoboa-adminpy deploy --dburl defaultltdatabase urlgt --domain localhost --develrarr˓instance$ python managepy runserver

Yoursquore ready to go You should be able to access Modoboa at httplocalhost8000 usingadminpassword as credentials

Manage static files

Modoboa uses bower (thanks to django-bower) to manage its CSS and javascript dependencies

50 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Those dependencies are listed in a file called dev_settingspy located inside the ltpath_to_local_copygtmodoboacore directory

If you want to add a new dependency just complete the BOWER_INSTALLED_APPS parameter and run the followingcommand

$ python managepy bower install

It will download and store the required files into the ltpath_to_local_copygtmodoboabower_components directory

Test your modifications

If you deployed a specific instance for your development needs you can run the tests suite as follows

gt python managepy test modoboacore modoboalib modoboaadmin modoboalimits modoboararr˓relaydomains

Otherwise you can run the tests suite from the repository using tox

Start a basic Modoboa instance

From the repository run the following command to launch a simple instance with a few fixtures

gt tox -e serve

You can use adminpassword to log in

Build the documentation

If you need to modify the documenation and want to see the result you can build it as follows

gt tox -e docgt firefox toxdoctmphtmlindexhtml

FAQ

bower command is missing in managepy

bower command is missing in managepy if you donrsquot use the --devel option of the modoboa-adminpydeploy command

To fix it regenerate your instance or update your settingspy file manually Look at devmode in httpsgithubcomtonioomodoboablobmastermodoboacorecommandstemplatessettingspytpl

Create a new plugin

Introduction

Modoboa offers a plugin API to expand its capabilities The current implementation provides the following possibili-ties

26 How to contribute 51

Modoboa Documentation Release 1100

bull Expand navigation by adding entry points to your plugin inside the GUI

bull Access and modify administrative objects (domains mailboxes etc)

bull Register callback actions for specific events

Plugins are nothing more than Django applications with an extra piece of code that integrates them into Modoboa Themodo_extensionpy file will contain a complete description of the plugin

bull Admin and user parameters

bull Custom menu entries

The communication between both applications is provided by Django signals

The following subsections describe the plugin architecture and explain how you can create your own

The required glue

To create a new plugin just start a new django application like this (into Modoboarsquos directory)

$ python managepy startapp

Then you need to register this application using the provided API Just copypaste the following example into themodo_extensionpy file of the future extension

from modoboacoreextensions import ModoExtension exts_pool

class MyExtension(ModoExtension)My custom Modoboa extension

name = myextlabel = My Extensionversion = 01description = A descriptionurl = myext_root_location optional name is used if not defined

def load(self)This method is called when Modoboa loads available and activated plugins

Declare parameters and register events herepass

def load_initial_data(self)Optional provide initial data for your extension herepass

exts_poolregister_extension(MyExtension)

Once done simply add your extensionrsquos module name to the MODOBOA_APPS variable located inside settingspy Finally run the following commands

$ python managepy migrate$ python managepy load_initial_data$ python managepy collectstatic

52 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Parameters

A plugin can declare its own parameters There are two levels available

bull lsquoGlobalrsquo parameters used to configure the plugin editable inside the Admin gt Settings gt Parameters page

bull lsquoUserrsquo parameters per-user parameters (or preferences) editable inside the Options gt Preferences page

Playing with parameters

Parameters are defined using Django forms and Modoboa adds two special forms you can inherit depending on thelevel of parameter(s) you want to add

bull modoboaparametersformsAdminParametersForm for general parameters

bull modoboaparametersformsUserParametersForm for user parameters

To register new parameters add the following line into the load method of your plugin class

from modoboaparameters import tools as param_toolsparam_toolsregistryadd(

LEVEL YourForm ugettext_lazy(Title))

Replace LEVEL by global or user

Custom role permissions

Modoboa uses Djangorsquos internal permission system Administrative roles are nothing more than groups (Groupinstances)

An extension can add new permissions to a group by listening to the extra_role_permissions signal Here isan example

from djangodispatch import receiverfrom modoboacore import signals as core_signals

PERMISSIONS = Resellers [

(relaydomains relaydomain add_relaydomain)(relaydomains relaydomain change_relaydomain)(relaydomains relaydomain delete_relaydomain)(relaydomains service add_service)(relaydomains service change_service)(relaydomains service delete_service)

]

receiver(core_signalsextra_role_permissions)def extra_role_permissions(sender role kwargs)

Add permissions to the Resellers groupreturn constantsPERMISSIONSget(role [])

Extending admin forms

The forms used to edit objects (account domain etc) through the admin panel are composed of tabs You can extendthem (ie add new tabs) in a pretty easy way thanks to custom signals

26 How to contribute 53

Modoboa Documentation Release 1100

Account

To add a new tab to the account edition form define new listeners (handlers) for the following signals

bull modoboaadminsignalsextra_account_forms

bull modoboaadminsignalsget_account_form_instances

bull modoboaadminsignalscheck_extra_account_form (optional)

Example

from djangodispatch import receiverfrom modoboaadmin import signals as admin_signals

receiver(admin_signalsextra_account_forms)def extra_account_form(sender user account kwargs)

return [id tabid title Title cls MyFormClass

]

receiver(admin_signalsget_account_form_instances)def fill_my_tab(sender user account kwargs)

return id my_instance

Domain

To add a new tab to the domain edition form define new listeners (handlers) for the following signals

bull modoboaadminsignalsextra_domain_forms

bull modoboaadminsignalsget_domain_form_instances

Example

from djangodispatch import receiverfrom modoboaadmin import signals as admin_signals

receiver(admin_signalsextra_domain_forms)def extra_account_form(sender user domain kwargs)

return [id tabid title Title cls MyFormClass

]

receiver(admin_signalsget_domain_form_instances)def fill_my_tab(sender user domain kwargs)

return id my_instance

27 Contributors

bull Antidot

bull Bearstech

bull CAP-REL

54 Chapter 2 Table of contents

Modoboa Documentation Release 1100

bull Dalnix

27 Contributors 55

  • Overview
  • Table of contents
Page 5: Modoboa Documentation

Modoboa Documentation Release 1100

2 Contents

CHAPTER 1

Overview

Modoboa is a mail hosting and management platform including a modern and simplified Web User Interface designedto work with Postfix and Dovecot

It is extensible by nature and comes with a lot of additional extensions

Name Description Documentationmodoboa-amavis A frontend for Amavis httpsmodoboa-amavisreadthedocs

iomodoboa-dmarc A set of tools to use DMARC httpsgithubcommodoboa

modoboa-dmarcmodoboa-imap-migration

Migrate mailboxes from an existing server usingIMAP (and offlineimap)

httpsgithubcommodoboamodoboa-imap-migration

modoboa-pdfcredentials

Generate PDF documents containing account cre-dentials

httpsgithubcommodoboamodoboa-pdfcredentials

modoboa-pfxadmin-migrate

A tool to migrate from Postfixadmin httpsgithubcommodoboamodoboa-pfxadmin-migrate

modoboa-postfix-autoreply

Away message editor (postfix compatible) httpsmodoboa-postfix-autoreplyreadthedocsio

modoboa-radicale A frontend for Radicale httpsmodoboa-radicalereadthedocsio

modoboa-sievefilters

A Sieve filters (rules) editor httpsmodoboa-sievefiltersreadthedocsio

modoboa-stats Graphical statistics (message traffic and more) httpsmodoboa-statsreadthedocsiomodoboa-webmail A simple webmail httpsmodoboa-webmail

readthedocsio

3

Modoboa Documentation Release 1100

4 Chapter 1 Overview

CHAPTER 2

Table of contents

21 Installation

211 Requirements

You will need a Server to perform well with at least

bull CPU 2

bull RAM 2GB

bull Disk 10GB

bull Python 3

Note Heads up for modoboa versions 115 and later

Python 2 support has been dropped with modoboa version 115 If you still have Python 2 installed on your systemeither uninstall it or force modoboa user to run with Python 3

212 Recommended way

If you start from scratch and want to deploy a complete mail server you will love the modoboa installer It is theeasiest and the quickest way to setup a fully functional server (modoboa postfix dovecot amavis and more) on onemachine

Warning For now only Debian and CentOS based Linux distributions are supported We do our best to improvecompatibility but if you use another Linux or a UNIX system you will have to install Modoboa manually

To use it just run the following commands in your terminal

5

Modoboa Documentation Release 1100

gt git clone httpsgithubcommodoboamodoboa-installergt cd modoboa-installergt sudo runpy ltyour domaingt

if you get this warning - lsquousrbinenv lsquopythonrsquo No such file or directoryrsquo do make sure sure python is installed onyour server Sometimes python is installed but the installer canrsquot detect it or which python version to run especiallyon a debian based system Then run this command first

gt sudo apt-get install python-virtualenv python-pip

Wait a few minutes and yoursquore done o

213 Manual installation

For those who need a manual installation or who just want to setup a specific part here are the steps you must follow

Modoboa

This section describes the installation of the web interface (a Django project)

Prepare the system

First of all we recommend the following context

bull A dedicated system user

bull A virtual environment to install the application because it will isolate it (and its dependencies) from the rest ofyour system

The following example illustrates how to realize this on Debian-based distributions using virtualenv

apt-get install virtualenv python3-pip useradd modoboa create a dedicated user su -l modoboa log in as the newly created user$ virtualenv --python python3 env create the virtual environment$ source envbinactivate activate the virtual environment

Modoboa depends on external tools and some of them require compilation so you need a compiler and a few C librariesMake sure to install the following system packages according to your distribution

Debian Ubuntubuild-essential python3-dev libxml2-dev libxslt-dev libjpeg-dev librrd-dev rrdtool libffi-dev libssl-dev

CentOSgcc gcc-c++ python3-devel libxml2-devel libxslt-devel libjpeg-turbo-devel rrdtool-devel rrdtool libffi-devel

Note Alternatively you could rely on your distribution packages for the Modoboa dependencies which requirecompilation - eg psycopg2 - if the version is compatible In this case you have to create your virtual environmentwith the --system-site-packages option

Then install Modoboa by running

6 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(env)$ pip install modoboa

Database

Warning This documentation does not cover the installation of a database server but only the setup of a functionaldatabase that Modoboa will use

Thanks to Django Modoboa is compatible with the following databases

bull PostgreSQL

bull MySQL MariaDB

bull SQLite

Since the last one does not require particular actions only the first two ones are described You should also read thenotes for those database backends on the official Django documentation

PostgreSQL

Install the corresponding Python binding

(env)$ pip install psycopg2

Note Alternatively you can install the python3-psycopg2 package instead on Debian-based distributions ifyour virtual environment was created with --system-site-packages option

Then create a user and a database For example to create the modoboa database owned by a modoboa user run thefollowing commands on your PostgreSQL server

sudo -l -u postgres createuser --no-createdb modoboa sudo -l -u postgres createdb --owner=modoboa modoboa

MySQL MariaDB

Install the corresponding Python binding

(env)$ pip install mysqlclient

Note Alternatively you can install the python3-mysqldb package instead on Debian-based distributions if yourvirtual environment was created with --system-site-packages option

Note MariaDB 102 (and newer) require mysqlclient 1311 (or newer)

Then create a user and a database For example to create the modoboa database owned by a modoboa user run thefollowing SQL commands

21 Installation 7

Modoboa Documentation Release 1100

CREATE DATABASE modoboaCREATE USER modoboalocalhost IDENTIFIED BY my-strong-password-hereGRANT ALL PRIVILEGES ON modoboa TO modoboalocalhost

Deploy an instance

modoboa-adminpy is a command line tool that lets you deploy a ready-to-use Modoboa site To create a newinstance into instance you just have to run the following command

(env)$ modoboa-adminpy deploy instance --collectstatic --domain lthostname of your servergt --dburl defaultltdatabase urlgt

Note You can install additional extensions during the deploy process To do so use the --extensions op-tion which accepts a list of names as argument (--extensions ext1 ext2 ) If you want to install allextensions just use the all keyword like this --extensions all

If you choose to install extensions one at a time you will have to add their names in settingspy to MODOBOA_APPSAlso ensure that you have the line from modoboa_amavissettings import at the end of this file

The list of available extensions can be found on the index page Instructions to install them are available on eachextensions page

Note You can specify more than one database connection using the --dburl option Multiple connections aredifferentiated by a prefix

The primary connection must use the default prefix (as shown in the example above) For the amavis exten-sion use the amavis prefix For example --dburl defaultltdatabase urlgt amavisltdatabaseurlgt

A database url should meet the following syntax ltmysql|postgresgt[userpass][hostport]dbname OR sqlitefullpathtoyourdatabasefilesqlite

The command will ask you a few questions answer them and yoursquore done

If you need a silent installation (eg if yoursquore using Salt-Stack Ansible or whatever) itrsquos possible to supply thedatabase credentials as command line arguments

You can consult the complete option list by running the following command

(env)$ modoboa-adminpy help deploy

Cron jobs

A few recurring jobs must be configured to make Modoboa works as expected

Create a new file for example etccrondmodoboa and put the following content inside

Modoboa specific cron jobsPYTHON=ltpath to Python binary inside the virtual environmentgtINSTANCE=ltpath to Modoboa instancegt

(continues on next page)

8 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

Operations on mailboxes

vmail $PYTHON $INSTANCEmanagepy handle_mailbox_operations

Generate DKIM keys (they will belong to the user running this job)

root umask 077 ampamp $PYTHON $INSTANCEmanagepy modo manage_dkim_rarr˓keys

Sessions table cleanup0 0 modoboa $PYTHON $INSTANCEmanagepy clearsessions Logs table cleanup0 0 modoboa $PYTHON $INSTANCEmanagepy cleanlogs DNSBL checks

30 modoboa $PYTHON $INSTANCEmanagepy modo check_mx Public API communication0 modoboa $PYTHON $INSTANCEmanagepy communicate_with_public_api

Policy daemon

Modoboa comes with a built-in Policy Daemon for Postfix Current features are

bull Define daily sending limits for domains andor accounts

A redis server is required to run this new daemon

You can launch it manually using the following command

(env)gt python managepy policy_daemon

But we recommend an automatic start using systemd or supervisor Here is a configuration example forsupervisor

[programpolicyd]autostart=trueautorestart=truecommand=srvmodoboaenvbinpython srvmodoboainstancemanagepy policy_daemondirectory=srvmodoboaredirect_stderr=trueuser=modoboanumprocs=1

It will listen by default on 127001 and port 9999 The policy daemon wonrsquot do anything unless you tell postfixto use it

Now you can continue to the Web server section

Web server

Note The following instructions are meant to help you get your site up and running quickly However it is notpossible for the people contributing documentation to Modoboa to test every single combination of web server wsgiserver distribution etc So it is possible that your installation of uwsgi or nginx or Apache or what-have-you worksdifferently Keep this in mind

21 Installation 9

Modoboa Documentation Release 1100

Apache2

First make sure that mod_wsgi is installed on your server

Create a new virtualhost in your Apache configuration and put the following content inside

ltVirtualHost 80gtServerName ltyour valuegtDocumentRoot ltmodoboa_instance_pathgt

Alias media ltmodoboa_instance_pathgtmedialtDirectory ltmodoboa_instance_pathgtmediagtOrder denyallowAllow from all

ltDirectorygt

Alias sitestatic ltmodoboa_instance_pathgtsitestaticltDirectory ltmodoboa_instance_pathgtsitestaticgtOrder denyallowAllow from all

ltDirectorygt

WSGIScriptAlias ltmodoboa_instance_pathgtltinstance_namegtwsgipy

Pass Authorization header to enable API usageWSGIPassAuthorization On

ltVirtualHostgt

This is just one possible configuration

To use mod_wsgi daemon mode add the two following directives just under WSGIScriptAlias

WSGIDaemonProcess examplecom python-path=ltmodoboa_instancegtltvirtualenv pathgtlibrarr˓python37site-packagesWSGIProcessGroup examplecom

Replace values between ltgt with yours If you donrsquot use a virtualenv just remove the last part of theWSGIDaemonProcess directive

Note You will certainly need more configuration in order to launch Apache

Now you can go the Dovecot section to continue the installation

Nginx

This section covers two different ways of running Modoboa behind Nginx using a WSGI application server Choosethe one you prefer between Green Unicorn or uWSGI

In both cases yoursquoll need to download and install nginx

Green Unicorn

Firstly Download and install gunicorn Then use the following sample gunicorn configuration (create a new filenamed gunicornconfpy inside Modoboarsquos root dir)

10 Chapter 2 Table of contents

Modoboa Documentation Release 1100

backlog = 2048bind = unixvarrungunicornmodoboasockpidfile = varrungunicornmodoboapiddaemon = Truedebug = Falseworkers = 2logfile = varloggunicornmodoboalogloglevel = info

To start gunicorn execute the following commands

$ cd ltmodoboa dirgt$ gunicorn -c gunicornconfpy ltmodoboa dirgtwsgiapplication

Now the nginx part Just create a new virtual host and use the following configuration

upstream modoboa server unixvarrungunicornmodoboasock fail_timeout=0

server listen 443 sslssl onkeepalive_timeout 70

server_name lthost fqdngtroot ltmodoboa_instance_pathgt

access_log varlognginxlthost fqdngtaccesslogerror_log varlognginxlthost fqdngterrorlog

ssl_certificate ltssl certificate for your sitegtssl_certificate_key ltssl certificate key for your sitegt

location sitestatic autoindex on

location media autoindex on

location proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_forproxy_set_header Host $http_hostproxy_redirect offproxy_set_header X-Forwarded-Protocol sslproxy_pass httpmodoboa

If you do not plan to use SSL then change the listen directive to listen 80 and delete each of the followingdirectives

ssl onkeepalive_timeout 70ssl_certificate ltssl certificate for your sitegt

(continues on next page)

21 Installation 11

Modoboa Documentation Release 1100

(continued from previous page)

ssl_certificate_key ltssl certificate key for your sitegtproxy_set_header X-Forwarded-Protocol ssl

If you do plan to use SSL yoursquoll have to generate a certificate and a key This article contains information about howto do it

Paste this content to your configuration (replace values between ltgt with yours) and restart nginx

Now you can go the Dovecot section to continue the installation

uWSGI

The following setup is meant to get you started quickly You should read the documentation of both nginx and uwsgito understand how to optimize their configuration for your site

The Django documentation includes the following warning regarding uwsgi

Warning Use uwsgi 126 or newer If you do not you will run into problems Modoboa will fail in obscureways

To use this setup first download and install uwsgi

Here is a sample nginx configuration

server listen 443 sslssl onkeepalive_timeout 70

server_name lthost fqdngtroot ltmodoboas settings dirgt

ssl_certificate ltssl certificate for your sitegtssl_certificate_key ltssl certificate key for your sitegt

access_log varlognginxlthost fqdngtaccesslogerror_log varlognginxlthost fqdngterrorlog

location ltmodoboas root urlgtsitestatic autoindex onalias ltlocation of sitestatic on your file systemgt

Whether or not Modoboa uses a media directory depends on how you configured Modoboa It does not hurt to have thislocation ltmodoboas root urlgtmedia

autoindex onalias ltlocation of media on your file systemgt

This denies access to any file that begins with ht Apaches htaccess and htpasswd are such files A Modoboa installed from scratch would not contain any such files but you never know what the future holds

(continues on next page)

12 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

location ~ ht deny all

location ltmodobas root urlgt include uwsgi_paramsuwsgi_pass ltuwsgi portgtuwsgi_param UWSGI_SCRIPT ltmodoboa instance namegtwsgiapplicationuwsgi_param UWSGI_SCHEME https

ltmodoboa instance namegt must be replaced by the value you used when you deployed your instance

If you do not plan to use SSL then change the listen directive to listen 80 and delete each of the followingdirectives

ssl onkeepalive_timeout 70ssl_certificate ltssl certificate for your sitegtssl_certificate_key ltssl certificate key for your sitegtuwsgi_param UWSGI_SCHEME https

If you do plan to use SSL yoursquoll have to generate a certificate and a key This article contains information about howto do it

Make sure to replace the ltgt in the sample configuration with appropriate values Here are some explanations forthe cases that may not be completely self-explanatory

ltmodoboas settings dirgt Where Modoboarsquos settingspy resides This is also where thesitestatic and media directories reside

ltmodoboas root urlgt This is the URL which will be the root of your Modoboa site at your domain For in-stance if your Modoboa installation is reachable at at httpsfoomodoboa then ltmodoboas rooturlgt is modoboa In this case you probably also have to set the alias directives to point to where Mod-oboarsquos sitestatic and media directories are because otherwise nginx wonrsquot be able to find them

If Modoboa is at the root of your domain then ltmodoboa root urlgt is an empty string and can be deletedfrom the configuration above In this case you probably do not need the alias directives

ltuwsgi portgt The location where uwsig is listening It could be a unix domain socket or an addressport combi-nation Ubuntu configures uwsgi so that the port is

unixrunuwsgiappltapp namegtsocket

where ltapp namegt is the name of the application

Your uwsgi configuration should be

[uwsgi] Not needed when using uwsgi from pip plugins = pythonchdir = ltmodoboas top dirgtmodule = ltnamegtwsgiapplicationmaster = trueharakiri = 60processes = 4vhost = trueno-default-app = true

21 Installation 13

Modoboa Documentation Release 1100

The plugins directive should be turned on if you use a uwsgi installation that requires it If uwsgi was installed frompip it does not require it In the configuration above

ltmodoboas top dirgt The directory where managepy resides This directory is the parent of ltmodoboassettings dirgt

ltnamegt The name that you passed to modoboa-adminpy deploy when you created your Modoboa instance

Now you can go the Dovecot section to continue the installation

Dovecot

Modoboa requires Dovecot 2+ to work so the following documentation is suitable for this combination

In this section we assume dovecotrsquos configuration resides in etcdovecot all pathes will be relative to thisdirectory

Mailboxes

First edit the confd10-mailconf and set the mail_location variable

maildirmail_location = maildir~maildir

Then edit the inbox namespace and add the following lines

inbox = yes

mailbox Drafts auto = subscribespecial_use = Drafts

mailbox Junk

auto = subscribespecial_use = Junk

mailbox Sent

auto = subscribespecial_use = Sent

mailbox Trash

auto = subscribespecial_use = Trash

With dovecot 21+ it ensures all the special mailboxes will be automaticaly created for new accounts

For dovecot 20 and older use the autocreate plugin

Operations on the file system

14 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning Modoboa needs to access the dovecot binary to check its version To find the binary path weuse the which command first and then try known locations (usrsbindovecot and usrlocalsbindovecot) If you installed dovecot in a custom location please tell us where the binary is by usingthe DOVECOT_LOOKUP_PATH setting (see settingspy)

Three operation types are considered

1 Mailbox creation

2 Mailbox renaming

3 Mailbox deletion

The first one is managed by Dovecot The last two ones may be managed by Modoboa if it can access the file systemwhere the mailboxes are stored (see General parameters to activate this feature)

Those operations are treated asynchronously by a cron script For example when you rename an e-mail addressthrough the web UI the associated mailbox on the file system is not modified directly Instead of that a renameorder is created for this mailbox The mailbox will be considered unavailable until the order is executed (see Postfixconfiguration)

Edit the crontab of the user who owns the mailboxes on the file system

$ crontab -u ltusergt -e

And add the following line inside

python ltmodoboa_sitegtmanagepy handle_mailbox_operations

Warning The cron script must be executed by the system user owning the mailboxes

Warning The user running the cron script must have access to the settingspy file of the modoboa instance

The result of each order is recorded into Modoboarsquos log Go to Modoboa gt Logs to consult them

Authentication

To make the authentication work edit the confd10-authconf and uncomment the following line at the end

include auth-systemconfextinclude auth-sqlconfextinclude auth-ldapconfextinclude auth-passwdfileconfextinclude auth-checkpasswordconfextinclude auth-vpopmailconfextinclude auth-staticconfext

Then edit the confdauth-sqlconfext file and add the following content inside

passdb sql driver = sql Path for SQL configuration file see example-configdovecot-sqlconfext

(continues on next page)

21 Installation 15

Modoboa Documentation Release 1100

(continued from previous page)

args = etcdovecotdovecot-sqlconfext

userdb sql driver = sqlargs = etcdovecotdovecot-sqlconfext

Make sure to activate only one backend (per type) inside your configuration (just comment the other ones)

Edit the dovecot-sqlconfext and modify the configuration according to your database engine

MySQL users

driver = mysql

connect = host=ltmysqld socketgt dbname=ltdatabasegt user=ltusergt password=ltpasswordgt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user WHERE email=Lu andrarr˓is_active=1

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid concat(bytes= mbquota M) AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

PostgreSQL users

driver = pgsql

connect = host=ltpostgres socketgt dbname=ltdatabasegt user=ltusergt password=ltpasswordgt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user u INNER JOIN admin_rarr˓mailbox mb ON uid=mbuser_id INNER JOIN admin_domain dom ON mbdomain_id=domidrarr˓WHERE uemail=Lu AND uis_active AND domenabled

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid bytes= || mbquota || M AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

16 Chapter 2 Table of contents

Modoboa Documentation Release 1100

SQLite users

driver = sqlite

connect = ltpath to the sqlite db filegt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user u INNER JOIN admin_rarr˓mailbox mb ON uid=mbuser_id INNER JOIN admin_domain dom ON mbdomain_id=domidrarr˓WHERE uemail=Lu AND uis_active=1 AND domenabled=1

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid (bytes= || mbquota || M) AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

Note Replace values between ltgt with yours

LDAP

To make the LDAP authentication work edit the confd10-authconf and uncomment the following line atthe end

include auth-ldapconfext

Then edit the confdauth-ldapconfext and edit the passdb section as following You should comment theuserdb section which will be managed by SQL with modoboa database

passdb driver = ldap

Path for LDAP configuration file see example-configdovecot-ldapconfextargs = etcdovecotdovecot-ldapconfext

userdb driver = ldapargs = etcdovecotdovecot-ldapconfext

Default fields can be used to specify defaults that LDAP may overridedefault_fields = home=homevirtualu

Your own dovecot LDAP configuration file is now etcdovecotdovecot-ldapconfext You can addyour default LDAP conf in it following the official documentation

Synchronize dovecot LDAP conf with modoboa LDAP conf

To make dovecot LDAP configuration synchronized with modoboa LDAP configuration you should create a dedicateddovecot conf file At the end of your dovecot configuration file (dovecot-ldapconfext) add the following

21 Installation 17

Modoboa Documentation Release 1100

line

include_try dovecot-modoboaconfext

Then set modoboa parameter Enable Dovecot LDAP sync to Yes Then set the Dovecot LDAP config file following theprevious step (etcdovecotdovecot-modoboaconfext in the example)

The last step is to add the command update_dovecot_conf to the cron job of modoboa Then each time your modoboaLDAP configuration is updated your dovecot LDAP configuration will also be

LMTP

Local Mail Transport Protocol is used to let Postfix deliver messages to Dovecot

First make sure the protocol is activated by looking at the protocols setting (generally inside dovecotconf)It should be similar to the following example

protocols = imap pop3 lmtp

Then open the confd10-masterconf look for lmtp service definition and add the following content inside

service lmtp stuff beforeunix_listener varspoolpostfixprivatedovecot-lmtp mode = 0600user = postfixgroup = postfix

stuff after

We assume here that Postfix is chrooted within varspoolpostfix

Finally open the confd20-lmtpconf and modify it as follows

protocol lmtp postmaster_address = postmasterltdomaingtmail_plugins = $mail_plugins quota sieve

Replace ltdomaingt by the appropriate value

Note If you donrsquot plan to apply quota or to use filters just adapt the content of the mail_plugins setting

Quota

Modoboa lets adminstrators define per-domain andor per-account limits (quota) It also lists the current quota usageof each account Those features require Dovecot to be configured in a specific way

Inside confd10-mailconf add the quota plugin to the default activated ones

mail_plugins = quota

Inside confd10-masterconf update the dict service to set proper permissions

18 Chapter 2 Table of contents

Modoboa Documentation Release 1100

service dict If dict proxy is used mail processes should have access to its socket For example mode=0660 group=vmail and global mail_access_groups=vmailunix_listener dict mode = 0600user = ltuser owning mailboxesgtgroup =

Inside confd20-imapconf activate the imap_quota plugin

protocol imap

mail_plugins = $mail_plugins imap_quota

Inside dovecotconf activate the quota SQL dictionary backend

dict quota = ltdrivergtetcdovecotdovecot-dict-sqlconfext

Inside confd90-quotaconf activate the quota dictionary backend

plugin quota = dictUser quotaproxyquota

It will tell Dovecot to keep quota usage in the SQL dictionary

Finally edit the dovecot-dict-sqlconfext file and put the following content inside

connect = host=ltdb hostgt dbname=ltdb namegt user=ltdb usergt password=ltpasswordgt SQLite users connect = pathtothedatabasedb

map pattern = privquotastoragetable = admin_quotausername_field = usernamevalue_field = bytes

map

pattern = privquotamessagestable = admin_quotausername_field = usernamevalue_field = messages

PostgreSQL users

21 Installation 19

Modoboa Documentation Release 1100

Database schema update

The admin_quota table is created by Django but unfortunately it doesnrsquot support DEFAULT constraints (it onlysimulates them when the ORM is used) As PostgreSQL is a bit strict about constraint violations you must executethe following query manually

db=gt ALTER TABLE admin_quota ALTER COLUMN bytes SET DEFAULT 0db=gt ALTER TABLE admin_quota ALTER COLUMN messages SET DEFAULT 0

Trigger

As indicated on Dovecotrsquos wiki you need a trigger to properly update the quota

A working copy of this trigger is available on Github

Download this file and copy it on the server running postgres Then execute the following commands

$ su - postgres$ psql [modoboa database] lt pathtomodoboa_postgres_triggersql$ exit

Replace [modoboa database] by the appropriate value

Forcing recalculation

For existing installations Dovecot (gt 2) offers a command to recalculate the current quota usages For example if youwant to update all usages run the following command

$ doveadm quota recalc -A

Be carefull it can take a while to execute

ManageSieveSieve

Modoboa lets users define filtering rules from the web interface To do so it requires ManageSieve to be activated onyour server

Inside confd20-managesieveconf make sure the following lines are uncommented

protocols = $protocols sieve

service managesieve-login

service managesieve

protocol sieve

20 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Messages filtering using Sieve is done by the LDA

Inside confd15-ldaconf activate the sieve plugin like this

protocol lda Space separated list of plugins to load (default is global mail_plugins)mail_plugins = $mail_plugins sieve

Finally configure the sieve plugin by editing the confd90-sieveconf file Put the follwing caontent inside

plugin Location of the active script When ManageSieve is used this is actually a symlink pointing to the active script in the sieve storage directorysieve = ~dovecotsieve

The path to the directory where the personal Sieve scripts are stored For ManageSieve this is where the uploaded scripts are storedsieve_dir = ~sieve

Restart Dovecot

Now you can go to the Postfix section to finish the installation

Last-login tracking

To update the last_login attribute of an account after a succesful IMAP or POP3 login you can configure apost-login script

Open confd10-masterconf add the following configuration (imap and pop3 services are already definedyou just need to update them)

service imap executable = imap postlogin

service pop3 executable = pop3 postlogin

service postlogin executable = script-login usrlocalbinpostloginshuser = modoboaunix_listener postlogin

Then you must create a script named usrlocalbinpostloginsh According to your database enginethe content will differ

PostgreSQL

21 Installation 21

Modoboa Documentation Release 1100

binsh

psql -c UPDATE core_user SET last_login=now() WHERE username=$USER gt devnull

exec $

MySQL

binsh

DBNAME=XXXDBUSER=XXXDBPASSWORD=XXX

echo UPDATE core_user SET last_login=now() WHERE username=$USER | mysql -urarr˓$DBUSER -p$DBPASSWORD $DBNAME

exec $

Postfix

This section gives an example about building a simple virtual hosting configuration with Postfix Refer to the officialdocumentation for more explanation

Map files

You first need to create configuration files (or map files) that will be used by Postfix to lookup into Modoboa tables

To automaticaly generate the requested map files and store them in a directory run the following command

gt cd ltmodoboa_instance_pathgtgt python managepy generate_postfix_maps --destdir ltdirectorygt

ltdirectorygt is the directory where the files will be stored Answer the few questions and yoursquore done

Configuration

Use the following configuration in the etcpostfixmaincf file (this is just one possible configuration)

Stuff beforevirtual_transport = lmtpunixprivatedovecot-lmtp

virtual_mailbox_domains = ltdrivergtetcpostfixsql-domainscfvirtual_alias_domains = ltdrivergtetcpostfixsql-domain-aliasescfvirtual_alias_maps = ltdrivergtetcpostfixsql-aliasescf

relay_domains = ltdrivergtetcpostfixsql-relaydomainscftransport_maps =

ltdrivergtetcpostfixsql-transportcfltdrivergtetcpostfixsql-spliteddomains-transportcf

(continues on next page)

22 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

smtpd_recipient_restrictions = check_recipient_access

ltdrivergtetcpostfixsql-maintaincfltdrivergtetcpostfixsql-relay-recipient-verificationcf

permit_mynetworksreject_unauth_destinationreject_unverified_recipient

smtpd_sender_login_maps = ltdrivergtetcpostfixsql-sender-login-mapcf

smtpd_sender_restrictions =reject_sender_login_mismatch

Stuff after

Replace ltdrivergt by the name of the database you use

Restart Postfix

Policy daemon

If you want to enable the built-in policy daemon add the following content to the etcpostfixmaincf file

smtpd_recipient_restrictions = check_policy_service inet1270019999

And reload postfix

Note The check_policy_service line must be placed before the permit_mynetworks one otherwise thedaemon wonrsquot be called

OpenDKIM

Modoboa can generate DKIM keys for the hosted domains but it wonrsquot sign or check messages To do that you needa dedicated software like OpenDKIM

Note The cron job in charge of creating DKIM keys must be run using the same user than OpenDKIM (ie opendkimin most cases)

Database

Since keys related information is stored in Modoboarsquos database you need to tell OpenDKIM how it can access it

First make sure to install the required additional packages on your system (libopendbx1- on debian baseddistributions or opendbx- on CentOS the complete name depends on your database engine)

Then insert the following SQL view into Modoboarsquos database

21 Installation 23

Modoboa Documentation Release 1100

PostgreSQL

CREATE OR REPLACE VIEW dkim AS (SELECT id name as domain_name dkim_private_key_path AS private_key_path

dkim_key_selector AS selectorFROM admin_domain WHERE enable_dkim

)

MySQLMariaDB

CREATE OR REPLACE VIEW dkim AS (SELECT id name as domain_name dkim_private_key_path AS private_key_path

dkim_key_selector AS selectorFROM admin_domain WHERE enable_dkim=1

)

Configuration

You should find OpenDKIMrsquos configuration file at etcopendkimconf

Add the following content to it

KeyTable dsnltdrivergtltusergtltpasswordgtltdb hostgtltdb namegttable=dkimrarr˓keycol=iddatacol=domain_nameselectorprivate_key_pathSigningTable dsnltdrivergtltusergtltpasswordgtltdb hostgtltdb namegttable=dkimrarr˓keycol=domain_namedatacol=idSocket inet12345localhost

Replace values between ltgt by yours Accepted values for driver are pgsql or mysql Make sure the user youspecify has read permission on the view created previously

If you run a debian based system make sure to adjust the following setting in the etcdefaultopendkim file

SOCKET=inet12345localhost

Eventually reload OpenDKIM

Postfix integration

Add the following lines to the etcpostfixmaincf file

smtpd_milters = inet12700112345non_smtpd_milters = inet12700112345milter_default_action = acceptmilter_content_timeout = 30s

and reload postfix

Extensions

Only few commands are needed to add a new extension to your setup

24 Chapter 2 Table of contents

Modoboa Documentation Release 1100

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install ltEXTENSIONgt==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Then restart your web server

22 Upgrade

221 Modoboa

Warning The new version you are going to install may need to modify your database Before you start makesure to backup everything

Most of the time upgrading your installation to a newer Modoboa version only requires a few actions In every caseyou will need to apply the general procedure first and then check if the version you are installing requires specificactions

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install modoboa==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Once done check if the version you are installing requires Specific instructions

Finally restart your web server

Sometimes you might need to upgrade postfix map files too To do so just run the generate_postfix_mapscommand on the same directory than the one used for installation (etcpostfix by default)

Make sure to use root privileges and run the following command

gt python managepy generate_postfix_maps --destdir ltdirectorygt

Then reload postfix

22 Upgrade 25

Modoboa Documentation Release 1100

222 Extensions

If a new version is available for an extension yoursquore using it is recommanded to install it Upgrading an extensions ispretty and the procedure is almost the same than the one used for Modoboa

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install ltEXTENSIONgt==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Finally restart your web server

It is a generic upgrade procedure which will be enough most of the time but it is generally a good idea to check theassociated documentation

223 Rebuild Virtual Environment

Sometimes when upgrading your Operating System (eg from Ubuntu 1704 to Ubuntu 1710) your virtual environmentrunning modoboa can get corrupted Your first response will be to panic but fear not The solution is in this document

First things first

Recover your database password

You will need to recover your database password (if using mysql or postgresql) You will find this in etcpostfixsql-aliasescf or any file with sql-cf in the etcpostfix directory

Make note of this as you will need it when reconfiguring modoboa

Reinstall Modoboa

Start out by backup up your modoboa settings file located in the modoboa instance directory (srvmodoboainstanceinstancesettingspy if you used the default installer configuration) This contains your currentconfiguration

Next you want to remove all current modoboa files

After doing this follow the manual installation instructions for Modoboa only as everything should be working prop-erly

After this completes simply restore your backed up settings file to srvinstanceinstancesettingspy(if you used installer default configuration) You will then need to reinstall your extensions

You can find which plugins you had in your settingspy file under the MODOBOA_APPS variable

Instructions to install extensions can also be found here

Once you have completed this step you will need to run the following commands

26 Chapter 2 Table of contents

Modoboa Documentation Release 1100

gt (env) $ cd ltinstance_dirgtgt (env) $ python managepy migrategt (env) $ python managepy collectstatic

You will then see a message similar to

You have requested to collect static files at the destinationlocation as specified in your settings

srvmodoboainstancesitestatic

This will overwrite existing filesAre you sure you want to do this

Type yes to continue or no to cancel

You will want to answer yes here then simply restart the uwsgi process with service uwsgi restart andyou should be up and running again

Simply log into your modoboa web panel and verify that your extensions and webmail box is working

224 Information

Rebuild instructions from httpshelppythonanywherecompagesRebuildingVirtualenvs

225 Specific instructions

1160

A new policy daemon has been added

Make sure to have a Redis instance running on your server

Add modoboapolicyd to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboapolicyd

)

Add the following settings to your settingspy file

REDIS_HOST = ltIP or hostname heregtREDIS_PORT = 6379REDIS_QUOTA_DB = 0REDIS_URL = redisformat(REDIS_HOST REDIS_PORT REDIS_QUOTA_DB)

Once done you can start the policy daemon using the following commands

22 Upgrade 27

Modoboa Documentation Release 1100

gt python managepy policy_daemon

Donrsquot forget to configure _policyd_config if you want to use this feature

The modoboa-stats plugin has been merged into the core

Add modoboamaillog to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboapolicydmodoboamaillog

)

And remove any reference to modoboa_stats in this same variable

1150

This version drops Python 2 support so donrsquot forget to update all the extensions you use

Warning If you upgrade an existing python 2 installation you will need to create a new Python 3 virtualenvironment You can remove the existing virtual environment and replace it by the new one so you wonrsquot have tomodify your configuration files

Add the following new setting

DISABLE_DASHBOARD_EXTERNAL_QUERIES = False

Reload uwsgigunicornapache depending on your setup

Finally Make sure to use root privileges and run the following command

gt python managepy generate_postfix_maps --destdir ltdirectorygt

Then reload postfix

1140

This release introduces an optional LDAP synchronization process If you want to use it please follow the dedicatedprocedure

1131

Upgrade postfix maps files as follows

28 Chapter 2 Table of contents

Modoboa Documentation Release 1100

gt python managepy generate_postfix_maps --destdir ltpathgt --force-overwrite

1130

Add modoboadnstools to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstools

)

Add the following new settings

CSRF_COOKIE_SECURE = TrueSESSION_COOKIE_SECURE = True

modoboa-postfix-autoreply 150

Edit the etcpostfixmaincf file and remove the sql-autoreplies-transportcf map from thetransport_maps if present Remove the corresponding proxy_read_maps entry if relevant

Reload postfix

1100

Warning Upgrade installed extensions BEFORE running check or migrate commands

Upgrade all your installed plugins to the following versions

Warning If you use the amavis plugin make sure to include its configuration as follows into settingspy

from modoboa_amavis import settings as modoboa_amavis_settingsmodoboa_amavis_settingsapply(globals())

22 Upgrade 29

Modoboa Documentation Release 1100

Name Versionmodoboa-amavis 120modoboa-contacts 050modoboa-dmarc 110modoboa-imap-migration 120modoboa-pdfcredentials 130modoboa-postfix-autoreply 140modoboa-radicale 120modoboa-sievefilters 140modoboa-stats 140modoboa-webmail 140

Edit the settingspy file and apply the following modifications

Add modoboatransport to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparameters

)

Replace the following line

MIDDLEWARE_CLASSES = (

by

MIDDLEWARE = (

Update postfix map files as follows

gt rm -f ltpathgtmodoboa-postfix-mapschkgt python managepy generate_postfix_maps --force --destdir ltpathgt

Then modify postfixrsquos configuration as follows

smtpd_sender_login_maps =ltdrivergtltpathgtsql-sender-login-mapcf

transport_maps =ltdrivergtltpathgtsql-transportcfltdrivergtltpathgtsql-spliteddomains-transportcf other map files

Replace ltdrivergt and ltpathgt by your values

If transport_maps contains sql-relaydomains-transportcf remove it

30 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning If you make use of postfixrsquos proxymap server you must also update the proxy_read_maps setting

Reload postfix

Add the following cron job in order to generate DKIM keys

Generate DKIM keys (they will belong to the user running this job)

root $PYTHON $INSTANCEmanagepy modorarr˓manage_dkim_keys

190

If you want to manage inactive accounts look at Cleaning inactive accounts

183

Edit the settingspy file and replace the following line

BASE_DIR = ospathdirname(ospathdirname(__file__))

by

BASE_DIR = ospathrealpath(ospathdirname(ospathdirname(__file__)))

180

Modoboa now relies on Djangorsquos builtin password validation system to validate user passwords instead ofdjango-passwords

Remove django-passwords from your system

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt pip uninstall django-passwords

Edit the settingspy file and remove the following content

django-passwords

PASSWORD_MIN_LENGTH = 8

PASSWORD_COMPLEXITY = UPPER 1LOWER 1DIGITS 1

Add the following lines

Password validation rulesAUTH_PASSWORD_VALIDATORS = [

NAME djangocontribauthpassword_validation

rarr˓UserAttributeSimilarityValidator (continues on next page)

22 Upgrade 31

Modoboa Documentation Release 1100

(continued from previous page)

NAME djangocontribauthpassword_validationMinimumLengthValidator

NAME djangocontribauthpassword_validationCommonPasswordValidator

NAME djangocontribauthpassword_validationNumericPasswordValidator

NAME modoboacorepassword_validationComplexityValidatorOPTIONS

upper 1lower 1digits 1specials 0

]

172

API documentation has evolved (because of the upgrade to Django Rest Framework 36) and CKeditor is now embed-ded by default (thanks to the django-ckeditor package) Some configuration changes are required

Edit your settingspy file and apply the following modifications

bull Update the INSTALLED_APPS variable as follows

INSTALLED_APPS = (djangocontribauthdjangocontribcontenttypesdjangocontribsessionsdjangocontribmessagesdjangocontribsitesdjangocontribstaticfilesreversionckeditorckeditor_uploaderrest_frameworkrest_frameworkauthtoken

)

bull Update the REST_FRAMEWORK variable as follows

REST_FRAMEWORK = DEFAULT_AUTHENTICATION_CLASSES (

rest_frameworkauthenticationTokenAuthenticationrest_frameworkauthenticationSessionAuthentication

)

bull Remove the SWAGGER_SETTINGS variable

bull Add the following content

32 Chapter 2 Table of contents

Modoboa Documentation Release 1100

CKeditor

CKEDITOR_UPLOAD_PATH = uploads

CKEDITOR_IMAGE_BACKEND = pillow

CKEDITOR_RESTRICT_BY_USER = True

CKEDITOR_BROWSE_SHOW_DIRS = True

CKEDITOR_ALLOW_NONIMAGE_FILES = False

CKEDITOR_CONFIGS = default

allowedContent Truetoolbar Modoboawidth Nonetoolbar_Modoboa [

[Bold Italic Underline][JustifyLeft JustifyCenter JustifyRight JustifyBlock][BidiLtr BidiRtl Language][NumberedList BulletedList - Outdent Indent][Undo Redo][Link Unlink Anchor - Smiley][TextColor BGColor - Source][Font FontSize][Image ][SpellChecker]

]

Donrsquot forget to run the following command

gt python managepy collectstatic

171

If you used 170 for a fresh installation please run the following commands

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy load_initial_data

170

This version requires Django gt= 110 so you need to make some modifications It also brings internal API changeswhich are not backward compatible so installed extensions must be upgraded too

First of all deactivate all installed extensions (edit the settingspy file and comment the corresponding lines inMODOBOA_APPS)

Edit the urlspy file of your local instance and replace its content by the following one

22 Upgrade 33

Modoboa Documentation Release 1100

from djangoconfurls import include url

urlpatterns = [url(r include(modoboaurls))

]

Edit the settingspy and apply the following changes

bull Add modoboaparameters to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboarelaydomainsmodoboalimitsmodoboaparameters Modoboa extensions here

)

bull Add modoboacoremiddlewareLocalConfigMiddleware to MIDDLEWARE_CLASSES

MIDDLEWARE_CLASSES = (djangocontribsessionsmiddlewareSessionMiddlewaredjangomiddlewarecommonCommonMiddlewaredjangomiddlewarecsrfCsrfViewMiddlewaredjangocontribauthmiddlewareAuthenticationMiddlewaredjangocontribmessagesmiddlewareMessageMiddlewaredjangomiddlewarelocaleLocaleMiddlewaredjangomiddlewareclickjackingXFrameOptionsMiddlewaremodoboacoremiddlewareLocalConfigMiddlewaremodoboalibmiddlewareAjaxLoginRedirectmodoboalibmiddlewareCommonExceptionCatchermodoboalibmiddlewareRequestCatcherMiddleware

)

bull Modoboa used to provide a custom authentication backend (modoboalibauthbackendsSimpleBackend) but it has been removed Replace it as follows

AUTHENTICATION_BACKENDS = ( Other backends beforedjangocontribauthbackendsModelBackend

)

bull Remove TEMPLATE_CONTEXT_PROCESSORS and replace it by

TEMPLATES = [

BACKEND djangotemplatebackendsdjangoDjangoTemplatesDIRS []APP_DIRS TrueOPTIONS

context_processors [djangotemplatecontext_processorsdebugdjangotemplatecontext_processorsrequestdjangocontribauthcontext_processorsauth

(continues on next page)

34 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

djangotemplatecontext_processorsi18ndjangotemplatecontext_processorsmediadjangotemplatecontext_processorsstaticdjangotemplatecontext_processorstzdjangocontribmessagescontext_processorsmessagesmodoboacorecontext_processorstop_notifications

]debug False

]

Run the following commands (load virtualenv if you use one)

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstatic

Finally upgrade your extensions and reactivate them

Name Versionmodoboa-amavis 110modoboa-dmarc 100modoboa-imap-migration 110modoboa-pdfcredentials 110modoboa-postfix-autoreply 120modoboa-radicale 110modoboa-sievefilters 110modoboa-stats 110modoboa-webmail 110

Command line shortcuts

$ pip install modoboa-amavis==110$ pip install modoboa-dmarc==100$ pip install modoboa-imap-migration==110$ pip install modoboa-pdfcredentials==110$ pip install modoboa-postfix-autoreply==120$ pip install modoboa-radicale==110$ pip install modoboa-sievefilters==110$ pip install modoboa-stats==110$ pip install modoboa-webmail==110

And please make sure you use the latest version of the django-versionfield2 package

$ pip install -U django-versionfield2

Notes about quota changes and resellers

Reseller users now have a quota option in Resources tab This is the quota that a reseller can share between all itsdomains

22 Upgrade 35

Modoboa Documentation Release 1100

There are two quotas for a domain in the new version

1 Quota amp

2 Default mailbox quota

[1] Quota quota shared between mailboxes This quota is shared between all the mailboxes of this domain This valuecannot exceed resellerrsquos quota and hence cannot be 0(unlimited) if reseller has finite quota

[2] Default mailbox quota default quota applied to mailboxes This quota is the default quota applied to new mail-boxes This value cannot exceed Quota[1] and hence cannot be 0(unlimited) if Quota[1] is finite

161

First of all update postfix map files as follows

gt python managepy generate_postfix_maps --destdir ltpathgt --force-overwrite

Then modify postfixrsquos configuration as follows

smtpd_sender_login_maps =ltdrivergtltpathgtsql-sender-login-mailboxescfltdrivergtltpathgtsql-sender-login-aliasescfltdrivergtltpathgtsql-sender-login-mailboxes-extracf

Replace ltdrivergt and ltpathgt by your values

Finally reload postfix

This release also deprecates some internal functions As a result several extensions has been updated to maintain thecompatibility If you enabled the notification service yoursquoll find the list of available updates directly in your Modoboaconsole

For the others here is the list

Name Versionmodoboa-amavis 1010modoboa-postfix-autoreply 117modoboa-radicale 105modoboa-stats 109

Command line shortcut

$ pip install modoboa-amavis==1010$ pip install modoboa-postfix-autoreply==117$ pip install modoboa-radicale==105$ pip install modoboa-stats==109

160

Warning You have to upgrade extensions due to coreUser model attribute change (usergroup to userrole) Oth-erwise you will have an internal error after upgrade In particular modoboa-amavisd modoboa-stats modoboa-postfix-autoreply are concerned

36 Chapter 2 Table of contents

Modoboa Documentation Release 1100

An interesting feature brougth by this version is the capability to make different checks about MX records Forexample Modoboa can query main DNSBL providers for every defined domain With this you will quickly know ifone the domains you manage is listed or not To activate it add the following line to your crontab

30 ltoptional_virtualenv_pathgtpython ltmodoboa_instance_dirgtmanagepy modorarr˓check_mx

The communication with Modoboa public API has been reworked Instead of sending direct synchronous queries (forexample to check new versions) a cron job has been added To activate it add the following line to your crontab

0 ltoptional_virtualenv_pathgtpython ltmodoboa_instance_dirgtmanagepyrarr˓communicate_with_public_api

Please also note that public API now uses TLS so you must update your configuration as follows

MODOBOA_API_URL = httpsapimodoboaorg1

Finally it is now possible to declare additional sender addresses on a per-account basis You need to update your postfixconfiguration in order to use this functionality Just edit the maincf file and change the following parameter

smtpd_sender_login_maps =ltdrivergtetcpostfixsql-sender-login-mailboxescfltdrivergtetcpostfixsql-sender-login-aliasescfltdrivergtetcpostfixsql-sender-login-mailboxes-extracf

150

The API has been greatly improved and a documentation is now available To enable it addrest_framework_swagger to the INSTALLED_APPS variable in settingspy as follows

INSTALLED_APPS = (djangocontribauthdjangocontribcontenttypesdjangocontribsessionsdjangocontribmessagesdjangocontribsitesdjangocontribstaticfilesreversionrest_frameworkauthtokenrest_framework_swagger

)

Then add the following content into settingspy just after the REST_FRAMEWORK variable

SWAGGER_SETTINGS = is_authenticated Falseapi_version 10exclude_namespaces []info

contact contactmodoboacomdescription (Modoboa API requires a valid token)title Modoboa API

Yoursquore done The documentation is now available at the following address

22 Upgrade 37

Modoboa Documentation Release 1100

httpltyour instance addressgtdocsapi

Finally if you find a TEMPLATE_CONTEXT_PROCESSORS variable in your settingspy file make sure it lookslike this

TEMPLATE_CONTEXT_PROCESSORS = global_settingsTEMPLATE_CONTEXT_PROCESSORS + [modoboacorecontext_processorstop_notifications

]

140

Warning Please make sure to use Modoboa 135 with an up-to-date database before an upgrade to 140

Warning Do not follow the regular upgrade procedure for this version

Some extension have been moved back into the main repository The main reason for that is that using Modoboawithout them doesnrsquot make sense

First of all you must rename the following applications listed inside the MODOBOA_APPS variable

Old name New namemodoboa_admin modoboaadminmodoboa_admin_limits modoboalimitsmodoboa_admin_relaydomains modoboarelaydomains

Then apply the following steps

1 Uninstall old extensions

$ pip uninstall modoboa-admin modoboa-admin-limits modoboa-admin-relaydomains

2 Install all extension updates using pip (check the Modoboa gt Information page)

3 Manually migrate database

$ cd ltinstance_dirgt$ python managepy migrate auth$ python managepy migrate admin 0001 --fake$ python managepy migrate admin$ python managepy migrate limits 0001 --fake$ python managepy migrate relaydomains 0001 --fake$ python managepy migrate

4 Finally update static files

$ python managepy collectstatic

This version also introduces a REST API To enable it

1 Add rest_frameworkauthtoken to the INSTALLED_APPS variable

2 Add the following configuration inside settingspy

38 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Rest framework settings

REST_FRAMEWORK = DEFAULT_AUTHENTICATION_CLASSES (

rest_frameworkauthenticationTokenAuthentication)DEFAULT_PERMISSION_CLASSES (

rest_frameworkpermissionsIsAuthenticated)

3 Run the following command

$ python managepy migrate

135

To enhance security Modoboa now checks the strength of user passwords lthttpsgithubcomdstufftdjango-passwordsgt_

To use this feature add the following configuration into the settingspy file

django-passwords

PASSWORD_MIN_LENGTH = 8

PASSWORD_COMPLEXITY = UPPER 1LOWER 1DIGITS 1

132

Modoboa now uses the atomic requests mode to preserve database consistency (reference)

To enable it update the DATABASES variable in settingspy as follows

DATABASES = default

stuff beforeATOMIC_REQUESTS True

amavis

stuff beforeATOMIC_REQUESTS True

130

This release does not bring awesome new features but it is a necessary bridge to the future of Modoboa All extensionsnow have their own git repository and the deploy process has been updated to reflect this change

22 Upgrade 39

Modoboa Documentation Release 1100

Another important update is the use of Django 17 Besides its new features the migration system has been reworkedand is now more robust than before

Before we begin with the procedure here is a table showing old extension names and their new name

Old name New package name New module namemodoboaextensionsadmin modoboa-admin modoboa_adminmodoboaextensionslimits modoboa-admin-limits modoboa_admin_limitsmodoboaextensionspostfix_autoreply modoboa-postfix-autoreply modoboa_postfix_autoreplymodoboaextensionspostfix_relay_domains modoboa-admin-relaydomains modoboa_admin_relaydomainsmodoboaextensionsradicale modoboa-radicale modoboa_radicalemodoboaextensionssievefilters modoboa-sievefilters modoboa_sievefiltersmodoboaextensionsstats modoboa-stats modoboa_statsmodoboaextensionswebmail modoboa-webmail modoboa_webmail

Here are the required steps

1 Install the extensions using pip (look at the second column in the table above)

$ pip install ltthe extensions you wantgt

2 Remove south from INSTALLED_APPS

3 Rename old extension names inside MODOBOA_APPS (look at the third column in the table above)

4 Remove modoboalibmiddlewareExtControlMiddleware from MIDDLEWARE_CLASSES

5 Change DATABASE_ROUTERS to

DATABASE_ROUTERS = [modoboa_amavisdbrouterAmavisRouter]

6 Run the following commands

$ cd ltmodoboa_instance_dirgt$ python managepy migrate

7 Reply yes to the question

8 Run the following commands

$ python managepy load_initial_data$ python managepy collectstatic

9 The cleanup job has been renamed in Django so you have to modify your crontab entry

- 0 0 ltmodoboa_sitegtmanagepy cleanup+ 0 0 ltmodoboa_sitegtmanagepy clearsessions

120

A new notification service let administrators know about new Modoboa versions To activate it you need to updatethe TEMPLATE_CONTEXT_PROCESSORS variable like this

from djangoconf import global_settings

TEMPLATE_CONTEXT_PROCESSORS = global_settingsTEMPLATE_CONTEXT_PROCESSORS + (

(continues on next page)

40 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

modoboacorecontext_processorstop_notifications)

and to define the new MODOBOA_API_URL variable

MODOBOA_API_URL = httpapimodoboaorg1

The location of external static files has changed To use them add a new path to the STATICFILES_DIRS

Additional locations of static filesSTATICFILES_DIRS = (

Put strings here like homehtmlstatic or Cwwwdjangostatic Always use forward slashes even on Windows Dont forget to use absolute paths not relative pathsltpathtomodoboainstalldirgtbower_components

)

Run the following commands to define the hostname of your instance

$ cd ltmodoboa_instance_dirgt$ python managepy set_default_site lthostnamegt

If you plan to use the Radicale extension

1 Add modoboaextensionsradicale to the MODOBOA_APPS variable

2 Run the following commands

$ cd ltmodoboa_instance_dirgt$ python managepy syncdb

Warning You also have to note that the sitestatic directory has moved from ltpath to your sitesdirgt to ltmodoboas root urlgt (itrsquos probably the parent directory) You have to adapt your web serverconfiguration to reflect this change

23 Configuration

231 Online parameters

Modoboa provides online panels to modify internal parameters There are two available levels

bull Application level global parameters define how the application behaves Available at Modoboa gt Parameters

bull User level per user customization Available at User gt Settings gt Preferences

Regardless level parameters are displayed using tabs each tab corresponding to one application

General parameters

The admin application exposes several parameters they are presented below

23 Configuration 41

Modoboa Documentation Release 1100

Name Tab Description Default valueAuthentication type General The backend used for au-

thenticationLocal

Default password scheme General Scheme used to cryptmailbox passwords

crypt

Rounds General Number of rounds (onlyused by sha256cryptand sha512crypt) Mustbe between 1000 and999999999 inclusive

70000

Secret key General A key used to encryptusersrsquo password in ses-sions

random value

Sender address General Email address used tosend notifications

Enable communication General Enable communicationwith Modoboa public API

yes

Check new versions General Automatically checks if anewer version is available

yes

Send statistics General Send statistics to Mod-oboa public API (countersand used extensions)

yes

Top notifications check in-terval

General Interval between two topnotification checks (inseconds)

30

Maximum log record age General The maximum age in daysof a log record

365

Items per page General Number of displayeditems per page

30

Default top redirection General The default redirectionused when no applicationis specified

userprefs

Enable MX checks Admin Check that every domainhas a valid MX record

yes

Valid MXs Admin A list of IP or networkaddress every MX shouldmatch A warning will besent if a record does notrespect this it

Enable DNSBL checks Admin Check every domainagainst major DNSBLproviders

yes

DKIM keys storage direc-tory

AdminPath to a directory where DKIM

generated keys willbe stored

Default DKIM key length Admin The default size (in bits)for new keys

2048

Handle mailboxes onfilesystem

Admin Rename or remove mail-boxes on the filesystemwhen they get renamed orremoved within Modoboa

no

Mailboxes owner Admin The UNIX account whoowns mailboxes on thefilesystem

vmail

Default domain quota Admin Default quota (in MB) ap-plied to freshly createddomains with no valuespecified A value of 0means no quota

0

Automatic accountremoval

Admin When a mailbox is re-moved also remove theassociated account

no

Automatic do-mainmailbox creation

Admin Create a domain and amailbox when an accountis automatically created

yes

42 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Note If you are not familiar with virtual domain hosting you should take a look at postfixrsquos documentation ThisHow to also contains useful information

Note A random secret key will be generated each time the Parameters page is refreshed and until you save parametersat least once

Note Specific LDAP parameters are also available see LDAP authentication

232 Media files

Modoboa uses a specific directory to upload files (ie when the webmail is in use) or to create ones (ex graphical statis-tics) This directory is named media and is located inside modoboarsquos installation directory (called modoboa_sitein this documentation)

To work properly the system user which runs modoboa (www-data apache whatever) must have write access tothis directory

233 Customization

Custom logo

You have the possibility to use a custom logo instead of the default one on the login page

To do so open the settingspy file and add a MODOBOA_CUSTOM_LOGO variable This variable must containthe relative URL of your logo under MEDIA_URL For example

MODOBOA_CUSTOM_LOGO = ospathjoin(MEDIA_URL custom_logopng)

Then copy your logo file into the directory indicated by MEDIA_ROOT

234 Host configuration

Note This section is only relevant when Modoboa handles mailboxes renaming and removal from the filesystem

To manipulate mailboxes on the filesystem you must allow the user who runs Modoboa to execute commands as theuser who owns mailboxes

To do so edit the etcsudoers file and add the following inside

ltuser_that_runs_modoboagt ALL=(ltmailboxes ownergt) NOPASSWD ALL

Replace values between ltgt by the ones you use

23 Configuration 43

Modoboa Documentation Release 1100

235 Time zone and language

Modoboa is available in many languages

To specify the default language to use edit the settingspy file and modify the LANGUAGE_CODE variable

LANGUAGE_CODE = fr or en for english etc

Note Each user has the possibility to define the language he prefers

In the same configuration file specify the timezone to use by modifying the TIME_ZONE variable For example

TIME_ZONE = EuropeParis

236 Sessions management

Modoboa uses Djangorsquos session framework to store per-user information

Few parameters need to be set in the settingspy configuration file to make Modoboa behave as expected

SESSION_EXPIRE_AT_BROWSER_CLOSE = False Default value

This parameter is optional but you must ensure it is set to False (the default value)

The default configuration file provided by the modoboa-adminpy command is properly configured

237 Logging authentication

To trace login attempts to the web interface Modoboa uses python SysLogHandler so you can see them in your syslogauthentication log file (varlogauthlog in most cases)

Depending on your configuration you may have to edit the settingspy file and add lsquoaddressrsquo lsquodevlogrsquo to thelogging section

syslog-auth class logginghandlersSysLogHandlerfacility SysLogHandlerLOG_AUTHaddress devlogformatter syslog

238 External authentication

LDAP

Modoboa supports external LDAP authentication using the following extra components

bull Python LDAP client

bull Django LDAP authentication backend

If you want to use this feature you must first install those components

44 Chapter 2 Table of contents

Modoboa Documentation Release 1100

$ pip install python-ldap django-auth-ldap

Then all you have to do is to modify the settingspy file Add a new authentication backend to the AUTHENTI-CATION_BACKENDS variable like this

AUTHENTICATION_BACKENDS = (modoboalibauthbackendsLDAPBackend modoboalibauthbackendsLDAPSecondaryBackend Useful for a fallback

rarr˓mechanismdjangocontribauthbackendsModelBackend

)

Finally go to Modoboa gt Parameters gt General and set Authentication type to LDAP

From there new parameters will appear to let you configure the way Modoboa should connect to your LDAP serverThey are described just below

Name Description De-faultvalue

Server address The IP address of the DNS name of the LDAP server local-host

Server port The TCP port number used by the LDAP server 389Use a secureconnection

Use an SSLTLS connection to access the LDAP server no

Authenticationmethod

Choose the authentication method to use Directbind

User DN tem-plate (directbind mode)

The template used to construct a userrsquos DN It should contain one placeholder (ie(user)s)

Bind BN The distinguished name to use when binding to the LDAP server Leave empty for ananonymous bind

Bind password The password to use when binding to the LDAP server (with lsquoBind DNrsquo)Search base The distinguished name of the search baseSearch filter An optional filter string (eg lsquo(objectClass=person)rsquo) In order to be valid it must be

enclosed in parentheses(mail=(user)s)

Passwordattribute

The attribute used to store user passwords user-Pass-word

Active Direc-tory

Tell if the LDAP server is an Active Directory one no

Administratorgroups

Members of those LDAP Posix groups will be created ad domain administrators Uselsquorsquo characters to separate groups

Group type The type of group used by your LDAP directory Posix-Group

Groups searchbase

The distinguished name of the search base used to find groups

Do-mainmailboxcreation

Automatically create a domain and a mailbox when a new user is created just after thefirst successful authentication You will generally want to disable this feature whenthe relay domains extension is in use

yes

If you need additional parameters you will find a detailed documentation here

Once the authentication is properly configured the users defined in your LDAP directory will be able to connect to

23 Configuration 45

Modoboa Documentation Release 1100

Modoboa the associated domain and mailboxes will be automatically created if needed

The first time a user connects to Modoboa a local account is created if the LDAP username is a valid email addressBy default this account belongs to the SimpleUsers group and it has a mailbox

To automatically create domain administrators you can use the Administrator groups setting If a LDAP user belongsto one the listed groups its local account will belong to the DomainAdmins group In this case the username is notnecessarily an email address

Users will also be able to update their LDAP password directly from Modoboa

Note Modoboa doesnrsquot provide any synchronization mechanism once a user is registered into the database Anymodification done from the directory to a user account will not be reported to Modoboa (an email address change forexample) Currently the only solution is to manually delete the Modoboa record it will be recreated on the next userlogin

SMTP

It is possible to use an existing SMTP server as an authentication source To enable this feature edit the settingspy file and change the following setting

AUTHENTICATION_BACKENDS = (modoboalibauthbackendsSMTPBackenddjangocontribauthbackendsModelBackend

)

SMTP server location can be customized using the following settings

AUTH_SMTP_SERVER_ADDRESS = localhostAUTH_SMTP_SERVER_PORT = 25AUTH_SMTP_SECURED_MODE = None ssl or starttls are accepted

239 LDAP synchronization

Modoboa can synchronize accounts with an LDAP directory (tested with OpenLDAP) but this feature is not enabledby default To activate it add modoboaldapsync to MODOBOA_APPS in the settingspy file

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboaldapsync

)

and enable it from the admin panel

46 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning Make sure to install additional requirements otherwise it wonrsquot work

The following parameters are available and must be filled

Name Description Defaultvalue

Enable LDAP synchro-nization

Control LDAP synchronization state no

Bind DN The DN of a user with write permission to createupdate accountsBind password The associated passwordAccount DN template The template used to build account DNs (must contain a (user)s

placeholder

2310 Database maintenance

Cleaning the logs table

Modoboa logs administrator specific actions into the database A clean-up script is provided to automatically removeoldest records The maximum log record age can be configured through the online panel

To use it you can setup a cron job to run every night

0 0 ltmodoboa_sitegtmanagepy cleanlogs Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy cleanlogs

Cleaning the session table

Django does not provide automatic purging Therefore itrsquos your job to purge expired sessions on a regular basis

Django provides a sample clean-up script django-adminpy clearsessions That script deletes any sessionin the session table whose expire_date is in the past

For example you could setup a cron job to run this script every night

0 0 ltmodoboa_sitegtmanagepy clearsessions Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy clearsessions

Cleaning inactive accounts

Thanks to Last-login tracking it is now possible to monitor inactive accounts An account is considered inactive if nologin has been recorded for the last 30 days (this value can be changed through the admin panel)

A management command is available to disable or delete inactive accounts For example you could setup a cron jobto run it every night

23 Configuration 47

Modoboa Documentation Release 1100

0 0 ltmodoboa_sitegtmanagepy clean_inactive_accounts Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy clean_inactive_rarr˓accounts

The default behaviour is to disable accounts You can delete them using the --delete option

24 Moving to Modoboa

You have an existing platform and yoursquod like to move to Modoboa the following tools could help you

241 From postfixadmin

A dedicated command allows you to convert an existing postfixadmin database to a Modoboa one Consult the docu-mentation to know more about the process

242 Using CSV files

Modoboa allows you to import any object (domain domain alias mailbox and alias) using a simple CSV file encodedusing UTF8 Each line corresponds to a single object and must respect one of the following format

domain ltname stringgt ltquota integergt ltdefault mailbox quota integergt ltenabledrarr˓booleangtdomainalias ltname stringgt lttargeted domain stringgt ltenabled booleangtrelaydomain ltname stringgt lttarget host stringgt lttarget port integergt ltservicerarr˓stringgt ltenabled booleangt ltverify recipients booleangtaccount ltloginname stringgt ltpassword stringgt ltfirst name stringgt ltlast namerarr˓stringgt ltenabled booleangt ltgroup stringgt ltaddress stringgt ltquota integergt [rarr˓ltdomain stringgt ]alias ltaddress stringgt ltenabled booleangt ltrecipient stringgt

Boolean fields accept the following values true 1 yes y (case insensitive) Any other value will be evaluated asfalse

Warning The order does matter Objects are created sequencially so a domain must be created before itsmailboxes and aliases and a mailbox must created before its alias(es)

To actually import such a file

gt sudo -u ltmodoboa_usergt -igt source ltvirtualenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy modo import ltyour filegt

Available options can be listed using the following command

gt python managepy modo import -h

48 Chapter 2 Table of contents

Modoboa Documentation Release 1100

25 REST API

To ease the integration with external sources (software or other) Modoboa provides a REST API

Every installed instance comes with a ready-to-use API and a documentation You will find them using the followingurl patterns

bull API httplthostnamegtapiv1

bull Documentation httplthostnamegtdocsapi

An example of this documentation is available on the official demo

Using this API requires an authentication and for now only a token based authentication is supported To get a validtoken log-in to your instance with a super administrator go to Settings gt API and activate the API access Press theUpdate button and wait until the page is reloaded the token will be displayed

To make valid API calls every requests you send must embed this token within an Authorization HTTP header likethis

Authorization Token ltYOUR_TOKENgt

and the content type of those requests must be applicationjson

26 How to contribute

Contributions are always welcome If you want to submit a patch please respect the following rules

bull Open a pull request on the appropriate repository

bull Respect PEP8

bull Document your patch and respect PEP 257

bull Add unit tests and make sure the global coverage does not decrease

If all those steps are validated your contribution will generally be integrated

261 Table of contents

25 REST API 49

Modoboa Documentation Release 1100

Useful tips

You would like to work on Modoboa but you donrsquot know where to start Yoursquore at the right place Browse this pageto learn useful tips

Docker

A docker image is available for developers To use it you must install docker and docker-compose first

Then just run the following command

$ docker-compose up

It will start the docker environment and make a Modoboa instance available at httplocalhost8000

If you donrsquot want to use docker or need a more complex development setup go to the next section

Prepare a virtual environment

A virtual environment is a good way to setup a development environment on your machine

To do so run the following commands

$ python3 -m venv ltpathgt$ source ltpathgtbinactivate$ git clone httpsgithubcommodoboamodoboagit$ cd modoboa$ python setuppy develop$ pip install -r dev-requirementstxt

The develop command creates a symbolic link to your local copy so any modification you make will be automati-cally available in your environment no need to copy them

Deploy an instance for development

Warning Make sure to create a database before running this step The format of the database url is also describedin this page

Now that you have a running environment yoursquore ready to deploy a test instance

$ cd ltpathgt$ modoboa-adminpy deploy --dburl defaultltdatabase urlgt --domain localhost --develrarr˓instance$ python managepy runserver

Yoursquore ready to go You should be able to access Modoboa at httplocalhost8000 usingadminpassword as credentials

Manage static files

Modoboa uses bower (thanks to django-bower) to manage its CSS and javascript dependencies

50 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Those dependencies are listed in a file called dev_settingspy located inside the ltpath_to_local_copygtmodoboacore directory

If you want to add a new dependency just complete the BOWER_INSTALLED_APPS parameter and run the followingcommand

$ python managepy bower install

It will download and store the required files into the ltpath_to_local_copygtmodoboabower_components directory

Test your modifications

If you deployed a specific instance for your development needs you can run the tests suite as follows

gt python managepy test modoboacore modoboalib modoboaadmin modoboalimits modoboararr˓relaydomains

Otherwise you can run the tests suite from the repository using tox

Start a basic Modoboa instance

From the repository run the following command to launch a simple instance with a few fixtures

gt tox -e serve

You can use adminpassword to log in

Build the documentation

If you need to modify the documenation and want to see the result you can build it as follows

gt tox -e docgt firefox toxdoctmphtmlindexhtml

FAQ

bower command is missing in managepy

bower command is missing in managepy if you donrsquot use the --devel option of the modoboa-adminpydeploy command

To fix it regenerate your instance or update your settingspy file manually Look at devmode in httpsgithubcomtonioomodoboablobmastermodoboacorecommandstemplatessettingspytpl

Create a new plugin

Introduction

Modoboa offers a plugin API to expand its capabilities The current implementation provides the following possibili-ties

26 How to contribute 51

Modoboa Documentation Release 1100

bull Expand navigation by adding entry points to your plugin inside the GUI

bull Access and modify administrative objects (domains mailboxes etc)

bull Register callback actions for specific events

Plugins are nothing more than Django applications with an extra piece of code that integrates them into Modoboa Themodo_extensionpy file will contain a complete description of the plugin

bull Admin and user parameters

bull Custom menu entries

The communication between both applications is provided by Django signals

The following subsections describe the plugin architecture and explain how you can create your own

The required glue

To create a new plugin just start a new django application like this (into Modoboarsquos directory)

$ python managepy startapp

Then you need to register this application using the provided API Just copypaste the following example into themodo_extensionpy file of the future extension

from modoboacoreextensions import ModoExtension exts_pool

class MyExtension(ModoExtension)My custom Modoboa extension

name = myextlabel = My Extensionversion = 01description = A descriptionurl = myext_root_location optional name is used if not defined

def load(self)This method is called when Modoboa loads available and activated plugins

Declare parameters and register events herepass

def load_initial_data(self)Optional provide initial data for your extension herepass

exts_poolregister_extension(MyExtension)

Once done simply add your extensionrsquos module name to the MODOBOA_APPS variable located inside settingspy Finally run the following commands

$ python managepy migrate$ python managepy load_initial_data$ python managepy collectstatic

52 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Parameters

A plugin can declare its own parameters There are two levels available

bull lsquoGlobalrsquo parameters used to configure the plugin editable inside the Admin gt Settings gt Parameters page

bull lsquoUserrsquo parameters per-user parameters (or preferences) editable inside the Options gt Preferences page

Playing with parameters

Parameters are defined using Django forms and Modoboa adds two special forms you can inherit depending on thelevel of parameter(s) you want to add

bull modoboaparametersformsAdminParametersForm for general parameters

bull modoboaparametersformsUserParametersForm for user parameters

To register new parameters add the following line into the load method of your plugin class

from modoboaparameters import tools as param_toolsparam_toolsregistryadd(

LEVEL YourForm ugettext_lazy(Title))

Replace LEVEL by global or user

Custom role permissions

Modoboa uses Djangorsquos internal permission system Administrative roles are nothing more than groups (Groupinstances)

An extension can add new permissions to a group by listening to the extra_role_permissions signal Here isan example

from djangodispatch import receiverfrom modoboacore import signals as core_signals

PERMISSIONS = Resellers [

(relaydomains relaydomain add_relaydomain)(relaydomains relaydomain change_relaydomain)(relaydomains relaydomain delete_relaydomain)(relaydomains service add_service)(relaydomains service change_service)(relaydomains service delete_service)

]

receiver(core_signalsextra_role_permissions)def extra_role_permissions(sender role kwargs)

Add permissions to the Resellers groupreturn constantsPERMISSIONSget(role [])

Extending admin forms

The forms used to edit objects (account domain etc) through the admin panel are composed of tabs You can extendthem (ie add new tabs) in a pretty easy way thanks to custom signals

26 How to contribute 53

Modoboa Documentation Release 1100

Account

To add a new tab to the account edition form define new listeners (handlers) for the following signals

bull modoboaadminsignalsextra_account_forms

bull modoboaadminsignalsget_account_form_instances

bull modoboaadminsignalscheck_extra_account_form (optional)

Example

from djangodispatch import receiverfrom modoboaadmin import signals as admin_signals

receiver(admin_signalsextra_account_forms)def extra_account_form(sender user account kwargs)

return [id tabid title Title cls MyFormClass

]

receiver(admin_signalsget_account_form_instances)def fill_my_tab(sender user account kwargs)

return id my_instance

Domain

To add a new tab to the domain edition form define new listeners (handlers) for the following signals

bull modoboaadminsignalsextra_domain_forms

bull modoboaadminsignalsget_domain_form_instances

Example

from djangodispatch import receiverfrom modoboaadmin import signals as admin_signals

receiver(admin_signalsextra_domain_forms)def extra_account_form(sender user domain kwargs)

return [id tabid title Title cls MyFormClass

]

receiver(admin_signalsget_domain_form_instances)def fill_my_tab(sender user domain kwargs)

return id my_instance

27 Contributors

bull Antidot

bull Bearstech

bull CAP-REL

54 Chapter 2 Table of contents

Modoboa Documentation Release 1100

bull Dalnix

27 Contributors 55

  • Overview
  • Table of contents
Page 6: Modoboa Documentation

CHAPTER 1

Overview

Modoboa is a mail hosting and management platform including a modern and simplified Web User Interface designedto work with Postfix and Dovecot

It is extensible by nature and comes with a lot of additional extensions

Name Description Documentationmodoboa-amavis A frontend for Amavis httpsmodoboa-amavisreadthedocs

iomodoboa-dmarc A set of tools to use DMARC httpsgithubcommodoboa

modoboa-dmarcmodoboa-imap-migration

Migrate mailboxes from an existing server usingIMAP (and offlineimap)

httpsgithubcommodoboamodoboa-imap-migration

modoboa-pdfcredentials

Generate PDF documents containing account cre-dentials

httpsgithubcommodoboamodoboa-pdfcredentials

modoboa-pfxadmin-migrate

A tool to migrate from Postfixadmin httpsgithubcommodoboamodoboa-pfxadmin-migrate

modoboa-postfix-autoreply

Away message editor (postfix compatible) httpsmodoboa-postfix-autoreplyreadthedocsio

modoboa-radicale A frontend for Radicale httpsmodoboa-radicalereadthedocsio

modoboa-sievefilters

A Sieve filters (rules) editor httpsmodoboa-sievefiltersreadthedocsio

modoboa-stats Graphical statistics (message traffic and more) httpsmodoboa-statsreadthedocsiomodoboa-webmail A simple webmail httpsmodoboa-webmail

readthedocsio

3

Modoboa Documentation Release 1100

4 Chapter 1 Overview

CHAPTER 2

Table of contents

21 Installation

211 Requirements

You will need a Server to perform well with at least

bull CPU 2

bull RAM 2GB

bull Disk 10GB

bull Python 3

Note Heads up for modoboa versions 115 and later

Python 2 support has been dropped with modoboa version 115 If you still have Python 2 installed on your systemeither uninstall it or force modoboa user to run with Python 3

212 Recommended way

If you start from scratch and want to deploy a complete mail server you will love the modoboa installer It is theeasiest and the quickest way to setup a fully functional server (modoboa postfix dovecot amavis and more) on onemachine

Warning For now only Debian and CentOS based Linux distributions are supported We do our best to improvecompatibility but if you use another Linux or a UNIX system you will have to install Modoboa manually

To use it just run the following commands in your terminal

5

Modoboa Documentation Release 1100

gt git clone httpsgithubcommodoboamodoboa-installergt cd modoboa-installergt sudo runpy ltyour domaingt

if you get this warning - lsquousrbinenv lsquopythonrsquo No such file or directoryrsquo do make sure sure python is installed onyour server Sometimes python is installed but the installer canrsquot detect it or which python version to run especiallyon a debian based system Then run this command first

gt sudo apt-get install python-virtualenv python-pip

Wait a few minutes and yoursquore done o

213 Manual installation

For those who need a manual installation or who just want to setup a specific part here are the steps you must follow

Modoboa

This section describes the installation of the web interface (a Django project)

Prepare the system

First of all we recommend the following context

bull A dedicated system user

bull A virtual environment to install the application because it will isolate it (and its dependencies) from the rest ofyour system

The following example illustrates how to realize this on Debian-based distributions using virtualenv

apt-get install virtualenv python3-pip useradd modoboa create a dedicated user su -l modoboa log in as the newly created user$ virtualenv --python python3 env create the virtual environment$ source envbinactivate activate the virtual environment

Modoboa depends on external tools and some of them require compilation so you need a compiler and a few C librariesMake sure to install the following system packages according to your distribution

Debian Ubuntubuild-essential python3-dev libxml2-dev libxslt-dev libjpeg-dev librrd-dev rrdtool libffi-dev libssl-dev

CentOSgcc gcc-c++ python3-devel libxml2-devel libxslt-devel libjpeg-turbo-devel rrdtool-devel rrdtool libffi-devel

Note Alternatively you could rely on your distribution packages for the Modoboa dependencies which requirecompilation - eg psycopg2 - if the version is compatible In this case you have to create your virtual environmentwith the --system-site-packages option

Then install Modoboa by running

6 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(env)$ pip install modoboa

Database

Warning This documentation does not cover the installation of a database server but only the setup of a functionaldatabase that Modoboa will use

Thanks to Django Modoboa is compatible with the following databases

bull PostgreSQL

bull MySQL MariaDB

bull SQLite

Since the last one does not require particular actions only the first two ones are described You should also read thenotes for those database backends on the official Django documentation

PostgreSQL

Install the corresponding Python binding

(env)$ pip install psycopg2

Note Alternatively you can install the python3-psycopg2 package instead on Debian-based distributions ifyour virtual environment was created with --system-site-packages option

Then create a user and a database For example to create the modoboa database owned by a modoboa user run thefollowing commands on your PostgreSQL server

sudo -l -u postgres createuser --no-createdb modoboa sudo -l -u postgres createdb --owner=modoboa modoboa

MySQL MariaDB

Install the corresponding Python binding

(env)$ pip install mysqlclient

Note Alternatively you can install the python3-mysqldb package instead on Debian-based distributions if yourvirtual environment was created with --system-site-packages option

Note MariaDB 102 (and newer) require mysqlclient 1311 (or newer)

Then create a user and a database For example to create the modoboa database owned by a modoboa user run thefollowing SQL commands

21 Installation 7

Modoboa Documentation Release 1100

CREATE DATABASE modoboaCREATE USER modoboalocalhost IDENTIFIED BY my-strong-password-hereGRANT ALL PRIVILEGES ON modoboa TO modoboalocalhost

Deploy an instance

modoboa-adminpy is a command line tool that lets you deploy a ready-to-use Modoboa site To create a newinstance into instance you just have to run the following command

(env)$ modoboa-adminpy deploy instance --collectstatic --domain lthostname of your servergt --dburl defaultltdatabase urlgt

Note You can install additional extensions during the deploy process To do so use the --extensions op-tion which accepts a list of names as argument (--extensions ext1 ext2 ) If you want to install allextensions just use the all keyword like this --extensions all

If you choose to install extensions one at a time you will have to add their names in settingspy to MODOBOA_APPSAlso ensure that you have the line from modoboa_amavissettings import at the end of this file

The list of available extensions can be found on the index page Instructions to install them are available on eachextensions page

Note You can specify more than one database connection using the --dburl option Multiple connections aredifferentiated by a prefix

The primary connection must use the default prefix (as shown in the example above) For the amavis exten-sion use the amavis prefix For example --dburl defaultltdatabase urlgt amavisltdatabaseurlgt

A database url should meet the following syntax ltmysql|postgresgt[userpass][hostport]dbname OR sqlitefullpathtoyourdatabasefilesqlite

The command will ask you a few questions answer them and yoursquore done

If you need a silent installation (eg if yoursquore using Salt-Stack Ansible or whatever) itrsquos possible to supply thedatabase credentials as command line arguments

You can consult the complete option list by running the following command

(env)$ modoboa-adminpy help deploy

Cron jobs

A few recurring jobs must be configured to make Modoboa works as expected

Create a new file for example etccrondmodoboa and put the following content inside

Modoboa specific cron jobsPYTHON=ltpath to Python binary inside the virtual environmentgtINSTANCE=ltpath to Modoboa instancegt

(continues on next page)

8 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

Operations on mailboxes

vmail $PYTHON $INSTANCEmanagepy handle_mailbox_operations

Generate DKIM keys (they will belong to the user running this job)

root umask 077 ampamp $PYTHON $INSTANCEmanagepy modo manage_dkim_rarr˓keys

Sessions table cleanup0 0 modoboa $PYTHON $INSTANCEmanagepy clearsessions Logs table cleanup0 0 modoboa $PYTHON $INSTANCEmanagepy cleanlogs DNSBL checks

30 modoboa $PYTHON $INSTANCEmanagepy modo check_mx Public API communication0 modoboa $PYTHON $INSTANCEmanagepy communicate_with_public_api

Policy daemon

Modoboa comes with a built-in Policy Daemon for Postfix Current features are

bull Define daily sending limits for domains andor accounts

A redis server is required to run this new daemon

You can launch it manually using the following command

(env)gt python managepy policy_daemon

But we recommend an automatic start using systemd or supervisor Here is a configuration example forsupervisor

[programpolicyd]autostart=trueautorestart=truecommand=srvmodoboaenvbinpython srvmodoboainstancemanagepy policy_daemondirectory=srvmodoboaredirect_stderr=trueuser=modoboanumprocs=1

It will listen by default on 127001 and port 9999 The policy daemon wonrsquot do anything unless you tell postfixto use it

Now you can continue to the Web server section

Web server

Note The following instructions are meant to help you get your site up and running quickly However it is notpossible for the people contributing documentation to Modoboa to test every single combination of web server wsgiserver distribution etc So it is possible that your installation of uwsgi or nginx or Apache or what-have-you worksdifferently Keep this in mind

21 Installation 9

Modoboa Documentation Release 1100

Apache2

First make sure that mod_wsgi is installed on your server

Create a new virtualhost in your Apache configuration and put the following content inside

ltVirtualHost 80gtServerName ltyour valuegtDocumentRoot ltmodoboa_instance_pathgt

Alias media ltmodoboa_instance_pathgtmedialtDirectory ltmodoboa_instance_pathgtmediagtOrder denyallowAllow from all

ltDirectorygt

Alias sitestatic ltmodoboa_instance_pathgtsitestaticltDirectory ltmodoboa_instance_pathgtsitestaticgtOrder denyallowAllow from all

ltDirectorygt

WSGIScriptAlias ltmodoboa_instance_pathgtltinstance_namegtwsgipy

Pass Authorization header to enable API usageWSGIPassAuthorization On

ltVirtualHostgt

This is just one possible configuration

To use mod_wsgi daemon mode add the two following directives just under WSGIScriptAlias

WSGIDaemonProcess examplecom python-path=ltmodoboa_instancegtltvirtualenv pathgtlibrarr˓python37site-packagesWSGIProcessGroup examplecom

Replace values between ltgt with yours If you donrsquot use a virtualenv just remove the last part of theWSGIDaemonProcess directive

Note You will certainly need more configuration in order to launch Apache

Now you can go the Dovecot section to continue the installation

Nginx

This section covers two different ways of running Modoboa behind Nginx using a WSGI application server Choosethe one you prefer between Green Unicorn or uWSGI

In both cases yoursquoll need to download and install nginx

Green Unicorn

Firstly Download and install gunicorn Then use the following sample gunicorn configuration (create a new filenamed gunicornconfpy inside Modoboarsquos root dir)

10 Chapter 2 Table of contents

Modoboa Documentation Release 1100

backlog = 2048bind = unixvarrungunicornmodoboasockpidfile = varrungunicornmodoboapiddaemon = Truedebug = Falseworkers = 2logfile = varloggunicornmodoboalogloglevel = info

To start gunicorn execute the following commands

$ cd ltmodoboa dirgt$ gunicorn -c gunicornconfpy ltmodoboa dirgtwsgiapplication

Now the nginx part Just create a new virtual host and use the following configuration

upstream modoboa server unixvarrungunicornmodoboasock fail_timeout=0

server listen 443 sslssl onkeepalive_timeout 70

server_name lthost fqdngtroot ltmodoboa_instance_pathgt

access_log varlognginxlthost fqdngtaccesslogerror_log varlognginxlthost fqdngterrorlog

ssl_certificate ltssl certificate for your sitegtssl_certificate_key ltssl certificate key for your sitegt

location sitestatic autoindex on

location media autoindex on

location proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_forproxy_set_header Host $http_hostproxy_redirect offproxy_set_header X-Forwarded-Protocol sslproxy_pass httpmodoboa

If you do not plan to use SSL then change the listen directive to listen 80 and delete each of the followingdirectives

ssl onkeepalive_timeout 70ssl_certificate ltssl certificate for your sitegt

(continues on next page)

21 Installation 11

Modoboa Documentation Release 1100

(continued from previous page)

ssl_certificate_key ltssl certificate key for your sitegtproxy_set_header X-Forwarded-Protocol ssl

If you do plan to use SSL yoursquoll have to generate a certificate and a key This article contains information about howto do it

Paste this content to your configuration (replace values between ltgt with yours) and restart nginx

Now you can go the Dovecot section to continue the installation

uWSGI

The following setup is meant to get you started quickly You should read the documentation of both nginx and uwsgito understand how to optimize their configuration for your site

The Django documentation includes the following warning regarding uwsgi

Warning Use uwsgi 126 or newer If you do not you will run into problems Modoboa will fail in obscureways

To use this setup first download and install uwsgi

Here is a sample nginx configuration

server listen 443 sslssl onkeepalive_timeout 70

server_name lthost fqdngtroot ltmodoboas settings dirgt

ssl_certificate ltssl certificate for your sitegtssl_certificate_key ltssl certificate key for your sitegt

access_log varlognginxlthost fqdngtaccesslogerror_log varlognginxlthost fqdngterrorlog

location ltmodoboas root urlgtsitestatic autoindex onalias ltlocation of sitestatic on your file systemgt

Whether or not Modoboa uses a media directory depends on how you configured Modoboa It does not hurt to have thislocation ltmodoboas root urlgtmedia

autoindex onalias ltlocation of media on your file systemgt

This denies access to any file that begins with ht Apaches htaccess and htpasswd are such files A Modoboa installed from scratch would not contain any such files but you never know what the future holds

(continues on next page)

12 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

location ~ ht deny all

location ltmodobas root urlgt include uwsgi_paramsuwsgi_pass ltuwsgi portgtuwsgi_param UWSGI_SCRIPT ltmodoboa instance namegtwsgiapplicationuwsgi_param UWSGI_SCHEME https

ltmodoboa instance namegt must be replaced by the value you used when you deployed your instance

If you do not plan to use SSL then change the listen directive to listen 80 and delete each of the followingdirectives

ssl onkeepalive_timeout 70ssl_certificate ltssl certificate for your sitegtssl_certificate_key ltssl certificate key for your sitegtuwsgi_param UWSGI_SCHEME https

If you do plan to use SSL yoursquoll have to generate a certificate and a key This article contains information about howto do it

Make sure to replace the ltgt in the sample configuration with appropriate values Here are some explanations forthe cases that may not be completely self-explanatory

ltmodoboas settings dirgt Where Modoboarsquos settingspy resides This is also where thesitestatic and media directories reside

ltmodoboas root urlgt This is the URL which will be the root of your Modoboa site at your domain For in-stance if your Modoboa installation is reachable at at httpsfoomodoboa then ltmodoboas rooturlgt is modoboa In this case you probably also have to set the alias directives to point to where Mod-oboarsquos sitestatic and media directories are because otherwise nginx wonrsquot be able to find them

If Modoboa is at the root of your domain then ltmodoboa root urlgt is an empty string and can be deletedfrom the configuration above In this case you probably do not need the alias directives

ltuwsgi portgt The location where uwsig is listening It could be a unix domain socket or an addressport combi-nation Ubuntu configures uwsgi so that the port is

unixrunuwsgiappltapp namegtsocket

where ltapp namegt is the name of the application

Your uwsgi configuration should be

[uwsgi] Not needed when using uwsgi from pip plugins = pythonchdir = ltmodoboas top dirgtmodule = ltnamegtwsgiapplicationmaster = trueharakiri = 60processes = 4vhost = trueno-default-app = true

21 Installation 13

Modoboa Documentation Release 1100

The plugins directive should be turned on if you use a uwsgi installation that requires it If uwsgi was installed frompip it does not require it In the configuration above

ltmodoboas top dirgt The directory where managepy resides This directory is the parent of ltmodoboassettings dirgt

ltnamegt The name that you passed to modoboa-adminpy deploy when you created your Modoboa instance

Now you can go the Dovecot section to continue the installation

Dovecot

Modoboa requires Dovecot 2+ to work so the following documentation is suitable for this combination

In this section we assume dovecotrsquos configuration resides in etcdovecot all pathes will be relative to thisdirectory

Mailboxes

First edit the confd10-mailconf and set the mail_location variable

maildirmail_location = maildir~maildir

Then edit the inbox namespace and add the following lines

inbox = yes

mailbox Drafts auto = subscribespecial_use = Drafts

mailbox Junk

auto = subscribespecial_use = Junk

mailbox Sent

auto = subscribespecial_use = Sent

mailbox Trash

auto = subscribespecial_use = Trash

With dovecot 21+ it ensures all the special mailboxes will be automaticaly created for new accounts

For dovecot 20 and older use the autocreate plugin

Operations on the file system

14 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning Modoboa needs to access the dovecot binary to check its version To find the binary path weuse the which command first and then try known locations (usrsbindovecot and usrlocalsbindovecot) If you installed dovecot in a custom location please tell us where the binary is by usingthe DOVECOT_LOOKUP_PATH setting (see settingspy)

Three operation types are considered

1 Mailbox creation

2 Mailbox renaming

3 Mailbox deletion

The first one is managed by Dovecot The last two ones may be managed by Modoboa if it can access the file systemwhere the mailboxes are stored (see General parameters to activate this feature)

Those operations are treated asynchronously by a cron script For example when you rename an e-mail addressthrough the web UI the associated mailbox on the file system is not modified directly Instead of that a renameorder is created for this mailbox The mailbox will be considered unavailable until the order is executed (see Postfixconfiguration)

Edit the crontab of the user who owns the mailboxes on the file system

$ crontab -u ltusergt -e

And add the following line inside

python ltmodoboa_sitegtmanagepy handle_mailbox_operations

Warning The cron script must be executed by the system user owning the mailboxes

Warning The user running the cron script must have access to the settingspy file of the modoboa instance

The result of each order is recorded into Modoboarsquos log Go to Modoboa gt Logs to consult them

Authentication

To make the authentication work edit the confd10-authconf and uncomment the following line at the end

include auth-systemconfextinclude auth-sqlconfextinclude auth-ldapconfextinclude auth-passwdfileconfextinclude auth-checkpasswordconfextinclude auth-vpopmailconfextinclude auth-staticconfext

Then edit the confdauth-sqlconfext file and add the following content inside

passdb sql driver = sql Path for SQL configuration file see example-configdovecot-sqlconfext

(continues on next page)

21 Installation 15

Modoboa Documentation Release 1100

(continued from previous page)

args = etcdovecotdovecot-sqlconfext

userdb sql driver = sqlargs = etcdovecotdovecot-sqlconfext

Make sure to activate only one backend (per type) inside your configuration (just comment the other ones)

Edit the dovecot-sqlconfext and modify the configuration according to your database engine

MySQL users

driver = mysql

connect = host=ltmysqld socketgt dbname=ltdatabasegt user=ltusergt password=ltpasswordgt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user WHERE email=Lu andrarr˓is_active=1

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid concat(bytes= mbquota M) AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

PostgreSQL users

driver = pgsql

connect = host=ltpostgres socketgt dbname=ltdatabasegt user=ltusergt password=ltpasswordgt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user u INNER JOIN admin_rarr˓mailbox mb ON uid=mbuser_id INNER JOIN admin_domain dom ON mbdomain_id=domidrarr˓WHERE uemail=Lu AND uis_active AND domenabled

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid bytes= || mbquota || M AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

16 Chapter 2 Table of contents

Modoboa Documentation Release 1100

SQLite users

driver = sqlite

connect = ltpath to the sqlite db filegt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user u INNER JOIN admin_rarr˓mailbox mb ON uid=mbuser_id INNER JOIN admin_domain dom ON mbdomain_id=domidrarr˓WHERE uemail=Lu AND uis_active=1 AND domenabled=1

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid (bytes= || mbquota || M) AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

Note Replace values between ltgt with yours

LDAP

To make the LDAP authentication work edit the confd10-authconf and uncomment the following line atthe end

include auth-ldapconfext

Then edit the confdauth-ldapconfext and edit the passdb section as following You should comment theuserdb section which will be managed by SQL with modoboa database

passdb driver = ldap

Path for LDAP configuration file see example-configdovecot-ldapconfextargs = etcdovecotdovecot-ldapconfext

userdb driver = ldapargs = etcdovecotdovecot-ldapconfext

Default fields can be used to specify defaults that LDAP may overridedefault_fields = home=homevirtualu

Your own dovecot LDAP configuration file is now etcdovecotdovecot-ldapconfext You can addyour default LDAP conf in it following the official documentation

Synchronize dovecot LDAP conf with modoboa LDAP conf

To make dovecot LDAP configuration synchronized with modoboa LDAP configuration you should create a dedicateddovecot conf file At the end of your dovecot configuration file (dovecot-ldapconfext) add the following

21 Installation 17

Modoboa Documentation Release 1100

line

include_try dovecot-modoboaconfext

Then set modoboa parameter Enable Dovecot LDAP sync to Yes Then set the Dovecot LDAP config file following theprevious step (etcdovecotdovecot-modoboaconfext in the example)

The last step is to add the command update_dovecot_conf to the cron job of modoboa Then each time your modoboaLDAP configuration is updated your dovecot LDAP configuration will also be

LMTP

Local Mail Transport Protocol is used to let Postfix deliver messages to Dovecot

First make sure the protocol is activated by looking at the protocols setting (generally inside dovecotconf)It should be similar to the following example

protocols = imap pop3 lmtp

Then open the confd10-masterconf look for lmtp service definition and add the following content inside

service lmtp stuff beforeunix_listener varspoolpostfixprivatedovecot-lmtp mode = 0600user = postfixgroup = postfix

stuff after

We assume here that Postfix is chrooted within varspoolpostfix

Finally open the confd20-lmtpconf and modify it as follows

protocol lmtp postmaster_address = postmasterltdomaingtmail_plugins = $mail_plugins quota sieve

Replace ltdomaingt by the appropriate value

Note If you donrsquot plan to apply quota or to use filters just adapt the content of the mail_plugins setting

Quota

Modoboa lets adminstrators define per-domain andor per-account limits (quota) It also lists the current quota usageof each account Those features require Dovecot to be configured in a specific way

Inside confd10-mailconf add the quota plugin to the default activated ones

mail_plugins = quota

Inside confd10-masterconf update the dict service to set proper permissions

18 Chapter 2 Table of contents

Modoboa Documentation Release 1100

service dict If dict proxy is used mail processes should have access to its socket For example mode=0660 group=vmail and global mail_access_groups=vmailunix_listener dict mode = 0600user = ltuser owning mailboxesgtgroup =

Inside confd20-imapconf activate the imap_quota plugin

protocol imap

mail_plugins = $mail_plugins imap_quota

Inside dovecotconf activate the quota SQL dictionary backend

dict quota = ltdrivergtetcdovecotdovecot-dict-sqlconfext

Inside confd90-quotaconf activate the quota dictionary backend

plugin quota = dictUser quotaproxyquota

It will tell Dovecot to keep quota usage in the SQL dictionary

Finally edit the dovecot-dict-sqlconfext file and put the following content inside

connect = host=ltdb hostgt dbname=ltdb namegt user=ltdb usergt password=ltpasswordgt SQLite users connect = pathtothedatabasedb

map pattern = privquotastoragetable = admin_quotausername_field = usernamevalue_field = bytes

map

pattern = privquotamessagestable = admin_quotausername_field = usernamevalue_field = messages

PostgreSQL users

21 Installation 19

Modoboa Documentation Release 1100

Database schema update

The admin_quota table is created by Django but unfortunately it doesnrsquot support DEFAULT constraints (it onlysimulates them when the ORM is used) As PostgreSQL is a bit strict about constraint violations you must executethe following query manually

db=gt ALTER TABLE admin_quota ALTER COLUMN bytes SET DEFAULT 0db=gt ALTER TABLE admin_quota ALTER COLUMN messages SET DEFAULT 0

Trigger

As indicated on Dovecotrsquos wiki you need a trigger to properly update the quota

A working copy of this trigger is available on Github

Download this file and copy it on the server running postgres Then execute the following commands

$ su - postgres$ psql [modoboa database] lt pathtomodoboa_postgres_triggersql$ exit

Replace [modoboa database] by the appropriate value

Forcing recalculation

For existing installations Dovecot (gt 2) offers a command to recalculate the current quota usages For example if youwant to update all usages run the following command

$ doveadm quota recalc -A

Be carefull it can take a while to execute

ManageSieveSieve

Modoboa lets users define filtering rules from the web interface To do so it requires ManageSieve to be activated onyour server

Inside confd20-managesieveconf make sure the following lines are uncommented

protocols = $protocols sieve

service managesieve-login

service managesieve

protocol sieve

20 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Messages filtering using Sieve is done by the LDA

Inside confd15-ldaconf activate the sieve plugin like this

protocol lda Space separated list of plugins to load (default is global mail_plugins)mail_plugins = $mail_plugins sieve

Finally configure the sieve plugin by editing the confd90-sieveconf file Put the follwing caontent inside

plugin Location of the active script When ManageSieve is used this is actually a symlink pointing to the active script in the sieve storage directorysieve = ~dovecotsieve

The path to the directory where the personal Sieve scripts are stored For ManageSieve this is where the uploaded scripts are storedsieve_dir = ~sieve

Restart Dovecot

Now you can go to the Postfix section to finish the installation

Last-login tracking

To update the last_login attribute of an account after a succesful IMAP or POP3 login you can configure apost-login script

Open confd10-masterconf add the following configuration (imap and pop3 services are already definedyou just need to update them)

service imap executable = imap postlogin

service pop3 executable = pop3 postlogin

service postlogin executable = script-login usrlocalbinpostloginshuser = modoboaunix_listener postlogin

Then you must create a script named usrlocalbinpostloginsh According to your database enginethe content will differ

PostgreSQL

21 Installation 21

Modoboa Documentation Release 1100

binsh

psql -c UPDATE core_user SET last_login=now() WHERE username=$USER gt devnull

exec $

MySQL

binsh

DBNAME=XXXDBUSER=XXXDBPASSWORD=XXX

echo UPDATE core_user SET last_login=now() WHERE username=$USER | mysql -urarr˓$DBUSER -p$DBPASSWORD $DBNAME

exec $

Postfix

This section gives an example about building a simple virtual hosting configuration with Postfix Refer to the officialdocumentation for more explanation

Map files

You first need to create configuration files (or map files) that will be used by Postfix to lookup into Modoboa tables

To automaticaly generate the requested map files and store them in a directory run the following command

gt cd ltmodoboa_instance_pathgtgt python managepy generate_postfix_maps --destdir ltdirectorygt

ltdirectorygt is the directory where the files will be stored Answer the few questions and yoursquore done

Configuration

Use the following configuration in the etcpostfixmaincf file (this is just one possible configuration)

Stuff beforevirtual_transport = lmtpunixprivatedovecot-lmtp

virtual_mailbox_domains = ltdrivergtetcpostfixsql-domainscfvirtual_alias_domains = ltdrivergtetcpostfixsql-domain-aliasescfvirtual_alias_maps = ltdrivergtetcpostfixsql-aliasescf

relay_domains = ltdrivergtetcpostfixsql-relaydomainscftransport_maps =

ltdrivergtetcpostfixsql-transportcfltdrivergtetcpostfixsql-spliteddomains-transportcf

(continues on next page)

22 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

smtpd_recipient_restrictions = check_recipient_access

ltdrivergtetcpostfixsql-maintaincfltdrivergtetcpostfixsql-relay-recipient-verificationcf

permit_mynetworksreject_unauth_destinationreject_unverified_recipient

smtpd_sender_login_maps = ltdrivergtetcpostfixsql-sender-login-mapcf

smtpd_sender_restrictions =reject_sender_login_mismatch

Stuff after

Replace ltdrivergt by the name of the database you use

Restart Postfix

Policy daemon

If you want to enable the built-in policy daemon add the following content to the etcpostfixmaincf file

smtpd_recipient_restrictions = check_policy_service inet1270019999

And reload postfix

Note The check_policy_service line must be placed before the permit_mynetworks one otherwise thedaemon wonrsquot be called

OpenDKIM

Modoboa can generate DKIM keys for the hosted domains but it wonrsquot sign or check messages To do that you needa dedicated software like OpenDKIM

Note The cron job in charge of creating DKIM keys must be run using the same user than OpenDKIM (ie opendkimin most cases)

Database

Since keys related information is stored in Modoboarsquos database you need to tell OpenDKIM how it can access it

First make sure to install the required additional packages on your system (libopendbx1- on debian baseddistributions or opendbx- on CentOS the complete name depends on your database engine)

Then insert the following SQL view into Modoboarsquos database

21 Installation 23

Modoboa Documentation Release 1100

PostgreSQL

CREATE OR REPLACE VIEW dkim AS (SELECT id name as domain_name dkim_private_key_path AS private_key_path

dkim_key_selector AS selectorFROM admin_domain WHERE enable_dkim

)

MySQLMariaDB

CREATE OR REPLACE VIEW dkim AS (SELECT id name as domain_name dkim_private_key_path AS private_key_path

dkim_key_selector AS selectorFROM admin_domain WHERE enable_dkim=1

)

Configuration

You should find OpenDKIMrsquos configuration file at etcopendkimconf

Add the following content to it

KeyTable dsnltdrivergtltusergtltpasswordgtltdb hostgtltdb namegttable=dkimrarr˓keycol=iddatacol=domain_nameselectorprivate_key_pathSigningTable dsnltdrivergtltusergtltpasswordgtltdb hostgtltdb namegttable=dkimrarr˓keycol=domain_namedatacol=idSocket inet12345localhost

Replace values between ltgt by yours Accepted values for driver are pgsql or mysql Make sure the user youspecify has read permission on the view created previously

If you run a debian based system make sure to adjust the following setting in the etcdefaultopendkim file

SOCKET=inet12345localhost

Eventually reload OpenDKIM

Postfix integration

Add the following lines to the etcpostfixmaincf file

smtpd_milters = inet12700112345non_smtpd_milters = inet12700112345milter_default_action = acceptmilter_content_timeout = 30s

and reload postfix

Extensions

Only few commands are needed to add a new extension to your setup

24 Chapter 2 Table of contents

Modoboa Documentation Release 1100

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install ltEXTENSIONgt==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Then restart your web server

22 Upgrade

221 Modoboa

Warning The new version you are going to install may need to modify your database Before you start makesure to backup everything

Most of the time upgrading your installation to a newer Modoboa version only requires a few actions In every caseyou will need to apply the general procedure first and then check if the version you are installing requires specificactions

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install modoboa==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Once done check if the version you are installing requires Specific instructions

Finally restart your web server

Sometimes you might need to upgrade postfix map files too To do so just run the generate_postfix_mapscommand on the same directory than the one used for installation (etcpostfix by default)

Make sure to use root privileges and run the following command

gt python managepy generate_postfix_maps --destdir ltdirectorygt

Then reload postfix

22 Upgrade 25

Modoboa Documentation Release 1100

222 Extensions

If a new version is available for an extension yoursquore using it is recommanded to install it Upgrading an extensions ispretty and the procedure is almost the same than the one used for Modoboa

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install ltEXTENSIONgt==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Finally restart your web server

It is a generic upgrade procedure which will be enough most of the time but it is generally a good idea to check theassociated documentation

223 Rebuild Virtual Environment

Sometimes when upgrading your Operating System (eg from Ubuntu 1704 to Ubuntu 1710) your virtual environmentrunning modoboa can get corrupted Your first response will be to panic but fear not The solution is in this document

First things first

Recover your database password

You will need to recover your database password (if using mysql or postgresql) You will find this in etcpostfixsql-aliasescf or any file with sql-cf in the etcpostfix directory

Make note of this as you will need it when reconfiguring modoboa

Reinstall Modoboa

Start out by backup up your modoboa settings file located in the modoboa instance directory (srvmodoboainstanceinstancesettingspy if you used the default installer configuration) This contains your currentconfiguration

Next you want to remove all current modoboa files

After doing this follow the manual installation instructions for Modoboa only as everything should be working prop-erly

After this completes simply restore your backed up settings file to srvinstanceinstancesettingspy(if you used installer default configuration) You will then need to reinstall your extensions

You can find which plugins you had in your settingspy file under the MODOBOA_APPS variable

Instructions to install extensions can also be found here

Once you have completed this step you will need to run the following commands

26 Chapter 2 Table of contents

Modoboa Documentation Release 1100

gt (env) $ cd ltinstance_dirgtgt (env) $ python managepy migrategt (env) $ python managepy collectstatic

You will then see a message similar to

You have requested to collect static files at the destinationlocation as specified in your settings

srvmodoboainstancesitestatic

This will overwrite existing filesAre you sure you want to do this

Type yes to continue or no to cancel

You will want to answer yes here then simply restart the uwsgi process with service uwsgi restart andyou should be up and running again

Simply log into your modoboa web panel and verify that your extensions and webmail box is working

224 Information

Rebuild instructions from httpshelppythonanywherecompagesRebuildingVirtualenvs

225 Specific instructions

1160

A new policy daemon has been added

Make sure to have a Redis instance running on your server

Add modoboapolicyd to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboapolicyd

)

Add the following settings to your settingspy file

REDIS_HOST = ltIP or hostname heregtREDIS_PORT = 6379REDIS_QUOTA_DB = 0REDIS_URL = redisformat(REDIS_HOST REDIS_PORT REDIS_QUOTA_DB)

Once done you can start the policy daemon using the following commands

22 Upgrade 27

Modoboa Documentation Release 1100

gt python managepy policy_daemon

Donrsquot forget to configure _policyd_config if you want to use this feature

The modoboa-stats plugin has been merged into the core

Add modoboamaillog to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboapolicydmodoboamaillog

)

And remove any reference to modoboa_stats in this same variable

1150

This version drops Python 2 support so donrsquot forget to update all the extensions you use

Warning If you upgrade an existing python 2 installation you will need to create a new Python 3 virtualenvironment You can remove the existing virtual environment and replace it by the new one so you wonrsquot have tomodify your configuration files

Add the following new setting

DISABLE_DASHBOARD_EXTERNAL_QUERIES = False

Reload uwsgigunicornapache depending on your setup

Finally Make sure to use root privileges and run the following command

gt python managepy generate_postfix_maps --destdir ltdirectorygt

Then reload postfix

1140

This release introduces an optional LDAP synchronization process If you want to use it please follow the dedicatedprocedure

1131

Upgrade postfix maps files as follows

28 Chapter 2 Table of contents

Modoboa Documentation Release 1100

gt python managepy generate_postfix_maps --destdir ltpathgt --force-overwrite

1130

Add modoboadnstools to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstools

)

Add the following new settings

CSRF_COOKIE_SECURE = TrueSESSION_COOKIE_SECURE = True

modoboa-postfix-autoreply 150

Edit the etcpostfixmaincf file and remove the sql-autoreplies-transportcf map from thetransport_maps if present Remove the corresponding proxy_read_maps entry if relevant

Reload postfix

1100

Warning Upgrade installed extensions BEFORE running check or migrate commands

Upgrade all your installed plugins to the following versions

Warning If you use the amavis plugin make sure to include its configuration as follows into settingspy

from modoboa_amavis import settings as modoboa_amavis_settingsmodoboa_amavis_settingsapply(globals())

22 Upgrade 29

Modoboa Documentation Release 1100

Name Versionmodoboa-amavis 120modoboa-contacts 050modoboa-dmarc 110modoboa-imap-migration 120modoboa-pdfcredentials 130modoboa-postfix-autoreply 140modoboa-radicale 120modoboa-sievefilters 140modoboa-stats 140modoboa-webmail 140

Edit the settingspy file and apply the following modifications

Add modoboatransport to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparameters

)

Replace the following line

MIDDLEWARE_CLASSES = (

by

MIDDLEWARE = (

Update postfix map files as follows

gt rm -f ltpathgtmodoboa-postfix-mapschkgt python managepy generate_postfix_maps --force --destdir ltpathgt

Then modify postfixrsquos configuration as follows

smtpd_sender_login_maps =ltdrivergtltpathgtsql-sender-login-mapcf

transport_maps =ltdrivergtltpathgtsql-transportcfltdrivergtltpathgtsql-spliteddomains-transportcf other map files

Replace ltdrivergt and ltpathgt by your values

If transport_maps contains sql-relaydomains-transportcf remove it

30 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning If you make use of postfixrsquos proxymap server you must also update the proxy_read_maps setting

Reload postfix

Add the following cron job in order to generate DKIM keys

Generate DKIM keys (they will belong to the user running this job)

root $PYTHON $INSTANCEmanagepy modorarr˓manage_dkim_keys

190

If you want to manage inactive accounts look at Cleaning inactive accounts

183

Edit the settingspy file and replace the following line

BASE_DIR = ospathdirname(ospathdirname(__file__))

by

BASE_DIR = ospathrealpath(ospathdirname(ospathdirname(__file__)))

180

Modoboa now relies on Djangorsquos builtin password validation system to validate user passwords instead ofdjango-passwords

Remove django-passwords from your system

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt pip uninstall django-passwords

Edit the settingspy file and remove the following content

django-passwords

PASSWORD_MIN_LENGTH = 8

PASSWORD_COMPLEXITY = UPPER 1LOWER 1DIGITS 1

Add the following lines

Password validation rulesAUTH_PASSWORD_VALIDATORS = [

NAME djangocontribauthpassword_validation

rarr˓UserAttributeSimilarityValidator (continues on next page)

22 Upgrade 31

Modoboa Documentation Release 1100

(continued from previous page)

NAME djangocontribauthpassword_validationMinimumLengthValidator

NAME djangocontribauthpassword_validationCommonPasswordValidator

NAME djangocontribauthpassword_validationNumericPasswordValidator

NAME modoboacorepassword_validationComplexityValidatorOPTIONS

upper 1lower 1digits 1specials 0

]

172

API documentation has evolved (because of the upgrade to Django Rest Framework 36) and CKeditor is now embed-ded by default (thanks to the django-ckeditor package) Some configuration changes are required

Edit your settingspy file and apply the following modifications

bull Update the INSTALLED_APPS variable as follows

INSTALLED_APPS = (djangocontribauthdjangocontribcontenttypesdjangocontribsessionsdjangocontribmessagesdjangocontribsitesdjangocontribstaticfilesreversionckeditorckeditor_uploaderrest_frameworkrest_frameworkauthtoken

)

bull Update the REST_FRAMEWORK variable as follows

REST_FRAMEWORK = DEFAULT_AUTHENTICATION_CLASSES (

rest_frameworkauthenticationTokenAuthenticationrest_frameworkauthenticationSessionAuthentication

)

bull Remove the SWAGGER_SETTINGS variable

bull Add the following content

32 Chapter 2 Table of contents

Modoboa Documentation Release 1100

CKeditor

CKEDITOR_UPLOAD_PATH = uploads

CKEDITOR_IMAGE_BACKEND = pillow

CKEDITOR_RESTRICT_BY_USER = True

CKEDITOR_BROWSE_SHOW_DIRS = True

CKEDITOR_ALLOW_NONIMAGE_FILES = False

CKEDITOR_CONFIGS = default

allowedContent Truetoolbar Modoboawidth Nonetoolbar_Modoboa [

[Bold Italic Underline][JustifyLeft JustifyCenter JustifyRight JustifyBlock][BidiLtr BidiRtl Language][NumberedList BulletedList - Outdent Indent][Undo Redo][Link Unlink Anchor - Smiley][TextColor BGColor - Source][Font FontSize][Image ][SpellChecker]

]

Donrsquot forget to run the following command

gt python managepy collectstatic

171

If you used 170 for a fresh installation please run the following commands

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy load_initial_data

170

This version requires Django gt= 110 so you need to make some modifications It also brings internal API changeswhich are not backward compatible so installed extensions must be upgraded too

First of all deactivate all installed extensions (edit the settingspy file and comment the corresponding lines inMODOBOA_APPS)

Edit the urlspy file of your local instance and replace its content by the following one

22 Upgrade 33

Modoboa Documentation Release 1100

from djangoconfurls import include url

urlpatterns = [url(r include(modoboaurls))

]

Edit the settingspy and apply the following changes

bull Add modoboaparameters to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboarelaydomainsmodoboalimitsmodoboaparameters Modoboa extensions here

)

bull Add modoboacoremiddlewareLocalConfigMiddleware to MIDDLEWARE_CLASSES

MIDDLEWARE_CLASSES = (djangocontribsessionsmiddlewareSessionMiddlewaredjangomiddlewarecommonCommonMiddlewaredjangomiddlewarecsrfCsrfViewMiddlewaredjangocontribauthmiddlewareAuthenticationMiddlewaredjangocontribmessagesmiddlewareMessageMiddlewaredjangomiddlewarelocaleLocaleMiddlewaredjangomiddlewareclickjackingXFrameOptionsMiddlewaremodoboacoremiddlewareLocalConfigMiddlewaremodoboalibmiddlewareAjaxLoginRedirectmodoboalibmiddlewareCommonExceptionCatchermodoboalibmiddlewareRequestCatcherMiddleware

)

bull Modoboa used to provide a custom authentication backend (modoboalibauthbackendsSimpleBackend) but it has been removed Replace it as follows

AUTHENTICATION_BACKENDS = ( Other backends beforedjangocontribauthbackendsModelBackend

)

bull Remove TEMPLATE_CONTEXT_PROCESSORS and replace it by

TEMPLATES = [

BACKEND djangotemplatebackendsdjangoDjangoTemplatesDIRS []APP_DIRS TrueOPTIONS

context_processors [djangotemplatecontext_processorsdebugdjangotemplatecontext_processorsrequestdjangocontribauthcontext_processorsauth

(continues on next page)

34 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

djangotemplatecontext_processorsi18ndjangotemplatecontext_processorsmediadjangotemplatecontext_processorsstaticdjangotemplatecontext_processorstzdjangocontribmessagescontext_processorsmessagesmodoboacorecontext_processorstop_notifications

]debug False

]

Run the following commands (load virtualenv if you use one)

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstatic

Finally upgrade your extensions and reactivate them

Name Versionmodoboa-amavis 110modoboa-dmarc 100modoboa-imap-migration 110modoboa-pdfcredentials 110modoboa-postfix-autoreply 120modoboa-radicale 110modoboa-sievefilters 110modoboa-stats 110modoboa-webmail 110

Command line shortcuts

$ pip install modoboa-amavis==110$ pip install modoboa-dmarc==100$ pip install modoboa-imap-migration==110$ pip install modoboa-pdfcredentials==110$ pip install modoboa-postfix-autoreply==120$ pip install modoboa-radicale==110$ pip install modoboa-sievefilters==110$ pip install modoboa-stats==110$ pip install modoboa-webmail==110

And please make sure you use the latest version of the django-versionfield2 package

$ pip install -U django-versionfield2

Notes about quota changes and resellers

Reseller users now have a quota option in Resources tab This is the quota that a reseller can share between all itsdomains

22 Upgrade 35

Modoboa Documentation Release 1100

There are two quotas for a domain in the new version

1 Quota amp

2 Default mailbox quota

[1] Quota quota shared between mailboxes This quota is shared between all the mailboxes of this domain This valuecannot exceed resellerrsquos quota and hence cannot be 0(unlimited) if reseller has finite quota

[2] Default mailbox quota default quota applied to mailboxes This quota is the default quota applied to new mail-boxes This value cannot exceed Quota[1] and hence cannot be 0(unlimited) if Quota[1] is finite

161

First of all update postfix map files as follows

gt python managepy generate_postfix_maps --destdir ltpathgt --force-overwrite

Then modify postfixrsquos configuration as follows

smtpd_sender_login_maps =ltdrivergtltpathgtsql-sender-login-mailboxescfltdrivergtltpathgtsql-sender-login-aliasescfltdrivergtltpathgtsql-sender-login-mailboxes-extracf

Replace ltdrivergt and ltpathgt by your values

Finally reload postfix

This release also deprecates some internal functions As a result several extensions has been updated to maintain thecompatibility If you enabled the notification service yoursquoll find the list of available updates directly in your Modoboaconsole

For the others here is the list

Name Versionmodoboa-amavis 1010modoboa-postfix-autoreply 117modoboa-radicale 105modoboa-stats 109

Command line shortcut

$ pip install modoboa-amavis==1010$ pip install modoboa-postfix-autoreply==117$ pip install modoboa-radicale==105$ pip install modoboa-stats==109

160

Warning You have to upgrade extensions due to coreUser model attribute change (usergroup to userrole) Oth-erwise you will have an internal error after upgrade In particular modoboa-amavisd modoboa-stats modoboa-postfix-autoreply are concerned

36 Chapter 2 Table of contents

Modoboa Documentation Release 1100

An interesting feature brougth by this version is the capability to make different checks about MX records Forexample Modoboa can query main DNSBL providers for every defined domain With this you will quickly know ifone the domains you manage is listed or not To activate it add the following line to your crontab

30 ltoptional_virtualenv_pathgtpython ltmodoboa_instance_dirgtmanagepy modorarr˓check_mx

The communication with Modoboa public API has been reworked Instead of sending direct synchronous queries (forexample to check new versions) a cron job has been added To activate it add the following line to your crontab

0 ltoptional_virtualenv_pathgtpython ltmodoboa_instance_dirgtmanagepyrarr˓communicate_with_public_api

Please also note that public API now uses TLS so you must update your configuration as follows

MODOBOA_API_URL = httpsapimodoboaorg1

Finally it is now possible to declare additional sender addresses on a per-account basis You need to update your postfixconfiguration in order to use this functionality Just edit the maincf file and change the following parameter

smtpd_sender_login_maps =ltdrivergtetcpostfixsql-sender-login-mailboxescfltdrivergtetcpostfixsql-sender-login-aliasescfltdrivergtetcpostfixsql-sender-login-mailboxes-extracf

150

The API has been greatly improved and a documentation is now available To enable it addrest_framework_swagger to the INSTALLED_APPS variable in settingspy as follows

INSTALLED_APPS = (djangocontribauthdjangocontribcontenttypesdjangocontribsessionsdjangocontribmessagesdjangocontribsitesdjangocontribstaticfilesreversionrest_frameworkauthtokenrest_framework_swagger

)

Then add the following content into settingspy just after the REST_FRAMEWORK variable

SWAGGER_SETTINGS = is_authenticated Falseapi_version 10exclude_namespaces []info

contact contactmodoboacomdescription (Modoboa API requires a valid token)title Modoboa API

Yoursquore done The documentation is now available at the following address

22 Upgrade 37

Modoboa Documentation Release 1100

httpltyour instance addressgtdocsapi

Finally if you find a TEMPLATE_CONTEXT_PROCESSORS variable in your settingspy file make sure it lookslike this

TEMPLATE_CONTEXT_PROCESSORS = global_settingsTEMPLATE_CONTEXT_PROCESSORS + [modoboacorecontext_processorstop_notifications

]

140

Warning Please make sure to use Modoboa 135 with an up-to-date database before an upgrade to 140

Warning Do not follow the regular upgrade procedure for this version

Some extension have been moved back into the main repository The main reason for that is that using Modoboawithout them doesnrsquot make sense

First of all you must rename the following applications listed inside the MODOBOA_APPS variable

Old name New namemodoboa_admin modoboaadminmodoboa_admin_limits modoboalimitsmodoboa_admin_relaydomains modoboarelaydomains

Then apply the following steps

1 Uninstall old extensions

$ pip uninstall modoboa-admin modoboa-admin-limits modoboa-admin-relaydomains

2 Install all extension updates using pip (check the Modoboa gt Information page)

3 Manually migrate database

$ cd ltinstance_dirgt$ python managepy migrate auth$ python managepy migrate admin 0001 --fake$ python managepy migrate admin$ python managepy migrate limits 0001 --fake$ python managepy migrate relaydomains 0001 --fake$ python managepy migrate

4 Finally update static files

$ python managepy collectstatic

This version also introduces a REST API To enable it

1 Add rest_frameworkauthtoken to the INSTALLED_APPS variable

2 Add the following configuration inside settingspy

38 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Rest framework settings

REST_FRAMEWORK = DEFAULT_AUTHENTICATION_CLASSES (

rest_frameworkauthenticationTokenAuthentication)DEFAULT_PERMISSION_CLASSES (

rest_frameworkpermissionsIsAuthenticated)

3 Run the following command

$ python managepy migrate

135

To enhance security Modoboa now checks the strength of user passwords lthttpsgithubcomdstufftdjango-passwordsgt_

To use this feature add the following configuration into the settingspy file

django-passwords

PASSWORD_MIN_LENGTH = 8

PASSWORD_COMPLEXITY = UPPER 1LOWER 1DIGITS 1

132

Modoboa now uses the atomic requests mode to preserve database consistency (reference)

To enable it update the DATABASES variable in settingspy as follows

DATABASES = default

stuff beforeATOMIC_REQUESTS True

amavis

stuff beforeATOMIC_REQUESTS True

130

This release does not bring awesome new features but it is a necessary bridge to the future of Modoboa All extensionsnow have their own git repository and the deploy process has been updated to reflect this change

22 Upgrade 39

Modoboa Documentation Release 1100

Another important update is the use of Django 17 Besides its new features the migration system has been reworkedand is now more robust than before

Before we begin with the procedure here is a table showing old extension names and their new name

Old name New package name New module namemodoboaextensionsadmin modoboa-admin modoboa_adminmodoboaextensionslimits modoboa-admin-limits modoboa_admin_limitsmodoboaextensionspostfix_autoreply modoboa-postfix-autoreply modoboa_postfix_autoreplymodoboaextensionspostfix_relay_domains modoboa-admin-relaydomains modoboa_admin_relaydomainsmodoboaextensionsradicale modoboa-radicale modoboa_radicalemodoboaextensionssievefilters modoboa-sievefilters modoboa_sievefiltersmodoboaextensionsstats modoboa-stats modoboa_statsmodoboaextensionswebmail modoboa-webmail modoboa_webmail

Here are the required steps

1 Install the extensions using pip (look at the second column in the table above)

$ pip install ltthe extensions you wantgt

2 Remove south from INSTALLED_APPS

3 Rename old extension names inside MODOBOA_APPS (look at the third column in the table above)

4 Remove modoboalibmiddlewareExtControlMiddleware from MIDDLEWARE_CLASSES

5 Change DATABASE_ROUTERS to

DATABASE_ROUTERS = [modoboa_amavisdbrouterAmavisRouter]

6 Run the following commands

$ cd ltmodoboa_instance_dirgt$ python managepy migrate

7 Reply yes to the question

8 Run the following commands

$ python managepy load_initial_data$ python managepy collectstatic

9 The cleanup job has been renamed in Django so you have to modify your crontab entry

- 0 0 ltmodoboa_sitegtmanagepy cleanup+ 0 0 ltmodoboa_sitegtmanagepy clearsessions

120

A new notification service let administrators know about new Modoboa versions To activate it you need to updatethe TEMPLATE_CONTEXT_PROCESSORS variable like this

from djangoconf import global_settings

TEMPLATE_CONTEXT_PROCESSORS = global_settingsTEMPLATE_CONTEXT_PROCESSORS + (

(continues on next page)

40 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

modoboacorecontext_processorstop_notifications)

and to define the new MODOBOA_API_URL variable

MODOBOA_API_URL = httpapimodoboaorg1

The location of external static files has changed To use them add a new path to the STATICFILES_DIRS

Additional locations of static filesSTATICFILES_DIRS = (

Put strings here like homehtmlstatic or Cwwwdjangostatic Always use forward slashes even on Windows Dont forget to use absolute paths not relative pathsltpathtomodoboainstalldirgtbower_components

)

Run the following commands to define the hostname of your instance

$ cd ltmodoboa_instance_dirgt$ python managepy set_default_site lthostnamegt

If you plan to use the Radicale extension

1 Add modoboaextensionsradicale to the MODOBOA_APPS variable

2 Run the following commands

$ cd ltmodoboa_instance_dirgt$ python managepy syncdb

Warning You also have to note that the sitestatic directory has moved from ltpath to your sitesdirgt to ltmodoboas root urlgt (itrsquos probably the parent directory) You have to adapt your web serverconfiguration to reflect this change

23 Configuration

231 Online parameters

Modoboa provides online panels to modify internal parameters There are two available levels

bull Application level global parameters define how the application behaves Available at Modoboa gt Parameters

bull User level per user customization Available at User gt Settings gt Preferences

Regardless level parameters are displayed using tabs each tab corresponding to one application

General parameters

The admin application exposes several parameters they are presented below

23 Configuration 41

Modoboa Documentation Release 1100

Name Tab Description Default valueAuthentication type General The backend used for au-

thenticationLocal

Default password scheme General Scheme used to cryptmailbox passwords

crypt

Rounds General Number of rounds (onlyused by sha256cryptand sha512crypt) Mustbe between 1000 and999999999 inclusive

70000

Secret key General A key used to encryptusersrsquo password in ses-sions

random value

Sender address General Email address used tosend notifications

Enable communication General Enable communicationwith Modoboa public API

yes

Check new versions General Automatically checks if anewer version is available

yes

Send statistics General Send statistics to Mod-oboa public API (countersand used extensions)

yes

Top notifications check in-terval

General Interval between two topnotification checks (inseconds)

30

Maximum log record age General The maximum age in daysof a log record

365

Items per page General Number of displayeditems per page

30

Default top redirection General The default redirectionused when no applicationis specified

userprefs

Enable MX checks Admin Check that every domainhas a valid MX record

yes

Valid MXs Admin A list of IP or networkaddress every MX shouldmatch A warning will besent if a record does notrespect this it

Enable DNSBL checks Admin Check every domainagainst major DNSBLproviders

yes

DKIM keys storage direc-tory

AdminPath to a directory where DKIM

generated keys willbe stored

Default DKIM key length Admin The default size (in bits)for new keys

2048

Handle mailboxes onfilesystem

Admin Rename or remove mail-boxes on the filesystemwhen they get renamed orremoved within Modoboa

no

Mailboxes owner Admin The UNIX account whoowns mailboxes on thefilesystem

vmail

Default domain quota Admin Default quota (in MB) ap-plied to freshly createddomains with no valuespecified A value of 0means no quota

0

Automatic accountremoval

Admin When a mailbox is re-moved also remove theassociated account

no

Automatic do-mainmailbox creation

Admin Create a domain and amailbox when an accountis automatically created

yes

42 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Note If you are not familiar with virtual domain hosting you should take a look at postfixrsquos documentation ThisHow to also contains useful information

Note A random secret key will be generated each time the Parameters page is refreshed and until you save parametersat least once

Note Specific LDAP parameters are also available see LDAP authentication

232 Media files

Modoboa uses a specific directory to upload files (ie when the webmail is in use) or to create ones (ex graphical statis-tics) This directory is named media and is located inside modoboarsquos installation directory (called modoboa_sitein this documentation)

To work properly the system user which runs modoboa (www-data apache whatever) must have write access tothis directory

233 Customization

Custom logo

You have the possibility to use a custom logo instead of the default one on the login page

To do so open the settingspy file and add a MODOBOA_CUSTOM_LOGO variable This variable must containthe relative URL of your logo under MEDIA_URL For example

MODOBOA_CUSTOM_LOGO = ospathjoin(MEDIA_URL custom_logopng)

Then copy your logo file into the directory indicated by MEDIA_ROOT

234 Host configuration

Note This section is only relevant when Modoboa handles mailboxes renaming and removal from the filesystem

To manipulate mailboxes on the filesystem you must allow the user who runs Modoboa to execute commands as theuser who owns mailboxes

To do so edit the etcsudoers file and add the following inside

ltuser_that_runs_modoboagt ALL=(ltmailboxes ownergt) NOPASSWD ALL

Replace values between ltgt by the ones you use

23 Configuration 43

Modoboa Documentation Release 1100

235 Time zone and language

Modoboa is available in many languages

To specify the default language to use edit the settingspy file and modify the LANGUAGE_CODE variable

LANGUAGE_CODE = fr or en for english etc

Note Each user has the possibility to define the language he prefers

In the same configuration file specify the timezone to use by modifying the TIME_ZONE variable For example

TIME_ZONE = EuropeParis

236 Sessions management

Modoboa uses Djangorsquos session framework to store per-user information

Few parameters need to be set in the settingspy configuration file to make Modoboa behave as expected

SESSION_EXPIRE_AT_BROWSER_CLOSE = False Default value

This parameter is optional but you must ensure it is set to False (the default value)

The default configuration file provided by the modoboa-adminpy command is properly configured

237 Logging authentication

To trace login attempts to the web interface Modoboa uses python SysLogHandler so you can see them in your syslogauthentication log file (varlogauthlog in most cases)

Depending on your configuration you may have to edit the settingspy file and add lsquoaddressrsquo lsquodevlogrsquo to thelogging section

syslog-auth class logginghandlersSysLogHandlerfacility SysLogHandlerLOG_AUTHaddress devlogformatter syslog

238 External authentication

LDAP

Modoboa supports external LDAP authentication using the following extra components

bull Python LDAP client

bull Django LDAP authentication backend

If you want to use this feature you must first install those components

44 Chapter 2 Table of contents

Modoboa Documentation Release 1100

$ pip install python-ldap django-auth-ldap

Then all you have to do is to modify the settingspy file Add a new authentication backend to the AUTHENTI-CATION_BACKENDS variable like this

AUTHENTICATION_BACKENDS = (modoboalibauthbackendsLDAPBackend modoboalibauthbackendsLDAPSecondaryBackend Useful for a fallback

rarr˓mechanismdjangocontribauthbackendsModelBackend

)

Finally go to Modoboa gt Parameters gt General and set Authentication type to LDAP

From there new parameters will appear to let you configure the way Modoboa should connect to your LDAP serverThey are described just below

Name Description De-faultvalue

Server address The IP address of the DNS name of the LDAP server local-host

Server port The TCP port number used by the LDAP server 389Use a secureconnection

Use an SSLTLS connection to access the LDAP server no

Authenticationmethod

Choose the authentication method to use Directbind

User DN tem-plate (directbind mode)

The template used to construct a userrsquos DN It should contain one placeholder (ie(user)s)

Bind BN The distinguished name to use when binding to the LDAP server Leave empty for ananonymous bind

Bind password The password to use when binding to the LDAP server (with lsquoBind DNrsquo)Search base The distinguished name of the search baseSearch filter An optional filter string (eg lsquo(objectClass=person)rsquo) In order to be valid it must be

enclosed in parentheses(mail=(user)s)

Passwordattribute

The attribute used to store user passwords user-Pass-word

Active Direc-tory

Tell if the LDAP server is an Active Directory one no

Administratorgroups

Members of those LDAP Posix groups will be created ad domain administrators Uselsquorsquo characters to separate groups

Group type The type of group used by your LDAP directory Posix-Group

Groups searchbase

The distinguished name of the search base used to find groups

Do-mainmailboxcreation

Automatically create a domain and a mailbox when a new user is created just after thefirst successful authentication You will generally want to disable this feature whenthe relay domains extension is in use

yes

If you need additional parameters you will find a detailed documentation here

Once the authentication is properly configured the users defined in your LDAP directory will be able to connect to

23 Configuration 45

Modoboa Documentation Release 1100

Modoboa the associated domain and mailboxes will be automatically created if needed

The first time a user connects to Modoboa a local account is created if the LDAP username is a valid email addressBy default this account belongs to the SimpleUsers group and it has a mailbox

To automatically create domain administrators you can use the Administrator groups setting If a LDAP user belongsto one the listed groups its local account will belong to the DomainAdmins group In this case the username is notnecessarily an email address

Users will also be able to update their LDAP password directly from Modoboa

Note Modoboa doesnrsquot provide any synchronization mechanism once a user is registered into the database Anymodification done from the directory to a user account will not be reported to Modoboa (an email address change forexample) Currently the only solution is to manually delete the Modoboa record it will be recreated on the next userlogin

SMTP

It is possible to use an existing SMTP server as an authentication source To enable this feature edit the settingspy file and change the following setting

AUTHENTICATION_BACKENDS = (modoboalibauthbackendsSMTPBackenddjangocontribauthbackendsModelBackend

)

SMTP server location can be customized using the following settings

AUTH_SMTP_SERVER_ADDRESS = localhostAUTH_SMTP_SERVER_PORT = 25AUTH_SMTP_SECURED_MODE = None ssl or starttls are accepted

239 LDAP synchronization

Modoboa can synchronize accounts with an LDAP directory (tested with OpenLDAP) but this feature is not enabledby default To activate it add modoboaldapsync to MODOBOA_APPS in the settingspy file

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboaldapsync

)

and enable it from the admin panel

46 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning Make sure to install additional requirements otherwise it wonrsquot work

The following parameters are available and must be filled

Name Description Defaultvalue

Enable LDAP synchro-nization

Control LDAP synchronization state no

Bind DN The DN of a user with write permission to createupdate accountsBind password The associated passwordAccount DN template The template used to build account DNs (must contain a (user)s

placeholder

2310 Database maintenance

Cleaning the logs table

Modoboa logs administrator specific actions into the database A clean-up script is provided to automatically removeoldest records The maximum log record age can be configured through the online panel

To use it you can setup a cron job to run every night

0 0 ltmodoboa_sitegtmanagepy cleanlogs Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy cleanlogs

Cleaning the session table

Django does not provide automatic purging Therefore itrsquos your job to purge expired sessions on a regular basis

Django provides a sample clean-up script django-adminpy clearsessions That script deletes any sessionin the session table whose expire_date is in the past

For example you could setup a cron job to run this script every night

0 0 ltmodoboa_sitegtmanagepy clearsessions Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy clearsessions

Cleaning inactive accounts

Thanks to Last-login tracking it is now possible to monitor inactive accounts An account is considered inactive if nologin has been recorded for the last 30 days (this value can be changed through the admin panel)

A management command is available to disable or delete inactive accounts For example you could setup a cron jobto run it every night

23 Configuration 47

Modoboa Documentation Release 1100

0 0 ltmodoboa_sitegtmanagepy clean_inactive_accounts Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy clean_inactive_rarr˓accounts

The default behaviour is to disable accounts You can delete them using the --delete option

24 Moving to Modoboa

You have an existing platform and yoursquod like to move to Modoboa the following tools could help you

241 From postfixadmin

A dedicated command allows you to convert an existing postfixadmin database to a Modoboa one Consult the docu-mentation to know more about the process

242 Using CSV files

Modoboa allows you to import any object (domain domain alias mailbox and alias) using a simple CSV file encodedusing UTF8 Each line corresponds to a single object and must respect one of the following format

domain ltname stringgt ltquota integergt ltdefault mailbox quota integergt ltenabledrarr˓booleangtdomainalias ltname stringgt lttargeted domain stringgt ltenabled booleangtrelaydomain ltname stringgt lttarget host stringgt lttarget port integergt ltservicerarr˓stringgt ltenabled booleangt ltverify recipients booleangtaccount ltloginname stringgt ltpassword stringgt ltfirst name stringgt ltlast namerarr˓stringgt ltenabled booleangt ltgroup stringgt ltaddress stringgt ltquota integergt [rarr˓ltdomain stringgt ]alias ltaddress stringgt ltenabled booleangt ltrecipient stringgt

Boolean fields accept the following values true 1 yes y (case insensitive) Any other value will be evaluated asfalse

Warning The order does matter Objects are created sequencially so a domain must be created before itsmailboxes and aliases and a mailbox must created before its alias(es)

To actually import such a file

gt sudo -u ltmodoboa_usergt -igt source ltvirtualenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy modo import ltyour filegt

Available options can be listed using the following command

gt python managepy modo import -h

48 Chapter 2 Table of contents

Modoboa Documentation Release 1100

25 REST API

To ease the integration with external sources (software or other) Modoboa provides a REST API

Every installed instance comes with a ready-to-use API and a documentation You will find them using the followingurl patterns

bull API httplthostnamegtapiv1

bull Documentation httplthostnamegtdocsapi

An example of this documentation is available on the official demo

Using this API requires an authentication and for now only a token based authentication is supported To get a validtoken log-in to your instance with a super administrator go to Settings gt API and activate the API access Press theUpdate button and wait until the page is reloaded the token will be displayed

To make valid API calls every requests you send must embed this token within an Authorization HTTP header likethis

Authorization Token ltYOUR_TOKENgt

and the content type of those requests must be applicationjson

26 How to contribute

Contributions are always welcome If you want to submit a patch please respect the following rules

bull Open a pull request on the appropriate repository

bull Respect PEP8

bull Document your patch and respect PEP 257

bull Add unit tests and make sure the global coverage does not decrease

If all those steps are validated your contribution will generally be integrated

261 Table of contents

25 REST API 49

Modoboa Documentation Release 1100

Useful tips

You would like to work on Modoboa but you donrsquot know where to start Yoursquore at the right place Browse this pageto learn useful tips

Docker

A docker image is available for developers To use it you must install docker and docker-compose first

Then just run the following command

$ docker-compose up

It will start the docker environment and make a Modoboa instance available at httplocalhost8000

If you donrsquot want to use docker or need a more complex development setup go to the next section

Prepare a virtual environment

A virtual environment is a good way to setup a development environment on your machine

To do so run the following commands

$ python3 -m venv ltpathgt$ source ltpathgtbinactivate$ git clone httpsgithubcommodoboamodoboagit$ cd modoboa$ python setuppy develop$ pip install -r dev-requirementstxt

The develop command creates a symbolic link to your local copy so any modification you make will be automati-cally available in your environment no need to copy them

Deploy an instance for development

Warning Make sure to create a database before running this step The format of the database url is also describedin this page

Now that you have a running environment yoursquore ready to deploy a test instance

$ cd ltpathgt$ modoboa-adminpy deploy --dburl defaultltdatabase urlgt --domain localhost --develrarr˓instance$ python managepy runserver

Yoursquore ready to go You should be able to access Modoboa at httplocalhost8000 usingadminpassword as credentials

Manage static files

Modoboa uses bower (thanks to django-bower) to manage its CSS and javascript dependencies

50 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Those dependencies are listed in a file called dev_settingspy located inside the ltpath_to_local_copygtmodoboacore directory

If you want to add a new dependency just complete the BOWER_INSTALLED_APPS parameter and run the followingcommand

$ python managepy bower install

It will download and store the required files into the ltpath_to_local_copygtmodoboabower_components directory

Test your modifications

If you deployed a specific instance for your development needs you can run the tests suite as follows

gt python managepy test modoboacore modoboalib modoboaadmin modoboalimits modoboararr˓relaydomains

Otherwise you can run the tests suite from the repository using tox

Start a basic Modoboa instance

From the repository run the following command to launch a simple instance with a few fixtures

gt tox -e serve

You can use adminpassword to log in

Build the documentation

If you need to modify the documenation and want to see the result you can build it as follows

gt tox -e docgt firefox toxdoctmphtmlindexhtml

FAQ

bower command is missing in managepy

bower command is missing in managepy if you donrsquot use the --devel option of the modoboa-adminpydeploy command

To fix it regenerate your instance or update your settingspy file manually Look at devmode in httpsgithubcomtonioomodoboablobmastermodoboacorecommandstemplatessettingspytpl

Create a new plugin

Introduction

Modoboa offers a plugin API to expand its capabilities The current implementation provides the following possibili-ties

26 How to contribute 51

Modoboa Documentation Release 1100

bull Expand navigation by adding entry points to your plugin inside the GUI

bull Access and modify administrative objects (domains mailboxes etc)

bull Register callback actions for specific events

Plugins are nothing more than Django applications with an extra piece of code that integrates them into Modoboa Themodo_extensionpy file will contain a complete description of the plugin

bull Admin and user parameters

bull Custom menu entries

The communication between both applications is provided by Django signals

The following subsections describe the plugin architecture and explain how you can create your own

The required glue

To create a new plugin just start a new django application like this (into Modoboarsquos directory)

$ python managepy startapp

Then you need to register this application using the provided API Just copypaste the following example into themodo_extensionpy file of the future extension

from modoboacoreextensions import ModoExtension exts_pool

class MyExtension(ModoExtension)My custom Modoboa extension

name = myextlabel = My Extensionversion = 01description = A descriptionurl = myext_root_location optional name is used if not defined

def load(self)This method is called when Modoboa loads available and activated plugins

Declare parameters and register events herepass

def load_initial_data(self)Optional provide initial data for your extension herepass

exts_poolregister_extension(MyExtension)

Once done simply add your extensionrsquos module name to the MODOBOA_APPS variable located inside settingspy Finally run the following commands

$ python managepy migrate$ python managepy load_initial_data$ python managepy collectstatic

52 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Parameters

A plugin can declare its own parameters There are two levels available

bull lsquoGlobalrsquo parameters used to configure the plugin editable inside the Admin gt Settings gt Parameters page

bull lsquoUserrsquo parameters per-user parameters (or preferences) editable inside the Options gt Preferences page

Playing with parameters

Parameters are defined using Django forms and Modoboa adds two special forms you can inherit depending on thelevel of parameter(s) you want to add

bull modoboaparametersformsAdminParametersForm for general parameters

bull modoboaparametersformsUserParametersForm for user parameters

To register new parameters add the following line into the load method of your plugin class

from modoboaparameters import tools as param_toolsparam_toolsregistryadd(

LEVEL YourForm ugettext_lazy(Title))

Replace LEVEL by global or user

Custom role permissions

Modoboa uses Djangorsquos internal permission system Administrative roles are nothing more than groups (Groupinstances)

An extension can add new permissions to a group by listening to the extra_role_permissions signal Here isan example

from djangodispatch import receiverfrom modoboacore import signals as core_signals

PERMISSIONS = Resellers [

(relaydomains relaydomain add_relaydomain)(relaydomains relaydomain change_relaydomain)(relaydomains relaydomain delete_relaydomain)(relaydomains service add_service)(relaydomains service change_service)(relaydomains service delete_service)

]

receiver(core_signalsextra_role_permissions)def extra_role_permissions(sender role kwargs)

Add permissions to the Resellers groupreturn constantsPERMISSIONSget(role [])

Extending admin forms

The forms used to edit objects (account domain etc) through the admin panel are composed of tabs You can extendthem (ie add new tabs) in a pretty easy way thanks to custom signals

26 How to contribute 53

Modoboa Documentation Release 1100

Account

To add a new tab to the account edition form define new listeners (handlers) for the following signals

bull modoboaadminsignalsextra_account_forms

bull modoboaadminsignalsget_account_form_instances

bull modoboaadminsignalscheck_extra_account_form (optional)

Example

from djangodispatch import receiverfrom modoboaadmin import signals as admin_signals

receiver(admin_signalsextra_account_forms)def extra_account_form(sender user account kwargs)

return [id tabid title Title cls MyFormClass

]

receiver(admin_signalsget_account_form_instances)def fill_my_tab(sender user account kwargs)

return id my_instance

Domain

To add a new tab to the domain edition form define new listeners (handlers) for the following signals

bull modoboaadminsignalsextra_domain_forms

bull modoboaadminsignalsget_domain_form_instances

Example

from djangodispatch import receiverfrom modoboaadmin import signals as admin_signals

receiver(admin_signalsextra_domain_forms)def extra_account_form(sender user domain kwargs)

return [id tabid title Title cls MyFormClass

]

receiver(admin_signalsget_domain_form_instances)def fill_my_tab(sender user domain kwargs)

return id my_instance

27 Contributors

bull Antidot

bull Bearstech

bull CAP-REL

54 Chapter 2 Table of contents

Modoboa Documentation Release 1100

bull Dalnix

27 Contributors 55

  • Overview
  • Table of contents
Page 7: Modoboa Documentation

Modoboa Documentation Release 1100

4 Chapter 1 Overview

CHAPTER 2

Table of contents

21 Installation

211 Requirements

You will need a Server to perform well with at least

bull CPU 2

bull RAM 2GB

bull Disk 10GB

bull Python 3

Note Heads up for modoboa versions 115 and later

Python 2 support has been dropped with modoboa version 115 If you still have Python 2 installed on your systemeither uninstall it or force modoboa user to run with Python 3

212 Recommended way

If you start from scratch and want to deploy a complete mail server you will love the modoboa installer It is theeasiest and the quickest way to setup a fully functional server (modoboa postfix dovecot amavis and more) on onemachine

Warning For now only Debian and CentOS based Linux distributions are supported We do our best to improvecompatibility but if you use another Linux or a UNIX system you will have to install Modoboa manually

To use it just run the following commands in your terminal

5

Modoboa Documentation Release 1100

gt git clone httpsgithubcommodoboamodoboa-installergt cd modoboa-installergt sudo runpy ltyour domaingt

if you get this warning - lsquousrbinenv lsquopythonrsquo No such file or directoryrsquo do make sure sure python is installed onyour server Sometimes python is installed but the installer canrsquot detect it or which python version to run especiallyon a debian based system Then run this command first

gt sudo apt-get install python-virtualenv python-pip

Wait a few minutes and yoursquore done o

213 Manual installation

For those who need a manual installation or who just want to setup a specific part here are the steps you must follow

Modoboa

This section describes the installation of the web interface (a Django project)

Prepare the system

First of all we recommend the following context

bull A dedicated system user

bull A virtual environment to install the application because it will isolate it (and its dependencies) from the rest ofyour system

The following example illustrates how to realize this on Debian-based distributions using virtualenv

apt-get install virtualenv python3-pip useradd modoboa create a dedicated user su -l modoboa log in as the newly created user$ virtualenv --python python3 env create the virtual environment$ source envbinactivate activate the virtual environment

Modoboa depends on external tools and some of them require compilation so you need a compiler and a few C librariesMake sure to install the following system packages according to your distribution

Debian Ubuntubuild-essential python3-dev libxml2-dev libxslt-dev libjpeg-dev librrd-dev rrdtool libffi-dev libssl-dev

CentOSgcc gcc-c++ python3-devel libxml2-devel libxslt-devel libjpeg-turbo-devel rrdtool-devel rrdtool libffi-devel

Note Alternatively you could rely on your distribution packages for the Modoboa dependencies which requirecompilation - eg psycopg2 - if the version is compatible In this case you have to create your virtual environmentwith the --system-site-packages option

Then install Modoboa by running

6 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(env)$ pip install modoboa

Database

Warning This documentation does not cover the installation of a database server but only the setup of a functionaldatabase that Modoboa will use

Thanks to Django Modoboa is compatible with the following databases

bull PostgreSQL

bull MySQL MariaDB

bull SQLite

Since the last one does not require particular actions only the first two ones are described You should also read thenotes for those database backends on the official Django documentation

PostgreSQL

Install the corresponding Python binding

(env)$ pip install psycopg2

Note Alternatively you can install the python3-psycopg2 package instead on Debian-based distributions ifyour virtual environment was created with --system-site-packages option

Then create a user and a database For example to create the modoboa database owned by a modoboa user run thefollowing commands on your PostgreSQL server

sudo -l -u postgres createuser --no-createdb modoboa sudo -l -u postgres createdb --owner=modoboa modoboa

MySQL MariaDB

Install the corresponding Python binding

(env)$ pip install mysqlclient

Note Alternatively you can install the python3-mysqldb package instead on Debian-based distributions if yourvirtual environment was created with --system-site-packages option

Note MariaDB 102 (and newer) require mysqlclient 1311 (or newer)

Then create a user and a database For example to create the modoboa database owned by a modoboa user run thefollowing SQL commands

21 Installation 7

Modoboa Documentation Release 1100

CREATE DATABASE modoboaCREATE USER modoboalocalhost IDENTIFIED BY my-strong-password-hereGRANT ALL PRIVILEGES ON modoboa TO modoboalocalhost

Deploy an instance

modoboa-adminpy is a command line tool that lets you deploy a ready-to-use Modoboa site To create a newinstance into instance you just have to run the following command

(env)$ modoboa-adminpy deploy instance --collectstatic --domain lthostname of your servergt --dburl defaultltdatabase urlgt

Note You can install additional extensions during the deploy process To do so use the --extensions op-tion which accepts a list of names as argument (--extensions ext1 ext2 ) If you want to install allextensions just use the all keyword like this --extensions all

If you choose to install extensions one at a time you will have to add their names in settingspy to MODOBOA_APPSAlso ensure that you have the line from modoboa_amavissettings import at the end of this file

The list of available extensions can be found on the index page Instructions to install them are available on eachextensions page

Note You can specify more than one database connection using the --dburl option Multiple connections aredifferentiated by a prefix

The primary connection must use the default prefix (as shown in the example above) For the amavis exten-sion use the amavis prefix For example --dburl defaultltdatabase urlgt amavisltdatabaseurlgt

A database url should meet the following syntax ltmysql|postgresgt[userpass][hostport]dbname OR sqlitefullpathtoyourdatabasefilesqlite

The command will ask you a few questions answer them and yoursquore done

If you need a silent installation (eg if yoursquore using Salt-Stack Ansible or whatever) itrsquos possible to supply thedatabase credentials as command line arguments

You can consult the complete option list by running the following command

(env)$ modoboa-adminpy help deploy

Cron jobs

A few recurring jobs must be configured to make Modoboa works as expected

Create a new file for example etccrondmodoboa and put the following content inside

Modoboa specific cron jobsPYTHON=ltpath to Python binary inside the virtual environmentgtINSTANCE=ltpath to Modoboa instancegt

(continues on next page)

8 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

Operations on mailboxes

vmail $PYTHON $INSTANCEmanagepy handle_mailbox_operations

Generate DKIM keys (they will belong to the user running this job)

root umask 077 ampamp $PYTHON $INSTANCEmanagepy modo manage_dkim_rarr˓keys

Sessions table cleanup0 0 modoboa $PYTHON $INSTANCEmanagepy clearsessions Logs table cleanup0 0 modoboa $PYTHON $INSTANCEmanagepy cleanlogs DNSBL checks

30 modoboa $PYTHON $INSTANCEmanagepy modo check_mx Public API communication0 modoboa $PYTHON $INSTANCEmanagepy communicate_with_public_api

Policy daemon

Modoboa comes with a built-in Policy Daemon for Postfix Current features are

bull Define daily sending limits for domains andor accounts

A redis server is required to run this new daemon

You can launch it manually using the following command

(env)gt python managepy policy_daemon

But we recommend an automatic start using systemd or supervisor Here is a configuration example forsupervisor

[programpolicyd]autostart=trueautorestart=truecommand=srvmodoboaenvbinpython srvmodoboainstancemanagepy policy_daemondirectory=srvmodoboaredirect_stderr=trueuser=modoboanumprocs=1

It will listen by default on 127001 and port 9999 The policy daemon wonrsquot do anything unless you tell postfixto use it

Now you can continue to the Web server section

Web server

Note The following instructions are meant to help you get your site up and running quickly However it is notpossible for the people contributing documentation to Modoboa to test every single combination of web server wsgiserver distribution etc So it is possible that your installation of uwsgi or nginx or Apache or what-have-you worksdifferently Keep this in mind

21 Installation 9

Modoboa Documentation Release 1100

Apache2

First make sure that mod_wsgi is installed on your server

Create a new virtualhost in your Apache configuration and put the following content inside

ltVirtualHost 80gtServerName ltyour valuegtDocumentRoot ltmodoboa_instance_pathgt

Alias media ltmodoboa_instance_pathgtmedialtDirectory ltmodoboa_instance_pathgtmediagtOrder denyallowAllow from all

ltDirectorygt

Alias sitestatic ltmodoboa_instance_pathgtsitestaticltDirectory ltmodoboa_instance_pathgtsitestaticgtOrder denyallowAllow from all

ltDirectorygt

WSGIScriptAlias ltmodoboa_instance_pathgtltinstance_namegtwsgipy

Pass Authorization header to enable API usageWSGIPassAuthorization On

ltVirtualHostgt

This is just one possible configuration

To use mod_wsgi daemon mode add the two following directives just under WSGIScriptAlias

WSGIDaemonProcess examplecom python-path=ltmodoboa_instancegtltvirtualenv pathgtlibrarr˓python37site-packagesWSGIProcessGroup examplecom

Replace values between ltgt with yours If you donrsquot use a virtualenv just remove the last part of theWSGIDaemonProcess directive

Note You will certainly need more configuration in order to launch Apache

Now you can go the Dovecot section to continue the installation

Nginx

This section covers two different ways of running Modoboa behind Nginx using a WSGI application server Choosethe one you prefer between Green Unicorn or uWSGI

In both cases yoursquoll need to download and install nginx

Green Unicorn

Firstly Download and install gunicorn Then use the following sample gunicorn configuration (create a new filenamed gunicornconfpy inside Modoboarsquos root dir)

10 Chapter 2 Table of contents

Modoboa Documentation Release 1100

backlog = 2048bind = unixvarrungunicornmodoboasockpidfile = varrungunicornmodoboapiddaemon = Truedebug = Falseworkers = 2logfile = varloggunicornmodoboalogloglevel = info

To start gunicorn execute the following commands

$ cd ltmodoboa dirgt$ gunicorn -c gunicornconfpy ltmodoboa dirgtwsgiapplication

Now the nginx part Just create a new virtual host and use the following configuration

upstream modoboa server unixvarrungunicornmodoboasock fail_timeout=0

server listen 443 sslssl onkeepalive_timeout 70

server_name lthost fqdngtroot ltmodoboa_instance_pathgt

access_log varlognginxlthost fqdngtaccesslogerror_log varlognginxlthost fqdngterrorlog

ssl_certificate ltssl certificate for your sitegtssl_certificate_key ltssl certificate key for your sitegt

location sitestatic autoindex on

location media autoindex on

location proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_forproxy_set_header Host $http_hostproxy_redirect offproxy_set_header X-Forwarded-Protocol sslproxy_pass httpmodoboa

If you do not plan to use SSL then change the listen directive to listen 80 and delete each of the followingdirectives

ssl onkeepalive_timeout 70ssl_certificate ltssl certificate for your sitegt

(continues on next page)

21 Installation 11

Modoboa Documentation Release 1100

(continued from previous page)

ssl_certificate_key ltssl certificate key for your sitegtproxy_set_header X-Forwarded-Protocol ssl

If you do plan to use SSL yoursquoll have to generate a certificate and a key This article contains information about howto do it

Paste this content to your configuration (replace values between ltgt with yours) and restart nginx

Now you can go the Dovecot section to continue the installation

uWSGI

The following setup is meant to get you started quickly You should read the documentation of both nginx and uwsgito understand how to optimize their configuration for your site

The Django documentation includes the following warning regarding uwsgi

Warning Use uwsgi 126 or newer If you do not you will run into problems Modoboa will fail in obscureways

To use this setup first download and install uwsgi

Here is a sample nginx configuration

server listen 443 sslssl onkeepalive_timeout 70

server_name lthost fqdngtroot ltmodoboas settings dirgt

ssl_certificate ltssl certificate for your sitegtssl_certificate_key ltssl certificate key for your sitegt

access_log varlognginxlthost fqdngtaccesslogerror_log varlognginxlthost fqdngterrorlog

location ltmodoboas root urlgtsitestatic autoindex onalias ltlocation of sitestatic on your file systemgt

Whether or not Modoboa uses a media directory depends on how you configured Modoboa It does not hurt to have thislocation ltmodoboas root urlgtmedia

autoindex onalias ltlocation of media on your file systemgt

This denies access to any file that begins with ht Apaches htaccess and htpasswd are such files A Modoboa installed from scratch would not contain any such files but you never know what the future holds

(continues on next page)

12 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

location ~ ht deny all

location ltmodobas root urlgt include uwsgi_paramsuwsgi_pass ltuwsgi portgtuwsgi_param UWSGI_SCRIPT ltmodoboa instance namegtwsgiapplicationuwsgi_param UWSGI_SCHEME https

ltmodoboa instance namegt must be replaced by the value you used when you deployed your instance

If you do not plan to use SSL then change the listen directive to listen 80 and delete each of the followingdirectives

ssl onkeepalive_timeout 70ssl_certificate ltssl certificate for your sitegtssl_certificate_key ltssl certificate key for your sitegtuwsgi_param UWSGI_SCHEME https

If you do plan to use SSL yoursquoll have to generate a certificate and a key This article contains information about howto do it

Make sure to replace the ltgt in the sample configuration with appropriate values Here are some explanations forthe cases that may not be completely self-explanatory

ltmodoboas settings dirgt Where Modoboarsquos settingspy resides This is also where thesitestatic and media directories reside

ltmodoboas root urlgt This is the URL which will be the root of your Modoboa site at your domain For in-stance if your Modoboa installation is reachable at at httpsfoomodoboa then ltmodoboas rooturlgt is modoboa In this case you probably also have to set the alias directives to point to where Mod-oboarsquos sitestatic and media directories are because otherwise nginx wonrsquot be able to find them

If Modoboa is at the root of your domain then ltmodoboa root urlgt is an empty string and can be deletedfrom the configuration above In this case you probably do not need the alias directives

ltuwsgi portgt The location where uwsig is listening It could be a unix domain socket or an addressport combi-nation Ubuntu configures uwsgi so that the port is

unixrunuwsgiappltapp namegtsocket

where ltapp namegt is the name of the application

Your uwsgi configuration should be

[uwsgi] Not needed when using uwsgi from pip plugins = pythonchdir = ltmodoboas top dirgtmodule = ltnamegtwsgiapplicationmaster = trueharakiri = 60processes = 4vhost = trueno-default-app = true

21 Installation 13

Modoboa Documentation Release 1100

The plugins directive should be turned on if you use a uwsgi installation that requires it If uwsgi was installed frompip it does not require it In the configuration above

ltmodoboas top dirgt The directory where managepy resides This directory is the parent of ltmodoboassettings dirgt

ltnamegt The name that you passed to modoboa-adminpy deploy when you created your Modoboa instance

Now you can go the Dovecot section to continue the installation

Dovecot

Modoboa requires Dovecot 2+ to work so the following documentation is suitable for this combination

In this section we assume dovecotrsquos configuration resides in etcdovecot all pathes will be relative to thisdirectory

Mailboxes

First edit the confd10-mailconf and set the mail_location variable

maildirmail_location = maildir~maildir

Then edit the inbox namespace and add the following lines

inbox = yes

mailbox Drafts auto = subscribespecial_use = Drafts

mailbox Junk

auto = subscribespecial_use = Junk

mailbox Sent

auto = subscribespecial_use = Sent

mailbox Trash

auto = subscribespecial_use = Trash

With dovecot 21+ it ensures all the special mailboxes will be automaticaly created for new accounts

For dovecot 20 and older use the autocreate plugin

Operations on the file system

14 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning Modoboa needs to access the dovecot binary to check its version To find the binary path weuse the which command first and then try known locations (usrsbindovecot and usrlocalsbindovecot) If you installed dovecot in a custom location please tell us where the binary is by usingthe DOVECOT_LOOKUP_PATH setting (see settingspy)

Three operation types are considered

1 Mailbox creation

2 Mailbox renaming

3 Mailbox deletion

The first one is managed by Dovecot The last two ones may be managed by Modoboa if it can access the file systemwhere the mailboxes are stored (see General parameters to activate this feature)

Those operations are treated asynchronously by a cron script For example when you rename an e-mail addressthrough the web UI the associated mailbox on the file system is not modified directly Instead of that a renameorder is created for this mailbox The mailbox will be considered unavailable until the order is executed (see Postfixconfiguration)

Edit the crontab of the user who owns the mailboxes on the file system

$ crontab -u ltusergt -e

And add the following line inside

python ltmodoboa_sitegtmanagepy handle_mailbox_operations

Warning The cron script must be executed by the system user owning the mailboxes

Warning The user running the cron script must have access to the settingspy file of the modoboa instance

The result of each order is recorded into Modoboarsquos log Go to Modoboa gt Logs to consult them

Authentication

To make the authentication work edit the confd10-authconf and uncomment the following line at the end

include auth-systemconfextinclude auth-sqlconfextinclude auth-ldapconfextinclude auth-passwdfileconfextinclude auth-checkpasswordconfextinclude auth-vpopmailconfextinclude auth-staticconfext

Then edit the confdauth-sqlconfext file and add the following content inside

passdb sql driver = sql Path for SQL configuration file see example-configdovecot-sqlconfext

(continues on next page)

21 Installation 15

Modoboa Documentation Release 1100

(continued from previous page)

args = etcdovecotdovecot-sqlconfext

userdb sql driver = sqlargs = etcdovecotdovecot-sqlconfext

Make sure to activate only one backend (per type) inside your configuration (just comment the other ones)

Edit the dovecot-sqlconfext and modify the configuration according to your database engine

MySQL users

driver = mysql

connect = host=ltmysqld socketgt dbname=ltdatabasegt user=ltusergt password=ltpasswordgt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user WHERE email=Lu andrarr˓is_active=1

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid concat(bytes= mbquota M) AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

PostgreSQL users

driver = pgsql

connect = host=ltpostgres socketgt dbname=ltdatabasegt user=ltusergt password=ltpasswordgt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user u INNER JOIN admin_rarr˓mailbox mb ON uid=mbuser_id INNER JOIN admin_domain dom ON mbdomain_id=domidrarr˓WHERE uemail=Lu AND uis_active AND domenabled

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid bytes= || mbquota || M AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

16 Chapter 2 Table of contents

Modoboa Documentation Release 1100

SQLite users

driver = sqlite

connect = ltpath to the sqlite db filegt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user u INNER JOIN admin_rarr˓mailbox mb ON uid=mbuser_id INNER JOIN admin_domain dom ON mbdomain_id=domidrarr˓WHERE uemail=Lu AND uis_active=1 AND domenabled=1

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid (bytes= || mbquota || M) AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

Note Replace values between ltgt with yours

LDAP

To make the LDAP authentication work edit the confd10-authconf and uncomment the following line atthe end

include auth-ldapconfext

Then edit the confdauth-ldapconfext and edit the passdb section as following You should comment theuserdb section which will be managed by SQL with modoboa database

passdb driver = ldap

Path for LDAP configuration file see example-configdovecot-ldapconfextargs = etcdovecotdovecot-ldapconfext

userdb driver = ldapargs = etcdovecotdovecot-ldapconfext

Default fields can be used to specify defaults that LDAP may overridedefault_fields = home=homevirtualu

Your own dovecot LDAP configuration file is now etcdovecotdovecot-ldapconfext You can addyour default LDAP conf in it following the official documentation

Synchronize dovecot LDAP conf with modoboa LDAP conf

To make dovecot LDAP configuration synchronized with modoboa LDAP configuration you should create a dedicateddovecot conf file At the end of your dovecot configuration file (dovecot-ldapconfext) add the following

21 Installation 17

Modoboa Documentation Release 1100

line

include_try dovecot-modoboaconfext

Then set modoboa parameter Enable Dovecot LDAP sync to Yes Then set the Dovecot LDAP config file following theprevious step (etcdovecotdovecot-modoboaconfext in the example)

The last step is to add the command update_dovecot_conf to the cron job of modoboa Then each time your modoboaLDAP configuration is updated your dovecot LDAP configuration will also be

LMTP

Local Mail Transport Protocol is used to let Postfix deliver messages to Dovecot

First make sure the protocol is activated by looking at the protocols setting (generally inside dovecotconf)It should be similar to the following example

protocols = imap pop3 lmtp

Then open the confd10-masterconf look for lmtp service definition and add the following content inside

service lmtp stuff beforeunix_listener varspoolpostfixprivatedovecot-lmtp mode = 0600user = postfixgroup = postfix

stuff after

We assume here that Postfix is chrooted within varspoolpostfix

Finally open the confd20-lmtpconf and modify it as follows

protocol lmtp postmaster_address = postmasterltdomaingtmail_plugins = $mail_plugins quota sieve

Replace ltdomaingt by the appropriate value

Note If you donrsquot plan to apply quota or to use filters just adapt the content of the mail_plugins setting

Quota

Modoboa lets adminstrators define per-domain andor per-account limits (quota) It also lists the current quota usageof each account Those features require Dovecot to be configured in a specific way

Inside confd10-mailconf add the quota plugin to the default activated ones

mail_plugins = quota

Inside confd10-masterconf update the dict service to set proper permissions

18 Chapter 2 Table of contents

Modoboa Documentation Release 1100

service dict If dict proxy is used mail processes should have access to its socket For example mode=0660 group=vmail and global mail_access_groups=vmailunix_listener dict mode = 0600user = ltuser owning mailboxesgtgroup =

Inside confd20-imapconf activate the imap_quota plugin

protocol imap

mail_plugins = $mail_plugins imap_quota

Inside dovecotconf activate the quota SQL dictionary backend

dict quota = ltdrivergtetcdovecotdovecot-dict-sqlconfext

Inside confd90-quotaconf activate the quota dictionary backend

plugin quota = dictUser quotaproxyquota

It will tell Dovecot to keep quota usage in the SQL dictionary

Finally edit the dovecot-dict-sqlconfext file and put the following content inside

connect = host=ltdb hostgt dbname=ltdb namegt user=ltdb usergt password=ltpasswordgt SQLite users connect = pathtothedatabasedb

map pattern = privquotastoragetable = admin_quotausername_field = usernamevalue_field = bytes

map

pattern = privquotamessagestable = admin_quotausername_field = usernamevalue_field = messages

PostgreSQL users

21 Installation 19

Modoboa Documentation Release 1100

Database schema update

The admin_quota table is created by Django but unfortunately it doesnrsquot support DEFAULT constraints (it onlysimulates them when the ORM is used) As PostgreSQL is a bit strict about constraint violations you must executethe following query manually

db=gt ALTER TABLE admin_quota ALTER COLUMN bytes SET DEFAULT 0db=gt ALTER TABLE admin_quota ALTER COLUMN messages SET DEFAULT 0

Trigger

As indicated on Dovecotrsquos wiki you need a trigger to properly update the quota

A working copy of this trigger is available on Github

Download this file and copy it on the server running postgres Then execute the following commands

$ su - postgres$ psql [modoboa database] lt pathtomodoboa_postgres_triggersql$ exit

Replace [modoboa database] by the appropriate value

Forcing recalculation

For existing installations Dovecot (gt 2) offers a command to recalculate the current quota usages For example if youwant to update all usages run the following command

$ doveadm quota recalc -A

Be carefull it can take a while to execute

ManageSieveSieve

Modoboa lets users define filtering rules from the web interface To do so it requires ManageSieve to be activated onyour server

Inside confd20-managesieveconf make sure the following lines are uncommented

protocols = $protocols sieve

service managesieve-login

service managesieve

protocol sieve

20 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Messages filtering using Sieve is done by the LDA

Inside confd15-ldaconf activate the sieve plugin like this

protocol lda Space separated list of plugins to load (default is global mail_plugins)mail_plugins = $mail_plugins sieve

Finally configure the sieve plugin by editing the confd90-sieveconf file Put the follwing caontent inside

plugin Location of the active script When ManageSieve is used this is actually a symlink pointing to the active script in the sieve storage directorysieve = ~dovecotsieve

The path to the directory where the personal Sieve scripts are stored For ManageSieve this is where the uploaded scripts are storedsieve_dir = ~sieve

Restart Dovecot

Now you can go to the Postfix section to finish the installation

Last-login tracking

To update the last_login attribute of an account after a succesful IMAP or POP3 login you can configure apost-login script

Open confd10-masterconf add the following configuration (imap and pop3 services are already definedyou just need to update them)

service imap executable = imap postlogin

service pop3 executable = pop3 postlogin

service postlogin executable = script-login usrlocalbinpostloginshuser = modoboaunix_listener postlogin

Then you must create a script named usrlocalbinpostloginsh According to your database enginethe content will differ

PostgreSQL

21 Installation 21

Modoboa Documentation Release 1100

binsh

psql -c UPDATE core_user SET last_login=now() WHERE username=$USER gt devnull

exec $

MySQL

binsh

DBNAME=XXXDBUSER=XXXDBPASSWORD=XXX

echo UPDATE core_user SET last_login=now() WHERE username=$USER | mysql -urarr˓$DBUSER -p$DBPASSWORD $DBNAME

exec $

Postfix

This section gives an example about building a simple virtual hosting configuration with Postfix Refer to the officialdocumentation for more explanation

Map files

You first need to create configuration files (or map files) that will be used by Postfix to lookup into Modoboa tables

To automaticaly generate the requested map files and store them in a directory run the following command

gt cd ltmodoboa_instance_pathgtgt python managepy generate_postfix_maps --destdir ltdirectorygt

ltdirectorygt is the directory where the files will be stored Answer the few questions and yoursquore done

Configuration

Use the following configuration in the etcpostfixmaincf file (this is just one possible configuration)

Stuff beforevirtual_transport = lmtpunixprivatedovecot-lmtp

virtual_mailbox_domains = ltdrivergtetcpostfixsql-domainscfvirtual_alias_domains = ltdrivergtetcpostfixsql-domain-aliasescfvirtual_alias_maps = ltdrivergtetcpostfixsql-aliasescf

relay_domains = ltdrivergtetcpostfixsql-relaydomainscftransport_maps =

ltdrivergtetcpostfixsql-transportcfltdrivergtetcpostfixsql-spliteddomains-transportcf

(continues on next page)

22 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

smtpd_recipient_restrictions = check_recipient_access

ltdrivergtetcpostfixsql-maintaincfltdrivergtetcpostfixsql-relay-recipient-verificationcf

permit_mynetworksreject_unauth_destinationreject_unverified_recipient

smtpd_sender_login_maps = ltdrivergtetcpostfixsql-sender-login-mapcf

smtpd_sender_restrictions =reject_sender_login_mismatch

Stuff after

Replace ltdrivergt by the name of the database you use

Restart Postfix

Policy daemon

If you want to enable the built-in policy daemon add the following content to the etcpostfixmaincf file

smtpd_recipient_restrictions = check_policy_service inet1270019999

And reload postfix

Note The check_policy_service line must be placed before the permit_mynetworks one otherwise thedaemon wonrsquot be called

OpenDKIM

Modoboa can generate DKIM keys for the hosted domains but it wonrsquot sign or check messages To do that you needa dedicated software like OpenDKIM

Note The cron job in charge of creating DKIM keys must be run using the same user than OpenDKIM (ie opendkimin most cases)

Database

Since keys related information is stored in Modoboarsquos database you need to tell OpenDKIM how it can access it

First make sure to install the required additional packages on your system (libopendbx1- on debian baseddistributions or opendbx- on CentOS the complete name depends on your database engine)

Then insert the following SQL view into Modoboarsquos database

21 Installation 23

Modoboa Documentation Release 1100

PostgreSQL

CREATE OR REPLACE VIEW dkim AS (SELECT id name as domain_name dkim_private_key_path AS private_key_path

dkim_key_selector AS selectorFROM admin_domain WHERE enable_dkim

)

MySQLMariaDB

CREATE OR REPLACE VIEW dkim AS (SELECT id name as domain_name dkim_private_key_path AS private_key_path

dkim_key_selector AS selectorFROM admin_domain WHERE enable_dkim=1

)

Configuration

You should find OpenDKIMrsquos configuration file at etcopendkimconf

Add the following content to it

KeyTable dsnltdrivergtltusergtltpasswordgtltdb hostgtltdb namegttable=dkimrarr˓keycol=iddatacol=domain_nameselectorprivate_key_pathSigningTable dsnltdrivergtltusergtltpasswordgtltdb hostgtltdb namegttable=dkimrarr˓keycol=domain_namedatacol=idSocket inet12345localhost

Replace values between ltgt by yours Accepted values for driver are pgsql or mysql Make sure the user youspecify has read permission on the view created previously

If you run a debian based system make sure to adjust the following setting in the etcdefaultopendkim file

SOCKET=inet12345localhost

Eventually reload OpenDKIM

Postfix integration

Add the following lines to the etcpostfixmaincf file

smtpd_milters = inet12700112345non_smtpd_milters = inet12700112345milter_default_action = acceptmilter_content_timeout = 30s

and reload postfix

Extensions

Only few commands are needed to add a new extension to your setup

24 Chapter 2 Table of contents

Modoboa Documentation Release 1100

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install ltEXTENSIONgt==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Then restart your web server

22 Upgrade

221 Modoboa

Warning The new version you are going to install may need to modify your database Before you start makesure to backup everything

Most of the time upgrading your installation to a newer Modoboa version only requires a few actions In every caseyou will need to apply the general procedure first and then check if the version you are installing requires specificactions

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install modoboa==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Once done check if the version you are installing requires Specific instructions

Finally restart your web server

Sometimes you might need to upgrade postfix map files too To do so just run the generate_postfix_mapscommand on the same directory than the one used for installation (etcpostfix by default)

Make sure to use root privileges and run the following command

gt python managepy generate_postfix_maps --destdir ltdirectorygt

Then reload postfix

22 Upgrade 25

Modoboa Documentation Release 1100

222 Extensions

If a new version is available for an extension yoursquore using it is recommanded to install it Upgrading an extensions ispretty and the procedure is almost the same than the one used for Modoboa

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install ltEXTENSIONgt==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Finally restart your web server

It is a generic upgrade procedure which will be enough most of the time but it is generally a good idea to check theassociated documentation

223 Rebuild Virtual Environment

Sometimes when upgrading your Operating System (eg from Ubuntu 1704 to Ubuntu 1710) your virtual environmentrunning modoboa can get corrupted Your first response will be to panic but fear not The solution is in this document

First things first

Recover your database password

You will need to recover your database password (if using mysql or postgresql) You will find this in etcpostfixsql-aliasescf or any file with sql-cf in the etcpostfix directory

Make note of this as you will need it when reconfiguring modoboa

Reinstall Modoboa

Start out by backup up your modoboa settings file located in the modoboa instance directory (srvmodoboainstanceinstancesettingspy if you used the default installer configuration) This contains your currentconfiguration

Next you want to remove all current modoboa files

After doing this follow the manual installation instructions for Modoboa only as everything should be working prop-erly

After this completes simply restore your backed up settings file to srvinstanceinstancesettingspy(if you used installer default configuration) You will then need to reinstall your extensions

You can find which plugins you had in your settingspy file under the MODOBOA_APPS variable

Instructions to install extensions can also be found here

Once you have completed this step you will need to run the following commands

26 Chapter 2 Table of contents

Modoboa Documentation Release 1100

gt (env) $ cd ltinstance_dirgtgt (env) $ python managepy migrategt (env) $ python managepy collectstatic

You will then see a message similar to

You have requested to collect static files at the destinationlocation as specified in your settings

srvmodoboainstancesitestatic

This will overwrite existing filesAre you sure you want to do this

Type yes to continue or no to cancel

You will want to answer yes here then simply restart the uwsgi process with service uwsgi restart andyou should be up and running again

Simply log into your modoboa web panel and verify that your extensions and webmail box is working

224 Information

Rebuild instructions from httpshelppythonanywherecompagesRebuildingVirtualenvs

225 Specific instructions

1160

A new policy daemon has been added

Make sure to have a Redis instance running on your server

Add modoboapolicyd to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboapolicyd

)

Add the following settings to your settingspy file

REDIS_HOST = ltIP or hostname heregtREDIS_PORT = 6379REDIS_QUOTA_DB = 0REDIS_URL = redisformat(REDIS_HOST REDIS_PORT REDIS_QUOTA_DB)

Once done you can start the policy daemon using the following commands

22 Upgrade 27

Modoboa Documentation Release 1100

gt python managepy policy_daemon

Donrsquot forget to configure _policyd_config if you want to use this feature

The modoboa-stats plugin has been merged into the core

Add modoboamaillog to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboapolicydmodoboamaillog

)

And remove any reference to modoboa_stats in this same variable

1150

This version drops Python 2 support so donrsquot forget to update all the extensions you use

Warning If you upgrade an existing python 2 installation you will need to create a new Python 3 virtualenvironment You can remove the existing virtual environment and replace it by the new one so you wonrsquot have tomodify your configuration files

Add the following new setting

DISABLE_DASHBOARD_EXTERNAL_QUERIES = False

Reload uwsgigunicornapache depending on your setup

Finally Make sure to use root privileges and run the following command

gt python managepy generate_postfix_maps --destdir ltdirectorygt

Then reload postfix

1140

This release introduces an optional LDAP synchronization process If you want to use it please follow the dedicatedprocedure

1131

Upgrade postfix maps files as follows

28 Chapter 2 Table of contents

Modoboa Documentation Release 1100

gt python managepy generate_postfix_maps --destdir ltpathgt --force-overwrite

1130

Add modoboadnstools to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstools

)

Add the following new settings

CSRF_COOKIE_SECURE = TrueSESSION_COOKIE_SECURE = True

modoboa-postfix-autoreply 150

Edit the etcpostfixmaincf file and remove the sql-autoreplies-transportcf map from thetransport_maps if present Remove the corresponding proxy_read_maps entry if relevant

Reload postfix

1100

Warning Upgrade installed extensions BEFORE running check or migrate commands

Upgrade all your installed plugins to the following versions

Warning If you use the amavis plugin make sure to include its configuration as follows into settingspy

from modoboa_amavis import settings as modoboa_amavis_settingsmodoboa_amavis_settingsapply(globals())

22 Upgrade 29

Modoboa Documentation Release 1100

Name Versionmodoboa-amavis 120modoboa-contacts 050modoboa-dmarc 110modoboa-imap-migration 120modoboa-pdfcredentials 130modoboa-postfix-autoreply 140modoboa-radicale 120modoboa-sievefilters 140modoboa-stats 140modoboa-webmail 140

Edit the settingspy file and apply the following modifications

Add modoboatransport to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparameters

)

Replace the following line

MIDDLEWARE_CLASSES = (

by

MIDDLEWARE = (

Update postfix map files as follows

gt rm -f ltpathgtmodoboa-postfix-mapschkgt python managepy generate_postfix_maps --force --destdir ltpathgt

Then modify postfixrsquos configuration as follows

smtpd_sender_login_maps =ltdrivergtltpathgtsql-sender-login-mapcf

transport_maps =ltdrivergtltpathgtsql-transportcfltdrivergtltpathgtsql-spliteddomains-transportcf other map files

Replace ltdrivergt and ltpathgt by your values

If transport_maps contains sql-relaydomains-transportcf remove it

30 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning If you make use of postfixrsquos proxymap server you must also update the proxy_read_maps setting

Reload postfix

Add the following cron job in order to generate DKIM keys

Generate DKIM keys (they will belong to the user running this job)

root $PYTHON $INSTANCEmanagepy modorarr˓manage_dkim_keys

190

If you want to manage inactive accounts look at Cleaning inactive accounts

183

Edit the settingspy file and replace the following line

BASE_DIR = ospathdirname(ospathdirname(__file__))

by

BASE_DIR = ospathrealpath(ospathdirname(ospathdirname(__file__)))

180

Modoboa now relies on Djangorsquos builtin password validation system to validate user passwords instead ofdjango-passwords

Remove django-passwords from your system

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt pip uninstall django-passwords

Edit the settingspy file and remove the following content

django-passwords

PASSWORD_MIN_LENGTH = 8

PASSWORD_COMPLEXITY = UPPER 1LOWER 1DIGITS 1

Add the following lines

Password validation rulesAUTH_PASSWORD_VALIDATORS = [

NAME djangocontribauthpassword_validation

rarr˓UserAttributeSimilarityValidator (continues on next page)

22 Upgrade 31

Modoboa Documentation Release 1100

(continued from previous page)

NAME djangocontribauthpassword_validationMinimumLengthValidator

NAME djangocontribauthpassword_validationCommonPasswordValidator

NAME djangocontribauthpassword_validationNumericPasswordValidator

NAME modoboacorepassword_validationComplexityValidatorOPTIONS

upper 1lower 1digits 1specials 0

]

172

API documentation has evolved (because of the upgrade to Django Rest Framework 36) and CKeditor is now embed-ded by default (thanks to the django-ckeditor package) Some configuration changes are required

Edit your settingspy file and apply the following modifications

bull Update the INSTALLED_APPS variable as follows

INSTALLED_APPS = (djangocontribauthdjangocontribcontenttypesdjangocontribsessionsdjangocontribmessagesdjangocontribsitesdjangocontribstaticfilesreversionckeditorckeditor_uploaderrest_frameworkrest_frameworkauthtoken

)

bull Update the REST_FRAMEWORK variable as follows

REST_FRAMEWORK = DEFAULT_AUTHENTICATION_CLASSES (

rest_frameworkauthenticationTokenAuthenticationrest_frameworkauthenticationSessionAuthentication

)

bull Remove the SWAGGER_SETTINGS variable

bull Add the following content

32 Chapter 2 Table of contents

Modoboa Documentation Release 1100

CKeditor

CKEDITOR_UPLOAD_PATH = uploads

CKEDITOR_IMAGE_BACKEND = pillow

CKEDITOR_RESTRICT_BY_USER = True

CKEDITOR_BROWSE_SHOW_DIRS = True

CKEDITOR_ALLOW_NONIMAGE_FILES = False

CKEDITOR_CONFIGS = default

allowedContent Truetoolbar Modoboawidth Nonetoolbar_Modoboa [

[Bold Italic Underline][JustifyLeft JustifyCenter JustifyRight JustifyBlock][BidiLtr BidiRtl Language][NumberedList BulletedList - Outdent Indent][Undo Redo][Link Unlink Anchor - Smiley][TextColor BGColor - Source][Font FontSize][Image ][SpellChecker]

]

Donrsquot forget to run the following command

gt python managepy collectstatic

171

If you used 170 for a fresh installation please run the following commands

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy load_initial_data

170

This version requires Django gt= 110 so you need to make some modifications It also brings internal API changeswhich are not backward compatible so installed extensions must be upgraded too

First of all deactivate all installed extensions (edit the settingspy file and comment the corresponding lines inMODOBOA_APPS)

Edit the urlspy file of your local instance and replace its content by the following one

22 Upgrade 33

Modoboa Documentation Release 1100

from djangoconfurls import include url

urlpatterns = [url(r include(modoboaurls))

]

Edit the settingspy and apply the following changes

bull Add modoboaparameters to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboarelaydomainsmodoboalimitsmodoboaparameters Modoboa extensions here

)

bull Add modoboacoremiddlewareLocalConfigMiddleware to MIDDLEWARE_CLASSES

MIDDLEWARE_CLASSES = (djangocontribsessionsmiddlewareSessionMiddlewaredjangomiddlewarecommonCommonMiddlewaredjangomiddlewarecsrfCsrfViewMiddlewaredjangocontribauthmiddlewareAuthenticationMiddlewaredjangocontribmessagesmiddlewareMessageMiddlewaredjangomiddlewarelocaleLocaleMiddlewaredjangomiddlewareclickjackingXFrameOptionsMiddlewaremodoboacoremiddlewareLocalConfigMiddlewaremodoboalibmiddlewareAjaxLoginRedirectmodoboalibmiddlewareCommonExceptionCatchermodoboalibmiddlewareRequestCatcherMiddleware

)

bull Modoboa used to provide a custom authentication backend (modoboalibauthbackendsSimpleBackend) but it has been removed Replace it as follows

AUTHENTICATION_BACKENDS = ( Other backends beforedjangocontribauthbackendsModelBackend

)

bull Remove TEMPLATE_CONTEXT_PROCESSORS and replace it by

TEMPLATES = [

BACKEND djangotemplatebackendsdjangoDjangoTemplatesDIRS []APP_DIRS TrueOPTIONS

context_processors [djangotemplatecontext_processorsdebugdjangotemplatecontext_processorsrequestdjangocontribauthcontext_processorsauth

(continues on next page)

34 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

djangotemplatecontext_processorsi18ndjangotemplatecontext_processorsmediadjangotemplatecontext_processorsstaticdjangotemplatecontext_processorstzdjangocontribmessagescontext_processorsmessagesmodoboacorecontext_processorstop_notifications

]debug False

]

Run the following commands (load virtualenv if you use one)

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstatic

Finally upgrade your extensions and reactivate them

Name Versionmodoboa-amavis 110modoboa-dmarc 100modoboa-imap-migration 110modoboa-pdfcredentials 110modoboa-postfix-autoreply 120modoboa-radicale 110modoboa-sievefilters 110modoboa-stats 110modoboa-webmail 110

Command line shortcuts

$ pip install modoboa-amavis==110$ pip install modoboa-dmarc==100$ pip install modoboa-imap-migration==110$ pip install modoboa-pdfcredentials==110$ pip install modoboa-postfix-autoreply==120$ pip install modoboa-radicale==110$ pip install modoboa-sievefilters==110$ pip install modoboa-stats==110$ pip install modoboa-webmail==110

And please make sure you use the latest version of the django-versionfield2 package

$ pip install -U django-versionfield2

Notes about quota changes and resellers

Reseller users now have a quota option in Resources tab This is the quota that a reseller can share between all itsdomains

22 Upgrade 35

Modoboa Documentation Release 1100

There are two quotas for a domain in the new version

1 Quota amp

2 Default mailbox quota

[1] Quota quota shared between mailboxes This quota is shared between all the mailboxes of this domain This valuecannot exceed resellerrsquos quota and hence cannot be 0(unlimited) if reseller has finite quota

[2] Default mailbox quota default quota applied to mailboxes This quota is the default quota applied to new mail-boxes This value cannot exceed Quota[1] and hence cannot be 0(unlimited) if Quota[1] is finite

161

First of all update postfix map files as follows

gt python managepy generate_postfix_maps --destdir ltpathgt --force-overwrite

Then modify postfixrsquos configuration as follows

smtpd_sender_login_maps =ltdrivergtltpathgtsql-sender-login-mailboxescfltdrivergtltpathgtsql-sender-login-aliasescfltdrivergtltpathgtsql-sender-login-mailboxes-extracf

Replace ltdrivergt and ltpathgt by your values

Finally reload postfix

This release also deprecates some internal functions As a result several extensions has been updated to maintain thecompatibility If you enabled the notification service yoursquoll find the list of available updates directly in your Modoboaconsole

For the others here is the list

Name Versionmodoboa-amavis 1010modoboa-postfix-autoreply 117modoboa-radicale 105modoboa-stats 109

Command line shortcut

$ pip install modoboa-amavis==1010$ pip install modoboa-postfix-autoreply==117$ pip install modoboa-radicale==105$ pip install modoboa-stats==109

160

Warning You have to upgrade extensions due to coreUser model attribute change (usergroup to userrole) Oth-erwise you will have an internal error after upgrade In particular modoboa-amavisd modoboa-stats modoboa-postfix-autoreply are concerned

36 Chapter 2 Table of contents

Modoboa Documentation Release 1100

An interesting feature brougth by this version is the capability to make different checks about MX records Forexample Modoboa can query main DNSBL providers for every defined domain With this you will quickly know ifone the domains you manage is listed or not To activate it add the following line to your crontab

30 ltoptional_virtualenv_pathgtpython ltmodoboa_instance_dirgtmanagepy modorarr˓check_mx

The communication with Modoboa public API has been reworked Instead of sending direct synchronous queries (forexample to check new versions) a cron job has been added To activate it add the following line to your crontab

0 ltoptional_virtualenv_pathgtpython ltmodoboa_instance_dirgtmanagepyrarr˓communicate_with_public_api

Please also note that public API now uses TLS so you must update your configuration as follows

MODOBOA_API_URL = httpsapimodoboaorg1

Finally it is now possible to declare additional sender addresses on a per-account basis You need to update your postfixconfiguration in order to use this functionality Just edit the maincf file and change the following parameter

smtpd_sender_login_maps =ltdrivergtetcpostfixsql-sender-login-mailboxescfltdrivergtetcpostfixsql-sender-login-aliasescfltdrivergtetcpostfixsql-sender-login-mailboxes-extracf

150

The API has been greatly improved and a documentation is now available To enable it addrest_framework_swagger to the INSTALLED_APPS variable in settingspy as follows

INSTALLED_APPS = (djangocontribauthdjangocontribcontenttypesdjangocontribsessionsdjangocontribmessagesdjangocontribsitesdjangocontribstaticfilesreversionrest_frameworkauthtokenrest_framework_swagger

)

Then add the following content into settingspy just after the REST_FRAMEWORK variable

SWAGGER_SETTINGS = is_authenticated Falseapi_version 10exclude_namespaces []info

contact contactmodoboacomdescription (Modoboa API requires a valid token)title Modoboa API

Yoursquore done The documentation is now available at the following address

22 Upgrade 37

Modoboa Documentation Release 1100

httpltyour instance addressgtdocsapi

Finally if you find a TEMPLATE_CONTEXT_PROCESSORS variable in your settingspy file make sure it lookslike this

TEMPLATE_CONTEXT_PROCESSORS = global_settingsTEMPLATE_CONTEXT_PROCESSORS + [modoboacorecontext_processorstop_notifications

]

140

Warning Please make sure to use Modoboa 135 with an up-to-date database before an upgrade to 140

Warning Do not follow the regular upgrade procedure for this version

Some extension have been moved back into the main repository The main reason for that is that using Modoboawithout them doesnrsquot make sense

First of all you must rename the following applications listed inside the MODOBOA_APPS variable

Old name New namemodoboa_admin modoboaadminmodoboa_admin_limits modoboalimitsmodoboa_admin_relaydomains modoboarelaydomains

Then apply the following steps

1 Uninstall old extensions

$ pip uninstall modoboa-admin modoboa-admin-limits modoboa-admin-relaydomains

2 Install all extension updates using pip (check the Modoboa gt Information page)

3 Manually migrate database

$ cd ltinstance_dirgt$ python managepy migrate auth$ python managepy migrate admin 0001 --fake$ python managepy migrate admin$ python managepy migrate limits 0001 --fake$ python managepy migrate relaydomains 0001 --fake$ python managepy migrate

4 Finally update static files

$ python managepy collectstatic

This version also introduces a REST API To enable it

1 Add rest_frameworkauthtoken to the INSTALLED_APPS variable

2 Add the following configuration inside settingspy

38 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Rest framework settings

REST_FRAMEWORK = DEFAULT_AUTHENTICATION_CLASSES (

rest_frameworkauthenticationTokenAuthentication)DEFAULT_PERMISSION_CLASSES (

rest_frameworkpermissionsIsAuthenticated)

3 Run the following command

$ python managepy migrate

135

To enhance security Modoboa now checks the strength of user passwords lthttpsgithubcomdstufftdjango-passwordsgt_

To use this feature add the following configuration into the settingspy file

django-passwords

PASSWORD_MIN_LENGTH = 8

PASSWORD_COMPLEXITY = UPPER 1LOWER 1DIGITS 1

132

Modoboa now uses the atomic requests mode to preserve database consistency (reference)

To enable it update the DATABASES variable in settingspy as follows

DATABASES = default

stuff beforeATOMIC_REQUESTS True

amavis

stuff beforeATOMIC_REQUESTS True

130

This release does not bring awesome new features but it is a necessary bridge to the future of Modoboa All extensionsnow have their own git repository and the deploy process has been updated to reflect this change

22 Upgrade 39

Modoboa Documentation Release 1100

Another important update is the use of Django 17 Besides its new features the migration system has been reworkedand is now more robust than before

Before we begin with the procedure here is a table showing old extension names and their new name

Old name New package name New module namemodoboaextensionsadmin modoboa-admin modoboa_adminmodoboaextensionslimits modoboa-admin-limits modoboa_admin_limitsmodoboaextensionspostfix_autoreply modoboa-postfix-autoreply modoboa_postfix_autoreplymodoboaextensionspostfix_relay_domains modoboa-admin-relaydomains modoboa_admin_relaydomainsmodoboaextensionsradicale modoboa-radicale modoboa_radicalemodoboaextensionssievefilters modoboa-sievefilters modoboa_sievefiltersmodoboaextensionsstats modoboa-stats modoboa_statsmodoboaextensionswebmail modoboa-webmail modoboa_webmail

Here are the required steps

1 Install the extensions using pip (look at the second column in the table above)

$ pip install ltthe extensions you wantgt

2 Remove south from INSTALLED_APPS

3 Rename old extension names inside MODOBOA_APPS (look at the third column in the table above)

4 Remove modoboalibmiddlewareExtControlMiddleware from MIDDLEWARE_CLASSES

5 Change DATABASE_ROUTERS to

DATABASE_ROUTERS = [modoboa_amavisdbrouterAmavisRouter]

6 Run the following commands

$ cd ltmodoboa_instance_dirgt$ python managepy migrate

7 Reply yes to the question

8 Run the following commands

$ python managepy load_initial_data$ python managepy collectstatic

9 The cleanup job has been renamed in Django so you have to modify your crontab entry

- 0 0 ltmodoboa_sitegtmanagepy cleanup+ 0 0 ltmodoboa_sitegtmanagepy clearsessions

120

A new notification service let administrators know about new Modoboa versions To activate it you need to updatethe TEMPLATE_CONTEXT_PROCESSORS variable like this

from djangoconf import global_settings

TEMPLATE_CONTEXT_PROCESSORS = global_settingsTEMPLATE_CONTEXT_PROCESSORS + (

(continues on next page)

40 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

modoboacorecontext_processorstop_notifications)

and to define the new MODOBOA_API_URL variable

MODOBOA_API_URL = httpapimodoboaorg1

The location of external static files has changed To use them add a new path to the STATICFILES_DIRS

Additional locations of static filesSTATICFILES_DIRS = (

Put strings here like homehtmlstatic or Cwwwdjangostatic Always use forward slashes even on Windows Dont forget to use absolute paths not relative pathsltpathtomodoboainstalldirgtbower_components

)

Run the following commands to define the hostname of your instance

$ cd ltmodoboa_instance_dirgt$ python managepy set_default_site lthostnamegt

If you plan to use the Radicale extension

1 Add modoboaextensionsradicale to the MODOBOA_APPS variable

2 Run the following commands

$ cd ltmodoboa_instance_dirgt$ python managepy syncdb

Warning You also have to note that the sitestatic directory has moved from ltpath to your sitesdirgt to ltmodoboas root urlgt (itrsquos probably the parent directory) You have to adapt your web serverconfiguration to reflect this change

23 Configuration

231 Online parameters

Modoboa provides online panels to modify internal parameters There are two available levels

bull Application level global parameters define how the application behaves Available at Modoboa gt Parameters

bull User level per user customization Available at User gt Settings gt Preferences

Regardless level parameters are displayed using tabs each tab corresponding to one application

General parameters

The admin application exposes several parameters they are presented below

23 Configuration 41

Modoboa Documentation Release 1100

Name Tab Description Default valueAuthentication type General The backend used for au-

thenticationLocal

Default password scheme General Scheme used to cryptmailbox passwords

crypt

Rounds General Number of rounds (onlyused by sha256cryptand sha512crypt) Mustbe between 1000 and999999999 inclusive

70000

Secret key General A key used to encryptusersrsquo password in ses-sions

random value

Sender address General Email address used tosend notifications

Enable communication General Enable communicationwith Modoboa public API

yes

Check new versions General Automatically checks if anewer version is available

yes

Send statistics General Send statistics to Mod-oboa public API (countersand used extensions)

yes

Top notifications check in-terval

General Interval between two topnotification checks (inseconds)

30

Maximum log record age General The maximum age in daysof a log record

365

Items per page General Number of displayeditems per page

30

Default top redirection General The default redirectionused when no applicationis specified

userprefs

Enable MX checks Admin Check that every domainhas a valid MX record

yes

Valid MXs Admin A list of IP or networkaddress every MX shouldmatch A warning will besent if a record does notrespect this it

Enable DNSBL checks Admin Check every domainagainst major DNSBLproviders

yes

DKIM keys storage direc-tory

AdminPath to a directory where DKIM

generated keys willbe stored

Default DKIM key length Admin The default size (in bits)for new keys

2048

Handle mailboxes onfilesystem

Admin Rename or remove mail-boxes on the filesystemwhen they get renamed orremoved within Modoboa

no

Mailboxes owner Admin The UNIX account whoowns mailboxes on thefilesystem

vmail

Default domain quota Admin Default quota (in MB) ap-plied to freshly createddomains with no valuespecified A value of 0means no quota

0

Automatic accountremoval

Admin When a mailbox is re-moved also remove theassociated account

no

Automatic do-mainmailbox creation

Admin Create a domain and amailbox when an accountis automatically created

yes

42 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Note If you are not familiar with virtual domain hosting you should take a look at postfixrsquos documentation ThisHow to also contains useful information

Note A random secret key will be generated each time the Parameters page is refreshed and until you save parametersat least once

Note Specific LDAP parameters are also available see LDAP authentication

232 Media files

Modoboa uses a specific directory to upload files (ie when the webmail is in use) or to create ones (ex graphical statis-tics) This directory is named media and is located inside modoboarsquos installation directory (called modoboa_sitein this documentation)

To work properly the system user which runs modoboa (www-data apache whatever) must have write access tothis directory

233 Customization

Custom logo

You have the possibility to use a custom logo instead of the default one on the login page

To do so open the settingspy file and add a MODOBOA_CUSTOM_LOGO variable This variable must containthe relative URL of your logo under MEDIA_URL For example

MODOBOA_CUSTOM_LOGO = ospathjoin(MEDIA_URL custom_logopng)

Then copy your logo file into the directory indicated by MEDIA_ROOT

234 Host configuration

Note This section is only relevant when Modoboa handles mailboxes renaming and removal from the filesystem

To manipulate mailboxes on the filesystem you must allow the user who runs Modoboa to execute commands as theuser who owns mailboxes

To do so edit the etcsudoers file and add the following inside

ltuser_that_runs_modoboagt ALL=(ltmailboxes ownergt) NOPASSWD ALL

Replace values between ltgt by the ones you use

23 Configuration 43

Modoboa Documentation Release 1100

235 Time zone and language

Modoboa is available in many languages

To specify the default language to use edit the settingspy file and modify the LANGUAGE_CODE variable

LANGUAGE_CODE = fr or en for english etc

Note Each user has the possibility to define the language he prefers

In the same configuration file specify the timezone to use by modifying the TIME_ZONE variable For example

TIME_ZONE = EuropeParis

236 Sessions management

Modoboa uses Djangorsquos session framework to store per-user information

Few parameters need to be set in the settingspy configuration file to make Modoboa behave as expected

SESSION_EXPIRE_AT_BROWSER_CLOSE = False Default value

This parameter is optional but you must ensure it is set to False (the default value)

The default configuration file provided by the modoboa-adminpy command is properly configured

237 Logging authentication

To trace login attempts to the web interface Modoboa uses python SysLogHandler so you can see them in your syslogauthentication log file (varlogauthlog in most cases)

Depending on your configuration you may have to edit the settingspy file and add lsquoaddressrsquo lsquodevlogrsquo to thelogging section

syslog-auth class logginghandlersSysLogHandlerfacility SysLogHandlerLOG_AUTHaddress devlogformatter syslog

238 External authentication

LDAP

Modoboa supports external LDAP authentication using the following extra components

bull Python LDAP client

bull Django LDAP authentication backend

If you want to use this feature you must first install those components

44 Chapter 2 Table of contents

Modoboa Documentation Release 1100

$ pip install python-ldap django-auth-ldap

Then all you have to do is to modify the settingspy file Add a new authentication backend to the AUTHENTI-CATION_BACKENDS variable like this

AUTHENTICATION_BACKENDS = (modoboalibauthbackendsLDAPBackend modoboalibauthbackendsLDAPSecondaryBackend Useful for a fallback

rarr˓mechanismdjangocontribauthbackendsModelBackend

)

Finally go to Modoboa gt Parameters gt General and set Authentication type to LDAP

From there new parameters will appear to let you configure the way Modoboa should connect to your LDAP serverThey are described just below

Name Description De-faultvalue

Server address The IP address of the DNS name of the LDAP server local-host

Server port The TCP port number used by the LDAP server 389Use a secureconnection

Use an SSLTLS connection to access the LDAP server no

Authenticationmethod

Choose the authentication method to use Directbind

User DN tem-plate (directbind mode)

The template used to construct a userrsquos DN It should contain one placeholder (ie(user)s)

Bind BN The distinguished name to use when binding to the LDAP server Leave empty for ananonymous bind

Bind password The password to use when binding to the LDAP server (with lsquoBind DNrsquo)Search base The distinguished name of the search baseSearch filter An optional filter string (eg lsquo(objectClass=person)rsquo) In order to be valid it must be

enclosed in parentheses(mail=(user)s)

Passwordattribute

The attribute used to store user passwords user-Pass-word

Active Direc-tory

Tell if the LDAP server is an Active Directory one no

Administratorgroups

Members of those LDAP Posix groups will be created ad domain administrators Uselsquorsquo characters to separate groups

Group type The type of group used by your LDAP directory Posix-Group

Groups searchbase

The distinguished name of the search base used to find groups

Do-mainmailboxcreation

Automatically create a domain and a mailbox when a new user is created just after thefirst successful authentication You will generally want to disable this feature whenthe relay domains extension is in use

yes

If you need additional parameters you will find a detailed documentation here

Once the authentication is properly configured the users defined in your LDAP directory will be able to connect to

23 Configuration 45

Modoboa Documentation Release 1100

Modoboa the associated domain and mailboxes will be automatically created if needed

The first time a user connects to Modoboa a local account is created if the LDAP username is a valid email addressBy default this account belongs to the SimpleUsers group and it has a mailbox

To automatically create domain administrators you can use the Administrator groups setting If a LDAP user belongsto one the listed groups its local account will belong to the DomainAdmins group In this case the username is notnecessarily an email address

Users will also be able to update their LDAP password directly from Modoboa

Note Modoboa doesnrsquot provide any synchronization mechanism once a user is registered into the database Anymodification done from the directory to a user account will not be reported to Modoboa (an email address change forexample) Currently the only solution is to manually delete the Modoboa record it will be recreated on the next userlogin

SMTP

It is possible to use an existing SMTP server as an authentication source To enable this feature edit the settingspy file and change the following setting

AUTHENTICATION_BACKENDS = (modoboalibauthbackendsSMTPBackenddjangocontribauthbackendsModelBackend

)

SMTP server location can be customized using the following settings

AUTH_SMTP_SERVER_ADDRESS = localhostAUTH_SMTP_SERVER_PORT = 25AUTH_SMTP_SECURED_MODE = None ssl or starttls are accepted

239 LDAP synchronization

Modoboa can synchronize accounts with an LDAP directory (tested with OpenLDAP) but this feature is not enabledby default To activate it add modoboaldapsync to MODOBOA_APPS in the settingspy file

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboaldapsync

)

and enable it from the admin panel

46 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning Make sure to install additional requirements otherwise it wonrsquot work

The following parameters are available and must be filled

Name Description Defaultvalue

Enable LDAP synchro-nization

Control LDAP synchronization state no

Bind DN The DN of a user with write permission to createupdate accountsBind password The associated passwordAccount DN template The template used to build account DNs (must contain a (user)s

placeholder

2310 Database maintenance

Cleaning the logs table

Modoboa logs administrator specific actions into the database A clean-up script is provided to automatically removeoldest records The maximum log record age can be configured through the online panel

To use it you can setup a cron job to run every night

0 0 ltmodoboa_sitegtmanagepy cleanlogs Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy cleanlogs

Cleaning the session table

Django does not provide automatic purging Therefore itrsquos your job to purge expired sessions on a regular basis

Django provides a sample clean-up script django-adminpy clearsessions That script deletes any sessionin the session table whose expire_date is in the past

For example you could setup a cron job to run this script every night

0 0 ltmodoboa_sitegtmanagepy clearsessions Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy clearsessions

Cleaning inactive accounts

Thanks to Last-login tracking it is now possible to monitor inactive accounts An account is considered inactive if nologin has been recorded for the last 30 days (this value can be changed through the admin panel)

A management command is available to disable or delete inactive accounts For example you could setup a cron jobto run it every night

23 Configuration 47

Modoboa Documentation Release 1100

0 0 ltmodoboa_sitegtmanagepy clean_inactive_accounts Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy clean_inactive_rarr˓accounts

The default behaviour is to disable accounts You can delete them using the --delete option

24 Moving to Modoboa

You have an existing platform and yoursquod like to move to Modoboa the following tools could help you

241 From postfixadmin

A dedicated command allows you to convert an existing postfixadmin database to a Modoboa one Consult the docu-mentation to know more about the process

242 Using CSV files

Modoboa allows you to import any object (domain domain alias mailbox and alias) using a simple CSV file encodedusing UTF8 Each line corresponds to a single object and must respect one of the following format

domain ltname stringgt ltquota integergt ltdefault mailbox quota integergt ltenabledrarr˓booleangtdomainalias ltname stringgt lttargeted domain stringgt ltenabled booleangtrelaydomain ltname stringgt lttarget host stringgt lttarget port integergt ltservicerarr˓stringgt ltenabled booleangt ltverify recipients booleangtaccount ltloginname stringgt ltpassword stringgt ltfirst name stringgt ltlast namerarr˓stringgt ltenabled booleangt ltgroup stringgt ltaddress stringgt ltquota integergt [rarr˓ltdomain stringgt ]alias ltaddress stringgt ltenabled booleangt ltrecipient stringgt

Boolean fields accept the following values true 1 yes y (case insensitive) Any other value will be evaluated asfalse

Warning The order does matter Objects are created sequencially so a domain must be created before itsmailboxes and aliases and a mailbox must created before its alias(es)

To actually import such a file

gt sudo -u ltmodoboa_usergt -igt source ltvirtualenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy modo import ltyour filegt

Available options can be listed using the following command

gt python managepy modo import -h

48 Chapter 2 Table of contents

Modoboa Documentation Release 1100

25 REST API

To ease the integration with external sources (software or other) Modoboa provides a REST API

Every installed instance comes with a ready-to-use API and a documentation You will find them using the followingurl patterns

bull API httplthostnamegtapiv1

bull Documentation httplthostnamegtdocsapi

An example of this documentation is available on the official demo

Using this API requires an authentication and for now only a token based authentication is supported To get a validtoken log-in to your instance with a super administrator go to Settings gt API and activate the API access Press theUpdate button and wait until the page is reloaded the token will be displayed

To make valid API calls every requests you send must embed this token within an Authorization HTTP header likethis

Authorization Token ltYOUR_TOKENgt

and the content type of those requests must be applicationjson

26 How to contribute

Contributions are always welcome If you want to submit a patch please respect the following rules

bull Open a pull request on the appropriate repository

bull Respect PEP8

bull Document your patch and respect PEP 257

bull Add unit tests and make sure the global coverage does not decrease

If all those steps are validated your contribution will generally be integrated

261 Table of contents

25 REST API 49

Modoboa Documentation Release 1100

Useful tips

You would like to work on Modoboa but you donrsquot know where to start Yoursquore at the right place Browse this pageto learn useful tips

Docker

A docker image is available for developers To use it you must install docker and docker-compose first

Then just run the following command

$ docker-compose up

It will start the docker environment and make a Modoboa instance available at httplocalhost8000

If you donrsquot want to use docker or need a more complex development setup go to the next section

Prepare a virtual environment

A virtual environment is a good way to setup a development environment on your machine

To do so run the following commands

$ python3 -m venv ltpathgt$ source ltpathgtbinactivate$ git clone httpsgithubcommodoboamodoboagit$ cd modoboa$ python setuppy develop$ pip install -r dev-requirementstxt

The develop command creates a symbolic link to your local copy so any modification you make will be automati-cally available in your environment no need to copy them

Deploy an instance for development

Warning Make sure to create a database before running this step The format of the database url is also describedin this page

Now that you have a running environment yoursquore ready to deploy a test instance

$ cd ltpathgt$ modoboa-adminpy deploy --dburl defaultltdatabase urlgt --domain localhost --develrarr˓instance$ python managepy runserver

Yoursquore ready to go You should be able to access Modoboa at httplocalhost8000 usingadminpassword as credentials

Manage static files

Modoboa uses bower (thanks to django-bower) to manage its CSS and javascript dependencies

50 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Those dependencies are listed in a file called dev_settingspy located inside the ltpath_to_local_copygtmodoboacore directory

If you want to add a new dependency just complete the BOWER_INSTALLED_APPS parameter and run the followingcommand

$ python managepy bower install

It will download and store the required files into the ltpath_to_local_copygtmodoboabower_components directory

Test your modifications

If you deployed a specific instance for your development needs you can run the tests suite as follows

gt python managepy test modoboacore modoboalib modoboaadmin modoboalimits modoboararr˓relaydomains

Otherwise you can run the tests suite from the repository using tox

Start a basic Modoboa instance

From the repository run the following command to launch a simple instance with a few fixtures

gt tox -e serve

You can use adminpassword to log in

Build the documentation

If you need to modify the documenation and want to see the result you can build it as follows

gt tox -e docgt firefox toxdoctmphtmlindexhtml

FAQ

bower command is missing in managepy

bower command is missing in managepy if you donrsquot use the --devel option of the modoboa-adminpydeploy command

To fix it regenerate your instance or update your settingspy file manually Look at devmode in httpsgithubcomtonioomodoboablobmastermodoboacorecommandstemplatessettingspytpl

Create a new plugin

Introduction

Modoboa offers a plugin API to expand its capabilities The current implementation provides the following possibili-ties

26 How to contribute 51

Modoboa Documentation Release 1100

bull Expand navigation by adding entry points to your plugin inside the GUI

bull Access and modify administrative objects (domains mailboxes etc)

bull Register callback actions for specific events

Plugins are nothing more than Django applications with an extra piece of code that integrates them into Modoboa Themodo_extensionpy file will contain a complete description of the plugin

bull Admin and user parameters

bull Custom menu entries

The communication between both applications is provided by Django signals

The following subsections describe the plugin architecture and explain how you can create your own

The required glue

To create a new plugin just start a new django application like this (into Modoboarsquos directory)

$ python managepy startapp

Then you need to register this application using the provided API Just copypaste the following example into themodo_extensionpy file of the future extension

from modoboacoreextensions import ModoExtension exts_pool

class MyExtension(ModoExtension)My custom Modoboa extension

name = myextlabel = My Extensionversion = 01description = A descriptionurl = myext_root_location optional name is used if not defined

def load(self)This method is called when Modoboa loads available and activated plugins

Declare parameters and register events herepass

def load_initial_data(self)Optional provide initial data for your extension herepass

exts_poolregister_extension(MyExtension)

Once done simply add your extensionrsquos module name to the MODOBOA_APPS variable located inside settingspy Finally run the following commands

$ python managepy migrate$ python managepy load_initial_data$ python managepy collectstatic

52 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Parameters

A plugin can declare its own parameters There are two levels available

bull lsquoGlobalrsquo parameters used to configure the plugin editable inside the Admin gt Settings gt Parameters page

bull lsquoUserrsquo parameters per-user parameters (or preferences) editable inside the Options gt Preferences page

Playing with parameters

Parameters are defined using Django forms and Modoboa adds two special forms you can inherit depending on thelevel of parameter(s) you want to add

bull modoboaparametersformsAdminParametersForm for general parameters

bull modoboaparametersformsUserParametersForm for user parameters

To register new parameters add the following line into the load method of your plugin class

from modoboaparameters import tools as param_toolsparam_toolsregistryadd(

LEVEL YourForm ugettext_lazy(Title))

Replace LEVEL by global or user

Custom role permissions

Modoboa uses Djangorsquos internal permission system Administrative roles are nothing more than groups (Groupinstances)

An extension can add new permissions to a group by listening to the extra_role_permissions signal Here isan example

from djangodispatch import receiverfrom modoboacore import signals as core_signals

PERMISSIONS = Resellers [

(relaydomains relaydomain add_relaydomain)(relaydomains relaydomain change_relaydomain)(relaydomains relaydomain delete_relaydomain)(relaydomains service add_service)(relaydomains service change_service)(relaydomains service delete_service)

]

receiver(core_signalsextra_role_permissions)def extra_role_permissions(sender role kwargs)

Add permissions to the Resellers groupreturn constantsPERMISSIONSget(role [])

Extending admin forms

The forms used to edit objects (account domain etc) through the admin panel are composed of tabs You can extendthem (ie add new tabs) in a pretty easy way thanks to custom signals

26 How to contribute 53

Modoboa Documentation Release 1100

Account

To add a new tab to the account edition form define new listeners (handlers) for the following signals

bull modoboaadminsignalsextra_account_forms

bull modoboaadminsignalsget_account_form_instances

bull modoboaadminsignalscheck_extra_account_form (optional)

Example

from djangodispatch import receiverfrom modoboaadmin import signals as admin_signals

receiver(admin_signalsextra_account_forms)def extra_account_form(sender user account kwargs)

return [id tabid title Title cls MyFormClass

]

receiver(admin_signalsget_account_form_instances)def fill_my_tab(sender user account kwargs)

return id my_instance

Domain

To add a new tab to the domain edition form define new listeners (handlers) for the following signals

bull modoboaadminsignalsextra_domain_forms

bull modoboaadminsignalsget_domain_form_instances

Example

from djangodispatch import receiverfrom modoboaadmin import signals as admin_signals

receiver(admin_signalsextra_domain_forms)def extra_account_form(sender user domain kwargs)

return [id tabid title Title cls MyFormClass

]

receiver(admin_signalsget_domain_form_instances)def fill_my_tab(sender user domain kwargs)

return id my_instance

27 Contributors

bull Antidot

bull Bearstech

bull CAP-REL

54 Chapter 2 Table of contents

Modoboa Documentation Release 1100

bull Dalnix

27 Contributors 55

  • Overview
  • Table of contents
Page 8: Modoboa Documentation

CHAPTER 2

Table of contents

21 Installation

211 Requirements

You will need a Server to perform well with at least

bull CPU 2

bull RAM 2GB

bull Disk 10GB

bull Python 3

Note Heads up for modoboa versions 115 and later

Python 2 support has been dropped with modoboa version 115 If you still have Python 2 installed on your systemeither uninstall it or force modoboa user to run with Python 3

212 Recommended way

If you start from scratch and want to deploy a complete mail server you will love the modoboa installer It is theeasiest and the quickest way to setup a fully functional server (modoboa postfix dovecot amavis and more) on onemachine

Warning For now only Debian and CentOS based Linux distributions are supported We do our best to improvecompatibility but if you use another Linux or a UNIX system you will have to install Modoboa manually

To use it just run the following commands in your terminal

5

Modoboa Documentation Release 1100

gt git clone httpsgithubcommodoboamodoboa-installergt cd modoboa-installergt sudo runpy ltyour domaingt

if you get this warning - lsquousrbinenv lsquopythonrsquo No such file or directoryrsquo do make sure sure python is installed onyour server Sometimes python is installed but the installer canrsquot detect it or which python version to run especiallyon a debian based system Then run this command first

gt sudo apt-get install python-virtualenv python-pip

Wait a few minutes and yoursquore done o

213 Manual installation

For those who need a manual installation or who just want to setup a specific part here are the steps you must follow

Modoboa

This section describes the installation of the web interface (a Django project)

Prepare the system

First of all we recommend the following context

bull A dedicated system user

bull A virtual environment to install the application because it will isolate it (and its dependencies) from the rest ofyour system

The following example illustrates how to realize this on Debian-based distributions using virtualenv

apt-get install virtualenv python3-pip useradd modoboa create a dedicated user su -l modoboa log in as the newly created user$ virtualenv --python python3 env create the virtual environment$ source envbinactivate activate the virtual environment

Modoboa depends on external tools and some of them require compilation so you need a compiler and a few C librariesMake sure to install the following system packages according to your distribution

Debian Ubuntubuild-essential python3-dev libxml2-dev libxslt-dev libjpeg-dev librrd-dev rrdtool libffi-dev libssl-dev

CentOSgcc gcc-c++ python3-devel libxml2-devel libxslt-devel libjpeg-turbo-devel rrdtool-devel rrdtool libffi-devel

Note Alternatively you could rely on your distribution packages for the Modoboa dependencies which requirecompilation - eg psycopg2 - if the version is compatible In this case you have to create your virtual environmentwith the --system-site-packages option

Then install Modoboa by running

6 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(env)$ pip install modoboa

Database

Warning This documentation does not cover the installation of a database server but only the setup of a functionaldatabase that Modoboa will use

Thanks to Django Modoboa is compatible with the following databases

bull PostgreSQL

bull MySQL MariaDB

bull SQLite

Since the last one does not require particular actions only the first two ones are described You should also read thenotes for those database backends on the official Django documentation

PostgreSQL

Install the corresponding Python binding

(env)$ pip install psycopg2

Note Alternatively you can install the python3-psycopg2 package instead on Debian-based distributions ifyour virtual environment was created with --system-site-packages option

Then create a user and a database For example to create the modoboa database owned by a modoboa user run thefollowing commands on your PostgreSQL server

sudo -l -u postgres createuser --no-createdb modoboa sudo -l -u postgres createdb --owner=modoboa modoboa

MySQL MariaDB

Install the corresponding Python binding

(env)$ pip install mysqlclient

Note Alternatively you can install the python3-mysqldb package instead on Debian-based distributions if yourvirtual environment was created with --system-site-packages option

Note MariaDB 102 (and newer) require mysqlclient 1311 (or newer)

Then create a user and a database For example to create the modoboa database owned by a modoboa user run thefollowing SQL commands

21 Installation 7

Modoboa Documentation Release 1100

CREATE DATABASE modoboaCREATE USER modoboalocalhost IDENTIFIED BY my-strong-password-hereGRANT ALL PRIVILEGES ON modoboa TO modoboalocalhost

Deploy an instance

modoboa-adminpy is a command line tool that lets you deploy a ready-to-use Modoboa site To create a newinstance into instance you just have to run the following command

(env)$ modoboa-adminpy deploy instance --collectstatic --domain lthostname of your servergt --dburl defaultltdatabase urlgt

Note You can install additional extensions during the deploy process To do so use the --extensions op-tion which accepts a list of names as argument (--extensions ext1 ext2 ) If you want to install allextensions just use the all keyword like this --extensions all

If you choose to install extensions one at a time you will have to add their names in settingspy to MODOBOA_APPSAlso ensure that you have the line from modoboa_amavissettings import at the end of this file

The list of available extensions can be found on the index page Instructions to install them are available on eachextensions page

Note You can specify more than one database connection using the --dburl option Multiple connections aredifferentiated by a prefix

The primary connection must use the default prefix (as shown in the example above) For the amavis exten-sion use the amavis prefix For example --dburl defaultltdatabase urlgt amavisltdatabaseurlgt

A database url should meet the following syntax ltmysql|postgresgt[userpass][hostport]dbname OR sqlitefullpathtoyourdatabasefilesqlite

The command will ask you a few questions answer them and yoursquore done

If you need a silent installation (eg if yoursquore using Salt-Stack Ansible or whatever) itrsquos possible to supply thedatabase credentials as command line arguments

You can consult the complete option list by running the following command

(env)$ modoboa-adminpy help deploy

Cron jobs

A few recurring jobs must be configured to make Modoboa works as expected

Create a new file for example etccrondmodoboa and put the following content inside

Modoboa specific cron jobsPYTHON=ltpath to Python binary inside the virtual environmentgtINSTANCE=ltpath to Modoboa instancegt

(continues on next page)

8 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

Operations on mailboxes

vmail $PYTHON $INSTANCEmanagepy handle_mailbox_operations

Generate DKIM keys (they will belong to the user running this job)

root umask 077 ampamp $PYTHON $INSTANCEmanagepy modo manage_dkim_rarr˓keys

Sessions table cleanup0 0 modoboa $PYTHON $INSTANCEmanagepy clearsessions Logs table cleanup0 0 modoboa $PYTHON $INSTANCEmanagepy cleanlogs DNSBL checks

30 modoboa $PYTHON $INSTANCEmanagepy modo check_mx Public API communication0 modoboa $PYTHON $INSTANCEmanagepy communicate_with_public_api

Policy daemon

Modoboa comes with a built-in Policy Daemon for Postfix Current features are

bull Define daily sending limits for domains andor accounts

A redis server is required to run this new daemon

You can launch it manually using the following command

(env)gt python managepy policy_daemon

But we recommend an automatic start using systemd or supervisor Here is a configuration example forsupervisor

[programpolicyd]autostart=trueautorestart=truecommand=srvmodoboaenvbinpython srvmodoboainstancemanagepy policy_daemondirectory=srvmodoboaredirect_stderr=trueuser=modoboanumprocs=1

It will listen by default on 127001 and port 9999 The policy daemon wonrsquot do anything unless you tell postfixto use it

Now you can continue to the Web server section

Web server

Note The following instructions are meant to help you get your site up and running quickly However it is notpossible for the people contributing documentation to Modoboa to test every single combination of web server wsgiserver distribution etc So it is possible that your installation of uwsgi or nginx or Apache or what-have-you worksdifferently Keep this in mind

21 Installation 9

Modoboa Documentation Release 1100

Apache2

First make sure that mod_wsgi is installed on your server

Create a new virtualhost in your Apache configuration and put the following content inside

ltVirtualHost 80gtServerName ltyour valuegtDocumentRoot ltmodoboa_instance_pathgt

Alias media ltmodoboa_instance_pathgtmedialtDirectory ltmodoboa_instance_pathgtmediagtOrder denyallowAllow from all

ltDirectorygt

Alias sitestatic ltmodoboa_instance_pathgtsitestaticltDirectory ltmodoboa_instance_pathgtsitestaticgtOrder denyallowAllow from all

ltDirectorygt

WSGIScriptAlias ltmodoboa_instance_pathgtltinstance_namegtwsgipy

Pass Authorization header to enable API usageWSGIPassAuthorization On

ltVirtualHostgt

This is just one possible configuration

To use mod_wsgi daemon mode add the two following directives just under WSGIScriptAlias

WSGIDaemonProcess examplecom python-path=ltmodoboa_instancegtltvirtualenv pathgtlibrarr˓python37site-packagesWSGIProcessGroup examplecom

Replace values between ltgt with yours If you donrsquot use a virtualenv just remove the last part of theWSGIDaemonProcess directive

Note You will certainly need more configuration in order to launch Apache

Now you can go the Dovecot section to continue the installation

Nginx

This section covers two different ways of running Modoboa behind Nginx using a WSGI application server Choosethe one you prefer between Green Unicorn or uWSGI

In both cases yoursquoll need to download and install nginx

Green Unicorn

Firstly Download and install gunicorn Then use the following sample gunicorn configuration (create a new filenamed gunicornconfpy inside Modoboarsquos root dir)

10 Chapter 2 Table of contents

Modoboa Documentation Release 1100

backlog = 2048bind = unixvarrungunicornmodoboasockpidfile = varrungunicornmodoboapiddaemon = Truedebug = Falseworkers = 2logfile = varloggunicornmodoboalogloglevel = info

To start gunicorn execute the following commands

$ cd ltmodoboa dirgt$ gunicorn -c gunicornconfpy ltmodoboa dirgtwsgiapplication

Now the nginx part Just create a new virtual host and use the following configuration

upstream modoboa server unixvarrungunicornmodoboasock fail_timeout=0

server listen 443 sslssl onkeepalive_timeout 70

server_name lthost fqdngtroot ltmodoboa_instance_pathgt

access_log varlognginxlthost fqdngtaccesslogerror_log varlognginxlthost fqdngterrorlog

ssl_certificate ltssl certificate for your sitegtssl_certificate_key ltssl certificate key for your sitegt

location sitestatic autoindex on

location media autoindex on

location proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_forproxy_set_header Host $http_hostproxy_redirect offproxy_set_header X-Forwarded-Protocol sslproxy_pass httpmodoboa

If you do not plan to use SSL then change the listen directive to listen 80 and delete each of the followingdirectives

ssl onkeepalive_timeout 70ssl_certificate ltssl certificate for your sitegt

(continues on next page)

21 Installation 11

Modoboa Documentation Release 1100

(continued from previous page)

ssl_certificate_key ltssl certificate key for your sitegtproxy_set_header X-Forwarded-Protocol ssl

If you do plan to use SSL yoursquoll have to generate a certificate and a key This article contains information about howto do it

Paste this content to your configuration (replace values between ltgt with yours) and restart nginx

Now you can go the Dovecot section to continue the installation

uWSGI

The following setup is meant to get you started quickly You should read the documentation of both nginx and uwsgito understand how to optimize their configuration for your site

The Django documentation includes the following warning regarding uwsgi

Warning Use uwsgi 126 or newer If you do not you will run into problems Modoboa will fail in obscureways

To use this setup first download and install uwsgi

Here is a sample nginx configuration

server listen 443 sslssl onkeepalive_timeout 70

server_name lthost fqdngtroot ltmodoboas settings dirgt

ssl_certificate ltssl certificate for your sitegtssl_certificate_key ltssl certificate key for your sitegt

access_log varlognginxlthost fqdngtaccesslogerror_log varlognginxlthost fqdngterrorlog

location ltmodoboas root urlgtsitestatic autoindex onalias ltlocation of sitestatic on your file systemgt

Whether or not Modoboa uses a media directory depends on how you configured Modoboa It does not hurt to have thislocation ltmodoboas root urlgtmedia

autoindex onalias ltlocation of media on your file systemgt

This denies access to any file that begins with ht Apaches htaccess and htpasswd are such files A Modoboa installed from scratch would not contain any such files but you never know what the future holds

(continues on next page)

12 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

location ~ ht deny all

location ltmodobas root urlgt include uwsgi_paramsuwsgi_pass ltuwsgi portgtuwsgi_param UWSGI_SCRIPT ltmodoboa instance namegtwsgiapplicationuwsgi_param UWSGI_SCHEME https

ltmodoboa instance namegt must be replaced by the value you used when you deployed your instance

If you do not plan to use SSL then change the listen directive to listen 80 and delete each of the followingdirectives

ssl onkeepalive_timeout 70ssl_certificate ltssl certificate for your sitegtssl_certificate_key ltssl certificate key for your sitegtuwsgi_param UWSGI_SCHEME https

If you do plan to use SSL yoursquoll have to generate a certificate and a key This article contains information about howto do it

Make sure to replace the ltgt in the sample configuration with appropriate values Here are some explanations forthe cases that may not be completely self-explanatory

ltmodoboas settings dirgt Where Modoboarsquos settingspy resides This is also where thesitestatic and media directories reside

ltmodoboas root urlgt This is the URL which will be the root of your Modoboa site at your domain For in-stance if your Modoboa installation is reachable at at httpsfoomodoboa then ltmodoboas rooturlgt is modoboa In this case you probably also have to set the alias directives to point to where Mod-oboarsquos sitestatic and media directories are because otherwise nginx wonrsquot be able to find them

If Modoboa is at the root of your domain then ltmodoboa root urlgt is an empty string and can be deletedfrom the configuration above In this case you probably do not need the alias directives

ltuwsgi portgt The location where uwsig is listening It could be a unix domain socket or an addressport combi-nation Ubuntu configures uwsgi so that the port is

unixrunuwsgiappltapp namegtsocket

where ltapp namegt is the name of the application

Your uwsgi configuration should be

[uwsgi] Not needed when using uwsgi from pip plugins = pythonchdir = ltmodoboas top dirgtmodule = ltnamegtwsgiapplicationmaster = trueharakiri = 60processes = 4vhost = trueno-default-app = true

21 Installation 13

Modoboa Documentation Release 1100

The plugins directive should be turned on if you use a uwsgi installation that requires it If uwsgi was installed frompip it does not require it In the configuration above

ltmodoboas top dirgt The directory where managepy resides This directory is the parent of ltmodoboassettings dirgt

ltnamegt The name that you passed to modoboa-adminpy deploy when you created your Modoboa instance

Now you can go the Dovecot section to continue the installation

Dovecot

Modoboa requires Dovecot 2+ to work so the following documentation is suitable for this combination

In this section we assume dovecotrsquos configuration resides in etcdovecot all pathes will be relative to thisdirectory

Mailboxes

First edit the confd10-mailconf and set the mail_location variable

maildirmail_location = maildir~maildir

Then edit the inbox namespace and add the following lines

inbox = yes

mailbox Drafts auto = subscribespecial_use = Drafts

mailbox Junk

auto = subscribespecial_use = Junk

mailbox Sent

auto = subscribespecial_use = Sent

mailbox Trash

auto = subscribespecial_use = Trash

With dovecot 21+ it ensures all the special mailboxes will be automaticaly created for new accounts

For dovecot 20 and older use the autocreate plugin

Operations on the file system

14 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning Modoboa needs to access the dovecot binary to check its version To find the binary path weuse the which command first and then try known locations (usrsbindovecot and usrlocalsbindovecot) If you installed dovecot in a custom location please tell us where the binary is by usingthe DOVECOT_LOOKUP_PATH setting (see settingspy)

Three operation types are considered

1 Mailbox creation

2 Mailbox renaming

3 Mailbox deletion

The first one is managed by Dovecot The last two ones may be managed by Modoboa if it can access the file systemwhere the mailboxes are stored (see General parameters to activate this feature)

Those operations are treated asynchronously by a cron script For example when you rename an e-mail addressthrough the web UI the associated mailbox on the file system is not modified directly Instead of that a renameorder is created for this mailbox The mailbox will be considered unavailable until the order is executed (see Postfixconfiguration)

Edit the crontab of the user who owns the mailboxes on the file system

$ crontab -u ltusergt -e

And add the following line inside

python ltmodoboa_sitegtmanagepy handle_mailbox_operations

Warning The cron script must be executed by the system user owning the mailboxes

Warning The user running the cron script must have access to the settingspy file of the modoboa instance

The result of each order is recorded into Modoboarsquos log Go to Modoboa gt Logs to consult them

Authentication

To make the authentication work edit the confd10-authconf and uncomment the following line at the end

include auth-systemconfextinclude auth-sqlconfextinclude auth-ldapconfextinclude auth-passwdfileconfextinclude auth-checkpasswordconfextinclude auth-vpopmailconfextinclude auth-staticconfext

Then edit the confdauth-sqlconfext file and add the following content inside

passdb sql driver = sql Path for SQL configuration file see example-configdovecot-sqlconfext

(continues on next page)

21 Installation 15

Modoboa Documentation Release 1100

(continued from previous page)

args = etcdovecotdovecot-sqlconfext

userdb sql driver = sqlargs = etcdovecotdovecot-sqlconfext

Make sure to activate only one backend (per type) inside your configuration (just comment the other ones)

Edit the dovecot-sqlconfext and modify the configuration according to your database engine

MySQL users

driver = mysql

connect = host=ltmysqld socketgt dbname=ltdatabasegt user=ltusergt password=ltpasswordgt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user WHERE email=Lu andrarr˓is_active=1

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid concat(bytes= mbquota M) AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

PostgreSQL users

driver = pgsql

connect = host=ltpostgres socketgt dbname=ltdatabasegt user=ltusergt password=ltpasswordgt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user u INNER JOIN admin_rarr˓mailbox mb ON uid=mbuser_id INNER JOIN admin_domain dom ON mbdomain_id=domidrarr˓WHERE uemail=Lu AND uis_active AND domenabled

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid bytes= || mbquota || M AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

16 Chapter 2 Table of contents

Modoboa Documentation Release 1100

SQLite users

driver = sqlite

connect = ltpath to the sqlite db filegt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user u INNER JOIN admin_rarr˓mailbox mb ON uid=mbuser_id INNER JOIN admin_domain dom ON mbdomain_id=domidrarr˓WHERE uemail=Lu AND uis_active=1 AND domenabled=1

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid (bytes= || mbquota || M) AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

Note Replace values between ltgt with yours

LDAP

To make the LDAP authentication work edit the confd10-authconf and uncomment the following line atthe end

include auth-ldapconfext

Then edit the confdauth-ldapconfext and edit the passdb section as following You should comment theuserdb section which will be managed by SQL with modoboa database

passdb driver = ldap

Path for LDAP configuration file see example-configdovecot-ldapconfextargs = etcdovecotdovecot-ldapconfext

userdb driver = ldapargs = etcdovecotdovecot-ldapconfext

Default fields can be used to specify defaults that LDAP may overridedefault_fields = home=homevirtualu

Your own dovecot LDAP configuration file is now etcdovecotdovecot-ldapconfext You can addyour default LDAP conf in it following the official documentation

Synchronize dovecot LDAP conf with modoboa LDAP conf

To make dovecot LDAP configuration synchronized with modoboa LDAP configuration you should create a dedicateddovecot conf file At the end of your dovecot configuration file (dovecot-ldapconfext) add the following

21 Installation 17

Modoboa Documentation Release 1100

line

include_try dovecot-modoboaconfext

Then set modoboa parameter Enable Dovecot LDAP sync to Yes Then set the Dovecot LDAP config file following theprevious step (etcdovecotdovecot-modoboaconfext in the example)

The last step is to add the command update_dovecot_conf to the cron job of modoboa Then each time your modoboaLDAP configuration is updated your dovecot LDAP configuration will also be

LMTP

Local Mail Transport Protocol is used to let Postfix deliver messages to Dovecot

First make sure the protocol is activated by looking at the protocols setting (generally inside dovecotconf)It should be similar to the following example

protocols = imap pop3 lmtp

Then open the confd10-masterconf look for lmtp service definition and add the following content inside

service lmtp stuff beforeunix_listener varspoolpostfixprivatedovecot-lmtp mode = 0600user = postfixgroup = postfix

stuff after

We assume here that Postfix is chrooted within varspoolpostfix

Finally open the confd20-lmtpconf and modify it as follows

protocol lmtp postmaster_address = postmasterltdomaingtmail_plugins = $mail_plugins quota sieve

Replace ltdomaingt by the appropriate value

Note If you donrsquot plan to apply quota or to use filters just adapt the content of the mail_plugins setting

Quota

Modoboa lets adminstrators define per-domain andor per-account limits (quota) It also lists the current quota usageof each account Those features require Dovecot to be configured in a specific way

Inside confd10-mailconf add the quota plugin to the default activated ones

mail_plugins = quota

Inside confd10-masterconf update the dict service to set proper permissions

18 Chapter 2 Table of contents

Modoboa Documentation Release 1100

service dict If dict proxy is used mail processes should have access to its socket For example mode=0660 group=vmail and global mail_access_groups=vmailunix_listener dict mode = 0600user = ltuser owning mailboxesgtgroup =

Inside confd20-imapconf activate the imap_quota plugin

protocol imap

mail_plugins = $mail_plugins imap_quota

Inside dovecotconf activate the quota SQL dictionary backend

dict quota = ltdrivergtetcdovecotdovecot-dict-sqlconfext

Inside confd90-quotaconf activate the quota dictionary backend

plugin quota = dictUser quotaproxyquota

It will tell Dovecot to keep quota usage in the SQL dictionary

Finally edit the dovecot-dict-sqlconfext file and put the following content inside

connect = host=ltdb hostgt dbname=ltdb namegt user=ltdb usergt password=ltpasswordgt SQLite users connect = pathtothedatabasedb

map pattern = privquotastoragetable = admin_quotausername_field = usernamevalue_field = bytes

map

pattern = privquotamessagestable = admin_quotausername_field = usernamevalue_field = messages

PostgreSQL users

21 Installation 19

Modoboa Documentation Release 1100

Database schema update

The admin_quota table is created by Django but unfortunately it doesnrsquot support DEFAULT constraints (it onlysimulates them when the ORM is used) As PostgreSQL is a bit strict about constraint violations you must executethe following query manually

db=gt ALTER TABLE admin_quota ALTER COLUMN bytes SET DEFAULT 0db=gt ALTER TABLE admin_quota ALTER COLUMN messages SET DEFAULT 0

Trigger

As indicated on Dovecotrsquos wiki you need a trigger to properly update the quota

A working copy of this trigger is available on Github

Download this file and copy it on the server running postgres Then execute the following commands

$ su - postgres$ psql [modoboa database] lt pathtomodoboa_postgres_triggersql$ exit

Replace [modoboa database] by the appropriate value

Forcing recalculation

For existing installations Dovecot (gt 2) offers a command to recalculate the current quota usages For example if youwant to update all usages run the following command

$ doveadm quota recalc -A

Be carefull it can take a while to execute

ManageSieveSieve

Modoboa lets users define filtering rules from the web interface To do so it requires ManageSieve to be activated onyour server

Inside confd20-managesieveconf make sure the following lines are uncommented

protocols = $protocols sieve

service managesieve-login

service managesieve

protocol sieve

20 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Messages filtering using Sieve is done by the LDA

Inside confd15-ldaconf activate the sieve plugin like this

protocol lda Space separated list of plugins to load (default is global mail_plugins)mail_plugins = $mail_plugins sieve

Finally configure the sieve plugin by editing the confd90-sieveconf file Put the follwing caontent inside

plugin Location of the active script When ManageSieve is used this is actually a symlink pointing to the active script in the sieve storage directorysieve = ~dovecotsieve

The path to the directory where the personal Sieve scripts are stored For ManageSieve this is where the uploaded scripts are storedsieve_dir = ~sieve

Restart Dovecot

Now you can go to the Postfix section to finish the installation

Last-login tracking

To update the last_login attribute of an account after a succesful IMAP or POP3 login you can configure apost-login script

Open confd10-masterconf add the following configuration (imap and pop3 services are already definedyou just need to update them)

service imap executable = imap postlogin

service pop3 executable = pop3 postlogin

service postlogin executable = script-login usrlocalbinpostloginshuser = modoboaunix_listener postlogin

Then you must create a script named usrlocalbinpostloginsh According to your database enginethe content will differ

PostgreSQL

21 Installation 21

Modoboa Documentation Release 1100

binsh

psql -c UPDATE core_user SET last_login=now() WHERE username=$USER gt devnull

exec $

MySQL

binsh

DBNAME=XXXDBUSER=XXXDBPASSWORD=XXX

echo UPDATE core_user SET last_login=now() WHERE username=$USER | mysql -urarr˓$DBUSER -p$DBPASSWORD $DBNAME

exec $

Postfix

This section gives an example about building a simple virtual hosting configuration with Postfix Refer to the officialdocumentation for more explanation

Map files

You first need to create configuration files (or map files) that will be used by Postfix to lookup into Modoboa tables

To automaticaly generate the requested map files and store them in a directory run the following command

gt cd ltmodoboa_instance_pathgtgt python managepy generate_postfix_maps --destdir ltdirectorygt

ltdirectorygt is the directory where the files will be stored Answer the few questions and yoursquore done

Configuration

Use the following configuration in the etcpostfixmaincf file (this is just one possible configuration)

Stuff beforevirtual_transport = lmtpunixprivatedovecot-lmtp

virtual_mailbox_domains = ltdrivergtetcpostfixsql-domainscfvirtual_alias_domains = ltdrivergtetcpostfixsql-domain-aliasescfvirtual_alias_maps = ltdrivergtetcpostfixsql-aliasescf

relay_domains = ltdrivergtetcpostfixsql-relaydomainscftransport_maps =

ltdrivergtetcpostfixsql-transportcfltdrivergtetcpostfixsql-spliteddomains-transportcf

(continues on next page)

22 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

smtpd_recipient_restrictions = check_recipient_access

ltdrivergtetcpostfixsql-maintaincfltdrivergtetcpostfixsql-relay-recipient-verificationcf

permit_mynetworksreject_unauth_destinationreject_unverified_recipient

smtpd_sender_login_maps = ltdrivergtetcpostfixsql-sender-login-mapcf

smtpd_sender_restrictions =reject_sender_login_mismatch

Stuff after

Replace ltdrivergt by the name of the database you use

Restart Postfix

Policy daemon

If you want to enable the built-in policy daemon add the following content to the etcpostfixmaincf file

smtpd_recipient_restrictions = check_policy_service inet1270019999

And reload postfix

Note The check_policy_service line must be placed before the permit_mynetworks one otherwise thedaemon wonrsquot be called

OpenDKIM

Modoboa can generate DKIM keys for the hosted domains but it wonrsquot sign or check messages To do that you needa dedicated software like OpenDKIM

Note The cron job in charge of creating DKIM keys must be run using the same user than OpenDKIM (ie opendkimin most cases)

Database

Since keys related information is stored in Modoboarsquos database you need to tell OpenDKIM how it can access it

First make sure to install the required additional packages on your system (libopendbx1- on debian baseddistributions or opendbx- on CentOS the complete name depends on your database engine)

Then insert the following SQL view into Modoboarsquos database

21 Installation 23

Modoboa Documentation Release 1100

PostgreSQL

CREATE OR REPLACE VIEW dkim AS (SELECT id name as domain_name dkim_private_key_path AS private_key_path

dkim_key_selector AS selectorFROM admin_domain WHERE enable_dkim

)

MySQLMariaDB

CREATE OR REPLACE VIEW dkim AS (SELECT id name as domain_name dkim_private_key_path AS private_key_path

dkim_key_selector AS selectorFROM admin_domain WHERE enable_dkim=1

)

Configuration

You should find OpenDKIMrsquos configuration file at etcopendkimconf

Add the following content to it

KeyTable dsnltdrivergtltusergtltpasswordgtltdb hostgtltdb namegttable=dkimrarr˓keycol=iddatacol=domain_nameselectorprivate_key_pathSigningTable dsnltdrivergtltusergtltpasswordgtltdb hostgtltdb namegttable=dkimrarr˓keycol=domain_namedatacol=idSocket inet12345localhost

Replace values between ltgt by yours Accepted values for driver are pgsql or mysql Make sure the user youspecify has read permission on the view created previously

If you run a debian based system make sure to adjust the following setting in the etcdefaultopendkim file

SOCKET=inet12345localhost

Eventually reload OpenDKIM

Postfix integration

Add the following lines to the etcpostfixmaincf file

smtpd_milters = inet12700112345non_smtpd_milters = inet12700112345milter_default_action = acceptmilter_content_timeout = 30s

and reload postfix

Extensions

Only few commands are needed to add a new extension to your setup

24 Chapter 2 Table of contents

Modoboa Documentation Release 1100

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install ltEXTENSIONgt==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Then restart your web server

22 Upgrade

221 Modoboa

Warning The new version you are going to install may need to modify your database Before you start makesure to backup everything

Most of the time upgrading your installation to a newer Modoboa version only requires a few actions In every caseyou will need to apply the general procedure first and then check if the version you are installing requires specificactions

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install modoboa==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Once done check if the version you are installing requires Specific instructions

Finally restart your web server

Sometimes you might need to upgrade postfix map files too To do so just run the generate_postfix_mapscommand on the same directory than the one used for installation (etcpostfix by default)

Make sure to use root privileges and run the following command

gt python managepy generate_postfix_maps --destdir ltdirectorygt

Then reload postfix

22 Upgrade 25

Modoboa Documentation Release 1100

222 Extensions

If a new version is available for an extension yoursquore using it is recommanded to install it Upgrading an extensions ispretty and the procedure is almost the same than the one used for Modoboa

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install ltEXTENSIONgt==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Finally restart your web server

It is a generic upgrade procedure which will be enough most of the time but it is generally a good idea to check theassociated documentation

223 Rebuild Virtual Environment

Sometimes when upgrading your Operating System (eg from Ubuntu 1704 to Ubuntu 1710) your virtual environmentrunning modoboa can get corrupted Your first response will be to panic but fear not The solution is in this document

First things first

Recover your database password

You will need to recover your database password (if using mysql or postgresql) You will find this in etcpostfixsql-aliasescf or any file with sql-cf in the etcpostfix directory

Make note of this as you will need it when reconfiguring modoboa

Reinstall Modoboa

Start out by backup up your modoboa settings file located in the modoboa instance directory (srvmodoboainstanceinstancesettingspy if you used the default installer configuration) This contains your currentconfiguration

Next you want to remove all current modoboa files

After doing this follow the manual installation instructions for Modoboa only as everything should be working prop-erly

After this completes simply restore your backed up settings file to srvinstanceinstancesettingspy(if you used installer default configuration) You will then need to reinstall your extensions

You can find which plugins you had in your settingspy file under the MODOBOA_APPS variable

Instructions to install extensions can also be found here

Once you have completed this step you will need to run the following commands

26 Chapter 2 Table of contents

Modoboa Documentation Release 1100

gt (env) $ cd ltinstance_dirgtgt (env) $ python managepy migrategt (env) $ python managepy collectstatic

You will then see a message similar to

You have requested to collect static files at the destinationlocation as specified in your settings

srvmodoboainstancesitestatic

This will overwrite existing filesAre you sure you want to do this

Type yes to continue or no to cancel

You will want to answer yes here then simply restart the uwsgi process with service uwsgi restart andyou should be up and running again

Simply log into your modoboa web panel and verify that your extensions and webmail box is working

224 Information

Rebuild instructions from httpshelppythonanywherecompagesRebuildingVirtualenvs

225 Specific instructions

1160

A new policy daemon has been added

Make sure to have a Redis instance running on your server

Add modoboapolicyd to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboapolicyd

)

Add the following settings to your settingspy file

REDIS_HOST = ltIP or hostname heregtREDIS_PORT = 6379REDIS_QUOTA_DB = 0REDIS_URL = redisformat(REDIS_HOST REDIS_PORT REDIS_QUOTA_DB)

Once done you can start the policy daemon using the following commands

22 Upgrade 27

Modoboa Documentation Release 1100

gt python managepy policy_daemon

Donrsquot forget to configure _policyd_config if you want to use this feature

The modoboa-stats plugin has been merged into the core

Add modoboamaillog to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboapolicydmodoboamaillog

)

And remove any reference to modoboa_stats in this same variable

1150

This version drops Python 2 support so donrsquot forget to update all the extensions you use

Warning If you upgrade an existing python 2 installation you will need to create a new Python 3 virtualenvironment You can remove the existing virtual environment and replace it by the new one so you wonrsquot have tomodify your configuration files

Add the following new setting

DISABLE_DASHBOARD_EXTERNAL_QUERIES = False

Reload uwsgigunicornapache depending on your setup

Finally Make sure to use root privileges and run the following command

gt python managepy generate_postfix_maps --destdir ltdirectorygt

Then reload postfix

1140

This release introduces an optional LDAP synchronization process If you want to use it please follow the dedicatedprocedure

1131

Upgrade postfix maps files as follows

28 Chapter 2 Table of contents

Modoboa Documentation Release 1100

gt python managepy generate_postfix_maps --destdir ltpathgt --force-overwrite

1130

Add modoboadnstools to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstools

)

Add the following new settings

CSRF_COOKIE_SECURE = TrueSESSION_COOKIE_SECURE = True

modoboa-postfix-autoreply 150

Edit the etcpostfixmaincf file and remove the sql-autoreplies-transportcf map from thetransport_maps if present Remove the corresponding proxy_read_maps entry if relevant

Reload postfix

1100

Warning Upgrade installed extensions BEFORE running check or migrate commands

Upgrade all your installed plugins to the following versions

Warning If you use the amavis plugin make sure to include its configuration as follows into settingspy

from modoboa_amavis import settings as modoboa_amavis_settingsmodoboa_amavis_settingsapply(globals())

22 Upgrade 29

Modoboa Documentation Release 1100

Name Versionmodoboa-amavis 120modoboa-contacts 050modoboa-dmarc 110modoboa-imap-migration 120modoboa-pdfcredentials 130modoboa-postfix-autoreply 140modoboa-radicale 120modoboa-sievefilters 140modoboa-stats 140modoboa-webmail 140

Edit the settingspy file and apply the following modifications

Add modoboatransport to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparameters

)

Replace the following line

MIDDLEWARE_CLASSES = (

by

MIDDLEWARE = (

Update postfix map files as follows

gt rm -f ltpathgtmodoboa-postfix-mapschkgt python managepy generate_postfix_maps --force --destdir ltpathgt

Then modify postfixrsquos configuration as follows

smtpd_sender_login_maps =ltdrivergtltpathgtsql-sender-login-mapcf

transport_maps =ltdrivergtltpathgtsql-transportcfltdrivergtltpathgtsql-spliteddomains-transportcf other map files

Replace ltdrivergt and ltpathgt by your values

If transport_maps contains sql-relaydomains-transportcf remove it

30 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning If you make use of postfixrsquos proxymap server you must also update the proxy_read_maps setting

Reload postfix

Add the following cron job in order to generate DKIM keys

Generate DKIM keys (they will belong to the user running this job)

root $PYTHON $INSTANCEmanagepy modorarr˓manage_dkim_keys

190

If you want to manage inactive accounts look at Cleaning inactive accounts

183

Edit the settingspy file and replace the following line

BASE_DIR = ospathdirname(ospathdirname(__file__))

by

BASE_DIR = ospathrealpath(ospathdirname(ospathdirname(__file__)))

180

Modoboa now relies on Djangorsquos builtin password validation system to validate user passwords instead ofdjango-passwords

Remove django-passwords from your system

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt pip uninstall django-passwords

Edit the settingspy file and remove the following content

django-passwords

PASSWORD_MIN_LENGTH = 8

PASSWORD_COMPLEXITY = UPPER 1LOWER 1DIGITS 1

Add the following lines

Password validation rulesAUTH_PASSWORD_VALIDATORS = [

NAME djangocontribauthpassword_validation

rarr˓UserAttributeSimilarityValidator (continues on next page)

22 Upgrade 31

Modoboa Documentation Release 1100

(continued from previous page)

NAME djangocontribauthpassword_validationMinimumLengthValidator

NAME djangocontribauthpassword_validationCommonPasswordValidator

NAME djangocontribauthpassword_validationNumericPasswordValidator

NAME modoboacorepassword_validationComplexityValidatorOPTIONS

upper 1lower 1digits 1specials 0

]

172

API documentation has evolved (because of the upgrade to Django Rest Framework 36) and CKeditor is now embed-ded by default (thanks to the django-ckeditor package) Some configuration changes are required

Edit your settingspy file and apply the following modifications

bull Update the INSTALLED_APPS variable as follows

INSTALLED_APPS = (djangocontribauthdjangocontribcontenttypesdjangocontribsessionsdjangocontribmessagesdjangocontribsitesdjangocontribstaticfilesreversionckeditorckeditor_uploaderrest_frameworkrest_frameworkauthtoken

)

bull Update the REST_FRAMEWORK variable as follows

REST_FRAMEWORK = DEFAULT_AUTHENTICATION_CLASSES (

rest_frameworkauthenticationTokenAuthenticationrest_frameworkauthenticationSessionAuthentication

)

bull Remove the SWAGGER_SETTINGS variable

bull Add the following content

32 Chapter 2 Table of contents

Modoboa Documentation Release 1100

CKeditor

CKEDITOR_UPLOAD_PATH = uploads

CKEDITOR_IMAGE_BACKEND = pillow

CKEDITOR_RESTRICT_BY_USER = True

CKEDITOR_BROWSE_SHOW_DIRS = True

CKEDITOR_ALLOW_NONIMAGE_FILES = False

CKEDITOR_CONFIGS = default

allowedContent Truetoolbar Modoboawidth Nonetoolbar_Modoboa [

[Bold Italic Underline][JustifyLeft JustifyCenter JustifyRight JustifyBlock][BidiLtr BidiRtl Language][NumberedList BulletedList - Outdent Indent][Undo Redo][Link Unlink Anchor - Smiley][TextColor BGColor - Source][Font FontSize][Image ][SpellChecker]

]

Donrsquot forget to run the following command

gt python managepy collectstatic

171

If you used 170 for a fresh installation please run the following commands

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy load_initial_data

170

This version requires Django gt= 110 so you need to make some modifications It also brings internal API changeswhich are not backward compatible so installed extensions must be upgraded too

First of all deactivate all installed extensions (edit the settingspy file and comment the corresponding lines inMODOBOA_APPS)

Edit the urlspy file of your local instance and replace its content by the following one

22 Upgrade 33

Modoboa Documentation Release 1100

from djangoconfurls import include url

urlpatterns = [url(r include(modoboaurls))

]

Edit the settingspy and apply the following changes

bull Add modoboaparameters to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboarelaydomainsmodoboalimitsmodoboaparameters Modoboa extensions here

)

bull Add modoboacoremiddlewareLocalConfigMiddleware to MIDDLEWARE_CLASSES

MIDDLEWARE_CLASSES = (djangocontribsessionsmiddlewareSessionMiddlewaredjangomiddlewarecommonCommonMiddlewaredjangomiddlewarecsrfCsrfViewMiddlewaredjangocontribauthmiddlewareAuthenticationMiddlewaredjangocontribmessagesmiddlewareMessageMiddlewaredjangomiddlewarelocaleLocaleMiddlewaredjangomiddlewareclickjackingXFrameOptionsMiddlewaremodoboacoremiddlewareLocalConfigMiddlewaremodoboalibmiddlewareAjaxLoginRedirectmodoboalibmiddlewareCommonExceptionCatchermodoboalibmiddlewareRequestCatcherMiddleware

)

bull Modoboa used to provide a custom authentication backend (modoboalibauthbackendsSimpleBackend) but it has been removed Replace it as follows

AUTHENTICATION_BACKENDS = ( Other backends beforedjangocontribauthbackendsModelBackend

)

bull Remove TEMPLATE_CONTEXT_PROCESSORS and replace it by

TEMPLATES = [

BACKEND djangotemplatebackendsdjangoDjangoTemplatesDIRS []APP_DIRS TrueOPTIONS

context_processors [djangotemplatecontext_processorsdebugdjangotemplatecontext_processorsrequestdjangocontribauthcontext_processorsauth

(continues on next page)

34 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

djangotemplatecontext_processorsi18ndjangotemplatecontext_processorsmediadjangotemplatecontext_processorsstaticdjangotemplatecontext_processorstzdjangocontribmessagescontext_processorsmessagesmodoboacorecontext_processorstop_notifications

]debug False

]

Run the following commands (load virtualenv if you use one)

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstatic

Finally upgrade your extensions and reactivate them

Name Versionmodoboa-amavis 110modoboa-dmarc 100modoboa-imap-migration 110modoboa-pdfcredentials 110modoboa-postfix-autoreply 120modoboa-radicale 110modoboa-sievefilters 110modoboa-stats 110modoboa-webmail 110

Command line shortcuts

$ pip install modoboa-amavis==110$ pip install modoboa-dmarc==100$ pip install modoboa-imap-migration==110$ pip install modoboa-pdfcredentials==110$ pip install modoboa-postfix-autoreply==120$ pip install modoboa-radicale==110$ pip install modoboa-sievefilters==110$ pip install modoboa-stats==110$ pip install modoboa-webmail==110

And please make sure you use the latest version of the django-versionfield2 package

$ pip install -U django-versionfield2

Notes about quota changes and resellers

Reseller users now have a quota option in Resources tab This is the quota that a reseller can share between all itsdomains

22 Upgrade 35

Modoboa Documentation Release 1100

There are two quotas for a domain in the new version

1 Quota amp

2 Default mailbox quota

[1] Quota quota shared between mailboxes This quota is shared between all the mailboxes of this domain This valuecannot exceed resellerrsquos quota and hence cannot be 0(unlimited) if reseller has finite quota

[2] Default mailbox quota default quota applied to mailboxes This quota is the default quota applied to new mail-boxes This value cannot exceed Quota[1] and hence cannot be 0(unlimited) if Quota[1] is finite

161

First of all update postfix map files as follows

gt python managepy generate_postfix_maps --destdir ltpathgt --force-overwrite

Then modify postfixrsquos configuration as follows

smtpd_sender_login_maps =ltdrivergtltpathgtsql-sender-login-mailboxescfltdrivergtltpathgtsql-sender-login-aliasescfltdrivergtltpathgtsql-sender-login-mailboxes-extracf

Replace ltdrivergt and ltpathgt by your values

Finally reload postfix

This release also deprecates some internal functions As a result several extensions has been updated to maintain thecompatibility If you enabled the notification service yoursquoll find the list of available updates directly in your Modoboaconsole

For the others here is the list

Name Versionmodoboa-amavis 1010modoboa-postfix-autoreply 117modoboa-radicale 105modoboa-stats 109

Command line shortcut

$ pip install modoboa-amavis==1010$ pip install modoboa-postfix-autoreply==117$ pip install modoboa-radicale==105$ pip install modoboa-stats==109

160

Warning You have to upgrade extensions due to coreUser model attribute change (usergroup to userrole) Oth-erwise you will have an internal error after upgrade In particular modoboa-amavisd modoboa-stats modoboa-postfix-autoreply are concerned

36 Chapter 2 Table of contents

Modoboa Documentation Release 1100

An interesting feature brougth by this version is the capability to make different checks about MX records Forexample Modoboa can query main DNSBL providers for every defined domain With this you will quickly know ifone the domains you manage is listed or not To activate it add the following line to your crontab

30 ltoptional_virtualenv_pathgtpython ltmodoboa_instance_dirgtmanagepy modorarr˓check_mx

The communication with Modoboa public API has been reworked Instead of sending direct synchronous queries (forexample to check new versions) a cron job has been added To activate it add the following line to your crontab

0 ltoptional_virtualenv_pathgtpython ltmodoboa_instance_dirgtmanagepyrarr˓communicate_with_public_api

Please also note that public API now uses TLS so you must update your configuration as follows

MODOBOA_API_URL = httpsapimodoboaorg1

Finally it is now possible to declare additional sender addresses on a per-account basis You need to update your postfixconfiguration in order to use this functionality Just edit the maincf file and change the following parameter

smtpd_sender_login_maps =ltdrivergtetcpostfixsql-sender-login-mailboxescfltdrivergtetcpostfixsql-sender-login-aliasescfltdrivergtetcpostfixsql-sender-login-mailboxes-extracf

150

The API has been greatly improved and a documentation is now available To enable it addrest_framework_swagger to the INSTALLED_APPS variable in settingspy as follows

INSTALLED_APPS = (djangocontribauthdjangocontribcontenttypesdjangocontribsessionsdjangocontribmessagesdjangocontribsitesdjangocontribstaticfilesreversionrest_frameworkauthtokenrest_framework_swagger

)

Then add the following content into settingspy just after the REST_FRAMEWORK variable

SWAGGER_SETTINGS = is_authenticated Falseapi_version 10exclude_namespaces []info

contact contactmodoboacomdescription (Modoboa API requires a valid token)title Modoboa API

Yoursquore done The documentation is now available at the following address

22 Upgrade 37

Modoboa Documentation Release 1100

httpltyour instance addressgtdocsapi

Finally if you find a TEMPLATE_CONTEXT_PROCESSORS variable in your settingspy file make sure it lookslike this

TEMPLATE_CONTEXT_PROCESSORS = global_settingsTEMPLATE_CONTEXT_PROCESSORS + [modoboacorecontext_processorstop_notifications

]

140

Warning Please make sure to use Modoboa 135 with an up-to-date database before an upgrade to 140

Warning Do not follow the regular upgrade procedure for this version

Some extension have been moved back into the main repository The main reason for that is that using Modoboawithout them doesnrsquot make sense

First of all you must rename the following applications listed inside the MODOBOA_APPS variable

Old name New namemodoboa_admin modoboaadminmodoboa_admin_limits modoboalimitsmodoboa_admin_relaydomains modoboarelaydomains

Then apply the following steps

1 Uninstall old extensions

$ pip uninstall modoboa-admin modoboa-admin-limits modoboa-admin-relaydomains

2 Install all extension updates using pip (check the Modoboa gt Information page)

3 Manually migrate database

$ cd ltinstance_dirgt$ python managepy migrate auth$ python managepy migrate admin 0001 --fake$ python managepy migrate admin$ python managepy migrate limits 0001 --fake$ python managepy migrate relaydomains 0001 --fake$ python managepy migrate

4 Finally update static files

$ python managepy collectstatic

This version also introduces a REST API To enable it

1 Add rest_frameworkauthtoken to the INSTALLED_APPS variable

2 Add the following configuration inside settingspy

38 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Rest framework settings

REST_FRAMEWORK = DEFAULT_AUTHENTICATION_CLASSES (

rest_frameworkauthenticationTokenAuthentication)DEFAULT_PERMISSION_CLASSES (

rest_frameworkpermissionsIsAuthenticated)

3 Run the following command

$ python managepy migrate

135

To enhance security Modoboa now checks the strength of user passwords lthttpsgithubcomdstufftdjango-passwordsgt_

To use this feature add the following configuration into the settingspy file

django-passwords

PASSWORD_MIN_LENGTH = 8

PASSWORD_COMPLEXITY = UPPER 1LOWER 1DIGITS 1

132

Modoboa now uses the atomic requests mode to preserve database consistency (reference)

To enable it update the DATABASES variable in settingspy as follows

DATABASES = default

stuff beforeATOMIC_REQUESTS True

amavis

stuff beforeATOMIC_REQUESTS True

130

This release does not bring awesome new features but it is a necessary bridge to the future of Modoboa All extensionsnow have their own git repository and the deploy process has been updated to reflect this change

22 Upgrade 39

Modoboa Documentation Release 1100

Another important update is the use of Django 17 Besides its new features the migration system has been reworkedand is now more robust than before

Before we begin with the procedure here is a table showing old extension names and their new name

Old name New package name New module namemodoboaextensionsadmin modoboa-admin modoboa_adminmodoboaextensionslimits modoboa-admin-limits modoboa_admin_limitsmodoboaextensionspostfix_autoreply modoboa-postfix-autoreply modoboa_postfix_autoreplymodoboaextensionspostfix_relay_domains modoboa-admin-relaydomains modoboa_admin_relaydomainsmodoboaextensionsradicale modoboa-radicale modoboa_radicalemodoboaextensionssievefilters modoboa-sievefilters modoboa_sievefiltersmodoboaextensionsstats modoboa-stats modoboa_statsmodoboaextensionswebmail modoboa-webmail modoboa_webmail

Here are the required steps

1 Install the extensions using pip (look at the second column in the table above)

$ pip install ltthe extensions you wantgt

2 Remove south from INSTALLED_APPS

3 Rename old extension names inside MODOBOA_APPS (look at the third column in the table above)

4 Remove modoboalibmiddlewareExtControlMiddleware from MIDDLEWARE_CLASSES

5 Change DATABASE_ROUTERS to

DATABASE_ROUTERS = [modoboa_amavisdbrouterAmavisRouter]

6 Run the following commands

$ cd ltmodoboa_instance_dirgt$ python managepy migrate

7 Reply yes to the question

8 Run the following commands

$ python managepy load_initial_data$ python managepy collectstatic

9 The cleanup job has been renamed in Django so you have to modify your crontab entry

- 0 0 ltmodoboa_sitegtmanagepy cleanup+ 0 0 ltmodoboa_sitegtmanagepy clearsessions

120

A new notification service let administrators know about new Modoboa versions To activate it you need to updatethe TEMPLATE_CONTEXT_PROCESSORS variable like this

from djangoconf import global_settings

TEMPLATE_CONTEXT_PROCESSORS = global_settingsTEMPLATE_CONTEXT_PROCESSORS + (

(continues on next page)

40 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

modoboacorecontext_processorstop_notifications)

and to define the new MODOBOA_API_URL variable

MODOBOA_API_URL = httpapimodoboaorg1

The location of external static files has changed To use them add a new path to the STATICFILES_DIRS

Additional locations of static filesSTATICFILES_DIRS = (

Put strings here like homehtmlstatic or Cwwwdjangostatic Always use forward slashes even on Windows Dont forget to use absolute paths not relative pathsltpathtomodoboainstalldirgtbower_components

)

Run the following commands to define the hostname of your instance

$ cd ltmodoboa_instance_dirgt$ python managepy set_default_site lthostnamegt

If you plan to use the Radicale extension

1 Add modoboaextensionsradicale to the MODOBOA_APPS variable

2 Run the following commands

$ cd ltmodoboa_instance_dirgt$ python managepy syncdb

Warning You also have to note that the sitestatic directory has moved from ltpath to your sitesdirgt to ltmodoboas root urlgt (itrsquos probably the parent directory) You have to adapt your web serverconfiguration to reflect this change

23 Configuration

231 Online parameters

Modoboa provides online panels to modify internal parameters There are two available levels

bull Application level global parameters define how the application behaves Available at Modoboa gt Parameters

bull User level per user customization Available at User gt Settings gt Preferences

Regardless level parameters are displayed using tabs each tab corresponding to one application

General parameters

The admin application exposes several parameters they are presented below

23 Configuration 41

Modoboa Documentation Release 1100

Name Tab Description Default valueAuthentication type General The backend used for au-

thenticationLocal

Default password scheme General Scheme used to cryptmailbox passwords

crypt

Rounds General Number of rounds (onlyused by sha256cryptand sha512crypt) Mustbe between 1000 and999999999 inclusive

70000

Secret key General A key used to encryptusersrsquo password in ses-sions

random value

Sender address General Email address used tosend notifications

Enable communication General Enable communicationwith Modoboa public API

yes

Check new versions General Automatically checks if anewer version is available

yes

Send statistics General Send statistics to Mod-oboa public API (countersand used extensions)

yes

Top notifications check in-terval

General Interval between two topnotification checks (inseconds)

30

Maximum log record age General The maximum age in daysof a log record

365

Items per page General Number of displayeditems per page

30

Default top redirection General The default redirectionused when no applicationis specified

userprefs

Enable MX checks Admin Check that every domainhas a valid MX record

yes

Valid MXs Admin A list of IP or networkaddress every MX shouldmatch A warning will besent if a record does notrespect this it

Enable DNSBL checks Admin Check every domainagainst major DNSBLproviders

yes

DKIM keys storage direc-tory

AdminPath to a directory where DKIM

generated keys willbe stored

Default DKIM key length Admin The default size (in bits)for new keys

2048

Handle mailboxes onfilesystem

Admin Rename or remove mail-boxes on the filesystemwhen they get renamed orremoved within Modoboa

no

Mailboxes owner Admin The UNIX account whoowns mailboxes on thefilesystem

vmail

Default domain quota Admin Default quota (in MB) ap-plied to freshly createddomains with no valuespecified A value of 0means no quota

0

Automatic accountremoval

Admin When a mailbox is re-moved also remove theassociated account

no

Automatic do-mainmailbox creation

Admin Create a domain and amailbox when an accountis automatically created

yes

42 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Note If you are not familiar with virtual domain hosting you should take a look at postfixrsquos documentation ThisHow to also contains useful information

Note A random secret key will be generated each time the Parameters page is refreshed and until you save parametersat least once

Note Specific LDAP parameters are also available see LDAP authentication

232 Media files

Modoboa uses a specific directory to upload files (ie when the webmail is in use) or to create ones (ex graphical statis-tics) This directory is named media and is located inside modoboarsquos installation directory (called modoboa_sitein this documentation)

To work properly the system user which runs modoboa (www-data apache whatever) must have write access tothis directory

233 Customization

Custom logo

You have the possibility to use a custom logo instead of the default one on the login page

To do so open the settingspy file and add a MODOBOA_CUSTOM_LOGO variable This variable must containthe relative URL of your logo under MEDIA_URL For example

MODOBOA_CUSTOM_LOGO = ospathjoin(MEDIA_URL custom_logopng)

Then copy your logo file into the directory indicated by MEDIA_ROOT

234 Host configuration

Note This section is only relevant when Modoboa handles mailboxes renaming and removal from the filesystem

To manipulate mailboxes on the filesystem you must allow the user who runs Modoboa to execute commands as theuser who owns mailboxes

To do so edit the etcsudoers file and add the following inside

ltuser_that_runs_modoboagt ALL=(ltmailboxes ownergt) NOPASSWD ALL

Replace values between ltgt by the ones you use

23 Configuration 43

Modoboa Documentation Release 1100

235 Time zone and language

Modoboa is available in many languages

To specify the default language to use edit the settingspy file and modify the LANGUAGE_CODE variable

LANGUAGE_CODE = fr or en for english etc

Note Each user has the possibility to define the language he prefers

In the same configuration file specify the timezone to use by modifying the TIME_ZONE variable For example

TIME_ZONE = EuropeParis

236 Sessions management

Modoboa uses Djangorsquos session framework to store per-user information

Few parameters need to be set in the settingspy configuration file to make Modoboa behave as expected

SESSION_EXPIRE_AT_BROWSER_CLOSE = False Default value

This parameter is optional but you must ensure it is set to False (the default value)

The default configuration file provided by the modoboa-adminpy command is properly configured

237 Logging authentication

To trace login attempts to the web interface Modoboa uses python SysLogHandler so you can see them in your syslogauthentication log file (varlogauthlog in most cases)

Depending on your configuration you may have to edit the settingspy file and add lsquoaddressrsquo lsquodevlogrsquo to thelogging section

syslog-auth class logginghandlersSysLogHandlerfacility SysLogHandlerLOG_AUTHaddress devlogformatter syslog

238 External authentication

LDAP

Modoboa supports external LDAP authentication using the following extra components

bull Python LDAP client

bull Django LDAP authentication backend

If you want to use this feature you must first install those components

44 Chapter 2 Table of contents

Modoboa Documentation Release 1100

$ pip install python-ldap django-auth-ldap

Then all you have to do is to modify the settingspy file Add a new authentication backend to the AUTHENTI-CATION_BACKENDS variable like this

AUTHENTICATION_BACKENDS = (modoboalibauthbackendsLDAPBackend modoboalibauthbackendsLDAPSecondaryBackend Useful for a fallback

rarr˓mechanismdjangocontribauthbackendsModelBackend

)

Finally go to Modoboa gt Parameters gt General and set Authentication type to LDAP

From there new parameters will appear to let you configure the way Modoboa should connect to your LDAP serverThey are described just below

Name Description De-faultvalue

Server address The IP address of the DNS name of the LDAP server local-host

Server port The TCP port number used by the LDAP server 389Use a secureconnection

Use an SSLTLS connection to access the LDAP server no

Authenticationmethod

Choose the authentication method to use Directbind

User DN tem-plate (directbind mode)

The template used to construct a userrsquos DN It should contain one placeholder (ie(user)s)

Bind BN The distinguished name to use when binding to the LDAP server Leave empty for ananonymous bind

Bind password The password to use when binding to the LDAP server (with lsquoBind DNrsquo)Search base The distinguished name of the search baseSearch filter An optional filter string (eg lsquo(objectClass=person)rsquo) In order to be valid it must be

enclosed in parentheses(mail=(user)s)

Passwordattribute

The attribute used to store user passwords user-Pass-word

Active Direc-tory

Tell if the LDAP server is an Active Directory one no

Administratorgroups

Members of those LDAP Posix groups will be created ad domain administrators Uselsquorsquo characters to separate groups

Group type The type of group used by your LDAP directory Posix-Group

Groups searchbase

The distinguished name of the search base used to find groups

Do-mainmailboxcreation

Automatically create a domain and a mailbox when a new user is created just after thefirst successful authentication You will generally want to disable this feature whenthe relay domains extension is in use

yes

If you need additional parameters you will find a detailed documentation here

Once the authentication is properly configured the users defined in your LDAP directory will be able to connect to

23 Configuration 45

Modoboa Documentation Release 1100

Modoboa the associated domain and mailboxes will be automatically created if needed

The first time a user connects to Modoboa a local account is created if the LDAP username is a valid email addressBy default this account belongs to the SimpleUsers group and it has a mailbox

To automatically create domain administrators you can use the Administrator groups setting If a LDAP user belongsto one the listed groups its local account will belong to the DomainAdmins group In this case the username is notnecessarily an email address

Users will also be able to update their LDAP password directly from Modoboa

Note Modoboa doesnrsquot provide any synchronization mechanism once a user is registered into the database Anymodification done from the directory to a user account will not be reported to Modoboa (an email address change forexample) Currently the only solution is to manually delete the Modoboa record it will be recreated on the next userlogin

SMTP

It is possible to use an existing SMTP server as an authentication source To enable this feature edit the settingspy file and change the following setting

AUTHENTICATION_BACKENDS = (modoboalibauthbackendsSMTPBackenddjangocontribauthbackendsModelBackend

)

SMTP server location can be customized using the following settings

AUTH_SMTP_SERVER_ADDRESS = localhostAUTH_SMTP_SERVER_PORT = 25AUTH_SMTP_SECURED_MODE = None ssl or starttls are accepted

239 LDAP synchronization

Modoboa can synchronize accounts with an LDAP directory (tested with OpenLDAP) but this feature is not enabledby default To activate it add modoboaldapsync to MODOBOA_APPS in the settingspy file

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboaldapsync

)

and enable it from the admin panel

46 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning Make sure to install additional requirements otherwise it wonrsquot work

The following parameters are available and must be filled

Name Description Defaultvalue

Enable LDAP synchro-nization

Control LDAP synchronization state no

Bind DN The DN of a user with write permission to createupdate accountsBind password The associated passwordAccount DN template The template used to build account DNs (must contain a (user)s

placeholder

2310 Database maintenance

Cleaning the logs table

Modoboa logs administrator specific actions into the database A clean-up script is provided to automatically removeoldest records The maximum log record age can be configured through the online panel

To use it you can setup a cron job to run every night

0 0 ltmodoboa_sitegtmanagepy cleanlogs Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy cleanlogs

Cleaning the session table

Django does not provide automatic purging Therefore itrsquos your job to purge expired sessions on a regular basis

Django provides a sample clean-up script django-adminpy clearsessions That script deletes any sessionin the session table whose expire_date is in the past

For example you could setup a cron job to run this script every night

0 0 ltmodoboa_sitegtmanagepy clearsessions Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy clearsessions

Cleaning inactive accounts

Thanks to Last-login tracking it is now possible to monitor inactive accounts An account is considered inactive if nologin has been recorded for the last 30 days (this value can be changed through the admin panel)

A management command is available to disable or delete inactive accounts For example you could setup a cron jobto run it every night

23 Configuration 47

Modoboa Documentation Release 1100

0 0 ltmodoboa_sitegtmanagepy clean_inactive_accounts Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy clean_inactive_rarr˓accounts

The default behaviour is to disable accounts You can delete them using the --delete option

24 Moving to Modoboa

You have an existing platform and yoursquod like to move to Modoboa the following tools could help you

241 From postfixadmin

A dedicated command allows you to convert an existing postfixadmin database to a Modoboa one Consult the docu-mentation to know more about the process

242 Using CSV files

Modoboa allows you to import any object (domain domain alias mailbox and alias) using a simple CSV file encodedusing UTF8 Each line corresponds to a single object and must respect one of the following format

domain ltname stringgt ltquota integergt ltdefault mailbox quota integergt ltenabledrarr˓booleangtdomainalias ltname stringgt lttargeted domain stringgt ltenabled booleangtrelaydomain ltname stringgt lttarget host stringgt lttarget port integergt ltservicerarr˓stringgt ltenabled booleangt ltverify recipients booleangtaccount ltloginname stringgt ltpassword stringgt ltfirst name stringgt ltlast namerarr˓stringgt ltenabled booleangt ltgroup stringgt ltaddress stringgt ltquota integergt [rarr˓ltdomain stringgt ]alias ltaddress stringgt ltenabled booleangt ltrecipient stringgt

Boolean fields accept the following values true 1 yes y (case insensitive) Any other value will be evaluated asfalse

Warning The order does matter Objects are created sequencially so a domain must be created before itsmailboxes and aliases and a mailbox must created before its alias(es)

To actually import such a file

gt sudo -u ltmodoboa_usergt -igt source ltvirtualenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy modo import ltyour filegt

Available options can be listed using the following command

gt python managepy modo import -h

48 Chapter 2 Table of contents

Modoboa Documentation Release 1100

25 REST API

To ease the integration with external sources (software or other) Modoboa provides a REST API

Every installed instance comes with a ready-to-use API and a documentation You will find them using the followingurl patterns

bull API httplthostnamegtapiv1

bull Documentation httplthostnamegtdocsapi

An example of this documentation is available on the official demo

Using this API requires an authentication and for now only a token based authentication is supported To get a validtoken log-in to your instance with a super administrator go to Settings gt API and activate the API access Press theUpdate button and wait until the page is reloaded the token will be displayed

To make valid API calls every requests you send must embed this token within an Authorization HTTP header likethis

Authorization Token ltYOUR_TOKENgt

and the content type of those requests must be applicationjson

26 How to contribute

Contributions are always welcome If you want to submit a patch please respect the following rules

bull Open a pull request on the appropriate repository

bull Respect PEP8

bull Document your patch and respect PEP 257

bull Add unit tests and make sure the global coverage does not decrease

If all those steps are validated your contribution will generally be integrated

261 Table of contents

25 REST API 49

Modoboa Documentation Release 1100

Useful tips

You would like to work on Modoboa but you donrsquot know where to start Yoursquore at the right place Browse this pageto learn useful tips

Docker

A docker image is available for developers To use it you must install docker and docker-compose first

Then just run the following command

$ docker-compose up

It will start the docker environment and make a Modoboa instance available at httplocalhost8000

If you donrsquot want to use docker or need a more complex development setup go to the next section

Prepare a virtual environment

A virtual environment is a good way to setup a development environment on your machine

To do so run the following commands

$ python3 -m venv ltpathgt$ source ltpathgtbinactivate$ git clone httpsgithubcommodoboamodoboagit$ cd modoboa$ python setuppy develop$ pip install -r dev-requirementstxt

The develop command creates a symbolic link to your local copy so any modification you make will be automati-cally available in your environment no need to copy them

Deploy an instance for development

Warning Make sure to create a database before running this step The format of the database url is also describedin this page

Now that you have a running environment yoursquore ready to deploy a test instance

$ cd ltpathgt$ modoboa-adminpy deploy --dburl defaultltdatabase urlgt --domain localhost --develrarr˓instance$ python managepy runserver

Yoursquore ready to go You should be able to access Modoboa at httplocalhost8000 usingadminpassword as credentials

Manage static files

Modoboa uses bower (thanks to django-bower) to manage its CSS and javascript dependencies

50 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Those dependencies are listed in a file called dev_settingspy located inside the ltpath_to_local_copygtmodoboacore directory

If you want to add a new dependency just complete the BOWER_INSTALLED_APPS parameter and run the followingcommand

$ python managepy bower install

It will download and store the required files into the ltpath_to_local_copygtmodoboabower_components directory

Test your modifications

If you deployed a specific instance for your development needs you can run the tests suite as follows

gt python managepy test modoboacore modoboalib modoboaadmin modoboalimits modoboararr˓relaydomains

Otherwise you can run the tests suite from the repository using tox

Start a basic Modoboa instance

From the repository run the following command to launch a simple instance with a few fixtures

gt tox -e serve

You can use adminpassword to log in

Build the documentation

If you need to modify the documenation and want to see the result you can build it as follows

gt tox -e docgt firefox toxdoctmphtmlindexhtml

FAQ

bower command is missing in managepy

bower command is missing in managepy if you donrsquot use the --devel option of the modoboa-adminpydeploy command

To fix it regenerate your instance or update your settingspy file manually Look at devmode in httpsgithubcomtonioomodoboablobmastermodoboacorecommandstemplatessettingspytpl

Create a new plugin

Introduction

Modoboa offers a plugin API to expand its capabilities The current implementation provides the following possibili-ties

26 How to contribute 51

Modoboa Documentation Release 1100

bull Expand navigation by adding entry points to your plugin inside the GUI

bull Access and modify administrative objects (domains mailboxes etc)

bull Register callback actions for specific events

Plugins are nothing more than Django applications with an extra piece of code that integrates them into Modoboa Themodo_extensionpy file will contain a complete description of the plugin

bull Admin and user parameters

bull Custom menu entries

The communication between both applications is provided by Django signals

The following subsections describe the plugin architecture and explain how you can create your own

The required glue

To create a new plugin just start a new django application like this (into Modoboarsquos directory)

$ python managepy startapp

Then you need to register this application using the provided API Just copypaste the following example into themodo_extensionpy file of the future extension

from modoboacoreextensions import ModoExtension exts_pool

class MyExtension(ModoExtension)My custom Modoboa extension

name = myextlabel = My Extensionversion = 01description = A descriptionurl = myext_root_location optional name is used if not defined

def load(self)This method is called when Modoboa loads available and activated plugins

Declare parameters and register events herepass

def load_initial_data(self)Optional provide initial data for your extension herepass

exts_poolregister_extension(MyExtension)

Once done simply add your extensionrsquos module name to the MODOBOA_APPS variable located inside settingspy Finally run the following commands

$ python managepy migrate$ python managepy load_initial_data$ python managepy collectstatic

52 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Parameters

A plugin can declare its own parameters There are two levels available

bull lsquoGlobalrsquo parameters used to configure the plugin editable inside the Admin gt Settings gt Parameters page

bull lsquoUserrsquo parameters per-user parameters (or preferences) editable inside the Options gt Preferences page

Playing with parameters

Parameters are defined using Django forms and Modoboa adds two special forms you can inherit depending on thelevel of parameter(s) you want to add

bull modoboaparametersformsAdminParametersForm for general parameters

bull modoboaparametersformsUserParametersForm for user parameters

To register new parameters add the following line into the load method of your plugin class

from modoboaparameters import tools as param_toolsparam_toolsregistryadd(

LEVEL YourForm ugettext_lazy(Title))

Replace LEVEL by global or user

Custom role permissions

Modoboa uses Djangorsquos internal permission system Administrative roles are nothing more than groups (Groupinstances)

An extension can add new permissions to a group by listening to the extra_role_permissions signal Here isan example

from djangodispatch import receiverfrom modoboacore import signals as core_signals

PERMISSIONS = Resellers [

(relaydomains relaydomain add_relaydomain)(relaydomains relaydomain change_relaydomain)(relaydomains relaydomain delete_relaydomain)(relaydomains service add_service)(relaydomains service change_service)(relaydomains service delete_service)

]

receiver(core_signalsextra_role_permissions)def extra_role_permissions(sender role kwargs)

Add permissions to the Resellers groupreturn constantsPERMISSIONSget(role [])

Extending admin forms

The forms used to edit objects (account domain etc) through the admin panel are composed of tabs You can extendthem (ie add new tabs) in a pretty easy way thanks to custom signals

26 How to contribute 53

Modoboa Documentation Release 1100

Account

To add a new tab to the account edition form define new listeners (handlers) for the following signals

bull modoboaadminsignalsextra_account_forms

bull modoboaadminsignalsget_account_form_instances

bull modoboaadminsignalscheck_extra_account_form (optional)

Example

from djangodispatch import receiverfrom modoboaadmin import signals as admin_signals

receiver(admin_signalsextra_account_forms)def extra_account_form(sender user account kwargs)

return [id tabid title Title cls MyFormClass

]

receiver(admin_signalsget_account_form_instances)def fill_my_tab(sender user account kwargs)

return id my_instance

Domain

To add a new tab to the domain edition form define new listeners (handlers) for the following signals

bull modoboaadminsignalsextra_domain_forms

bull modoboaadminsignalsget_domain_form_instances

Example

from djangodispatch import receiverfrom modoboaadmin import signals as admin_signals

receiver(admin_signalsextra_domain_forms)def extra_account_form(sender user domain kwargs)

return [id tabid title Title cls MyFormClass

]

receiver(admin_signalsget_domain_form_instances)def fill_my_tab(sender user domain kwargs)

return id my_instance

27 Contributors

bull Antidot

bull Bearstech

bull CAP-REL

54 Chapter 2 Table of contents

Modoboa Documentation Release 1100

bull Dalnix

27 Contributors 55

  • Overview
  • Table of contents
Page 9: Modoboa Documentation

Modoboa Documentation Release 1100

gt git clone httpsgithubcommodoboamodoboa-installergt cd modoboa-installergt sudo runpy ltyour domaingt

if you get this warning - lsquousrbinenv lsquopythonrsquo No such file or directoryrsquo do make sure sure python is installed onyour server Sometimes python is installed but the installer canrsquot detect it or which python version to run especiallyon a debian based system Then run this command first

gt sudo apt-get install python-virtualenv python-pip

Wait a few minutes and yoursquore done o

213 Manual installation

For those who need a manual installation or who just want to setup a specific part here are the steps you must follow

Modoboa

This section describes the installation of the web interface (a Django project)

Prepare the system

First of all we recommend the following context

bull A dedicated system user

bull A virtual environment to install the application because it will isolate it (and its dependencies) from the rest ofyour system

The following example illustrates how to realize this on Debian-based distributions using virtualenv

apt-get install virtualenv python3-pip useradd modoboa create a dedicated user su -l modoboa log in as the newly created user$ virtualenv --python python3 env create the virtual environment$ source envbinactivate activate the virtual environment

Modoboa depends on external tools and some of them require compilation so you need a compiler and a few C librariesMake sure to install the following system packages according to your distribution

Debian Ubuntubuild-essential python3-dev libxml2-dev libxslt-dev libjpeg-dev librrd-dev rrdtool libffi-dev libssl-dev

CentOSgcc gcc-c++ python3-devel libxml2-devel libxslt-devel libjpeg-turbo-devel rrdtool-devel rrdtool libffi-devel

Note Alternatively you could rely on your distribution packages for the Modoboa dependencies which requirecompilation - eg psycopg2 - if the version is compatible In this case you have to create your virtual environmentwith the --system-site-packages option

Then install Modoboa by running

6 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(env)$ pip install modoboa

Database

Warning This documentation does not cover the installation of a database server but only the setup of a functionaldatabase that Modoboa will use

Thanks to Django Modoboa is compatible with the following databases

bull PostgreSQL

bull MySQL MariaDB

bull SQLite

Since the last one does not require particular actions only the first two ones are described You should also read thenotes for those database backends on the official Django documentation

PostgreSQL

Install the corresponding Python binding

(env)$ pip install psycopg2

Note Alternatively you can install the python3-psycopg2 package instead on Debian-based distributions ifyour virtual environment was created with --system-site-packages option

Then create a user and a database For example to create the modoboa database owned by a modoboa user run thefollowing commands on your PostgreSQL server

sudo -l -u postgres createuser --no-createdb modoboa sudo -l -u postgres createdb --owner=modoboa modoboa

MySQL MariaDB

Install the corresponding Python binding

(env)$ pip install mysqlclient

Note Alternatively you can install the python3-mysqldb package instead on Debian-based distributions if yourvirtual environment was created with --system-site-packages option

Note MariaDB 102 (and newer) require mysqlclient 1311 (or newer)

Then create a user and a database For example to create the modoboa database owned by a modoboa user run thefollowing SQL commands

21 Installation 7

Modoboa Documentation Release 1100

CREATE DATABASE modoboaCREATE USER modoboalocalhost IDENTIFIED BY my-strong-password-hereGRANT ALL PRIVILEGES ON modoboa TO modoboalocalhost

Deploy an instance

modoboa-adminpy is a command line tool that lets you deploy a ready-to-use Modoboa site To create a newinstance into instance you just have to run the following command

(env)$ modoboa-adminpy deploy instance --collectstatic --domain lthostname of your servergt --dburl defaultltdatabase urlgt

Note You can install additional extensions during the deploy process To do so use the --extensions op-tion which accepts a list of names as argument (--extensions ext1 ext2 ) If you want to install allextensions just use the all keyword like this --extensions all

If you choose to install extensions one at a time you will have to add their names in settingspy to MODOBOA_APPSAlso ensure that you have the line from modoboa_amavissettings import at the end of this file

The list of available extensions can be found on the index page Instructions to install them are available on eachextensions page

Note You can specify more than one database connection using the --dburl option Multiple connections aredifferentiated by a prefix

The primary connection must use the default prefix (as shown in the example above) For the amavis exten-sion use the amavis prefix For example --dburl defaultltdatabase urlgt amavisltdatabaseurlgt

A database url should meet the following syntax ltmysql|postgresgt[userpass][hostport]dbname OR sqlitefullpathtoyourdatabasefilesqlite

The command will ask you a few questions answer them and yoursquore done

If you need a silent installation (eg if yoursquore using Salt-Stack Ansible or whatever) itrsquos possible to supply thedatabase credentials as command line arguments

You can consult the complete option list by running the following command

(env)$ modoboa-adminpy help deploy

Cron jobs

A few recurring jobs must be configured to make Modoboa works as expected

Create a new file for example etccrondmodoboa and put the following content inside

Modoboa specific cron jobsPYTHON=ltpath to Python binary inside the virtual environmentgtINSTANCE=ltpath to Modoboa instancegt

(continues on next page)

8 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

Operations on mailboxes

vmail $PYTHON $INSTANCEmanagepy handle_mailbox_operations

Generate DKIM keys (they will belong to the user running this job)

root umask 077 ampamp $PYTHON $INSTANCEmanagepy modo manage_dkim_rarr˓keys

Sessions table cleanup0 0 modoboa $PYTHON $INSTANCEmanagepy clearsessions Logs table cleanup0 0 modoboa $PYTHON $INSTANCEmanagepy cleanlogs DNSBL checks

30 modoboa $PYTHON $INSTANCEmanagepy modo check_mx Public API communication0 modoboa $PYTHON $INSTANCEmanagepy communicate_with_public_api

Policy daemon

Modoboa comes with a built-in Policy Daemon for Postfix Current features are

bull Define daily sending limits for domains andor accounts

A redis server is required to run this new daemon

You can launch it manually using the following command

(env)gt python managepy policy_daemon

But we recommend an automatic start using systemd or supervisor Here is a configuration example forsupervisor

[programpolicyd]autostart=trueautorestart=truecommand=srvmodoboaenvbinpython srvmodoboainstancemanagepy policy_daemondirectory=srvmodoboaredirect_stderr=trueuser=modoboanumprocs=1

It will listen by default on 127001 and port 9999 The policy daemon wonrsquot do anything unless you tell postfixto use it

Now you can continue to the Web server section

Web server

Note The following instructions are meant to help you get your site up and running quickly However it is notpossible for the people contributing documentation to Modoboa to test every single combination of web server wsgiserver distribution etc So it is possible that your installation of uwsgi or nginx or Apache or what-have-you worksdifferently Keep this in mind

21 Installation 9

Modoboa Documentation Release 1100

Apache2

First make sure that mod_wsgi is installed on your server

Create a new virtualhost in your Apache configuration and put the following content inside

ltVirtualHost 80gtServerName ltyour valuegtDocumentRoot ltmodoboa_instance_pathgt

Alias media ltmodoboa_instance_pathgtmedialtDirectory ltmodoboa_instance_pathgtmediagtOrder denyallowAllow from all

ltDirectorygt

Alias sitestatic ltmodoboa_instance_pathgtsitestaticltDirectory ltmodoboa_instance_pathgtsitestaticgtOrder denyallowAllow from all

ltDirectorygt

WSGIScriptAlias ltmodoboa_instance_pathgtltinstance_namegtwsgipy

Pass Authorization header to enable API usageWSGIPassAuthorization On

ltVirtualHostgt

This is just one possible configuration

To use mod_wsgi daemon mode add the two following directives just under WSGIScriptAlias

WSGIDaemonProcess examplecom python-path=ltmodoboa_instancegtltvirtualenv pathgtlibrarr˓python37site-packagesWSGIProcessGroup examplecom

Replace values between ltgt with yours If you donrsquot use a virtualenv just remove the last part of theWSGIDaemonProcess directive

Note You will certainly need more configuration in order to launch Apache

Now you can go the Dovecot section to continue the installation

Nginx

This section covers two different ways of running Modoboa behind Nginx using a WSGI application server Choosethe one you prefer between Green Unicorn or uWSGI

In both cases yoursquoll need to download and install nginx

Green Unicorn

Firstly Download and install gunicorn Then use the following sample gunicorn configuration (create a new filenamed gunicornconfpy inside Modoboarsquos root dir)

10 Chapter 2 Table of contents

Modoboa Documentation Release 1100

backlog = 2048bind = unixvarrungunicornmodoboasockpidfile = varrungunicornmodoboapiddaemon = Truedebug = Falseworkers = 2logfile = varloggunicornmodoboalogloglevel = info

To start gunicorn execute the following commands

$ cd ltmodoboa dirgt$ gunicorn -c gunicornconfpy ltmodoboa dirgtwsgiapplication

Now the nginx part Just create a new virtual host and use the following configuration

upstream modoboa server unixvarrungunicornmodoboasock fail_timeout=0

server listen 443 sslssl onkeepalive_timeout 70

server_name lthost fqdngtroot ltmodoboa_instance_pathgt

access_log varlognginxlthost fqdngtaccesslogerror_log varlognginxlthost fqdngterrorlog

ssl_certificate ltssl certificate for your sitegtssl_certificate_key ltssl certificate key for your sitegt

location sitestatic autoindex on

location media autoindex on

location proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_forproxy_set_header Host $http_hostproxy_redirect offproxy_set_header X-Forwarded-Protocol sslproxy_pass httpmodoboa

If you do not plan to use SSL then change the listen directive to listen 80 and delete each of the followingdirectives

ssl onkeepalive_timeout 70ssl_certificate ltssl certificate for your sitegt

(continues on next page)

21 Installation 11

Modoboa Documentation Release 1100

(continued from previous page)

ssl_certificate_key ltssl certificate key for your sitegtproxy_set_header X-Forwarded-Protocol ssl

If you do plan to use SSL yoursquoll have to generate a certificate and a key This article contains information about howto do it

Paste this content to your configuration (replace values between ltgt with yours) and restart nginx

Now you can go the Dovecot section to continue the installation

uWSGI

The following setup is meant to get you started quickly You should read the documentation of both nginx and uwsgito understand how to optimize their configuration for your site

The Django documentation includes the following warning regarding uwsgi

Warning Use uwsgi 126 or newer If you do not you will run into problems Modoboa will fail in obscureways

To use this setup first download and install uwsgi

Here is a sample nginx configuration

server listen 443 sslssl onkeepalive_timeout 70

server_name lthost fqdngtroot ltmodoboas settings dirgt

ssl_certificate ltssl certificate for your sitegtssl_certificate_key ltssl certificate key for your sitegt

access_log varlognginxlthost fqdngtaccesslogerror_log varlognginxlthost fqdngterrorlog

location ltmodoboas root urlgtsitestatic autoindex onalias ltlocation of sitestatic on your file systemgt

Whether or not Modoboa uses a media directory depends on how you configured Modoboa It does not hurt to have thislocation ltmodoboas root urlgtmedia

autoindex onalias ltlocation of media on your file systemgt

This denies access to any file that begins with ht Apaches htaccess and htpasswd are such files A Modoboa installed from scratch would not contain any such files but you never know what the future holds

(continues on next page)

12 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

location ~ ht deny all

location ltmodobas root urlgt include uwsgi_paramsuwsgi_pass ltuwsgi portgtuwsgi_param UWSGI_SCRIPT ltmodoboa instance namegtwsgiapplicationuwsgi_param UWSGI_SCHEME https

ltmodoboa instance namegt must be replaced by the value you used when you deployed your instance

If you do not plan to use SSL then change the listen directive to listen 80 and delete each of the followingdirectives

ssl onkeepalive_timeout 70ssl_certificate ltssl certificate for your sitegtssl_certificate_key ltssl certificate key for your sitegtuwsgi_param UWSGI_SCHEME https

If you do plan to use SSL yoursquoll have to generate a certificate and a key This article contains information about howto do it

Make sure to replace the ltgt in the sample configuration with appropriate values Here are some explanations forthe cases that may not be completely self-explanatory

ltmodoboas settings dirgt Where Modoboarsquos settingspy resides This is also where thesitestatic and media directories reside

ltmodoboas root urlgt This is the URL which will be the root of your Modoboa site at your domain For in-stance if your Modoboa installation is reachable at at httpsfoomodoboa then ltmodoboas rooturlgt is modoboa In this case you probably also have to set the alias directives to point to where Mod-oboarsquos sitestatic and media directories are because otherwise nginx wonrsquot be able to find them

If Modoboa is at the root of your domain then ltmodoboa root urlgt is an empty string and can be deletedfrom the configuration above In this case you probably do not need the alias directives

ltuwsgi portgt The location where uwsig is listening It could be a unix domain socket or an addressport combi-nation Ubuntu configures uwsgi so that the port is

unixrunuwsgiappltapp namegtsocket

where ltapp namegt is the name of the application

Your uwsgi configuration should be

[uwsgi] Not needed when using uwsgi from pip plugins = pythonchdir = ltmodoboas top dirgtmodule = ltnamegtwsgiapplicationmaster = trueharakiri = 60processes = 4vhost = trueno-default-app = true

21 Installation 13

Modoboa Documentation Release 1100

The plugins directive should be turned on if you use a uwsgi installation that requires it If uwsgi was installed frompip it does not require it In the configuration above

ltmodoboas top dirgt The directory where managepy resides This directory is the parent of ltmodoboassettings dirgt

ltnamegt The name that you passed to modoboa-adminpy deploy when you created your Modoboa instance

Now you can go the Dovecot section to continue the installation

Dovecot

Modoboa requires Dovecot 2+ to work so the following documentation is suitable for this combination

In this section we assume dovecotrsquos configuration resides in etcdovecot all pathes will be relative to thisdirectory

Mailboxes

First edit the confd10-mailconf and set the mail_location variable

maildirmail_location = maildir~maildir

Then edit the inbox namespace and add the following lines

inbox = yes

mailbox Drafts auto = subscribespecial_use = Drafts

mailbox Junk

auto = subscribespecial_use = Junk

mailbox Sent

auto = subscribespecial_use = Sent

mailbox Trash

auto = subscribespecial_use = Trash

With dovecot 21+ it ensures all the special mailboxes will be automaticaly created for new accounts

For dovecot 20 and older use the autocreate plugin

Operations on the file system

14 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning Modoboa needs to access the dovecot binary to check its version To find the binary path weuse the which command first and then try known locations (usrsbindovecot and usrlocalsbindovecot) If you installed dovecot in a custom location please tell us where the binary is by usingthe DOVECOT_LOOKUP_PATH setting (see settingspy)

Three operation types are considered

1 Mailbox creation

2 Mailbox renaming

3 Mailbox deletion

The first one is managed by Dovecot The last two ones may be managed by Modoboa if it can access the file systemwhere the mailboxes are stored (see General parameters to activate this feature)

Those operations are treated asynchronously by a cron script For example when you rename an e-mail addressthrough the web UI the associated mailbox on the file system is not modified directly Instead of that a renameorder is created for this mailbox The mailbox will be considered unavailable until the order is executed (see Postfixconfiguration)

Edit the crontab of the user who owns the mailboxes on the file system

$ crontab -u ltusergt -e

And add the following line inside

python ltmodoboa_sitegtmanagepy handle_mailbox_operations

Warning The cron script must be executed by the system user owning the mailboxes

Warning The user running the cron script must have access to the settingspy file of the modoboa instance

The result of each order is recorded into Modoboarsquos log Go to Modoboa gt Logs to consult them

Authentication

To make the authentication work edit the confd10-authconf and uncomment the following line at the end

include auth-systemconfextinclude auth-sqlconfextinclude auth-ldapconfextinclude auth-passwdfileconfextinclude auth-checkpasswordconfextinclude auth-vpopmailconfextinclude auth-staticconfext

Then edit the confdauth-sqlconfext file and add the following content inside

passdb sql driver = sql Path for SQL configuration file see example-configdovecot-sqlconfext

(continues on next page)

21 Installation 15

Modoboa Documentation Release 1100

(continued from previous page)

args = etcdovecotdovecot-sqlconfext

userdb sql driver = sqlargs = etcdovecotdovecot-sqlconfext

Make sure to activate only one backend (per type) inside your configuration (just comment the other ones)

Edit the dovecot-sqlconfext and modify the configuration according to your database engine

MySQL users

driver = mysql

connect = host=ltmysqld socketgt dbname=ltdatabasegt user=ltusergt password=ltpasswordgt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user WHERE email=Lu andrarr˓is_active=1

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid concat(bytes= mbquota M) AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

PostgreSQL users

driver = pgsql

connect = host=ltpostgres socketgt dbname=ltdatabasegt user=ltusergt password=ltpasswordgt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user u INNER JOIN admin_rarr˓mailbox mb ON uid=mbuser_id INNER JOIN admin_domain dom ON mbdomain_id=domidrarr˓WHERE uemail=Lu AND uis_active AND domenabled

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid bytes= || mbquota || M AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

16 Chapter 2 Table of contents

Modoboa Documentation Release 1100

SQLite users

driver = sqlite

connect = ltpath to the sqlite db filegt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user u INNER JOIN admin_rarr˓mailbox mb ON uid=mbuser_id INNER JOIN admin_domain dom ON mbdomain_id=domidrarr˓WHERE uemail=Lu AND uis_active=1 AND domenabled=1

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid (bytes= || mbquota || M) AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

Note Replace values between ltgt with yours

LDAP

To make the LDAP authentication work edit the confd10-authconf and uncomment the following line atthe end

include auth-ldapconfext

Then edit the confdauth-ldapconfext and edit the passdb section as following You should comment theuserdb section which will be managed by SQL with modoboa database

passdb driver = ldap

Path for LDAP configuration file see example-configdovecot-ldapconfextargs = etcdovecotdovecot-ldapconfext

userdb driver = ldapargs = etcdovecotdovecot-ldapconfext

Default fields can be used to specify defaults that LDAP may overridedefault_fields = home=homevirtualu

Your own dovecot LDAP configuration file is now etcdovecotdovecot-ldapconfext You can addyour default LDAP conf in it following the official documentation

Synchronize dovecot LDAP conf with modoboa LDAP conf

To make dovecot LDAP configuration synchronized with modoboa LDAP configuration you should create a dedicateddovecot conf file At the end of your dovecot configuration file (dovecot-ldapconfext) add the following

21 Installation 17

Modoboa Documentation Release 1100

line

include_try dovecot-modoboaconfext

Then set modoboa parameter Enable Dovecot LDAP sync to Yes Then set the Dovecot LDAP config file following theprevious step (etcdovecotdovecot-modoboaconfext in the example)

The last step is to add the command update_dovecot_conf to the cron job of modoboa Then each time your modoboaLDAP configuration is updated your dovecot LDAP configuration will also be

LMTP

Local Mail Transport Protocol is used to let Postfix deliver messages to Dovecot

First make sure the protocol is activated by looking at the protocols setting (generally inside dovecotconf)It should be similar to the following example

protocols = imap pop3 lmtp

Then open the confd10-masterconf look for lmtp service definition and add the following content inside

service lmtp stuff beforeunix_listener varspoolpostfixprivatedovecot-lmtp mode = 0600user = postfixgroup = postfix

stuff after

We assume here that Postfix is chrooted within varspoolpostfix

Finally open the confd20-lmtpconf and modify it as follows

protocol lmtp postmaster_address = postmasterltdomaingtmail_plugins = $mail_plugins quota sieve

Replace ltdomaingt by the appropriate value

Note If you donrsquot plan to apply quota or to use filters just adapt the content of the mail_plugins setting

Quota

Modoboa lets adminstrators define per-domain andor per-account limits (quota) It also lists the current quota usageof each account Those features require Dovecot to be configured in a specific way

Inside confd10-mailconf add the quota plugin to the default activated ones

mail_plugins = quota

Inside confd10-masterconf update the dict service to set proper permissions

18 Chapter 2 Table of contents

Modoboa Documentation Release 1100

service dict If dict proxy is used mail processes should have access to its socket For example mode=0660 group=vmail and global mail_access_groups=vmailunix_listener dict mode = 0600user = ltuser owning mailboxesgtgroup =

Inside confd20-imapconf activate the imap_quota plugin

protocol imap

mail_plugins = $mail_plugins imap_quota

Inside dovecotconf activate the quota SQL dictionary backend

dict quota = ltdrivergtetcdovecotdovecot-dict-sqlconfext

Inside confd90-quotaconf activate the quota dictionary backend

plugin quota = dictUser quotaproxyquota

It will tell Dovecot to keep quota usage in the SQL dictionary

Finally edit the dovecot-dict-sqlconfext file and put the following content inside

connect = host=ltdb hostgt dbname=ltdb namegt user=ltdb usergt password=ltpasswordgt SQLite users connect = pathtothedatabasedb

map pattern = privquotastoragetable = admin_quotausername_field = usernamevalue_field = bytes

map

pattern = privquotamessagestable = admin_quotausername_field = usernamevalue_field = messages

PostgreSQL users

21 Installation 19

Modoboa Documentation Release 1100

Database schema update

The admin_quota table is created by Django but unfortunately it doesnrsquot support DEFAULT constraints (it onlysimulates them when the ORM is used) As PostgreSQL is a bit strict about constraint violations you must executethe following query manually

db=gt ALTER TABLE admin_quota ALTER COLUMN bytes SET DEFAULT 0db=gt ALTER TABLE admin_quota ALTER COLUMN messages SET DEFAULT 0

Trigger

As indicated on Dovecotrsquos wiki you need a trigger to properly update the quota

A working copy of this trigger is available on Github

Download this file and copy it on the server running postgres Then execute the following commands

$ su - postgres$ psql [modoboa database] lt pathtomodoboa_postgres_triggersql$ exit

Replace [modoboa database] by the appropriate value

Forcing recalculation

For existing installations Dovecot (gt 2) offers a command to recalculate the current quota usages For example if youwant to update all usages run the following command

$ doveadm quota recalc -A

Be carefull it can take a while to execute

ManageSieveSieve

Modoboa lets users define filtering rules from the web interface To do so it requires ManageSieve to be activated onyour server

Inside confd20-managesieveconf make sure the following lines are uncommented

protocols = $protocols sieve

service managesieve-login

service managesieve

protocol sieve

20 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Messages filtering using Sieve is done by the LDA

Inside confd15-ldaconf activate the sieve plugin like this

protocol lda Space separated list of plugins to load (default is global mail_plugins)mail_plugins = $mail_plugins sieve

Finally configure the sieve plugin by editing the confd90-sieveconf file Put the follwing caontent inside

plugin Location of the active script When ManageSieve is used this is actually a symlink pointing to the active script in the sieve storage directorysieve = ~dovecotsieve

The path to the directory where the personal Sieve scripts are stored For ManageSieve this is where the uploaded scripts are storedsieve_dir = ~sieve

Restart Dovecot

Now you can go to the Postfix section to finish the installation

Last-login tracking

To update the last_login attribute of an account after a succesful IMAP or POP3 login you can configure apost-login script

Open confd10-masterconf add the following configuration (imap and pop3 services are already definedyou just need to update them)

service imap executable = imap postlogin

service pop3 executable = pop3 postlogin

service postlogin executable = script-login usrlocalbinpostloginshuser = modoboaunix_listener postlogin

Then you must create a script named usrlocalbinpostloginsh According to your database enginethe content will differ

PostgreSQL

21 Installation 21

Modoboa Documentation Release 1100

binsh

psql -c UPDATE core_user SET last_login=now() WHERE username=$USER gt devnull

exec $

MySQL

binsh

DBNAME=XXXDBUSER=XXXDBPASSWORD=XXX

echo UPDATE core_user SET last_login=now() WHERE username=$USER | mysql -urarr˓$DBUSER -p$DBPASSWORD $DBNAME

exec $

Postfix

This section gives an example about building a simple virtual hosting configuration with Postfix Refer to the officialdocumentation for more explanation

Map files

You first need to create configuration files (or map files) that will be used by Postfix to lookup into Modoboa tables

To automaticaly generate the requested map files and store them in a directory run the following command

gt cd ltmodoboa_instance_pathgtgt python managepy generate_postfix_maps --destdir ltdirectorygt

ltdirectorygt is the directory where the files will be stored Answer the few questions and yoursquore done

Configuration

Use the following configuration in the etcpostfixmaincf file (this is just one possible configuration)

Stuff beforevirtual_transport = lmtpunixprivatedovecot-lmtp

virtual_mailbox_domains = ltdrivergtetcpostfixsql-domainscfvirtual_alias_domains = ltdrivergtetcpostfixsql-domain-aliasescfvirtual_alias_maps = ltdrivergtetcpostfixsql-aliasescf

relay_domains = ltdrivergtetcpostfixsql-relaydomainscftransport_maps =

ltdrivergtetcpostfixsql-transportcfltdrivergtetcpostfixsql-spliteddomains-transportcf

(continues on next page)

22 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

smtpd_recipient_restrictions = check_recipient_access

ltdrivergtetcpostfixsql-maintaincfltdrivergtetcpostfixsql-relay-recipient-verificationcf

permit_mynetworksreject_unauth_destinationreject_unverified_recipient

smtpd_sender_login_maps = ltdrivergtetcpostfixsql-sender-login-mapcf

smtpd_sender_restrictions =reject_sender_login_mismatch

Stuff after

Replace ltdrivergt by the name of the database you use

Restart Postfix

Policy daemon

If you want to enable the built-in policy daemon add the following content to the etcpostfixmaincf file

smtpd_recipient_restrictions = check_policy_service inet1270019999

And reload postfix

Note The check_policy_service line must be placed before the permit_mynetworks one otherwise thedaemon wonrsquot be called

OpenDKIM

Modoboa can generate DKIM keys for the hosted domains but it wonrsquot sign or check messages To do that you needa dedicated software like OpenDKIM

Note The cron job in charge of creating DKIM keys must be run using the same user than OpenDKIM (ie opendkimin most cases)

Database

Since keys related information is stored in Modoboarsquos database you need to tell OpenDKIM how it can access it

First make sure to install the required additional packages on your system (libopendbx1- on debian baseddistributions or opendbx- on CentOS the complete name depends on your database engine)

Then insert the following SQL view into Modoboarsquos database

21 Installation 23

Modoboa Documentation Release 1100

PostgreSQL

CREATE OR REPLACE VIEW dkim AS (SELECT id name as domain_name dkim_private_key_path AS private_key_path

dkim_key_selector AS selectorFROM admin_domain WHERE enable_dkim

)

MySQLMariaDB

CREATE OR REPLACE VIEW dkim AS (SELECT id name as domain_name dkim_private_key_path AS private_key_path

dkim_key_selector AS selectorFROM admin_domain WHERE enable_dkim=1

)

Configuration

You should find OpenDKIMrsquos configuration file at etcopendkimconf

Add the following content to it

KeyTable dsnltdrivergtltusergtltpasswordgtltdb hostgtltdb namegttable=dkimrarr˓keycol=iddatacol=domain_nameselectorprivate_key_pathSigningTable dsnltdrivergtltusergtltpasswordgtltdb hostgtltdb namegttable=dkimrarr˓keycol=domain_namedatacol=idSocket inet12345localhost

Replace values between ltgt by yours Accepted values for driver are pgsql or mysql Make sure the user youspecify has read permission on the view created previously

If you run a debian based system make sure to adjust the following setting in the etcdefaultopendkim file

SOCKET=inet12345localhost

Eventually reload OpenDKIM

Postfix integration

Add the following lines to the etcpostfixmaincf file

smtpd_milters = inet12700112345non_smtpd_milters = inet12700112345milter_default_action = acceptmilter_content_timeout = 30s

and reload postfix

Extensions

Only few commands are needed to add a new extension to your setup

24 Chapter 2 Table of contents

Modoboa Documentation Release 1100

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install ltEXTENSIONgt==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Then restart your web server

22 Upgrade

221 Modoboa

Warning The new version you are going to install may need to modify your database Before you start makesure to backup everything

Most of the time upgrading your installation to a newer Modoboa version only requires a few actions In every caseyou will need to apply the general procedure first and then check if the version you are installing requires specificactions

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install modoboa==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Once done check if the version you are installing requires Specific instructions

Finally restart your web server

Sometimes you might need to upgrade postfix map files too To do so just run the generate_postfix_mapscommand on the same directory than the one used for installation (etcpostfix by default)

Make sure to use root privileges and run the following command

gt python managepy generate_postfix_maps --destdir ltdirectorygt

Then reload postfix

22 Upgrade 25

Modoboa Documentation Release 1100

222 Extensions

If a new version is available for an extension yoursquore using it is recommanded to install it Upgrading an extensions ispretty and the procedure is almost the same than the one used for Modoboa

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install ltEXTENSIONgt==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Finally restart your web server

It is a generic upgrade procedure which will be enough most of the time but it is generally a good idea to check theassociated documentation

223 Rebuild Virtual Environment

Sometimes when upgrading your Operating System (eg from Ubuntu 1704 to Ubuntu 1710) your virtual environmentrunning modoboa can get corrupted Your first response will be to panic but fear not The solution is in this document

First things first

Recover your database password

You will need to recover your database password (if using mysql or postgresql) You will find this in etcpostfixsql-aliasescf or any file with sql-cf in the etcpostfix directory

Make note of this as you will need it when reconfiguring modoboa

Reinstall Modoboa

Start out by backup up your modoboa settings file located in the modoboa instance directory (srvmodoboainstanceinstancesettingspy if you used the default installer configuration) This contains your currentconfiguration

Next you want to remove all current modoboa files

After doing this follow the manual installation instructions for Modoboa only as everything should be working prop-erly

After this completes simply restore your backed up settings file to srvinstanceinstancesettingspy(if you used installer default configuration) You will then need to reinstall your extensions

You can find which plugins you had in your settingspy file under the MODOBOA_APPS variable

Instructions to install extensions can also be found here

Once you have completed this step you will need to run the following commands

26 Chapter 2 Table of contents

Modoboa Documentation Release 1100

gt (env) $ cd ltinstance_dirgtgt (env) $ python managepy migrategt (env) $ python managepy collectstatic

You will then see a message similar to

You have requested to collect static files at the destinationlocation as specified in your settings

srvmodoboainstancesitestatic

This will overwrite existing filesAre you sure you want to do this

Type yes to continue or no to cancel

You will want to answer yes here then simply restart the uwsgi process with service uwsgi restart andyou should be up and running again

Simply log into your modoboa web panel and verify that your extensions and webmail box is working

224 Information

Rebuild instructions from httpshelppythonanywherecompagesRebuildingVirtualenvs

225 Specific instructions

1160

A new policy daemon has been added

Make sure to have a Redis instance running on your server

Add modoboapolicyd to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboapolicyd

)

Add the following settings to your settingspy file

REDIS_HOST = ltIP or hostname heregtREDIS_PORT = 6379REDIS_QUOTA_DB = 0REDIS_URL = redisformat(REDIS_HOST REDIS_PORT REDIS_QUOTA_DB)

Once done you can start the policy daemon using the following commands

22 Upgrade 27

Modoboa Documentation Release 1100

gt python managepy policy_daemon

Donrsquot forget to configure _policyd_config if you want to use this feature

The modoboa-stats plugin has been merged into the core

Add modoboamaillog to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboapolicydmodoboamaillog

)

And remove any reference to modoboa_stats in this same variable

1150

This version drops Python 2 support so donrsquot forget to update all the extensions you use

Warning If you upgrade an existing python 2 installation you will need to create a new Python 3 virtualenvironment You can remove the existing virtual environment and replace it by the new one so you wonrsquot have tomodify your configuration files

Add the following new setting

DISABLE_DASHBOARD_EXTERNAL_QUERIES = False

Reload uwsgigunicornapache depending on your setup

Finally Make sure to use root privileges and run the following command

gt python managepy generate_postfix_maps --destdir ltdirectorygt

Then reload postfix

1140

This release introduces an optional LDAP synchronization process If you want to use it please follow the dedicatedprocedure

1131

Upgrade postfix maps files as follows

28 Chapter 2 Table of contents

Modoboa Documentation Release 1100

gt python managepy generate_postfix_maps --destdir ltpathgt --force-overwrite

1130

Add modoboadnstools to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstools

)

Add the following new settings

CSRF_COOKIE_SECURE = TrueSESSION_COOKIE_SECURE = True

modoboa-postfix-autoreply 150

Edit the etcpostfixmaincf file and remove the sql-autoreplies-transportcf map from thetransport_maps if present Remove the corresponding proxy_read_maps entry if relevant

Reload postfix

1100

Warning Upgrade installed extensions BEFORE running check or migrate commands

Upgrade all your installed plugins to the following versions

Warning If you use the amavis plugin make sure to include its configuration as follows into settingspy

from modoboa_amavis import settings as modoboa_amavis_settingsmodoboa_amavis_settingsapply(globals())

22 Upgrade 29

Modoboa Documentation Release 1100

Name Versionmodoboa-amavis 120modoboa-contacts 050modoboa-dmarc 110modoboa-imap-migration 120modoboa-pdfcredentials 130modoboa-postfix-autoreply 140modoboa-radicale 120modoboa-sievefilters 140modoboa-stats 140modoboa-webmail 140

Edit the settingspy file and apply the following modifications

Add modoboatransport to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparameters

)

Replace the following line

MIDDLEWARE_CLASSES = (

by

MIDDLEWARE = (

Update postfix map files as follows

gt rm -f ltpathgtmodoboa-postfix-mapschkgt python managepy generate_postfix_maps --force --destdir ltpathgt

Then modify postfixrsquos configuration as follows

smtpd_sender_login_maps =ltdrivergtltpathgtsql-sender-login-mapcf

transport_maps =ltdrivergtltpathgtsql-transportcfltdrivergtltpathgtsql-spliteddomains-transportcf other map files

Replace ltdrivergt and ltpathgt by your values

If transport_maps contains sql-relaydomains-transportcf remove it

30 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning If you make use of postfixrsquos proxymap server you must also update the proxy_read_maps setting

Reload postfix

Add the following cron job in order to generate DKIM keys

Generate DKIM keys (they will belong to the user running this job)

root $PYTHON $INSTANCEmanagepy modorarr˓manage_dkim_keys

190

If you want to manage inactive accounts look at Cleaning inactive accounts

183

Edit the settingspy file and replace the following line

BASE_DIR = ospathdirname(ospathdirname(__file__))

by

BASE_DIR = ospathrealpath(ospathdirname(ospathdirname(__file__)))

180

Modoboa now relies on Djangorsquos builtin password validation system to validate user passwords instead ofdjango-passwords

Remove django-passwords from your system

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt pip uninstall django-passwords

Edit the settingspy file and remove the following content

django-passwords

PASSWORD_MIN_LENGTH = 8

PASSWORD_COMPLEXITY = UPPER 1LOWER 1DIGITS 1

Add the following lines

Password validation rulesAUTH_PASSWORD_VALIDATORS = [

NAME djangocontribauthpassword_validation

rarr˓UserAttributeSimilarityValidator (continues on next page)

22 Upgrade 31

Modoboa Documentation Release 1100

(continued from previous page)

NAME djangocontribauthpassword_validationMinimumLengthValidator

NAME djangocontribauthpassword_validationCommonPasswordValidator

NAME djangocontribauthpassword_validationNumericPasswordValidator

NAME modoboacorepassword_validationComplexityValidatorOPTIONS

upper 1lower 1digits 1specials 0

]

172

API documentation has evolved (because of the upgrade to Django Rest Framework 36) and CKeditor is now embed-ded by default (thanks to the django-ckeditor package) Some configuration changes are required

Edit your settingspy file and apply the following modifications

bull Update the INSTALLED_APPS variable as follows

INSTALLED_APPS = (djangocontribauthdjangocontribcontenttypesdjangocontribsessionsdjangocontribmessagesdjangocontribsitesdjangocontribstaticfilesreversionckeditorckeditor_uploaderrest_frameworkrest_frameworkauthtoken

)

bull Update the REST_FRAMEWORK variable as follows

REST_FRAMEWORK = DEFAULT_AUTHENTICATION_CLASSES (

rest_frameworkauthenticationTokenAuthenticationrest_frameworkauthenticationSessionAuthentication

)

bull Remove the SWAGGER_SETTINGS variable

bull Add the following content

32 Chapter 2 Table of contents

Modoboa Documentation Release 1100

CKeditor

CKEDITOR_UPLOAD_PATH = uploads

CKEDITOR_IMAGE_BACKEND = pillow

CKEDITOR_RESTRICT_BY_USER = True

CKEDITOR_BROWSE_SHOW_DIRS = True

CKEDITOR_ALLOW_NONIMAGE_FILES = False

CKEDITOR_CONFIGS = default

allowedContent Truetoolbar Modoboawidth Nonetoolbar_Modoboa [

[Bold Italic Underline][JustifyLeft JustifyCenter JustifyRight JustifyBlock][BidiLtr BidiRtl Language][NumberedList BulletedList - Outdent Indent][Undo Redo][Link Unlink Anchor - Smiley][TextColor BGColor - Source][Font FontSize][Image ][SpellChecker]

]

Donrsquot forget to run the following command

gt python managepy collectstatic

171

If you used 170 for a fresh installation please run the following commands

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy load_initial_data

170

This version requires Django gt= 110 so you need to make some modifications It also brings internal API changeswhich are not backward compatible so installed extensions must be upgraded too

First of all deactivate all installed extensions (edit the settingspy file and comment the corresponding lines inMODOBOA_APPS)

Edit the urlspy file of your local instance and replace its content by the following one

22 Upgrade 33

Modoboa Documentation Release 1100

from djangoconfurls import include url

urlpatterns = [url(r include(modoboaurls))

]

Edit the settingspy and apply the following changes

bull Add modoboaparameters to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboarelaydomainsmodoboalimitsmodoboaparameters Modoboa extensions here

)

bull Add modoboacoremiddlewareLocalConfigMiddleware to MIDDLEWARE_CLASSES

MIDDLEWARE_CLASSES = (djangocontribsessionsmiddlewareSessionMiddlewaredjangomiddlewarecommonCommonMiddlewaredjangomiddlewarecsrfCsrfViewMiddlewaredjangocontribauthmiddlewareAuthenticationMiddlewaredjangocontribmessagesmiddlewareMessageMiddlewaredjangomiddlewarelocaleLocaleMiddlewaredjangomiddlewareclickjackingXFrameOptionsMiddlewaremodoboacoremiddlewareLocalConfigMiddlewaremodoboalibmiddlewareAjaxLoginRedirectmodoboalibmiddlewareCommonExceptionCatchermodoboalibmiddlewareRequestCatcherMiddleware

)

bull Modoboa used to provide a custom authentication backend (modoboalibauthbackendsSimpleBackend) but it has been removed Replace it as follows

AUTHENTICATION_BACKENDS = ( Other backends beforedjangocontribauthbackendsModelBackend

)

bull Remove TEMPLATE_CONTEXT_PROCESSORS and replace it by

TEMPLATES = [

BACKEND djangotemplatebackendsdjangoDjangoTemplatesDIRS []APP_DIRS TrueOPTIONS

context_processors [djangotemplatecontext_processorsdebugdjangotemplatecontext_processorsrequestdjangocontribauthcontext_processorsauth

(continues on next page)

34 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

djangotemplatecontext_processorsi18ndjangotemplatecontext_processorsmediadjangotemplatecontext_processorsstaticdjangotemplatecontext_processorstzdjangocontribmessagescontext_processorsmessagesmodoboacorecontext_processorstop_notifications

]debug False

]

Run the following commands (load virtualenv if you use one)

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstatic

Finally upgrade your extensions and reactivate them

Name Versionmodoboa-amavis 110modoboa-dmarc 100modoboa-imap-migration 110modoboa-pdfcredentials 110modoboa-postfix-autoreply 120modoboa-radicale 110modoboa-sievefilters 110modoboa-stats 110modoboa-webmail 110

Command line shortcuts

$ pip install modoboa-amavis==110$ pip install modoboa-dmarc==100$ pip install modoboa-imap-migration==110$ pip install modoboa-pdfcredentials==110$ pip install modoboa-postfix-autoreply==120$ pip install modoboa-radicale==110$ pip install modoboa-sievefilters==110$ pip install modoboa-stats==110$ pip install modoboa-webmail==110

And please make sure you use the latest version of the django-versionfield2 package

$ pip install -U django-versionfield2

Notes about quota changes and resellers

Reseller users now have a quota option in Resources tab This is the quota that a reseller can share between all itsdomains

22 Upgrade 35

Modoboa Documentation Release 1100

There are two quotas for a domain in the new version

1 Quota amp

2 Default mailbox quota

[1] Quota quota shared between mailboxes This quota is shared between all the mailboxes of this domain This valuecannot exceed resellerrsquos quota and hence cannot be 0(unlimited) if reseller has finite quota

[2] Default mailbox quota default quota applied to mailboxes This quota is the default quota applied to new mail-boxes This value cannot exceed Quota[1] and hence cannot be 0(unlimited) if Quota[1] is finite

161

First of all update postfix map files as follows

gt python managepy generate_postfix_maps --destdir ltpathgt --force-overwrite

Then modify postfixrsquos configuration as follows

smtpd_sender_login_maps =ltdrivergtltpathgtsql-sender-login-mailboxescfltdrivergtltpathgtsql-sender-login-aliasescfltdrivergtltpathgtsql-sender-login-mailboxes-extracf

Replace ltdrivergt and ltpathgt by your values

Finally reload postfix

This release also deprecates some internal functions As a result several extensions has been updated to maintain thecompatibility If you enabled the notification service yoursquoll find the list of available updates directly in your Modoboaconsole

For the others here is the list

Name Versionmodoboa-amavis 1010modoboa-postfix-autoreply 117modoboa-radicale 105modoboa-stats 109

Command line shortcut

$ pip install modoboa-amavis==1010$ pip install modoboa-postfix-autoreply==117$ pip install modoboa-radicale==105$ pip install modoboa-stats==109

160

Warning You have to upgrade extensions due to coreUser model attribute change (usergroup to userrole) Oth-erwise you will have an internal error after upgrade In particular modoboa-amavisd modoboa-stats modoboa-postfix-autoreply are concerned

36 Chapter 2 Table of contents

Modoboa Documentation Release 1100

An interesting feature brougth by this version is the capability to make different checks about MX records Forexample Modoboa can query main DNSBL providers for every defined domain With this you will quickly know ifone the domains you manage is listed or not To activate it add the following line to your crontab

30 ltoptional_virtualenv_pathgtpython ltmodoboa_instance_dirgtmanagepy modorarr˓check_mx

The communication with Modoboa public API has been reworked Instead of sending direct synchronous queries (forexample to check new versions) a cron job has been added To activate it add the following line to your crontab

0 ltoptional_virtualenv_pathgtpython ltmodoboa_instance_dirgtmanagepyrarr˓communicate_with_public_api

Please also note that public API now uses TLS so you must update your configuration as follows

MODOBOA_API_URL = httpsapimodoboaorg1

Finally it is now possible to declare additional sender addresses on a per-account basis You need to update your postfixconfiguration in order to use this functionality Just edit the maincf file and change the following parameter

smtpd_sender_login_maps =ltdrivergtetcpostfixsql-sender-login-mailboxescfltdrivergtetcpostfixsql-sender-login-aliasescfltdrivergtetcpostfixsql-sender-login-mailboxes-extracf

150

The API has been greatly improved and a documentation is now available To enable it addrest_framework_swagger to the INSTALLED_APPS variable in settingspy as follows

INSTALLED_APPS = (djangocontribauthdjangocontribcontenttypesdjangocontribsessionsdjangocontribmessagesdjangocontribsitesdjangocontribstaticfilesreversionrest_frameworkauthtokenrest_framework_swagger

)

Then add the following content into settingspy just after the REST_FRAMEWORK variable

SWAGGER_SETTINGS = is_authenticated Falseapi_version 10exclude_namespaces []info

contact contactmodoboacomdescription (Modoboa API requires a valid token)title Modoboa API

Yoursquore done The documentation is now available at the following address

22 Upgrade 37

Modoboa Documentation Release 1100

httpltyour instance addressgtdocsapi

Finally if you find a TEMPLATE_CONTEXT_PROCESSORS variable in your settingspy file make sure it lookslike this

TEMPLATE_CONTEXT_PROCESSORS = global_settingsTEMPLATE_CONTEXT_PROCESSORS + [modoboacorecontext_processorstop_notifications

]

140

Warning Please make sure to use Modoboa 135 with an up-to-date database before an upgrade to 140

Warning Do not follow the regular upgrade procedure for this version

Some extension have been moved back into the main repository The main reason for that is that using Modoboawithout them doesnrsquot make sense

First of all you must rename the following applications listed inside the MODOBOA_APPS variable

Old name New namemodoboa_admin modoboaadminmodoboa_admin_limits modoboalimitsmodoboa_admin_relaydomains modoboarelaydomains

Then apply the following steps

1 Uninstall old extensions

$ pip uninstall modoboa-admin modoboa-admin-limits modoboa-admin-relaydomains

2 Install all extension updates using pip (check the Modoboa gt Information page)

3 Manually migrate database

$ cd ltinstance_dirgt$ python managepy migrate auth$ python managepy migrate admin 0001 --fake$ python managepy migrate admin$ python managepy migrate limits 0001 --fake$ python managepy migrate relaydomains 0001 --fake$ python managepy migrate

4 Finally update static files

$ python managepy collectstatic

This version also introduces a REST API To enable it

1 Add rest_frameworkauthtoken to the INSTALLED_APPS variable

2 Add the following configuration inside settingspy

38 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Rest framework settings

REST_FRAMEWORK = DEFAULT_AUTHENTICATION_CLASSES (

rest_frameworkauthenticationTokenAuthentication)DEFAULT_PERMISSION_CLASSES (

rest_frameworkpermissionsIsAuthenticated)

3 Run the following command

$ python managepy migrate

135

To enhance security Modoboa now checks the strength of user passwords lthttpsgithubcomdstufftdjango-passwordsgt_

To use this feature add the following configuration into the settingspy file

django-passwords

PASSWORD_MIN_LENGTH = 8

PASSWORD_COMPLEXITY = UPPER 1LOWER 1DIGITS 1

132

Modoboa now uses the atomic requests mode to preserve database consistency (reference)

To enable it update the DATABASES variable in settingspy as follows

DATABASES = default

stuff beforeATOMIC_REQUESTS True

amavis

stuff beforeATOMIC_REQUESTS True

130

This release does not bring awesome new features but it is a necessary bridge to the future of Modoboa All extensionsnow have their own git repository and the deploy process has been updated to reflect this change

22 Upgrade 39

Modoboa Documentation Release 1100

Another important update is the use of Django 17 Besides its new features the migration system has been reworkedand is now more robust than before

Before we begin with the procedure here is a table showing old extension names and their new name

Old name New package name New module namemodoboaextensionsadmin modoboa-admin modoboa_adminmodoboaextensionslimits modoboa-admin-limits modoboa_admin_limitsmodoboaextensionspostfix_autoreply modoboa-postfix-autoreply modoboa_postfix_autoreplymodoboaextensionspostfix_relay_domains modoboa-admin-relaydomains modoboa_admin_relaydomainsmodoboaextensionsradicale modoboa-radicale modoboa_radicalemodoboaextensionssievefilters modoboa-sievefilters modoboa_sievefiltersmodoboaextensionsstats modoboa-stats modoboa_statsmodoboaextensionswebmail modoboa-webmail modoboa_webmail

Here are the required steps

1 Install the extensions using pip (look at the second column in the table above)

$ pip install ltthe extensions you wantgt

2 Remove south from INSTALLED_APPS

3 Rename old extension names inside MODOBOA_APPS (look at the third column in the table above)

4 Remove modoboalibmiddlewareExtControlMiddleware from MIDDLEWARE_CLASSES

5 Change DATABASE_ROUTERS to

DATABASE_ROUTERS = [modoboa_amavisdbrouterAmavisRouter]

6 Run the following commands

$ cd ltmodoboa_instance_dirgt$ python managepy migrate

7 Reply yes to the question

8 Run the following commands

$ python managepy load_initial_data$ python managepy collectstatic

9 The cleanup job has been renamed in Django so you have to modify your crontab entry

- 0 0 ltmodoboa_sitegtmanagepy cleanup+ 0 0 ltmodoboa_sitegtmanagepy clearsessions

120

A new notification service let administrators know about new Modoboa versions To activate it you need to updatethe TEMPLATE_CONTEXT_PROCESSORS variable like this

from djangoconf import global_settings

TEMPLATE_CONTEXT_PROCESSORS = global_settingsTEMPLATE_CONTEXT_PROCESSORS + (

(continues on next page)

40 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

modoboacorecontext_processorstop_notifications)

and to define the new MODOBOA_API_URL variable

MODOBOA_API_URL = httpapimodoboaorg1

The location of external static files has changed To use them add a new path to the STATICFILES_DIRS

Additional locations of static filesSTATICFILES_DIRS = (

Put strings here like homehtmlstatic or Cwwwdjangostatic Always use forward slashes even on Windows Dont forget to use absolute paths not relative pathsltpathtomodoboainstalldirgtbower_components

)

Run the following commands to define the hostname of your instance

$ cd ltmodoboa_instance_dirgt$ python managepy set_default_site lthostnamegt

If you plan to use the Radicale extension

1 Add modoboaextensionsradicale to the MODOBOA_APPS variable

2 Run the following commands

$ cd ltmodoboa_instance_dirgt$ python managepy syncdb

Warning You also have to note that the sitestatic directory has moved from ltpath to your sitesdirgt to ltmodoboas root urlgt (itrsquos probably the parent directory) You have to adapt your web serverconfiguration to reflect this change

23 Configuration

231 Online parameters

Modoboa provides online panels to modify internal parameters There are two available levels

bull Application level global parameters define how the application behaves Available at Modoboa gt Parameters

bull User level per user customization Available at User gt Settings gt Preferences

Regardless level parameters are displayed using tabs each tab corresponding to one application

General parameters

The admin application exposes several parameters they are presented below

23 Configuration 41

Modoboa Documentation Release 1100

Name Tab Description Default valueAuthentication type General The backend used for au-

thenticationLocal

Default password scheme General Scheme used to cryptmailbox passwords

crypt

Rounds General Number of rounds (onlyused by sha256cryptand sha512crypt) Mustbe between 1000 and999999999 inclusive

70000

Secret key General A key used to encryptusersrsquo password in ses-sions

random value

Sender address General Email address used tosend notifications

Enable communication General Enable communicationwith Modoboa public API

yes

Check new versions General Automatically checks if anewer version is available

yes

Send statistics General Send statistics to Mod-oboa public API (countersand used extensions)

yes

Top notifications check in-terval

General Interval between two topnotification checks (inseconds)

30

Maximum log record age General The maximum age in daysof a log record

365

Items per page General Number of displayeditems per page

30

Default top redirection General The default redirectionused when no applicationis specified

userprefs

Enable MX checks Admin Check that every domainhas a valid MX record

yes

Valid MXs Admin A list of IP or networkaddress every MX shouldmatch A warning will besent if a record does notrespect this it

Enable DNSBL checks Admin Check every domainagainst major DNSBLproviders

yes

DKIM keys storage direc-tory

AdminPath to a directory where DKIM

generated keys willbe stored

Default DKIM key length Admin The default size (in bits)for new keys

2048

Handle mailboxes onfilesystem

Admin Rename or remove mail-boxes on the filesystemwhen they get renamed orremoved within Modoboa

no

Mailboxes owner Admin The UNIX account whoowns mailboxes on thefilesystem

vmail

Default domain quota Admin Default quota (in MB) ap-plied to freshly createddomains with no valuespecified A value of 0means no quota

0

Automatic accountremoval

Admin When a mailbox is re-moved also remove theassociated account

no

Automatic do-mainmailbox creation

Admin Create a domain and amailbox when an accountis automatically created

yes

42 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Note If you are not familiar with virtual domain hosting you should take a look at postfixrsquos documentation ThisHow to also contains useful information

Note A random secret key will be generated each time the Parameters page is refreshed and until you save parametersat least once

Note Specific LDAP parameters are also available see LDAP authentication

232 Media files

Modoboa uses a specific directory to upload files (ie when the webmail is in use) or to create ones (ex graphical statis-tics) This directory is named media and is located inside modoboarsquos installation directory (called modoboa_sitein this documentation)

To work properly the system user which runs modoboa (www-data apache whatever) must have write access tothis directory

233 Customization

Custom logo

You have the possibility to use a custom logo instead of the default one on the login page

To do so open the settingspy file and add a MODOBOA_CUSTOM_LOGO variable This variable must containthe relative URL of your logo under MEDIA_URL For example

MODOBOA_CUSTOM_LOGO = ospathjoin(MEDIA_URL custom_logopng)

Then copy your logo file into the directory indicated by MEDIA_ROOT

234 Host configuration

Note This section is only relevant when Modoboa handles mailboxes renaming and removal from the filesystem

To manipulate mailboxes on the filesystem you must allow the user who runs Modoboa to execute commands as theuser who owns mailboxes

To do so edit the etcsudoers file and add the following inside

ltuser_that_runs_modoboagt ALL=(ltmailboxes ownergt) NOPASSWD ALL

Replace values between ltgt by the ones you use

23 Configuration 43

Modoboa Documentation Release 1100

235 Time zone and language

Modoboa is available in many languages

To specify the default language to use edit the settingspy file and modify the LANGUAGE_CODE variable

LANGUAGE_CODE = fr or en for english etc

Note Each user has the possibility to define the language he prefers

In the same configuration file specify the timezone to use by modifying the TIME_ZONE variable For example

TIME_ZONE = EuropeParis

236 Sessions management

Modoboa uses Djangorsquos session framework to store per-user information

Few parameters need to be set in the settingspy configuration file to make Modoboa behave as expected

SESSION_EXPIRE_AT_BROWSER_CLOSE = False Default value

This parameter is optional but you must ensure it is set to False (the default value)

The default configuration file provided by the modoboa-adminpy command is properly configured

237 Logging authentication

To trace login attempts to the web interface Modoboa uses python SysLogHandler so you can see them in your syslogauthentication log file (varlogauthlog in most cases)

Depending on your configuration you may have to edit the settingspy file and add lsquoaddressrsquo lsquodevlogrsquo to thelogging section

syslog-auth class logginghandlersSysLogHandlerfacility SysLogHandlerLOG_AUTHaddress devlogformatter syslog

238 External authentication

LDAP

Modoboa supports external LDAP authentication using the following extra components

bull Python LDAP client

bull Django LDAP authentication backend

If you want to use this feature you must first install those components

44 Chapter 2 Table of contents

Modoboa Documentation Release 1100

$ pip install python-ldap django-auth-ldap

Then all you have to do is to modify the settingspy file Add a new authentication backend to the AUTHENTI-CATION_BACKENDS variable like this

AUTHENTICATION_BACKENDS = (modoboalibauthbackendsLDAPBackend modoboalibauthbackendsLDAPSecondaryBackend Useful for a fallback

rarr˓mechanismdjangocontribauthbackendsModelBackend

)

Finally go to Modoboa gt Parameters gt General and set Authentication type to LDAP

From there new parameters will appear to let you configure the way Modoboa should connect to your LDAP serverThey are described just below

Name Description De-faultvalue

Server address The IP address of the DNS name of the LDAP server local-host

Server port The TCP port number used by the LDAP server 389Use a secureconnection

Use an SSLTLS connection to access the LDAP server no

Authenticationmethod

Choose the authentication method to use Directbind

User DN tem-plate (directbind mode)

The template used to construct a userrsquos DN It should contain one placeholder (ie(user)s)

Bind BN The distinguished name to use when binding to the LDAP server Leave empty for ananonymous bind

Bind password The password to use when binding to the LDAP server (with lsquoBind DNrsquo)Search base The distinguished name of the search baseSearch filter An optional filter string (eg lsquo(objectClass=person)rsquo) In order to be valid it must be

enclosed in parentheses(mail=(user)s)

Passwordattribute

The attribute used to store user passwords user-Pass-word

Active Direc-tory

Tell if the LDAP server is an Active Directory one no

Administratorgroups

Members of those LDAP Posix groups will be created ad domain administrators Uselsquorsquo characters to separate groups

Group type The type of group used by your LDAP directory Posix-Group

Groups searchbase

The distinguished name of the search base used to find groups

Do-mainmailboxcreation

Automatically create a domain and a mailbox when a new user is created just after thefirst successful authentication You will generally want to disable this feature whenthe relay domains extension is in use

yes

If you need additional parameters you will find a detailed documentation here

Once the authentication is properly configured the users defined in your LDAP directory will be able to connect to

23 Configuration 45

Modoboa Documentation Release 1100

Modoboa the associated domain and mailboxes will be automatically created if needed

The first time a user connects to Modoboa a local account is created if the LDAP username is a valid email addressBy default this account belongs to the SimpleUsers group and it has a mailbox

To automatically create domain administrators you can use the Administrator groups setting If a LDAP user belongsto one the listed groups its local account will belong to the DomainAdmins group In this case the username is notnecessarily an email address

Users will also be able to update their LDAP password directly from Modoboa

Note Modoboa doesnrsquot provide any synchronization mechanism once a user is registered into the database Anymodification done from the directory to a user account will not be reported to Modoboa (an email address change forexample) Currently the only solution is to manually delete the Modoboa record it will be recreated on the next userlogin

SMTP

It is possible to use an existing SMTP server as an authentication source To enable this feature edit the settingspy file and change the following setting

AUTHENTICATION_BACKENDS = (modoboalibauthbackendsSMTPBackenddjangocontribauthbackendsModelBackend

)

SMTP server location can be customized using the following settings

AUTH_SMTP_SERVER_ADDRESS = localhostAUTH_SMTP_SERVER_PORT = 25AUTH_SMTP_SECURED_MODE = None ssl or starttls are accepted

239 LDAP synchronization

Modoboa can synchronize accounts with an LDAP directory (tested with OpenLDAP) but this feature is not enabledby default To activate it add modoboaldapsync to MODOBOA_APPS in the settingspy file

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboaldapsync

)

and enable it from the admin panel

46 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning Make sure to install additional requirements otherwise it wonrsquot work

The following parameters are available and must be filled

Name Description Defaultvalue

Enable LDAP synchro-nization

Control LDAP synchronization state no

Bind DN The DN of a user with write permission to createupdate accountsBind password The associated passwordAccount DN template The template used to build account DNs (must contain a (user)s

placeholder

2310 Database maintenance

Cleaning the logs table

Modoboa logs administrator specific actions into the database A clean-up script is provided to automatically removeoldest records The maximum log record age can be configured through the online panel

To use it you can setup a cron job to run every night

0 0 ltmodoboa_sitegtmanagepy cleanlogs Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy cleanlogs

Cleaning the session table

Django does not provide automatic purging Therefore itrsquos your job to purge expired sessions on a regular basis

Django provides a sample clean-up script django-adminpy clearsessions That script deletes any sessionin the session table whose expire_date is in the past

For example you could setup a cron job to run this script every night

0 0 ltmodoboa_sitegtmanagepy clearsessions Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy clearsessions

Cleaning inactive accounts

Thanks to Last-login tracking it is now possible to monitor inactive accounts An account is considered inactive if nologin has been recorded for the last 30 days (this value can be changed through the admin panel)

A management command is available to disable or delete inactive accounts For example you could setup a cron jobto run it every night

23 Configuration 47

Modoboa Documentation Release 1100

0 0 ltmodoboa_sitegtmanagepy clean_inactive_accounts Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy clean_inactive_rarr˓accounts

The default behaviour is to disable accounts You can delete them using the --delete option

24 Moving to Modoboa

You have an existing platform and yoursquod like to move to Modoboa the following tools could help you

241 From postfixadmin

A dedicated command allows you to convert an existing postfixadmin database to a Modoboa one Consult the docu-mentation to know more about the process

242 Using CSV files

Modoboa allows you to import any object (domain domain alias mailbox and alias) using a simple CSV file encodedusing UTF8 Each line corresponds to a single object and must respect one of the following format

domain ltname stringgt ltquota integergt ltdefault mailbox quota integergt ltenabledrarr˓booleangtdomainalias ltname stringgt lttargeted domain stringgt ltenabled booleangtrelaydomain ltname stringgt lttarget host stringgt lttarget port integergt ltservicerarr˓stringgt ltenabled booleangt ltverify recipients booleangtaccount ltloginname stringgt ltpassword stringgt ltfirst name stringgt ltlast namerarr˓stringgt ltenabled booleangt ltgroup stringgt ltaddress stringgt ltquota integergt [rarr˓ltdomain stringgt ]alias ltaddress stringgt ltenabled booleangt ltrecipient stringgt

Boolean fields accept the following values true 1 yes y (case insensitive) Any other value will be evaluated asfalse

Warning The order does matter Objects are created sequencially so a domain must be created before itsmailboxes and aliases and a mailbox must created before its alias(es)

To actually import such a file

gt sudo -u ltmodoboa_usergt -igt source ltvirtualenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy modo import ltyour filegt

Available options can be listed using the following command

gt python managepy modo import -h

48 Chapter 2 Table of contents

Modoboa Documentation Release 1100

25 REST API

To ease the integration with external sources (software or other) Modoboa provides a REST API

Every installed instance comes with a ready-to-use API and a documentation You will find them using the followingurl patterns

bull API httplthostnamegtapiv1

bull Documentation httplthostnamegtdocsapi

An example of this documentation is available on the official demo

Using this API requires an authentication and for now only a token based authentication is supported To get a validtoken log-in to your instance with a super administrator go to Settings gt API and activate the API access Press theUpdate button and wait until the page is reloaded the token will be displayed

To make valid API calls every requests you send must embed this token within an Authorization HTTP header likethis

Authorization Token ltYOUR_TOKENgt

and the content type of those requests must be applicationjson

26 How to contribute

Contributions are always welcome If you want to submit a patch please respect the following rules

bull Open a pull request on the appropriate repository

bull Respect PEP8

bull Document your patch and respect PEP 257

bull Add unit tests and make sure the global coverage does not decrease

If all those steps are validated your contribution will generally be integrated

261 Table of contents

25 REST API 49

Modoboa Documentation Release 1100

Useful tips

You would like to work on Modoboa but you donrsquot know where to start Yoursquore at the right place Browse this pageto learn useful tips

Docker

A docker image is available for developers To use it you must install docker and docker-compose first

Then just run the following command

$ docker-compose up

It will start the docker environment and make a Modoboa instance available at httplocalhost8000

If you donrsquot want to use docker or need a more complex development setup go to the next section

Prepare a virtual environment

A virtual environment is a good way to setup a development environment on your machine

To do so run the following commands

$ python3 -m venv ltpathgt$ source ltpathgtbinactivate$ git clone httpsgithubcommodoboamodoboagit$ cd modoboa$ python setuppy develop$ pip install -r dev-requirementstxt

The develop command creates a symbolic link to your local copy so any modification you make will be automati-cally available in your environment no need to copy them

Deploy an instance for development

Warning Make sure to create a database before running this step The format of the database url is also describedin this page

Now that you have a running environment yoursquore ready to deploy a test instance

$ cd ltpathgt$ modoboa-adminpy deploy --dburl defaultltdatabase urlgt --domain localhost --develrarr˓instance$ python managepy runserver

Yoursquore ready to go You should be able to access Modoboa at httplocalhost8000 usingadminpassword as credentials

Manage static files

Modoboa uses bower (thanks to django-bower) to manage its CSS and javascript dependencies

50 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Those dependencies are listed in a file called dev_settingspy located inside the ltpath_to_local_copygtmodoboacore directory

If you want to add a new dependency just complete the BOWER_INSTALLED_APPS parameter and run the followingcommand

$ python managepy bower install

It will download and store the required files into the ltpath_to_local_copygtmodoboabower_components directory

Test your modifications

If you deployed a specific instance for your development needs you can run the tests suite as follows

gt python managepy test modoboacore modoboalib modoboaadmin modoboalimits modoboararr˓relaydomains

Otherwise you can run the tests suite from the repository using tox

Start a basic Modoboa instance

From the repository run the following command to launch a simple instance with a few fixtures

gt tox -e serve

You can use adminpassword to log in

Build the documentation

If you need to modify the documenation and want to see the result you can build it as follows

gt tox -e docgt firefox toxdoctmphtmlindexhtml

FAQ

bower command is missing in managepy

bower command is missing in managepy if you donrsquot use the --devel option of the modoboa-adminpydeploy command

To fix it regenerate your instance or update your settingspy file manually Look at devmode in httpsgithubcomtonioomodoboablobmastermodoboacorecommandstemplatessettingspytpl

Create a new plugin

Introduction

Modoboa offers a plugin API to expand its capabilities The current implementation provides the following possibili-ties

26 How to contribute 51

Modoboa Documentation Release 1100

bull Expand navigation by adding entry points to your plugin inside the GUI

bull Access and modify administrative objects (domains mailboxes etc)

bull Register callback actions for specific events

Plugins are nothing more than Django applications with an extra piece of code that integrates them into Modoboa Themodo_extensionpy file will contain a complete description of the plugin

bull Admin and user parameters

bull Custom menu entries

The communication between both applications is provided by Django signals

The following subsections describe the plugin architecture and explain how you can create your own

The required glue

To create a new plugin just start a new django application like this (into Modoboarsquos directory)

$ python managepy startapp

Then you need to register this application using the provided API Just copypaste the following example into themodo_extensionpy file of the future extension

from modoboacoreextensions import ModoExtension exts_pool

class MyExtension(ModoExtension)My custom Modoboa extension

name = myextlabel = My Extensionversion = 01description = A descriptionurl = myext_root_location optional name is used if not defined

def load(self)This method is called when Modoboa loads available and activated plugins

Declare parameters and register events herepass

def load_initial_data(self)Optional provide initial data for your extension herepass

exts_poolregister_extension(MyExtension)

Once done simply add your extensionrsquos module name to the MODOBOA_APPS variable located inside settingspy Finally run the following commands

$ python managepy migrate$ python managepy load_initial_data$ python managepy collectstatic

52 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Parameters

A plugin can declare its own parameters There are two levels available

bull lsquoGlobalrsquo parameters used to configure the plugin editable inside the Admin gt Settings gt Parameters page

bull lsquoUserrsquo parameters per-user parameters (or preferences) editable inside the Options gt Preferences page

Playing with parameters

Parameters are defined using Django forms and Modoboa adds two special forms you can inherit depending on thelevel of parameter(s) you want to add

bull modoboaparametersformsAdminParametersForm for general parameters

bull modoboaparametersformsUserParametersForm for user parameters

To register new parameters add the following line into the load method of your plugin class

from modoboaparameters import tools as param_toolsparam_toolsregistryadd(

LEVEL YourForm ugettext_lazy(Title))

Replace LEVEL by global or user

Custom role permissions

Modoboa uses Djangorsquos internal permission system Administrative roles are nothing more than groups (Groupinstances)

An extension can add new permissions to a group by listening to the extra_role_permissions signal Here isan example

from djangodispatch import receiverfrom modoboacore import signals as core_signals

PERMISSIONS = Resellers [

(relaydomains relaydomain add_relaydomain)(relaydomains relaydomain change_relaydomain)(relaydomains relaydomain delete_relaydomain)(relaydomains service add_service)(relaydomains service change_service)(relaydomains service delete_service)

]

receiver(core_signalsextra_role_permissions)def extra_role_permissions(sender role kwargs)

Add permissions to the Resellers groupreturn constantsPERMISSIONSget(role [])

Extending admin forms

The forms used to edit objects (account domain etc) through the admin panel are composed of tabs You can extendthem (ie add new tabs) in a pretty easy way thanks to custom signals

26 How to contribute 53

Modoboa Documentation Release 1100

Account

To add a new tab to the account edition form define new listeners (handlers) for the following signals

bull modoboaadminsignalsextra_account_forms

bull modoboaadminsignalsget_account_form_instances

bull modoboaadminsignalscheck_extra_account_form (optional)

Example

from djangodispatch import receiverfrom modoboaadmin import signals as admin_signals

receiver(admin_signalsextra_account_forms)def extra_account_form(sender user account kwargs)

return [id tabid title Title cls MyFormClass

]

receiver(admin_signalsget_account_form_instances)def fill_my_tab(sender user account kwargs)

return id my_instance

Domain

To add a new tab to the domain edition form define new listeners (handlers) for the following signals

bull modoboaadminsignalsextra_domain_forms

bull modoboaadminsignalsget_domain_form_instances

Example

from djangodispatch import receiverfrom modoboaadmin import signals as admin_signals

receiver(admin_signalsextra_domain_forms)def extra_account_form(sender user domain kwargs)

return [id tabid title Title cls MyFormClass

]

receiver(admin_signalsget_domain_form_instances)def fill_my_tab(sender user domain kwargs)

return id my_instance

27 Contributors

bull Antidot

bull Bearstech

bull CAP-REL

54 Chapter 2 Table of contents

Modoboa Documentation Release 1100

bull Dalnix

27 Contributors 55

  • Overview
  • Table of contents
Page 10: Modoboa Documentation

Modoboa Documentation Release 1100

(env)$ pip install modoboa

Database

Warning This documentation does not cover the installation of a database server but only the setup of a functionaldatabase that Modoboa will use

Thanks to Django Modoboa is compatible with the following databases

bull PostgreSQL

bull MySQL MariaDB

bull SQLite

Since the last one does not require particular actions only the first two ones are described You should also read thenotes for those database backends on the official Django documentation

PostgreSQL

Install the corresponding Python binding

(env)$ pip install psycopg2

Note Alternatively you can install the python3-psycopg2 package instead on Debian-based distributions ifyour virtual environment was created with --system-site-packages option

Then create a user and a database For example to create the modoboa database owned by a modoboa user run thefollowing commands on your PostgreSQL server

sudo -l -u postgres createuser --no-createdb modoboa sudo -l -u postgres createdb --owner=modoboa modoboa

MySQL MariaDB

Install the corresponding Python binding

(env)$ pip install mysqlclient

Note Alternatively you can install the python3-mysqldb package instead on Debian-based distributions if yourvirtual environment was created with --system-site-packages option

Note MariaDB 102 (and newer) require mysqlclient 1311 (or newer)

Then create a user and a database For example to create the modoboa database owned by a modoboa user run thefollowing SQL commands

21 Installation 7

Modoboa Documentation Release 1100

CREATE DATABASE modoboaCREATE USER modoboalocalhost IDENTIFIED BY my-strong-password-hereGRANT ALL PRIVILEGES ON modoboa TO modoboalocalhost

Deploy an instance

modoboa-adminpy is a command line tool that lets you deploy a ready-to-use Modoboa site To create a newinstance into instance you just have to run the following command

(env)$ modoboa-adminpy deploy instance --collectstatic --domain lthostname of your servergt --dburl defaultltdatabase urlgt

Note You can install additional extensions during the deploy process To do so use the --extensions op-tion which accepts a list of names as argument (--extensions ext1 ext2 ) If you want to install allextensions just use the all keyword like this --extensions all

If you choose to install extensions one at a time you will have to add their names in settingspy to MODOBOA_APPSAlso ensure that you have the line from modoboa_amavissettings import at the end of this file

The list of available extensions can be found on the index page Instructions to install them are available on eachextensions page

Note You can specify more than one database connection using the --dburl option Multiple connections aredifferentiated by a prefix

The primary connection must use the default prefix (as shown in the example above) For the amavis exten-sion use the amavis prefix For example --dburl defaultltdatabase urlgt amavisltdatabaseurlgt

A database url should meet the following syntax ltmysql|postgresgt[userpass][hostport]dbname OR sqlitefullpathtoyourdatabasefilesqlite

The command will ask you a few questions answer them and yoursquore done

If you need a silent installation (eg if yoursquore using Salt-Stack Ansible or whatever) itrsquos possible to supply thedatabase credentials as command line arguments

You can consult the complete option list by running the following command

(env)$ modoboa-adminpy help deploy

Cron jobs

A few recurring jobs must be configured to make Modoboa works as expected

Create a new file for example etccrondmodoboa and put the following content inside

Modoboa specific cron jobsPYTHON=ltpath to Python binary inside the virtual environmentgtINSTANCE=ltpath to Modoboa instancegt

(continues on next page)

8 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

Operations on mailboxes

vmail $PYTHON $INSTANCEmanagepy handle_mailbox_operations

Generate DKIM keys (they will belong to the user running this job)

root umask 077 ampamp $PYTHON $INSTANCEmanagepy modo manage_dkim_rarr˓keys

Sessions table cleanup0 0 modoboa $PYTHON $INSTANCEmanagepy clearsessions Logs table cleanup0 0 modoboa $PYTHON $INSTANCEmanagepy cleanlogs DNSBL checks

30 modoboa $PYTHON $INSTANCEmanagepy modo check_mx Public API communication0 modoboa $PYTHON $INSTANCEmanagepy communicate_with_public_api

Policy daemon

Modoboa comes with a built-in Policy Daemon for Postfix Current features are

bull Define daily sending limits for domains andor accounts

A redis server is required to run this new daemon

You can launch it manually using the following command

(env)gt python managepy policy_daemon

But we recommend an automatic start using systemd or supervisor Here is a configuration example forsupervisor

[programpolicyd]autostart=trueautorestart=truecommand=srvmodoboaenvbinpython srvmodoboainstancemanagepy policy_daemondirectory=srvmodoboaredirect_stderr=trueuser=modoboanumprocs=1

It will listen by default on 127001 and port 9999 The policy daemon wonrsquot do anything unless you tell postfixto use it

Now you can continue to the Web server section

Web server

Note The following instructions are meant to help you get your site up and running quickly However it is notpossible for the people contributing documentation to Modoboa to test every single combination of web server wsgiserver distribution etc So it is possible that your installation of uwsgi or nginx or Apache or what-have-you worksdifferently Keep this in mind

21 Installation 9

Modoboa Documentation Release 1100

Apache2

First make sure that mod_wsgi is installed on your server

Create a new virtualhost in your Apache configuration and put the following content inside

ltVirtualHost 80gtServerName ltyour valuegtDocumentRoot ltmodoboa_instance_pathgt

Alias media ltmodoboa_instance_pathgtmedialtDirectory ltmodoboa_instance_pathgtmediagtOrder denyallowAllow from all

ltDirectorygt

Alias sitestatic ltmodoboa_instance_pathgtsitestaticltDirectory ltmodoboa_instance_pathgtsitestaticgtOrder denyallowAllow from all

ltDirectorygt

WSGIScriptAlias ltmodoboa_instance_pathgtltinstance_namegtwsgipy

Pass Authorization header to enable API usageWSGIPassAuthorization On

ltVirtualHostgt

This is just one possible configuration

To use mod_wsgi daemon mode add the two following directives just under WSGIScriptAlias

WSGIDaemonProcess examplecom python-path=ltmodoboa_instancegtltvirtualenv pathgtlibrarr˓python37site-packagesWSGIProcessGroup examplecom

Replace values between ltgt with yours If you donrsquot use a virtualenv just remove the last part of theWSGIDaemonProcess directive

Note You will certainly need more configuration in order to launch Apache

Now you can go the Dovecot section to continue the installation

Nginx

This section covers two different ways of running Modoboa behind Nginx using a WSGI application server Choosethe one you prefer between Green Unicorn or uWSGI

In both cases yoursquoll need to download and install nginx

Green Unicorn

Firstly Download and install gunicorn Then use the following sample gunicorn configuration (create a new filenamed gunicornconfpy inside Modoboarsquos root dir)

10 Chapter 2 Table of contents

Modoboa Documentation Release 1100

backlog = 2048bind = unixvarrungunicornmodoboasockpidfile = varrungunicornmodoboapiddaemon = Truedebug = Falseworkers = 2logfile = varloggunicornmodoboalogloglevel = info

To start gunicorn execute the following commands

$ cd ltmodoboa dirgt$ gunicorn -c gunicornconfpy ltmodoboa dirgtwsgiapplication

Now the nginx part Just create a new virtual host and use the following configuration

upstream modoboa server unixvarrungunicornmodoboasock fail_timeout=0

server listen 443 sslssl onkeepalive_timeout 70

server_name lthost fqdngtroot ltmodoboa_instance_pathgt

access_log varlognginxlthost fqdngtaccesslogerror_log varlognginxlthost fqdngterrorlog

ssl_certificate ltssl certificate for your sitegtssl_certificate_key ltssl certificate key for your sitegt

location sitestatic autoindex on

location media autoindex on

location proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_forproxy_set_header Host $http_hostproxy_redirect offproxy_set_header X-Forwarded-Protocol sslproxy_pass httpmodoboa

If you do not plan to use SSL then change the listen directive to listen 80 and delete each of the followingdirectives

ssl onkeepalive_timeout 70ssl_certificate ltssl certificate for your sitegt

(continues on next page)

21 Installation 11

Modoboa Documentation Release 1100

(continued from previous page)

ssl_certificate_key ltssl certificate key for your sitegtproxy_set_header X-Forwarded-Protocol ssl

If you do plan to use SSL yoursquoll have to generate a certificate and a key This article contains information about howto do it

Paste this content to your configuration (replace values between ltgt with yours) and restart nginx

Now you can go the Dovecot section to continue the installation

uWSGI

The following setup is meant to get you started quickly You should read the documentation of both nginx and uwsgito understand how to optimize their configuration for your site

The Django documentation includes the following warning regarding uwsgi

Warning Use uwsgi 126 or newer If you do not you will run into problems Modoboa will fail in obscureways

To use this setup first download and install uwsgi

Here is a sample nginx configuration

server listen 443 sslssl onkeepalive_timeout 70

server_name lthost fqdngtroot ltmodoboas settings dirgt

ssl_certificate ltssl certificate for your sitegtssl_certificate_key ltssl certificate key for your sitegt

access_log varlognginxlthost fqdngtaccesslogerror_log varlognginxlthost fqdngterrorlog

location ltmodoboas root urlgtsitestatic autoindex onalias ltlocation of sitestatic on your file systemgt

Whether or not Modoboa uses a media directory depends on how you configured Modoboa It does not hurt to have thislocation ltmodoboas root urlgtmedia

autoindex onalias ltlocation of media on your file systemgt

This denies access to any file that begins with ht Apaches htaccess and htpasswd are such files A Modoboa installed from scratch would not contain any such files but you never know what the future holds

(continues on next page)

12 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

location ~ ht deny all

location ltmodobas root urlgt include uwsgi_paramsuwsgi_pass ltuwsgi portgtuwsgi_param UWSGI_SCRIPT ltmodoboa instance namegtwsgiapplicationuwsgi_param UWSGI_SCHEME https

ltmodoboa instance namegt must be replaced by the value you used when you deployed your instance

If you do not plan to use SSL then change the listen directive to listen 80 and delete each of the followingdirectives

ssl onkeepalive_timeout 70ssl_certificate ltssl certificate for your sitegtssl_certificate_key ltssl certificate key for your sitegtuwsgi_param UWSGI_SCHEME https

If you do plan to use SSL yoursquoll have to generate a certificate and a key This article contains information about howto do it

Make sure to replace the ltgt in the sample configuration with appropriate values Here are some explanations forthe cases that may not be completely self-explanatory

ltmodoboas settings dirgt Where Modoboarsquos settingspy resides This is also where thesitestatic and media directories reside

ltmodoboas root urlgt This is the URL which will be the root of your Modoboa site at your domain For in-stance if your Modoboa installation is reachable at at httpsfoomodoboa then ltmodoboas rooturlgt is modoboa In this case you probably also have to set the alias directives to point to where Mod-oboarsquos sitestatic and media directories are because otherwise nginx wonrsquot be able to find them

If Modoboa is at the root of your domain then ltmodoboa root urlgt is an empty string and can be deletedfrom the configuration above In this case you probably do not need the alias directives

ltuwsgi portgt The location where uwsig is listening It could be a unix domain socket or an addressport combi-nation Ubuntu configures uwsgi so that the port is

unixrunuwsgiappltapp namegtsocket

where ltapp namegt is the name of the application

Your uwsgi configuration should be

[uwsgi] Not needed when using uwsgi from pip plugins = pythonchdir = ltmodoboas top dirgtmodule = ltnamegtwsgiapplicationmaster = trueharakiri = 60processes = 4vhost = trueno-default-app = true

21 Installation 13

Modoboa Documentation Release 1100

The plugins directive should be turned on if you use a uwsgi installation that requires it If uwsgi was installed frompip it does not require it In the configuration above

ltmodoboas top dirgt The directory where managepy resides This directory is the parent of ltmodoboassettings dirgt

ltnamegt The name that you passed to modoboa-adminpy deploy when you created your Modoboa instance

Now you can go the Dovecot section to continue the installation

Dovecot

Modoboa requires Dovecot 2+ to work so the following documentation is suitable for this combination

In this section we assume dovecotrsquos configuration resides in etcdovecot all pathes will be relative to thisdirectory

Mailboxes

First edit the confd10-mailconf and set the mail_location variable

maildirmail_location = maildir~maildir

Then edit the inbox namespace and add the following lines

inbox = yes

mailbox Drafts auto = subscribespecial_use = Drafts

mailbox Junk

auto = subscribespecial_use = Junk

mailbox Sent

auto = subscribespecial_use = Sent

mailbox Trash

auto = subscribespecial_use = Trash

With dovecot 21+ it ensures all the special mailboxes will be automaticaly created for new accounts

For dovecot 20 and older use the autocreate plugin

Operations on the file system

14 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning Modoboa needs to access the dovecot binary to check its version To find the binary path weuse the which command first and then try known locations (usrsbindovecot and usrlocalsbindovecot) If you installed dovecot in a custom location please tell us where the binary is by usingthe DOVECOT_LOOKUP_PATH setting (see settingspy)

Three operation types are considered

1 Mailbox creation

2 Mailbox renaming

3 Mailbox deletion

The first one is managed by Dovecot The last two ones may be managed by Modoboa if it can access the file systemwhere the mailboxes are stored (see General parameters to activate this feature)

Those operations are treated asynchronously by a cron script For example when you rename an e-mail addressthrough the web UI the associated mailbox on the file system is not modified directly Instead of that a renameorder is created for this mailbox The mailbox will be considered unavailable until the order is executed (see Postfixconfiguration)

Edit the crontab of the user who owns the mailboxes on the file system

$ crontab -u ltusergt -e

And add the following line inside

python ltmodoboa_sitegtmanagepy handle_mailbox_operations

Warning The cron script must be executed by the system user owning the mailboxes

Warning The user running the cron script must have access to the settingspy file of the modoboa instance

The result of each order is recorded into Modoboarsquos log Go to Modoboa gt Logs to consult them

Authentication

To make the authentication work edit the confd10-authconf and uncomment the following line at the end

include auth-systemconfextinclude auth-sqlconfextinclude auth-ldapconfextinclude auth-passwdfileconfextinclude auth-checkpasswordconfextinclude auth-vpopmailconfextinclude auth-staticconfext

Then edit the confdauth-sqlconfext file and add the following content inside

passdb sql driver = sql Path for SQL configuration file see example-configdovecot-sqlconfext

(continues on next page)

21 Installation 15

Modoboa Documentation Release 1100

(continued from previous page)

args = etcdovecotdovecot-sqlconfext

userdb sql driver = sqlargs = etcdovecotdovecot-sqlconfext

Make sure to activate only one backend (per type) inside your configuration (just comment the other ones)

Edit the dovecot-sqlconfext and modify the configuration according to your database engine

MySQL users

driver = mysql

connect = host=ltmysqld socketgt dbname=ltdatabasegt user=ltusergt password=ltpasswordgt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user WHERE email=Lu andrarr˓is_active=1

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid concat(bytes= mbquota M) AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

PostgreSQL users

driver = pgsql

connect = host=ltpostgres socketgt dbname=ltdatabasegt user=ltusergt password=ltpasswordgt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user u INNER JOIN admin_rarr˓mailbox mb ON uid=mbuser_id INNER JOIN admin_domain dom ON mbdomain_id=domidrarr˓WHERE uemail=Lu AND uis_active AND domenabled

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid bytes= || mbquota || M AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

16 Chapter 2 Table of contents

Modoboa Documentation Release 1100

SQLite users

driver = sqlite

connect = ltpath to the sqlite db filegt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user u INNER JOIN admin_rarr˓mailbox mb ON uid=mbuser_id INNER JOIN admin_domain dom ON mbdomain_id=domidrarr˓WHERE uemail=Lu AND uis_active=1 AND domenabled=1

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid (bytes= || mbquota || M) AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

Note Replace values between ltgt with yours

LDAP

To make the LDAP authentication work edit the confd10-authconf and uncomment the following line atthe end

include auth-ldapconfext

Then edit the confdauth-ldapconfext and edit the passdb section as following You should comment theuserdb section which will be managed by SQL with modoboa database

passdb driver = ldap

Path for LDAP configuration file see example-configdovecot-ldapconfextargs = etcdovecotdovecot-ldapconfext

userdb driver = ldapargs = etcdovecotdovecot-ldapconfext

Default fields can be used to specify defaults that LDAP may overridedefault_fields = home=homevirtualu

Your own dovecot LDAP configuration file is now etcdovecotdovecot-ldapconfext You can addyour default LDAP conf in it following the official documentation

Synchronize dovecot LDAP conf with modoboa LDAP conf

To make dovecot LDAP configuration synchronized with modoboa LDAP configuration you should create a dedicateddovecot conf file At the end of your dovecot configuration file (dovecot-ldapconfext) add the following

21 Installation 17

Modoboa Documentation Release 1100

line

include_try dovecot-modoboaconfext

Then set modoboa parameter Enable Dovecot LDAP sync to Yes Then set the Dovecot LDAP config file following theprevious step (etcdovecotdovecot-modoboaconfext in the example)

The last step is to add the command update_dovecot_conf to the cron job of modoboa Then each time your modoboaLDAP configuration is updated your dovecot LDAP configuration will also be

LMTP

Local Mail Transport Protocol is used to let Postfix deliver messages to Dovecot

First make sure the protocol is activated by looking at the protocols setting (generally inside dovecotconf)It should be similar to the following example

protocols = imap pop3 lmtp

Then open the confd10-masterconf look for lmtp service definition and add the following content inside

service lmtp stuff beforeunix_listener varspoolpostfixprivatedovecot-lmtp mode = 0600user = postfixgroup = postfix

stuff after

We assume here that Postfix is chrooted within varspoolpostfix

Finally open the confd20-lmtpconf and modify it as follows

protocol lmtp postmaster_address = postmasterltdomaingtmail_plugins = $mail_plugins quota sieve

Replace ltdomaingt by the appropriate value

Note If you donrsquot plan to apply quota or to use filters just adapt the content of the mail_plugins setting

Quota

Modoboa lets adminstrators define per-domain andor per-account limits (quota) It also lists the current quota usageof each account Those features require Dovecot to be configured in a specific way

Inside confd10-mailconf add the quota plugin to the default activated ones

mail_plugins = quota

Inside confd10-masterconf update the dict service to set proper permissions

18 Chapter 2 Table of contents

Modoboa Documentation Release 1100

service dict If dict proxy is used mail processes should have access to its socket For example mode=0660 group=vmail and global mail_access_groups=vmailunix_listener dict mode = 0600user = ltuser owning mailboxesgtgroup =

Inside confd20-imapconf activate the imap_quota plugin

protocol imap

mail_plugins = $mail_plugins imap_quota

Inside dovecotconf activate the quota SQL dictionary backend

dict quota = ltdrivergtetcdovecotdovecot-dict-sqlconfext

Inside confd90-quotaconf activate the quota dictionary backend

plugin quota = dictUser quotaproxyquota

It will tell Dovecot to keep quota usage in the SQL dictionary

Finally edit the dovecot-dict-sqlconfext file and put the following content inside

connect = host=ltdb hostgt dbname=ltdb namegt user=ltdb usergt password=ltpasswordgt SQLite users connect = pathtothedatabasedb

map pattern = privquotastoragetable = admin_quotausername_field = usernamevalue_field = bytes

map

pattern = privquotamessagestable = admin_quotausername_field = usernamevalue_field = messages

PostgreSQL users

21 Installation 19

Modoboa Documentation Release 1100

Database schema update

The admin_quota table is created by Django but unfortunately it doesnrsquot support DEFAULT constraints (it onlysimulates them when the ORM is used) As PostgreSQL is a bit strict about constraint violations you must executethe following query manually

db=gt ALTER TABLE admin_quota ALTER COLUMN bytes SET DEFAULT 0db=gt ALTER TABLE admin_quota ALTER COLUMN messages SET DEFAULT 0

Trigger

As indicated on Dovecotrsquos wiki you need a trigger to properly update the quota

A working copy of this trigger is available on Github

Download this file and copy it on the server running postgres Then execute the following commands

$ su - postgres$ psql [modoboa database] lt pathtomodoboa_postgres_triggersql$ exit

Replace [modoboa database] by the appropriate value

Forcing recalculation

For existing installations Dovecot (gt 2) offers a command to recalculate the current quota usages For example if youwant to update all usages run the following command

$ doveadm quota recalc -A

Be carefull it can take a while to execute

ManageSieveSieve

Modoboa lets users define filtering rules from the web interface To do so it requires ManageSieve to be activated onyour server

Inside confd20-managesieveconf make sure the following lines are uncommented

protocols = $protocols sieve

service managesieve-login

service managesieve

protocol sieve

20 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Messages filtering using Sieve is done by the LDA

Inside confd15-ldaconf activate the sieve plugin like this

protocol lda Space separated list of plugins to load (default is global mail_plugins)mail_plugins = $mail_plugins sieve

Finally configure the sieve plugin by editing the confd90-sieveconf file Put the follwing caontent inside

plugin Location of the active script When ManageSieve is used this is actually a symlink pointing to the active script in the sieve storage directorysieve = ~dovecotsieve

The path to the directory where the personal Sieve scripts are stored For ManageSieve this is where the uploaded scripts are storedsieve_dir = ~sieve

Restart Dovecot

Now you can go to the Postfix section to finish the installation

Last-login tracking

To update the last_login attribute of an account after a succesful IMAP or POP3 login you can configure apost-login script

Open confd10-masterconf add the following configuration (imap and pop3 services are already definedyou just need to update them)

service imap executable = imap postlogin

service pop3 executable = pop3 postlogin

service postlogin executable = script-login usrlocalbinpostloginshuser = modoboaunix_listener postlogin

Then you must create a script named usrlocalbinpostloginsh According to your database enginethe content will differ

PostgreSQL

21 Installation 21

Modoboa Documentation Release 1100

binsh

psql -c UPDATE core_user SET last_login=now() WHERE username=$USER gt devnull

exec $

MySQL

binsh

DBNAME=XXXDBUSER=XXXDBPASSWORD=XXX

echo UPDATE core_user SET last_login=now() WHERE username=$USER | mysql -urarr˓$DBUSER -p$DBPASSWORD $DBNAME

exec $

Postfix

This section gives an example about building a simple virtual hosting configuration with Postfix Refer to the officialdocumentation for more explanation

Map files

You first need to create configuration files (or map files) that will be used by Postfix to lookup into Modoboa tables

To automaticaly generate the requested map files and store them in a directory run the following command

gt cd ltmodoboa_instance_pathgtgt python managepy generate_postfix_maps --destdir ltdirectorygt

ltdirectorygt is the directory where the files will be stored Answer the few questions and yoursquore done

Configuration

Use the following configuration in the etcpostfixmaincf file (this is just one possible configuration)

Stuff beforevirtual_transport = lmtpunixprivatedovecot-lmtp

virtual_mailbox_domains = ltdrivergtetcpostfixsql-domainscfvirtual_alias_domains = ltdrivergtetcpostfixsql-domain-aliasescfvirtual_alias_maps = ltdrivergtetcpostfixsql-aliasescf

relay_domains = ltdrivergtetcpostfixsql-relaydomainscftransport_maps =

ltdrivergtetcpostfixsql-transportcfltdrivergtetcpostfixsql-spliteddomains-transportcf

(continues on next page)

22 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

smtpd_recipient_restrictions = check_recipient_access

ltdrivergtetcpostfixsql-maintaincfltdrivergtetcpostfixsql-relay-recipient-verificationcf

permit_mynetworksreject_unauth_destinationreject_unverified_recipient

smtpd_sender_login_maps = ltdrivergtetcpostfixsql-sender-login-mapcf

smtpd_sender_restrictions =reject_sender_login_mismatch

Stuff after

Replace ltdrivergt by the name of the database you use

Restart Postfix

Policy daemon

If you want to enable the built-in policy daemon add the following content to the etcpostfixmaincf file

smtpd_recipient_restrictions = check_policy_service inet1270019999

And reload postfix

Note The check_policy_service line must be placed before the permit_mynetworks one otherwise thedaemon wonrsquot be called

OpenDKIM

Modoboa can generate DKIM keys for the hosted domains but it wonrsquot sign or check messages To do that you needa dedicated software like OpenDKIM

Note The cron job in charge of creating DKIM keys must be run using the same user than OpenDKIM (ie opendkimin most cases)

Database

Since keys related information is stored in Modoboarsquos database you need to tell OpenDKIM how it can access it

First make sure to install the required additional packages on your system (libopendbx1- on debian baseddistributions or opendbx- on CentOS the complete name depends on your database engine)

Then insert the following SQL view into Modoboarsquos database

21 Installation 23

Modoboa Documentation Release 1100

PostgreSQL

CREATE OR REPLACE VIEW dkim AS (SELECT id name as domain_name dkim_private_key_path AS private_key_path

dkim_key_selector AS selectorFROM admin_domain WHERE enable_dkim

)

MySQLMariaDB

CREATE OR REPLACE VIEW dkim AS (SELECT id name as domain_name dkim_private_key_path AS private_key_path

dkim_key_selector AS selectorFROM admin_domain WHERE enable_dkim=1

)

Configuration

You should find OpenDKIMrsquos configuration file at etcopendkimconf

Add the following content to it

KeyTable dsnltdrivergtltusergtltpasswordgtltdb hostgtltdb namegttable=dkimrarr˓keycol=iddatacol=domain_nameselectorprivate_key_pathSigningTable dsnltdrivergtltusergtltpasswordgtltdb hostgtltdb namegttable=dkimrarr˓keycol=domain_namedatacol=idSocket inet12345localhost

Replace values between ltgt by yours Accepted values for driver are pgsql or mysql Make sure the user youspecify has read permission on the view created previously

If you run a debian based system make sure to adjust the following setting in the etcdefaultopendkim file

SOCKET=inet12345localhost

Eventually reload OpenDKIM

Postfix integration

Add the following lines to the etcpostfixmaincf file

smtpd_milters = inet12700112345non_smtpd_milters = inet12700112345milter_default_action = acceptmilter_content_timeout = 30s

and reload postfix

Extensions

Only few commands are needed to add a new extension to your setup

24 Chapter 2 Table of contents

Modoboa Documentation Release 1100

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install ltEXTENSIONgt==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Then restart your web server

22 Upgrade

221 Modoboa

Warning The new version you are going to install may need to modify your database Before you start makesure to backup everything

Most of the time upgrading your installation to a newer Modoboa version only requires a few actions In every caseyou will need to apply the general procedure first and then check if the version you are installing requires specificactions

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install modoboa==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Once done check if the version you are installing requires Specific instructions

Finally restart your web server

Sometimes you might need to upgrade postfix map files too To do so just run the generate_postfix_mapscommand on the same directory than the one used for installation (etcpostfix by default)

Make sure to use root privileges and run the following command

gt python managepy generate_postfix_maps --destdir ltdirectorygt

Then reload postfix

22 Upgrade 25

Modoboa Documentation Release 1100

222 Extensions

If a new version is available for an extension yoursquore using it is recommanded to install it Upgrading an extensions ispretty and the procedure is almost the same than the one used for Modoboa

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install ltEXTENSIONgt==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Finally restart your web server

It is a generic upgrade procedure which will be enough most of the time but it is generally a good idea to check theassociated documentation

223 Rebuild Virtual Environment

Sometimes when upgrading your Operating System (eg from Ubuntu 1704 to Ubuntu 1710) your virtual environmentrunning modoboa can get corrupted Your first response will be to panic but fear not The solution is in this document

First things first

Recover your database password

You will need to recover your database password (if using mysql or postgresql) You will find this in etcpostfixsql-aliasescf or any file with sql-cf in the etcpostfix directory

Make note of this as you will need it when reconfiguring modoboa

Reinstall Modoboa

Start out by backup up your modoboa settings file located in the modoboa instance directory (srvmodoboainstanceinstancesettingspy if you used the default installer configuration) This contains your currentconfiguration

Next you want to remove all current modoboa files

After doing this follow the manual installation instructions for Modoboa only as everything should be working prop-erly

After this completes simply restore your backed up settings file to srvinstanceinstancesettingspy(if you used installer default configuration) You will then need to reinstall your extensions

You can find which plugins you had in your settingspy file under the MODOBOA_APPS variable

Instructions to install extensions can also be found here

Once you have completed this step you will need to run the following commands

26 Chapter 2 Table of contents

Modoboa Documentation Release 1100

gt (env) $ cd ltinstance_dirgtgt (env) $ python managepy migrategt (env) $ python managepy collectstatic

You will then see a message similar to

You have requested to collect static files at the destinationlocation as specified in your settings

srvmodoboainstancesitestatic

This will overwrite existing filesAre you sure you want to do this

Type yes to continue or no to cancel

You will want to answer yes here then simply restart the uwsgi process with service uwsgi restart andyou should be up and running again

Simply log into your modoboa web panel and verify that your extensions and webmail box is working

224 Information

Rebuild instructions from httpshelppythonanywherecompagesRebuildingVirtualenvs

225 Specific instructions

1160

A new policy daemon has been added

Make sure to have a Redis instance running on your server

Add modoboapolicyd to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboapolicyd

)

Add the following settings to your settingspy file

REDIS_HOST = ltIP or hostname heregtREDIS_PORT = 6379REDIS_QUOTA_DB = 0REDIS_URL = redisformat(REDIS_HOST REDIS_PORT REDIS_QUOTA_DB)

Once done you can start the policy daemon using the following commands

22 Upgrade 27

Modoboa Documentation Release 1100

gt python managepy policy_daemon

Donrsquot forget to configure _policyd_config if you want to use this feature

The modoboa-stats plugin has been merged into the core

Add modoboamaillog to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboapolicydmodoboamaillog

)

And remove any reference to modoboa_stats in this same variable

1150

This version drops Python 2 support so donrsquot forget to update all the extensions you use

Warning If you upgrade an existing python 2 installation you will need to create a new Python 3 virtualenvironment You can remove the existing virtual environment and replace it by the new one so you wonrsquot have tomodify your configuration files

Add the following new setting

DISABLE_DASHBOARD_EXTERNAL_QUERIES = False

Reload uwsgigunicornapache depending on your setup

Finally Make sure to use root privileges and run the following command

gt python managepy generate_postfix_maps --destdir ltdirectorygt

Then reload postfix

1140

This release introduces an optional LDAP synchronization process If you want to use it please follow the dedicatedprocedure

1131

Upgrade postfix maps files as follows

28 Chapter 2 Table of contents

Modoboa Documentation Release 1100

gt python managepy generate_postfix_maps --destdir ltpathgt --force-overwrite

1130

Add modoboadnstools to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstools

)

Add the following new settings

CSRF_COOKIE_SECURE = TrueSESSION_COOKIE_SECURE = True

modoboa-postfix-autoreply 150

Edit the etcpostfixmaincf file and remove the sql-autoreplies-transportcf map from thetransport_maps if present Remove the corresponding proxy_read_maps entry if relevant

Reload postfix

1100

Warning Upgrade installed extensions BEFORE running check or migrate commands

Upgrade all your installed plugins to the following versions

Warning If you use the amavis plugin make sure to include its configuration as follows into settingspy

from modoboa_amavis import settings as modoboa_amavis_settingsmodoboa_amavis_settingsapply(globals())

22 Upgrade 29

Modoboa Documentation Release 1100

Name Versionmodoboa-amavis 120modoboa-contacts 050modoboa-dmarc 110modoboa-imap-migration 120modoboa-pdfcredentials 130modoboa-postfix-autoreply 140modoboa-radicale 120modoboa-sievefilters 140modoboa-stats 140modoboa-webmail 140

Edit the settingspy file and apply the following modifications

Add modoboatransport to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparameters

)

Replace the following line

MIDDLEWARE_CLASSES = (

by

MIDDLEWARE = (

Update postfix map files as follows

gt rm -f ltpathgtmodoboa-postfix-mapschkgt python managepy generate_postfix_maps --force --destdir ltpathgt

Then modify postfixrsquos configuration as follows

smtpd_sender_login_maps =ltdrivergtltpathgtsql-sender-login-mapcf

transport_maps =ltdrivergtltpathgtsql-transportcfltdrivergtltpathgtsql-spliteddomains-transportcf other map files

Replace ltdrivergt and ltpathgt by your values

If transport_maps contains sql-relaydomains-transportcf remove it

30 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning If you make use of postfixrsquos proxymap server you must also update the proxy_read_maps setting

Reload postfix

Add the following cron job in order to generate DKIM keys

Generate DKIM keys (they will belong to the user running this job)

root $PYTHON $INSTANCEmanagepy modorarr˓manage_dkim_keys

190

If you want to manage inactive accounts look at Cleaning inactive accounts

183

Edit the settingspy file and replace the following line

BASE_DIR = ospathdirname(ospathdirname(__file__))

by

BASE_DIR = ospathrealpath(ospathdirname(ospathdirname(__file__)))

180

Modoboa now relies on Djangorsquos builtin password validation system to validate user passwords instead ofdjango-passwords

Remove django-passwords from your system

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt pip uninstall django-passwords

Edit the settingspy file and remove the following content

django-passwords

PASSWORD_MIN_LENGTH = 8

PASSWORD_COMPLEXITY = UPPER 1LOWER 1DIGITS 1

Add the following lines

Password validation rulesAUTH_PASSWORD_VALIDATORS = [

NAME djangocontribauthpassword_validation

rarr˓UserAttributeSimilarityValidator (continues on next page)

22 Upgrade 31

Modoboa Documentation Release 1100

(continued from previous page)

NAME djangocontribauthpassword_validationMinimumLengthValidator

NAME djangocontribauthpassword_validationCommonPasswordValidator

NAME djangocontribauthpassword_validationNumericPasswordValidator

NAME modoboacorepassword_validationComplexityValidatorOPTIONS

upper 1lower 1digits 1specials 0

]

172

API documentation has evolved (because of the upgrade to Django Rest Framework 36) and CKeditor is now embed-ded by default (thanks to the django-ckeditor package) Some configuration changes are required

Edit your settingspy file and apply the following modifications

bull Update the INSTALLED_APPS variable as follows

INSTALLED_APPS = (djangocontribauthdjangocontribcontenttypesdjangocontribsessionsdjangocontribmessagesdjangocontribsitesdjangocontribstaticfilesreversionckeditorckeditor_uploaderrest_frameworkrest_frameworkauthtoken

)

bull Update the REST_FRAMEWORK variable as follows

REST_FRAMEWORK = DEFAULT_AUTHENTICATION_CLASSES (

rest_frameworkauthenticationTokenAuthenticationrest_frameworkauthenticationSessionAuthentication

)

bull Remove the SWAGGER_SETTINGS variable

bull Add the following content

32 Chapter 2 Table of contents

Modoboa Documentation Release 1100

CKeditor

CKEDITOR_UPLOAD_PATH = uploads

CKEDITOR_IMAGE_BACKEND = pillow

CKEDITOR_RESTRICT_BY_USER = True

CKEDITOR_BROWSE_SHOW_DIRS = True

CKEDITOR_ALLOW_NONIMAGE_FILES = False

CKEDITOR_CONFIGS = default

allowedContent Truetoolbar Modoboawidth Nonetoolbar_Modoboa [

[Bold Italic Underline][JustifyLeft JustifyCenter JustifyRight JustifyBlock][BidiLtr BidiRtl Language][NumberedList BulletedList - Outdent Indent][Undo Redo][Link Unlink Anchor - Smiley][TextColor BGColor - Source][Font FontSize][Image ][SpellChecker]

]

Donrsquot forget to run the following command

gt python managepy collectstatic

171

If you used 170 for a fresh installation please run the following commands

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy load_initial_data

170

This version requires Django gt= 110 so you need to make some modifications It also brings internal API changeswhich are not backward compatible so installed extensions must be upgraded too

First of all deactivate all installed extensions (edit the settingspy file and comment the corresponding lines inMODOBOA_APPS)

Edit the urlspy file of your local instance and replace its content by the following one

22 Upgrade 33

Modoboa Documentation Release 1100

from djangoconfurls import include url

urlpatterns = [url(r include(modoboaurls))

]

Edit the settingspy and apply the following changes

bull Add modoboaparameters to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboarelaydomainsmodoboalimitsmodoboaparameters Modoboa extensions here

)

bull Add modoboacoremiddlewareLocalConfigMiddleware to MIDDLEWARE_CLASSES

MIDDLEWARE_CLASSES = (djangocontribsessionsmiddlewareSessionMiddlewaredjangomiddlewarecommonCommonMiddlewaredjangomiddlewarecsrfCsrfViewMiddlewaredjangocontribauthmiddlewareAuthenticationMiddlewaredjangocontribmessagesmiddlewareMessageMiddlewaredjangomiddlewarelocaleLocaleMiddlewaredjangomiddlewareclickjackingXFrameOptionsMiddlewaremodoboacoremiddlewareLocalConfigMiddlewaremodoboalibmiddlewareAjaxLoginRedirectmodoboalibmiddlewareCommonExceptionCatchermodoboalibmiddlewareRequestCatcherMiddleware

)

bull Modoboa used to provide a custom authentication backend (modoboalibauthbackendsSimpleBackend) but it has been removed Replace it as follows

AUTHENTICATION_BACKENDS = ( Other backends beforedjangocontribauthbackendsModelBackend

)

bull Remove TEMPLATE_CONTEXT_PROCESSORS and replace it by

TEMPLATES = [

BACKEND djangotemplatebackendsdjangoDjangoTemplatesDIRS []APP_DIRS TrueOPTIONS

context_processors [djangotemplatecontext_processorsdebugdjangotemplatecontext_processorsrequestdjangocontribauthcontext_processorsauth

(continues on next page)

34 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

djangotemplatecontext_processorsi18ndjangotemplatecontext_processorsmediadjangotemplatecontext_processorsstaticdjangotemplatecontext_processorstzdjangocontribmessagescontext_processorsmessagesmodoboacorecontext_processorstop_notifications

]debug False

]

Run the following commands (load virtualenv if you use one)

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstatic

Finally upgrade your extensions and reactivate them

Name Versionmodoboa-amavis 110modoboa-dmarc 100modoboa-imap-migration 110modoboa-pdfcredentials 110modoboa-postfix-autoreply 120modoboa-radicale 110modoboa-sievefilters 110modoboa-stats 110modoboa-webmail 110

Command line shortcuts

$ pip install modoboa-amavis==110$ pip install modoboa-dmarc==100$ pip install modoboa-imap-migration==110$ pip install modoboa-pdfcredentials==110$ pip install modoboa-postfix-autoreply==120$ pip install modoboa-radicale==110$ pip install modoboa-sievefilters==110$ pip install modoboa-stats==110$ pip install modoboa-webmail==110

And please make sure you use the latest version of the django-versionfield2 package

$ pip install -U django-versionfield2

Notes about quota changes and resellers

Reseller users now have a quota option in Resources tab This is the quota that a reseller can share between all itsdomains

22 Upgrade 35

Modoboa Documentation Release 1100

There are two quotas for a domain in the new version

1 Quota amp

2 Default mailbox quota

[1] Quota quota shared between mailboxes This quota is shared between all the mailboxes of this domain This valuecannot exceed resellerrsquos quota and hence cannot be 0(unlimited) if reseller has finite quota

[2] Default mailbox quota default quota applied to mailboxes This quota is the default quota applied to new mail-boxes This value cannot exceed Quota[1] and hence cannot be 0(unlimited) if Quota[1] is finite

161

First of all update postfix map files as follows

gt python managepy generate_postfix_maps --destdir ltpathgt --force-overwrite

Then modify postfixrsquos configuration as follows

smtpd_sender_login_maps =ltdrivergtltpathgtsql-sender-login-mailboxescfltdrivergtltpathgtsql-sender-login-aliasescfltdrivergtltpathgtsql-sender-login-mailboxes-extracf

Replace ltdrivergt and ltpathgt by your values

Finally reload postfix

This release also deprecates some internal functions As a result several extensions has been updated to maintain thecompatibility If you enabled the notification service yoursquoll find the list of available updates directly in your Modoboaconsole

For the others here is the list

Name Versionmodoboa-amavis 1010modoboa-postfix-autoreply 117modoboa-radicale 105modoboa-stats 109

Command line shortcut

$ pip install modoboa-amavis==1010$ pip install modoboa-postfix-autoreply==117$ pip install modoboa-radicale==105$ pip install modoboa-stats==109

160

Warning You have to upgrade extensions due to coreUser model attribute change (usergroup to userrole) Oth-erwise you will have an internal error after upgrade In particular modoboa-amavisd modoboa-stats modoboa-postfix-autoreply are concerned

36 Chapter 2 Table of contents

Modoboa Documentation Release 1100

An interesting feature brougth by this version is the capability to make different checks about MX records Forexample Modoboa can query main DNSBL providers for every defined domain With this you will quickly know ifone the domains you manage is listed or not To activate it add the following line to your crontab

30 ltoptional_virtualenv_pathgtpython ltmodoboa_instance_dirgtmanagepy modorarr˓check_mx

The communication with Modoboa public API has been reworked Instead of sending direct synchronous queries (forexample to check new versions) a cron job has been added To activate it add the following line to your crontab

0 ltoptional_virtualenv_pathgtpython ltmodoboa_instance_dirgtmanagepyrarr˓communicate_with_public_api

Please also note that public API now uses TLS so you must update your configuration as follows

MODOBOA_API_URL = httpsapimodoboaorg1

Finally it is now possible to declare additional sender addresses on a per-account basis You need to update your postfixconfiguration in order to use this functionality Just edit the maincf file and change the following parameter

smtpd_sender_login_maps =ltdrivergtetcpostfixsql-sender-login-mailboxescfltdrivergtetcpostfixsql-sender-login-aliasescfltdrivergtetcpostfixsql-sender-login-mailboxes-extracf

150

The API has been greatly improved and a documentation is now available To enable it addrest_framework_swagger to the INSTALLED_APPS variable in settingspy as follows

INSTALLED_APPS = (djangocontribauthdjangocontribcontenttypesdjangocontribsessionsdjangocontribmessagesdjangocontribsitesdjangocontribstaticfilesreversionrest_frameworkauthtokenrest_framework_swagger

)

Then add the following content into settingspy just after the REST_FRAMEWORK variable

SWAGGER_SETTINGS = is_authenticated Falseapi_version 10exclude_namespaces []info

contact contactmodoboacomdescription (Modoboa API requires a valid token)title Modoboa API

Yoursquore done The documentation is now available at the following address

22 Upgrade 37

Modoboa Documentation Release 1100

httpltyour instance addressgtdocsapi

Finally if you find a TEMPLATE_CONTEXT_PROCESSORS variable in your settingspy file make sure it lookslike this

TEMPLATE_CONTEXT_PROCESSORS = global_settingsTEMPLATE_CONTEXT_PROCESSORS + [modoboacorecontext_processorstop_notifications

]

140

Warning Please make sure to use Modoboa 135 with an up-to-date database before an upgrade to 140

Warning Do not follow the regular upgrade procedure for this version

Some extension have been moved back into the main repository The main reason for that is that using Modoboawithout them doesnrsquot make sense

First of all you must rename the following applications listed inside the MODOBOA_APPS variable

Old name New namemodoboa_admin modoboaadminmodoboa_admin_limits modoboalimitsmodoboa_admin_relaydomains modoboarelaydomains

Then apply the following steps

1 Uninstall old extensions

$ pip uninstall modoboa-admin modoboa-admin-limits modoboa-admin-relaydomains

2 Install all extension updates using pip (check the Modoboa gt Information page)

3 Manually migrate database

$ cd ltinstance_dirgt$ python managepy migrate auth$ python managepy migrate admin 0001 --fake$ python managepy migrate admin$ python managepy migrate limits 0001 --fake$ python managepy migrate relaydomains 0001 --fake$ python managepy migrate

4 Finally update static files

$ python managepy collectstatic

This version also introduces a REST API To enable it

1 Add rest_frameworkauthtoken to the INSTALLED_APPS variable

2 Add the following configuration inside settingspy

38 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Rest framework settings

REST_FRAMEWORK = DEFAULT_AUTHENTICATION_CLASSES (

rest_frameworkauthenticationTokenAuthentication)DEFAULT_PERMISSION_CLASSES (

rest_frameworkpermissionsIsAuthenticated)

3 Run the following command

$ python managepy migrate

135

To enhance security Modoboa now checks the strength of user passwords lthttpsgithubcomdstufftdjango-passwordsgt_

To use this feature add the following configuration into the settingspy file

django-passwords

PASSWORD_MIN_LENGTH = 8

PASSWORD_COMPLEXITY = UPPER 1LOWER 1DIGITS 1

132

Modoboa now uses the atomic requests mode to preserve database consistency (reference)

To enable it update the DATABASES variable in settingspy as follows

DATABASES = default

stuff beforeATOMIC_REQUESTS True

amavis

stuff beforeATOMIC_REQUESTS True

130

This release does not bring awesome new features but it is a necessary bridge to the future of Modoboa All extensionsnow have their own git repository and the deploy process has been updated to reflect this change

22 Upgrade 39

Modoboa Documentation Release 1100

Another important update is the use of Django 17 Besides its new features the migration system has been reworkedand is now more robust than before

Before we begin with the procedure here is a table showing old extension names and their new name

Old name New package name New module namemodoboaextensionsadmin modoboa-admin modoboa_adminmodoboaextensionslimits modoboa-admin-limits modoboa_admin_limitsmodoboaextensionspostfix_autoreply modoboa-postfix-autoreply modoboa_postfix_autoreplymodoboaextensionspostfix_relay_domains modoboa-admin-relaydomains modoboa_admin_relaydomainsmodoboaextensionsradicale modoboa-radicale modoboa_radicalemodoboaextensionssievefilters modoboa-sievefilters modoboa_sievefiltersmodoboaextensionsstats modoboa-stats modoboa_statsmodoboaextensionswebmail modoboa-webmail modoboa_webmail

Here are the required steps

1 Install the extensions using pip (look at the second column in the table above)

$ pip install ltthe extensions you wantgt

2 Remove south from INSTALLED_APPS

3 Rename old extension names inside MODOBOA_APPS (look at the third column in the table above)

4 Remove modoboalibmiddlewareExtControlMiddleware from MIDDLEWARE_CLASSES

5 Change DATABASE_ROUTERS to

DATABASE_ROUTERS = [modoboa_amavisdbrouterAmavisRouter]

6 Run the following commands

$ cd ltmodoboa_instance_dirgt$ python managepy migrate

7 Reply yes to the question

8 Run the following commands

$ python managepy load_initial_data$ python managepy collectstatic

9 The cleanup job has been renamed in Django so you have to modify your crontab entry

- 0 0 ltmodoboa_sitegtmanagepy cleanup+ 0 0 ltmodoboa_sitegtmanagepy clearsessions

120

A new notification service let administrators know about new Modoboa versions To activate it you need to updatethe TEMPLATE_CONTEXT_PROCESSORS variable like this

from djangoconf import global_settings

TEMPLATE_CONTEXT_PROCESSORS = global_settingsTEMPLATE_CONTEXT_PROCESSORS + (

(continues on next page)

40 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

modoboacorecontext_processorstop_notifications)

and to define the new MODOBOA_API_URL variable

MODOBOA_API_URL = httpapimodoboaorg1

The location of external static files has changed To use them add a new path to the STATICFILES_DIRS

Additional locations of static filesSTATICFILES_DIRS = (

Put strings here like homehtmlstatic or Cwwwdjangostatic Always use forward slashes even on Windows Dont forget to use absolute paths not relative pathsltpathtomodoboainstalldirgtbower_components

)

Run the following commands to define the hostname of your instance

$ cd ltmodoboa_instance_dirgt$ python managepy set_default_site lthostnamegt

If you plan to use the Radicale extension

1 Add modoboaextensionsradicale to the MODOBOA_APPS variable

2 Run the following commands

$ cd ltmodoboa_instance_dirgt$ python managepy syncdb

Warning You also have to note that the sitestatic directory has moved from ltpath to your sitesdirgt to ltmodoboas root urlgt (itrsquos probably the parent directory) You have to adapt your web serverconfiguration to reflect this change

23 Configuration

231 Online parameters

Modoboa provides online panels to modify internal parameters There are two available levels

bull Application level global parameters define how the application behaves Available at Modoboa gt Parameters

bull User level per user customization Available at User gt Settings gt Preferences

Regardless level parameters are displayed using tabs each tab corresponding to one application

General parameters

The admin application exposes several parameters they are presented below

23 Configuration 41

Modoboa Documentation Release 1100

Name Tab Description Default valueAuthentication type General The backend used for au-

thenticationLocal

Default password scheme General Scheme used to cryptmailbox passwords

crypt

Rounds General Number of rounds (onlyused by sha256cryptand sha512crypt) Mustbe between 1000 and999999999 inclusive

70000

Secret key General A key used to encryptusersrsquo password in ses-sions

random value

Sender address General Email address used tosend notifications

Enable communication General Enable communicationwith Modoboa public API

yes

Check new versions General Automatically checks if anewer version is available

yes

Send statistics General Send statistics to Mod-oboa public API (countersand used extensions)

yes

Top notifications check in-terval

General Interval between two topnotification checks (inseconds)

30

Maximum log record age General The maximum age in daysof a log record

365

Items per page General Number of displayeditems per page

30

Default top redirection General The default redirectionused when no applicationis specified

userprefs

Enable MX checks Admin Check that every domainhas a valid MX record

yes

Valid MXs Admin A list of IP or networkaddress every MX shouldmatch A warning will besent if a record does notrespect this it

Enable DNSBL checks Admin Check every domainagainst major DNSBLproviders

yes

DKIM keys storage direc-tory

AdminPath to a directory where DKIM

generated keys willbe stored

Default DKIM key length Admin The default size (in bits)for new keys

2048

Handle mailboxes onfilesystem

Admin Rename or remove mail-boxes on the filesystemwhen they get renamed orremoved within Modoboa

no

Mailboxes owner Admin The UNIX account whoowns mailboxes on thefilesystem

vmail

Default domain quota Admin Default quota (in MB) ap-plied to freshly createddomains with no valuespecified A value of 0means no quota

0

Automatic accountremoval

Admin When a mailbox is re-moved also remove theassociated account

no

Automatic do-mainmailbox creation

Admin Create a domain and amailbox when an accountis automatically created

yes

42 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Note If you are not familiar with virtual domain hosting you should take a look at postfixrsquos documentation ThisHow to also contains useful information

Note A random secret key will be generated each time the Parameters page is refreshed and until you save parametersat least once

Note Specific LDAP parameters are also available see LDAP authentication

232 Media files

Modoboa uses a specific directory to upload files (ie when the webmail is in use) or to create ones (ex graphical statis-tics) This directory is named media and is located inside modoboarsquos installation directory (called modoboa_sitein this documentation)

To work properly the system user which runs modoboa (www-data apache whatever) must have write access tothis directory

233 Customization

Custom logo

You have the possibility to use a custom logo instead of the default one on the login page

To do so open the settingspy file and add a MODOBOA_CUSTOM_LOGO variable This variable must containthe relative URL of your logo under MEDIA_URL For example

MODOBOA_CUSTOM_LOGO = ospathjoin(MEDIA_URL custom_logopng)

Then copy your logo file into the directory indicated by MEDIA_ROOT

234 Host configuration

Note This section is only relevant when Modoboa handles mailboxes renaming and removal from the filesystem

To manipulate mailboxes on the filesystem you must allow the user who runs Modoboa to execute commands as theuser who owns mailboxes

To do so edit the etcsudoers file and add the following inside

ltuser_that_runs_modoboagt ALL=(ltmailboxes ownergt) NOPASSWD ALL

Replace values between ltgt by the ones you use

23 Configuration 43

Modoboa Documentation Release 1100

235 Time zone and language

Modoboa is available in many languages

To specify the default language to use edit the settingspy file and modify the LANGUAGE_CODE variable

LANGUAGE_CODE = fr or en for english etc

Note Each user has the possibility to define the language he prefers

In the same configuration file specify the timezone to use by modifying the TIME_ZONE variable For example

TIME_ZONE = EuropeParis

236 Sessions management

Modoboa uses Djangorsquos session framework to store per-user information

Few parameters need to be set in the settingspy configuration file to make Modoboa behave as expected

SESSION_EXPIRE_AT_BROWSER_CLOSE = False Default value

This parameter is optional but you must ensure it is set to False (the default value)

The default configuration file provided by the modoboa-adminpy command is properly configured

237 Logging authentication

To trace login attempts to the web interface Modoboa uses python SysLogHandler so you can see them in your syslogauthentication log file (varlogauthlog in most cases)

Depending on your configuration you may have to edit the settingspy file and add lsquoaddressrsquo lsquodevlogrsquo to thelogging section

syslog-auth class logginghandlersSysLogHandlerfacility SysLogHandlerLOG_AUTHaddress devlogformatter syslog

238 External authentication

LDAP

Modoboa supports external LDAP authentication using the following extra components

bull Python LDAP client

bull Django LDAP authentication backend

If you want to use this feature you must first install those components

44 Chapter 2 Table of contents

Modoboa Documentation Release 1100

$ pip install python-ldap django-auth-ldap

Then all you have to do is to modify the settingspy file Add a new authentication backend to the AUTHENTI-CATION_BACKENDS variable like this

AUTHENTICATION_BACKENDS = (modoboalibauthbackendsLDAPBackend modoboalibauthbackendsLDAPSecondaryBackend Useful for a fallback

rarr˓mechanismdjangocontribauthbackendsModelBackend

)

Finally go to Modoboa gt Parameters gt General and set Authentication type to LDAP

From there new parameters will appear to let you configure the way Modoboa should connect to your LDAP serverThey are described just below

Name Description De-faultvalue

Server address The IP address of the DNS name of the LDAP server local-host

Server port The TCP port number used by the LDAP server 389Use a secureconnection

Use an SSLTLS connection to access the LDAP server no

Authenticationmethod

Choose the authentication method to use Directbind

User DN tem-plate (directbind mode)

The template used to construct a userrsquos DN It should contain one placeholder (ie(user)s)

Bind BN The distinguished name to use when binding to the LDAP server Leave empty for ananonymous bind

Bind password The password to use when binding to the LDAP server (with lsquoBind DNrsquo)Search base The distinguished name of the search baseSearch filter An optional filter string (eg lsquo(objectClass=person)rsquo) In order to be valid it must be

enclosed in parentheses(mail=(user)s)

Passwordattribute

The attribute used to store user passwords user-Pass-word

Active Direc-tory

Tell if the LDAP server is an Active Directory one no

Administratorgroups

Members of those LDAP Posix groups will be created ad domain administrators Uselsquorsquo characters to separate groups

Group type The type of group used by your LDAP directory Posix-Group

Groups searchbase

The distinguished name of the search base used to find groups

Do-mainmailboxcreation

Automatically create a domain and a mailbox when a new user is created just after thefirst successful authentication You will generally want to disable this feature whenthe relay domains extension is in use

yes

If you need additional parameters you will find a detailed documentation here

Once the authentication is properly configured the users defined in your LDAP directory will be able to connect to

23 Configuration 45

Modoboa Documentation Release 1100

Modoboa the associated domain and mailboxes will be automatically created if needed

The first time a user connects to Modoboa a local account is created if the LDAP username is a valid email addressBy default this account belongs to the SimpleUsers group and it has a mailbox

To automatically create domain administrators you can use the Administrator groups setting If a LDAP user belongsto one the listed groups its local account will belong to the DomainAdmins group In this case the username is notnecessarily an email address

Users will also be able to update their LDAP password directly from Modoboa

Note Modoboa doesnrsquot provide any synchronization mechanism once a user is registered into the database Anymodification done from the directory to a user account will not be reported to Modoboa (an email address change forexample) Currently the only solution is to manually delete the Modoboa record it will be recreated on the next userlogin

SMTP

It is possible to use an existing SMTP server as an authentication source To enable this feature edit the settingspy file and change the following setting

AUTHENTICATION_BACKENDS = (modoboalibauthbackendsSMTPBackenddjangocontribauthbackendsModelBackend

)

SMTP server location can be customized using the following settings

AUTH_SMTP_SERVER_ADDRESS = localhostAUTH_SMTP_SERVER_PORT = 25AUTH_SMTP_SECURED_MODE = None ssl or starttls are accepted

239 LDAP synchronization

Modoboa can synchronize accounts with an LDAP directory (tested with OpenLDAP) but this feature is not enabledby default To activate it add modoboaldapsync to MODOBOA_APPS in the settingspy file

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboaldapsync

)

and enable it from the admin panel

46 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning Make sure to install additional requirements otherwise it wonrsquot work

The following parameters are available and must be filled

Name Description Defaultvalue

Enable LDAP synchro-nization

Control LDAP synchronization state no

Bind DN The DN of a user with write permission to createupdate accountsBind password The associated passwordAccount DN template The template used to build account DNs (must contain a (user)s

placeholder

2310 Database maintenance

Cleaning the logs table

Modoboa logs administrator specific actions into the database A clean-up script is provided to automatically removeoldest records The maximum log record age can be configured through the online panel

To use it you can setup a cron job to run every night

0 0 ltmodoboa_sitegtmanagepy cleanlogs Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy cleanlogs

Cleaning the session table

Django does not provide automatic purging Therefore itrsquos your job to purge expired sessions on a regular basis

Django provides a sample clean-up script django-adminpy clearsessions That script deletes any sessionin the session table whose expire_date is in the past

For example you could setup a cron job to run this script every night

0 0 ltmodoboa_sitegtmanagepy clearsessions Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy clearsessions

Cleaning inactive accounts

Thanks to Last-login tracking it is now possible to monitor inactive accounts An account is considered inactive if nologin has been recorded for the last 30 days (this value can be changed through the admin panel)

A management command is available to disable or delete inactive accounts For example you could setup a cron jobto run it every night

23 Configuration 47

Modoboa Documentation Release 1100

0 0 ltmodoboa_sitegtmanagepy clean_inactive_accounts Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy clean_inactive_rarr˓accounts

The default behaviour is to disable accounts You can delete them using the --delete option

24 Moving to Modoboa

You have an existing platform and yoursquod like to move to Modoboa the following tools could help you

241 From postfixadmin

A dedicated command allows you to convert an existing postfixadmin database to a Modoboa one Consult the docu-mentation to know more about the process

242 Using CSV files

Modoboa allows you to import any object (domain domain alias mailbox and alias) using a simple CSV file encodedusing UTF8 Each line corresponds to a single object and must respect one of the following format

domain ltname stringgt ltquota integergt ltdefault mailbox quota integergt ltenabledrarr˓booleangtdomainalias ltname stringgt lttargeted domain stringgt ltenabled booleangtrelaydomain ltname stringgt lttarget host stringgt lttarget port integergt ltservicerarr˓stringgt ltenabled booleangt ltverify recipients booleangtaccount ltloginname stringgt ltpassword stringgt ltfirst name stringgt ltlast namerarr˓stringgt ltenabled booleangt ltgroup stringgt ltaddress stringgt ltquota integergt [rarr˓ltdomain stringgt ]alias ltaddress stringgt ltenabled booleangt ltrecipient stringgt

Boolean fields accept the following values true 1 yes y (case insensitive) Any other value will be evaluated asfalse

Warning The order does matter Objects are created sequencially so a domain must be created before itsmailboxes and aliases and a mailbox must created before its alias(es)

To actually import such a file

gt sudo -u ltmodoboa_usergt -igt source ltvirtualenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy modo import ltyour filegt

Available options can be listed using the following command

gt python managepy modo import -h

48 Chapter 2 Table of contents

Modoboa Documentation Release 1100

25 REST API

To ease the integration with external sources (software or other) Modoboa provides a REST API

Every installed instance comes with a ready-to-use API and a documentation You will find them using the followingurl patterns

bull API httplthostnamegtapiv1

bull Documentation httplthostnamegtdocsapi

An example of this documentation is available on the official demo

Using this API requires an authentication and for now only a token based authentication is supported To get a validtoken log-in to your instance with a super administrator go to Settings gt API and activate the API access Press theUpdate button and wait until the page is reloaded the token will be displayed

To make valid API calls every requests you send must embed this token within an Authorization HTTP header likethis

Authorization Token ltYOUR_TOKENgt

and the content type of those requests must be applicationjson

26 How to contribute

Contributions are always welcome If you want to submit a patch please respect the following rules

bull Open a pull request on the appropriate repository

bull Respect PEP8

bull Document your patch and respect PEP 257

bull Add unit tests and make sure the global coverage does not decrease

If all those steps are validated your contribution will generally be integrated

261 Table of contents

25 REST API 49

Modoboa Documentation Release 1100

Useful tips

You would like to work on Modoboa but you donrsquot know where to start Yoursquore at the right place Browse this pageto learn useful tips

Docker

A docker image is available for developers To use it you must install docker and docker-compose first

Then just run the following command

$ docker-compose up

It will start the docker environment and make a Modoboa instance available at httplocalhost8000

If you donrsquot want to use docker or need a more complex development setup go to the next section

Prepare a virtual environment

A virtual environment is a good way to setup a development environment on your machine

To do so run the following commands

$ python3 -m venv ltpathgt$ source ltpathgtbinactivate$ git clone httpsgithubcommodoboamodoboagit$ cd modoboa$ python setuppy develop$ pip install -r dev-requirementstxt

The develop command creates a symbolic link to your local copy so any modification you make will be automati-cally available in your environment no need to copy them

Deploy an instance for development

Warning Make sure to create a database before running this step The format of the database url is also describedin this page

Now that you have a running environment yoursquore ready to deploy a test instance

$ cd ltpathgt$ modoboa-adminpy deploy --dburl defaultltdatabase urlgt --domain localhost --develrarr˓instance$ python managepy runserver

Yoursquore ready to go You should be able to access Modoboa at httplocalhost8000 usingadminpassword as credentials

Manage static files

Modoboa uses bower (thanks to django-bower) to manage its CSS and javascript dependencies

50 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Those dependencies are listed in a file called dev_settingspy located inside the ltpath_to_local_copygtmodoboacore directory

If you want to add a new dependency just complete the BOWER_INSTALLED_APPS parameter and run the followingcommand

$ python managepy bower install

It will download and store the required files into the ltpath_to_local_copygtmodoboabower_components directory

Test your modifications

If you deployed a specific instance for your development needs you can run the tests suite as follows

gt python managepy test modoboacore modoboalib modoboaadmin modoboalimits modoboararr˓relaydomains

Otherwise you can run the tests suite from the repository using tox

Start a basic Modoboa instance

From the repository run the following command to launch a simple instance with a few fixtures

gt tox -e serve

You can use adminpassword to log in

Build the documentation

If you need to modify the documenation and want to see the result you can build it as follows

gt tox -e docgt firefox toxdoctmphtmlindexhtml

FAQ

bower command is missing in managepy

bower command is missing in managepy if you donrsquot use the --devel option of the modoboa-adminpydeploy command

To fix it regenerate your instance or update your settingspy file manually Look at devmode in httpsgithubcomtonioomodoboablobmastermodoboacorecommandstemplatessettingspytpl

Create a new plugin

Introduction

Modoboa offers a plugin API to expand its capabilities The current implementation provides the following possibili-ties

26 How to contribute 51

Modoboa Documentation Release 1100

bull Expand navigation by adding entry points to your plugin inside the GUI

bull Access and modify administrative objects (domains mailboxes etc)

bull Register callback actions for specific events

Plugins are nothing more than Django applications with an extra piece of code that integrates them into Modoboa Themodo_extensionpy file will contain a complete description of the plugin

bull Admin and user parameters

bull Custom menu entries

The communication between both applications is provided by Django signals

The following subsections describe the plugin architecture and explain how you can create your own

The required glue

To create a new plugin just start a new django application like this (into Modoboarsquos directory)

$ python managepy startapp

Then you need to register this application using the provided API Just copypaste the following example into themodo_extensionpy file of the future extension

from modoboacoreextensions import ModoExtension exts_pool

class MyExtension(ModoExtension)My custom Modoboa extension

name = myextlabel = My Extensionversion = 01description = A descriptionurl = myext_root_location optional name is used if not defined

def load(self)This method is called when Modoboa loads available and activated plugins

Declare parameters and register events herepass

def load_initial_data(self)Optional provide initial data for your extension herepass

exts_poolregister_extension(MyExtension)

Once done simply add your extensionrsquos module name to the MODOBOA_APPS variable located inside settingspy Finally run the following commands

$ python managepy migrate$ python managepy load_initial_data$ python managepy collectstatic

52 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Parameters

A plugin can declare its own parameters There are two levels available

bull lsquoGlobalrsquo parameters used to configure the plugin editable inside the Admin gt Settings gt Parameters page

bull lsquoUserrsquo parameters per-user parameters (or preferences) editable inside the Options gt Preferences page

Playing with parameters

Parameters are defined using Django forms and Modoboa adds two special forms you can inherit depending on thelevel of parameter(s) you want to add

bull modoboaparametersformsAdminParametersForm for general parameters

bull modoboaparametersformsUserParametersForm for user parameters

To register new parameters add the following line into the load method of your plugin class

from modoboaparameters import tools as param_toolsparam_toolsregistryadd(

LEVEL YourForm ugettext_lazy(Title))

Replace LEVEL by global or user

Custom role permissions

Modoboa uses Djangorsquos internal permission system Administrative roles are nothing more than groups (Groupinstances)

An extension can add new permissions to a group by listening to the extra_role_permissions signal Here isan example

from djangodispatch import receiverfrom modoboacore import signals as core_signals

PERMISSIONS = Resellers [

(relaydomains relaydomain add_relaydomain)(relaydomains relaydomain change_relaydomain)(relaydomains relaydomain delete_relaydomain)(relaydomains service add_service)(relaydomains service change_service)(relaydomains service delete_service)

]

receiver(core_signalsextra_role_permissions)def extra_role_permissions(sender role kwargs)

Add permissions to the Resellers groupreturn constantsPERMISSIONSget(role [])

Extending admin forms

The forms used to edit objects (account domain etc) through the admin panel are composed of tabs You can extendthem (ie add new tabs) in a pretty easy way thanks to custom signals

26 How to contribute 53

Modoboa Documentation Release 1100

Account

To add a new tab to the account edition form define new listeners (handlers) for the following signals

bull modoboaadminsignalsextra_account_forms

bull modoboaadminsignalsget_account_form_instances

bull modoboaadminsignalscheck_extra_account_form (optional)

Example

from djangodispatch import receiverfrom modoboaadmin import signals as admin_signals

receiver(admin_signalsextra_account_forms)def extra_account_form(sender user account kwargs)

return [id tabid title Title cls MyFormClass

]

receiver(admin_signalsget_account_form_instances)def fill_my_tab(sender user account kwargs)

return id my_instance

Domain

To add a new tab to the domain edition form define new listeners (handlers) for the following signals

bull modoboaadminsignalsextra_domain_forms

bull modoboaadminsignalsget_domain_form_instances

Example

from djangodispatch import receiverfrom modoboaadmin import signals as admin_signals

receiver(admin_signalsextra_domain_forms)def extra_account_form(sender user domain kwargs)

return [id tabid title Title cls MyFormClass

]

receiver(admin_signalsget_domain_form_instances)def fill_my_tab(sender user domain kwargs)

return id my_instance

27 Contributors

bull Antidot

bull Bearstech

bull CAP-REL

54 Chapter 2 Table of contents

Modoboa Documentation Release 1100

bull Dalnix

27 Contributors 55

  • Overview
  • Table of contents
Page 11: Modoboa Documentation

Modoboa Documentation Release 1100

CREATE DATABASE modoboaCREATE USER modoboalocalhost IDENTIFIED BY my-strong-password-hereGRANT ALL PRIVILEGES ON modoboa TO modoboalocalhost

Deploy an instance

modoboa-adminpy is a command line tool that lets you deploy a ready-to-use Modoboa site To create a newinstance into instance you just have to run the following command

(env)$ modoboa-adminpy deploy instance --collectstatic --domain lthostname of your servergt --dburl defaultltdatabase urlgt

Note You can install additional extensions during the deploy process To do so use the --extensions op-tion which accepts a list of names as argument (--extensions ext1 ext2 ) If you want to install allextensions just use the all keyword like this --extensions all

If you choose to install extensions one at a time you will have to add their names in settingspy to MODOBOA_APPSAlso ensure that you have the line from modoboa_amavissettings import at the end of this file

The list of available extensions can be found on the index page Instructions to install them are available on eachextensions page

Note You can specify more than one database connection using the --dburl option Multiple connections aredifferentiated by a prefix

The primary connection must use the default prefix (as shown in the example above) For the amavis exten-sion use the amavis prefix For example --dburl defaultltdatabase urlgt amavisltdatabaseurlgt

A database url should meet the following syntax ltmysql|postgresgt[userpass][hostport]dbname OR sqlitefullpathtoyourdatabasefilesqlite

The command will ask you a few questions answer them and yoursquore done

If you need a silent installation (eg if yoursquore using Salt-Stack Ansible or whatever) itrsquos possible to supply thedatabase credentials as command line arguments

You can consult the complete option list by running the following command

(env)$ modoboa-adminpy help deploy

Cron jobs

A few recurring jobs must be configured to make Modoboa works as expected

Create a new file for example etccrondmodoboa and put the following content inside

Modoboa specific cron jobsPYTHON=ltpath to Python binary inside the virtual environmentgtINSTANCE=ltpath to Modoboa instancegt

(continues on next page)

8 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

Operations on mailboxes

vmail $PYTHON $INSTANCEmanagepy handle_mailbox_operations

Generate DKIM keys (they will belong to the user running this job)

root umask 077 ampamp $PYTHON $INSTANCEmanagepy modo manage_dkim_rarr˓keys

Sessions table cleanup0 0 modoboa $PYTHON $INSTANCEmanagepy clearsessions Logs table cleanup0 0 modoboa $PYTHON $INSTANCEmanagepy cleanlogs DNSBL checks

30 modoboa $PYTHON $INSTANCEmanagepy modo check_mx Public API communication0 modoboa $PYTHON $INSTANCEmanagepy communicate_with_public_api

Policy daemon

Modoboa comes with a built-in Policy Daemon for Postfix Current features are

bull Define daily sending limits for domains andor accounts

A redis server is required to run this new daemon

You can launch it manually using the following command

(env)gt python managepy policy_daemon

But we recommend an automatic start using systemd or supervisor Here is a configuration example forsupervisor

[programpolicyd]autostart=trueautorestart=truecommand=srvmodoboaenvbinpython srvmodoboainstancemanagepy policy_daemondirectory=srvmodoboaredirect_stderr=trueuser=modoboanumprocs=1

It will listen by default on 127001 and port 9999 The policy daemon wonrsquot do anything unless you tell postfixto use it

Now you can continue to the Web server section

Web server

Note The following instructions are meant to help you get your site up and running quickly However it is notpossible for the people contributing documentation to Modoboa to test every single combination of web server wsgiserver distribution etc So it is possible that your installation of uwsgi or nginx or Apache or what-have-you worksdifferently Keep this in mind

21 Installation 9

Modoboa Documentation Release 1100

Apache2

First make sure that mod_wsgi is installed on your server

Create a new virtualhost in your Apache configuration and put the following content inside

ltVirtualHost 80gtServerName ltyour valuegtDocumentRoot ltmodoboa_instance_pathgt

Alias media ltmodoboa_instance_pathgtmedialtDirectory ltmodoboa_instance_pathgtmediagtOrder denyallowAllow from all

ltDirectorygt

Alias sitestatic ltmodoboa_instance_pathgtsitestaticltDirectory ltmodoboa_instance_pathgtsitestaticgtOrder denyallowAllow from all

ltDirectorygt

WSGIScriptAlias ltmodoboa_instance_pathgtltinstance_namegtwsgipy

Pass Authorization header to enable API usageWSGIPassAuthorization On

ltVirtualHostgt

This is just one possible configuration

To use mod_wsgi daemon mode add the two following directives just under WSGIScriptAlias

WSGIDaemonProcess examplecom python-path=ltmodoboa_instancegtltvirtualenv pathgtlibrarr˓python37site-packagesWSGIProcessGroup examplecom

Replace values between ltgt with yours If you donrsquot use a virtualenv just remove the last part of theWSGIDaemonProcess directive

Note You will certainly need more configuration in order to launch Apache

Now you can go the Dovecot section to continue the installation

Nginx

This section covers two different ways of running Modoboa behind Nginx using a WSGI application server Choosethe one you prefer between Green Unicorn or uWSGI

In both cases yoursquoll need to download and install nginx

Green Unicorn

Firstly Download and install gunicorn Then use the following sample gunicorn configuration (create a new filenamed gunicornconfpy inside Modoboarsquos root dir)

10 Chapter 2 Table of contents

Modoboa Documentation Release 1100

backlog = 2048bind = unixvarrungunicornmodoboasockpidfile = varrungunicornmodoboapiddaemon = Truedebug = Falseworkers = 2logfile = varloggunicornmodoboalogloglevel = info

To start gunicorn execute the following commands

$ cd ltmodoboa dirgt$ gunicorn -c gunicornconfpy ltmodoboa dirgtwsgiapplication

Now the nginx part Just create a new virtual host and use the following configuration

upstream modoboa server unixvarrungunicornmodoboasock fail_timeout=0

server listen 443 sslssl onkeepalive_timeout 70

server_name lthost fqdngtroot ltmodoboa_instance_pathgt

access_log varlognginxlthost fqdngtaccesslogerror_log varlognginxlthost fqdngterrorlog

ssl_certificate ltssl certificate for your sitegtssl_certificate_key ltssl certificate key for your sitegt

location sitestatic autoindex on

location media autoindex on

location proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_forproxy_set_header Host $http_hostproxy_redirect offproxy_set_header X-Forwarded-Protocol sslproxy_pass httpmodoboa

If you do not plan to use SSL then change the listen directive to listen 80 and delete each of the followingdirectives

ssl onkeepalive_timeout 70ssl_certificate ltssl certificate for your sitegt

(continues on next page)

21 Installation 11

Modoboa Documentation Release 1100

(continued from previous page)

ssl_certificate_key ltssl certificate key for your sitegtproxy_set_header X-Forwarded-Protocol ssl

If you do plan to use SSL yoursquoll have to generate a certificate and a key This article contains information about howto do it

Paste this content to your configuration (replace values between ltgt with yours) and restart nginx

Now you can go the Dovecot section to continue the installation

uWSGI

The following setup is meant to get you started quickly You should read the documentation of both nginx and uwsgito understand how to optimize their configuration for your site

The Django documentation includes the following warning regarding uwsgi

Warning Use uwsgi 126 or newer If you do not you will run into problems Modoboa will fail in obscureways

To use this setup first download and install uwsgi

Here is a sample nginx configuration

server listen 443 sslssl onkeepalive_timeout 70

server_name lthost fqdngtroot ltmodoboas settings dirgt

ssl_certificate ltssl certificate for your sitegtssl_certificate_key ltssl certificate key for your sitegt

access_log varlognginxlthost fqdngtaccesslogerror_log varlognginxlthost fqdngterrorlog

location ltmodoboas root urlgtsitestatic autoindex onalias ltlocation of sitestatic on your file systemgt

Whether or not Modoboa uses a media directory depends on how you configured Modoboa It does not hurt to have thislocation ltmodoboas root urlgtmedia

autoindex onalias ltlocation of media on your file systemgt

This denies access to any file that begins with ht Apaches htaccess and htpasswd are such files A Modoboa installed from scratch would not contain any such files but you never know what the future holds

(continues on next page)

12 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

location ~ ht deny all

location ltmodobas root urlgt include uwsgi_paramsuwsgi_pass ltuwsgi portgtuwsgi_param UWSGI_SCRIPT ltmodoboa instance namegtwsgiapplicationuwsgi_param UWSGI_SCHEME https

ltmodoboa instance namegt must be replaced by the value you used when you deployed your instance

If you do not plan to use SSL then change the listen directive to listen 80 and delete each of the followingdirectives

ssl onkeepalive_timeout 70ssl_certificate ltssl certificate for your sitegtssl_certificate_key ltssl certificate key for your sitegtuwsgi_param UWSGI_SCHEME https

If you do plan to use SSL yoursquoll have to generate a certificate and a key This article contains information about howto do it

Make sure to replace the ltgt in the sample configuration with appropriate values Here are some explanations forthe cases that may not be completely self-explanatory

ltmodoboas settings dirgt Where Modoboarsquos settingspy resides This is also where thesitestatic and media directories reside

ltmodoboas root urlgt This is the URL which will be the root of your Modoboa site at your domain For in-stance if your Modoboa installation is reachable at at httpsfoomodoboa then ltmodoboas rooturlgt is modoboa In this case you probably also have to set the alias directives to point to where Mod-oboarsquos sitestatic and media directories are because otherwise nginx wonrsquot be able to find them

If Modoboa is at the root of your domain then ltmodoboa root urlgt is an empty string and can be deletedfrom the configuration above In this case you probably do not need the alias directives

ltuwsgi portgt The location where uwsig is listening It could be a unix domain socket or an addressport combi-nation Ubuntu configures uwsgi so that the port is

unixrunuwsgiappltapp namegtsocket

where ltapp namegt is the name of the application

Your uwsgi configuration should be

[uwsgi] Not needed when using uwsgi from pip plugins = pythonchdir = ltmodoboas top dirgtmodule = ltnamegtwsgiapplicationmaster = trueharakiri = 60processes = 4vhost = trueno-default-app = true

21 Installation 13

Modoboa Documentation Release 1100

The plugins directive should be turned on if you use a uwsgi installation that requires it If uwsgi was installed frompip it does not require it In the configuration above

ltmodoboas top dirgt The directory where managepy resides This directory is the parent of ltmodoboassettings dirgt

ltnamegt The name that you passed to modoboa-adminpy deploy when you created your Modoboa instance

Now you can go the Dovecot section to continue the installation

Dovecot

Modoboa requires Dovecot 2+ to work so the following documentation is suitable for this combination

In this section we assume dovecotrsquos configuration resides in etcdovecot all pathes will be relative to thisdirectory

Mailboxes

First edit the confd10-mailconf and set the mail_location variable

maildirmail_location = maildir~maildir

Then edit the inbox namespace and add the following lines

inbox = yes

mailbox Drafts auto = subscribespecial_use = Drafts

mailbox Junk

auto = subscribespecial_use = Junk

mailbox Sent

auto = subscribespecial_use = Sent

mailbox Trash

auto = subscribespecial_use = Trash

With dovecot 21+ it ensures all the special mailboxes will be automaticaly created for new accounts

For dovecot 20 and older use the autocreate plugin

Operations on the file system

14 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning Modoboa needs to access the dovecot binary to check its version To find the binary path weuse the which command first and then try known locations (usrsbindovecot and usrlocalsbindovecot) If you installed dovecot in a custom location please tell us where the binary is by usingthe DOVECOT_LOOKUP_PATH setting (see settingspy)

Three operation types are considered

1 Mailbox creation

2 Mailbox renaming

3 Mailbox deletion

The first one is managed by Dovecot The last two ones may be managed by Modoboa if it can access the file systemwhere the mailboxes are stored (see General parameters to activate this feature)

Those operations are treated asynchronously by a cron script For example when you rename an e-mail addressthrough the web UI the associated mailbox on the file system is not modified directly Instead of that a renameorder is created for this mailbox The mailbox will be considered unavailable until the order is executed (see Postfixconfiguration)

Edit the crontab of the user who owns the mailboxes on the file system

$ crontab -u ltusergt -e

And add the following line inside

python ltmodoboa_sitegtmanagepy handle_mailbox_operations

Warning The cron script must be executed by the system user owning the mailboxes

Warning The user running the cron script must have access to the settingspy file of the modoboa instance

The result of each order is recorded into Modoboarsquos log Go to Modoboa gt Logs to consult them

Authentication

To make the authentication work edit the confd10-authconf and uncomment the following line at the end

include auth-systemconfextinclude auth-sqlconfextinclude auth-ldapconfextinclude auth-passwdfileconfextinclude auth-checkpasswordconfextinclude auth-vpopmailconfextinclude auth-staticconfext

Then edit the confdauth-sqlconfext file and add the following content inside

passdb sql driver = sql Path for SQL configuration file see example-configdovecot-sqlconfext

(continues on next page)

21 Installation 15

Modoboa Documentation Release 1100

(continued from previous page)

args = etcdovecotdovecot-sqlconfext

userdb sql driver = sqlargs = etcdovecotdovecot-sqlconfext

Make sure to activate only one backend (per type) inside your configuration (just comment the other ones)

Edit the dovecot-sqlconfext and modify the configuration according to your database engine

MySQL users

driver = mysql

connect = host=ltmysqld socketgt dbname=ltdatabasegt user=ltusergt password=ltpasswordgt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user WHERE email=Lu andrarr˓is_active=1

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid concat(bytes= mbquota M) AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

PostgreSQL users

driver = pgsql

connect = host=ltpostgres socketgt dbname=ltdatabasegt user=ltusergt password=ltpasswordgt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user u INNER JOIN admin_rarr˓mailbox mb ON uid=mbuser_id INNER JOIN admin_domain dom ON mbdomain_id=domidrarr˓WHERE uemail=Lu AND uis_active AND domenabled

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid bytes= || mbquota || M AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

16 Chapter 2 Table of contents

Modoboa Documentation Release 1100

SQLite users

driver = sqlite

connect = ltpath to the sqlite db filegt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user u INNER JOIN admin_rarr˓mailbox mb ON uid=mbuser_id INNER JOIN admin_domain dom ON mbdomain_id=domidrarr˓WHERE uemail=Lu AND uis_active=1 AND domenabled=1

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid (bytes= || mbquota || M) AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

Note Replace values between ltgt with yours

LDAP

To make the LDAP authentication work edit the confd10-authconf and uncomment the following line atthe end

include auth-ldapconfext

Then edit the confdauth-ldapconfext and edit the passdb section as following You should comment theuserdb section which will be managed by SQL with modoboa database

passdb driver = ldap

Path for LDAP configuration file see example-configdovecot-ldapconfextargs = etcdovecotdovecot-ldapconfext

userdb driver = ldapargs = etcdovecotdovecot-ldapconfext

Default fields can be used to specify defaults that LDAP may overridedefault_fields = home=homevirtualu

Your own dovecot LDAP configuration file is now etcdovecotdovecot-ldapconfext You can addyour default LDAP conf in it following the official documentation

Synchronize dovecot LDAP conf with modoboa LDAP conf

To make dovecot LDAP configuration synchronized with modoboa LDAP configuration you should create a dedicateddovecot conf file At the end of your dovecot configuration file (dovecot-ldapconfext) add the following

21 Installation 17

Modoboa Documentation Release 1100

line

include_try dovecot-modoboaconfext

Then set modoboa parameter Enable Dovecot LDAP sync to Yes Then set the Dovecot LDAP config file following theprevious step (etcdovecotdovecot-modoboaconfext in the example)

The last step is to add the command update_dovecot_conf to the cron job of modoboa Then each time your modoboaLDAP configuration is updated your dovecot LDAP configuration will also be

LMTP

Local Mail Transport Protocol is used to let Postfix deliver messages to Dovecot

First make sure the protocol is activated by looking at the protocols setting (generally inside dovecotconf)It should be similar to the following example

protocols = imap pop3 lmtp

Then open the confd10-masterconf look for lmtp service definition and add the following content inside

service lmtp stuff beforeunix_listener varspoolpostfixprivatedovecot-lmtp mode = 0600user = postfixgroup = postfix

stuff after

We assume here that Postfix is chrooted within varspoolpostfix

Finally open the confd20-lmtpconf and modify it as follows

protocol lmtp postmaster_address = postmasterltdomaingtmail_plugins = $mail_plugins quota sieve

Replace ltdomaingt by the appropriate value

Note If you donrsquot plan to apply quota or to use filters just adapt the content of the mail_plugins setting

Quota

Modoboa lets adminstrators define per-domain andor per-account limits (quota) It also lists the current quota usageof each account Those features require Dovecot to be configured in a specific way

Inside confd10-mailconf add the quota plugin to the default activated ones

mail_plugins = quota

Inside confd10-masterconf update the dict service to set proper permissions

18 Chapter 2 Table of contents

Modoboa Documentation Release 1100

service dict If dict proxy is used mail processes should have access to its socket For example mode=0660 group=vmail and global mail_access_groups=vmailunix_listener dict mode = 0600user = ltuser owning mailboxesgtgroup =

Inside confd20-imapconf activate the imap_quota plugin

protocol imap

mail_plugins = $mail_plugins imap_quota

Inside dovecotconf activate the quota SQL dictionary backend

dict quota = ltdrivergtetcdovecotdovecot-dict-sqlconfext

Inside confd90-quotaconf activate the quota dictionary backend

plugin quota = dictUser quotaproxyquota

It will tell Dovecot to keep quota usage in the SQL dictionary

Finally edit the dovecot-dict-sqlconfext file and put the following content inside

connect = host=ltdb hostgt dbname=ltdb namegt user=ltdb usergt password=ltpasswordgt SQLite users connect = pathtothedatabasedb

map pattern = privquotastoragetable = admin_quotausername_field = usernamevalue_field = bytes

map

pattern = privquotamessagestable = admin_quotausername_field = usernamevalue_field = messages

PostgreSQL users

21 Installation 19

Modoboa Documentation Release 1100

Database schema update

The admin_quota table is created by Django but unfortunately it doesnrsquot support DEFAULT constraints (it onlysimulates them when the ORM is used) As PostgreSQL is a bit strict about constraint violations you must executethe following query manually

db=gt ALTER TABLE admin_quota ALTER COLUMN bytes SET DEFAULT 0db=gt ALTER TABLE admin_quota ALTER COLUMN messages SET DEFAULT 0

Trigger

As indicated on Dovecotrsquos wiki you need a trigger to properly update the quota

A working copy of this trigger is available on Github

Download this file and copy it on the server running postgres Then execute the following commands

$ su - postgres$ psql [modoboa database] lt pathtomodoboa_postgres_triggersql$ exit

Replace [modoboa database] by the appropriate value

Forcing recalculation

For existing installations Dovecot (gt 2) offers a command to recalculate the current quota usages For example if youwant to update all usages run the following command

$ doveadm quota recalc -A

Be carefull it can take a while to execute

ManageSieveSieve

Modoboa lets users define filtering rules from the web interface To do so it requires ManageSieve to be activated onyour server

Inside confd20-managesieveconf make sure the following lines are uncommented

protocols = $protocols sieve

service managesieve-login

service managesieve

protocol sieve

20 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Messages filtering using Sieve is done by the LDA

Inside confd15-ldaconf activate the sieve plugin like this

protocol lda Space separated list of plugins to load (default is global mail_plugins)mail_plugins = $mail_plugins sieve

Finally configure the sieve plugin by editing the confd90-sieveconf file Put the follwing caontent inside

plugin Location of the active script When ManageSieve is used this is actually a symlink pointing to the active script in the sieve storage directorysieve = ~dovecotsieve

The path to the directory where the personal Sieve scripts are stored For ManageSieve this is where the uploaded scripts are storedsieve_dir = ~sieve

Restart Dovecot

Now you can go to the Postfix section to finish the installation

Last-login tracking

To update the last_login attribute of an account after a succesful IMAP or POP3 login you can configure apost-login script

Open confd10-masterconf add the following configuration (imap and pop3 services are already definedyou just need to update them)

service imap executable = imap postlogin

service pop3 executable = pop3 postlogin

service postlogin executable = script-login usrlocalbinpostloginshuser = modoboaunix_listener postlogin

Then you must create a script named usrlocalbinpostloginsh According to your database enginethe content will differ

PostgreSQL

21 Installation 21

Modoboa Documentation Release 1100

binsh

psql -c UPDATE core_user SET last_login=now() WHERE username=$USER gt devnull

exec $

MySQL

binsh

DBNAME=XXXDBUSER=XXXDBPASSWORD=XXX

echo UPDATE core_user SET last_login=now() WHERE username=$USER | mysql -urarr˓$DBUSER -p$DBPASSWORD $DBNAME

exec $

Postfix

This section gives an example about building a simple virtual hosting configuration with Postfix Refer to the officialdocumentation for more explanation

Map files

You first need to create configuration files (or map files) that will be used by Postfix to lookup into Modoboa tables

To automaticaly generate the requested map files and store them in a directory run the following command

gt cd ltmodoboa_instance_pathgtgt python managepy generate_postfix_maps --destdir ltdirectorygt

ltdirectorygt is the directory where the files will be stored Answer the few questions and yoursquore done

Configuration

Use the following configuration in the etcpostfixmaincf file (this is just one possible configuration)

Stuff beforevirtual_transport = lmtpunixprivatedovecot-lmtp

virtual_mailbox_domains = ltdrivergtetcpostfixsql-domainscfvirtual_alias_domains = ltdrivergtetcpostfixsql-domain-aliasescfvirtual_alias_maps = ltdrivergtetcpostfixsql-aliasescf

relay_domains = ltdrivergtetcpostfixsql-relaydomainscftransport_maps =

ltdrivergtetcpostfixsql-transportcfltdrivergtetcpostfixsql-spliteddomains-transportcf

(continues on next page)

22 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

smtpd_recipient_restrictions = check_recipient_access

ltdrivergtetcpostfixsql-maintaincfltdrivergtetcpostfixsql-relay-recipient-verificationcf

permit_mynetworksreject_unauth_destinationreject_unverified_recipient

smtpd_sender_login_maps = ltdrivergtetcpostfixsql-sender-login-mapcf

smtpd_sender_restrictions =reject_sender_login_mismatch

Stuff after

Replace ltdrivergt by the name of the database you use

Restart Postfix

Policy daemon

If you want to enable the built-in policy daemon add the following content to the etcpostfixmaincf file

smtpd_recipient_restrictions = check_policy_service inet1270019999

And reload postfix

Note The check_policy_service line must be placed before the permit_mynetworks one otherwise thedaemon wonrsquot be called

OpenDKIM

Modoboa can generate DKIM keys for the hosted domains but it wonrsquot sign or check messages To do that you needa dedicated software like OpenDKIM

Note The cron job in charge of creating DKIM keys must be run using the same user than OpenDKIM (ie opendkimin most cases)

Database

Since keys related information is stored in Modoboarsquos database you need to tell OpenDKIM how it can access it

First make sure to install the required additional packages on your system (libopendbx1- on debian baseddistributions or opendbx- on CentOS the complete name depends on your database engine)

Then insert the following SQL view into Modoboarsquos database

21 Installation 23

Modoboa Documentation Release 1100

PostgreSQL

CREATE OR REPLACE VIEW dkim AS (SELECT id name as domain_name dkim_private_key_path AS private_key_path

dkim_key_selector AS selectorFROM admin_domain WHERE enable_dkim

)

MySQLMariaDB

CREATE OR REPLACE VIEW dkim AS (SELECT id name as domain_name dkim_private_key_path AS private_key_path

dkim_key_selector AS selectorFROM admin_domain WHERE enable_dkim=1

)

Configuration

You should find OpenDKIMrsquos configuration file at etcopendkimconf

Add the following content to it

KeyTable dsnltdrivergtltusergtltpasswordgtltdb hostgtltdb namegttable=dkimrarr˓keycol=iddatacol=domain_nameselectorprivate_key_pathSigningTable dsnltdrivergtltusergtltpasswordgtltdb hostgtltdb namegttable=dkimrarr˓keycol=domain_namedatacol=idSocket inet12345localhost

Replace values between ltgt by yours Accepted values for driver are pgsql or mysql Make sure the user youspecify has read permission on the view created previously

If you run a debian based system make sure to adjust the following setting in the etcdefaultopendkim file

SOCKET=inet12345localhost

Eventually reload OpenDKIM

Postfix integration

Add the following lines to the etcpostfixmaincf file

smtpd_milters = inet12700112345non_smtpd_milters = inet12700112345milter_default_action = acceptmilter_content_timeout = 30s

and reload postfix

Extensions

Only few commands are needed to add a new extension to your setup

24 Chapter 2 Table of contents

Modoboa Documentation Release 1100

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install ltEXTENSIONgt==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Then restart your web server

22 Upgrade

221 Modoboa

Warning The new version you are going to install may need to modify your database Before you start makesure to backup everything

Most of the time upgrading your installation to a newer Modoboa version only requires a few actions In every caseyou will need to apply the general procedure first and then check if the version you are installing requires specificactions

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install modoboa==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Once done check if the version you are installing requires Specific instructions

Finally restart your web server

Sometimes you might need to upgrade postfix map files too To do so just run the generate_postfix_mapscommand on the same directory than the one used for installation (etcpostfix by default)

Make sure to use root privileges and run the following command

gt python managepy generate_postfix_maps --destdir ltdirectorygt

Then reload postfix

22 Upgrade 25

Modoboa Documentation Release 1100

222 Extensions

If a new version is available for an extension yoursquore using it is recommanded to install it Upgrading an extensions ispretty and the procedure is almost the same than the one used for Modoboa

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install ltEXTENSIONgt==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Finally restart your web server

It is a generic upgrade procedure which will be enough most of the time but it is generally a good idea to check theassociated documentation

223 Rebuild Virtual Environment

Sometimes when upgrading your Operating System (eg from Ubuntu 1704 to Ubuntu 1710) your virtual environmentrunning modoboa can get corrupted Your first response will be to panic but fear not The solution is in this document

First things first

Recover your database password

You will need to recover your database password (if using mysql or postgresql) You will find this in etcpostfixsql-aliasescf or any file with sql-cf in the etcpostfix directory

Make note of this as you will need it when reconfiguring modoboa

Reinstall Modoboa

Start out by backup up your modoboa settings file located in the modoboa instance directory (srvmodoboainstanceinstancesettingspy if you used the default installer configuration) This contains your currentconfiguration

Next you want to remove all current modoboa files

After doing this follow the manual installation instructions for Modoboa only as everything should be working prop-erly

After this completes simply restore your backed up settings file to srvinstanceinstancesettingspy(if you used installer default configuration) You will then need to reinstall your extensions

You can find which plugins you had in your settingspy file under the MODOBOA_APPS variable

Instructions to install extensions can also be found here

Once you have completed this step you will need to run the following commands

26 Chapter 2 Table of contents

Modoboa Documentation Release 1100

gt (env) $ cd ltinstance_dirgtgt (env) $ python managepy migrategt (env) $ python managepy collectstatic

You will then see a message similar to

You have requested to collect static files at the destinationlocation as specified in your settings

srvmodoboainstancesitestatic

This will overwrite existing filesAre you sure you want to do this

Type yes to continue or no to cancel

You will want to answer yes here then simply restart the uwsgi process with service uwsgi restart andyou should be up and running again

Simply log into your modoboa web panel and verify that your extensions and webmail box is working

224 Information

Rebuild instructions from httpshelppythonanywherecompagesRebuildingVirtualenvs

225 Specific instructions

1160

A new policy daemon has been added

Make sure to have a Redis instance running on your server

Add modoboapolicyd to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboapolicyd

)

Add the following settings to your settingspy file

REDIS_HOST = ltIP or hostname heregtREDIS_PORT = 6379REDIS_QUOTA_DB = 0REDIS_URL = redisformat(REDIS_HOST REDIS_PORT REDIS_QUOTA_DB)

Once done you can start the policy daemon using the following commands

22 Upgrade 27

Modoboa Documentation Release 1100

gt python managepy policy_daemon

Donrsquot forget to configure _policyd_config if you want to use this feature

The modoboa-stats plugin has been merged into the core

Add modoboamaillog to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboapolicydmodoboamaillog

)

And remove any reference to modoboa_stats in this same variable

1150

This version drops Python 2 support so donrsquot forget to update all the extensions you use

Warning If you upgrade an existing python 2 installation you will need to create a new Python 3 virtualenvironment You can remove the existing virtual environment and replace it by the new one so you wonrsquot have tomodify your configuration files

Add the following new setting

DISABLE_DASHBOARD_EXTERNAL_QUERIES = False

Reload uwsgigunicornapache depending on your setup

Finally Make sure to use root privileges and run the following command

gt python managepy generate_postfix_maps --destdir ltdirectorygt

Then reload postfix

1140

This release introduces an optional LDAP synchronization process If you want to use it please follow the dedicatedprocedure

1131

Upgrade postfix maps files as follows

28 Chapter 2 Table of contents

Modoboa Documentation Release 1100

gt python managepy generate_postfix_maps --destdir ltpathgt --force-overwrite

1130

Add modoboadnstools to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstools

)

Add the following new settings

CSRF_COOKIE_SECURE = TrueSESSION_COOKIE_SECURE = True

modoboa-postfix-autoreply 150

Edit the etcpostfixmaincf file and remove the sql-autoreplies-transportcf map from thetransport_maps if present Remove the corresponding proxy_read_maps entry if relevant

Reload postfix

1100

Warning Upgrade installed extensions BEFORE running check or migrate commands

Upgrade all your installed plugins to the following versions

Warning If you use the amavis plugin make sure to include its configuration as follows into settingspy

from modoboa_amavis import settings as modoboa_amavis_settingsmodoboa_amavis_settingsapply(globals())

22 Upgrade 29

Modoboa Documentation Release 1100

Name Versionmodoboa-amavis 120modoboa-contacts 050modoboa-dmarc 110modoboa-imap-migration 120modoboa-pdfcredentials 130modoboa-postfix-autoreply 140modoboa-radicale 120modoboa-sievefilters 140modoboa-stats 140modoboa-webmail 140

Edit the settingspy file and apply the following modifications

Add modoboatransport to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparameters

)

Replace the following line

MIDDLEWARE_CLASSES = (

by

MIDDLEWARE = (

Update postfix map files as follows

gt rm -f ltpathgtmodoboa-postfix-mapschkgt python managepy generate_postfix_maps --force --destdir ltpathgt

Then modify postfixrsquos configuration as follows

smtpd_sender_login_maps =ltdrivergtltpathgtsql-sender-login-mapcf

transport_maps =ltdrivergtltpathgtsql-transportcfltdrivergtltpathgtsql-spliteddomains-transportcf other map files

Replace ltdrivergt and ltpathgt by your values

If transport_maps contains sql-relaydomains-transportcf remove it

30 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning If you make use of postfixrsquos proxymap server you must also update the proxy_read_maps setting

Reload postfix

Add the following cron job in order to generate DKIM keys

Generate DKIM keys (they will belong to the user running this job)

root $PYTHON $INSTANCEmanagepy modorarr˓manage_dkim_keys

190

If you want to manage inactive accounts look at Cleaning inactive accounts

183

Edit the settingspy file and replace the following line

BASE_DIR = ospathdirname(ospathdirname(__file__))

by

BASE_DIR = ospathrealpath(ospathdirname(ospathdirname(__file__)))

180

Modoboa now relies on Djangorsquos builtin password validation system to validate user passwords instead ofdjango-passwords

Remove django-passwords from your system

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt pip uninstall django-passwords

Edit the settingspy file and remove the following content

django-passwords

PASSWORD_MIN_LENGTH = 8

PASSWORD_COMPLEXITY = UPPER 1LOWER 1DIGITS 1

Add the following lines

Password validation rulesAUTH_PASSWORD_VALIDATORS = [

NAME djangocontribauthpassword_validation

rarr˓UserAttributeSimilarityValidator (continues on next page)

22 Upgrade 31

Modoboa Documentation Release 1100

(continued from previous page)

NAME djangocontribauthpassword_validationMinimumLengthValidator

NAME djangocontribauthpassword_validationCommonPasswordValidator

NAME djangocontribauthpassword_validationNumericPasswordValidator

NAME modoboacorepassword_validationComplexityValidatorOPTIONS

upper 1lower 1digits 1specials 0

]

172

API documentation has evolved (because of the upgrade to Django Rest Framework 36) and CKeditor is now embed-ded by default (thanks to the django-ckeditor package) Some configuration changes are required

Edit your settingspy file and apply the following modifications

bull Update the INSTALLED_APPS variable as follows

INSTALLED_APPS = (djangocontribauthdjangocontribcontenttypesdjangocontribsessionsdjangocontribmessagesdjangocontribsitesdjangocontribstaticfilesreversionckeditorckeditor_uploaderrest_frameworkrest_frameworkauthtoken

)

bull Update the REST_FRAMEWORK variable as follows

REST_FRAMEWORK = DEFAULT_AUTHENTICATION_CLASSES (

rest_frameworkauthenticationTokenAuthenticationrest_frameworkauthenticationSessionAuthentication

)

bull Remove the SWAGGER_SETTINGS variable

bull Add the following content

32 Chapter 2 Table of contents

Modoboa Documentation Release 1100

CKeditor

CKEDITOR_UPLOAD_PATH = uploads

CKEDITOR_IMAGE_BACKEND = pillow

CKEDITOR_RESTRICT_BY_USER = True

CKEDITOR_BROWSE_SHOW_DIRS = True

CKEDITOR_ALLOW_NONIMAGE_FILES = False

CKEDITOR_CONFIGS = default

allowedContent Truetoolbar Modoboawidth Nonetoolbar_Modoboa [

[Bold Italic Underline][JustifyLeft JustifyCenter JustifyRight JustifyBlock][BidiLtr BidiRtl Language][NumberedList BulletedList - Outdent Indent][Undo Redo][Link Unlink Anchor - Smiley][TextColor BGColor - Source][Font FontSize][Image ][SpellChecker]

]

Donrsquot forget to run the following command

gt python managepy collectstatic

171

If you used 170 for a fresh installation please run the following commands

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy load_initial_data

170

This version requires Django gt= 110 so you need to make some modifications It also brings internal API changeswhich are not backward compatible so installed extensions must be upgraded too

First of all deactivate all installed extensions (edit the settingspy file and comment the corresponding lines inMODOBOA_APPS)

Edit the urlspy file of your local instance and replace its content by the following one

22 Upgrade 33

Modoboa Documentation Release 1100

from djangoconfurls import include url

urlpatterns = [url(r include(modoboaurls))

]

Edit the settingspy and apply the following changes

bull Add modoboaparameters to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboarelaydomainsmodoboalimitsmodoboaparameters Modoboa extensions here

)

bull Add modoboacoremiddlewareLocalConfigMiddleware to MIDDLEWARE_CLASSES

MIDDLEWARE_CLASSES = (djangocontribsessionsmiddlewareSessionMiddlewaredjangomiddlewarecommonCommonMiddlewaredjangomiddlewarecsrfCsrfViewMiddlewaredjangocontribauthmiddlewareAuthenticationMiddlewaredjangocontribmessagesmiddlewareMessageMiddlewaredjangomiddlewarelocaleLocaleMiddlewaredjangomiddlewareclickjackingXFrameOptionsMiddlewaremodoboacoremiddlewareLocalConfigMiddlewaremodoboalibmiddlewareAjaxLoginRedirectmodoboalibmiddlewareCommonExceptionCatchermodoboalibmiddlewareRequestCatcherMiddleware

)

bull Modoboa used to provide a custom authentication backend (modoboalibauthbackendsSimpleBackend) but it has been removed Replace it as follows

AUTHENTICATION_BACKENDS = ( Other backends beforedjangocontribauthbackendsModelBackend

)

bull Remove TEMPLATE_CONTEXT_PROCESSORS and replace it by

TEMPLATES = [

BACKEND djangotemplatebackendsdjangoDjangoTemplatesDIRS []APP_DIRS TrueOPTIONS

context_processors [djangotemplatecontext_processorsdebugdjangotemplatecontext_processorsrequestdjangocontribauthcontext_processorsauth

(continues on next page)

34 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

djangotemplatecontext_processorsi18ndjangotemplatecontext_processorsmediadjangotemplatecontext_processorsstaticdjangotemplatecontext_processorstzdjangocontribmessagescontext_processorsmessagesmodoboacorecontext_processorstop_notifications

]debug False

]

Run the following commands (load virtualenv if you use one)

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstatic

Finally upgrade your extensions and reactivate them

Name Versionmodoboa-amavis 110modoboa-dmarc 100modoboa-imap-migration 110modoboa-pdfcredentials 110modoboa-postfix-autoreply 120modoboa-radicale 110modoboa-sievefilters 110modoboa-stats 110modoboa-webmail 110

Command line shortcuts

$ pip install modoboa-amavis==110$ pip install modoboa-dmarc==100$ pip install modoboa-imap-migration==110$ pip install modoboa-pdfcredentials==110$ pip install modoboa-postfix-autoreply==120$ pip install modoboa-radicale==110$ pip install modoboa-sievefilters==110$ pip install modoboa-stats==110$ pip install modoboa-webmail==110

And please make sure you use the latest version of the django-versionfield2 package

$ pip install -U django-versionfield2

Notes about quota changes and resellers

Reseller users now have a quota option in Resources tab This is the quota that a reseller can share between all itsdomains

22 Upgrade 35

Modoboa Documentation Release 1100

There are two quotas for a domain in the new version

1 Quota amp

2 Default mailbox quota

[1] Quota quota shared between mailboxes This quota is shared between all the mailboxes of this domain This valuecannot exceed resellerrsquos quota and hence cannot be 0(unlimited) if reseller has finite quota

[2] Default mailbox quota default quota applied to mailboxes This quota is the default quota applied to new mail-boxes This value cannot exceed Quota[1] and hence cannot be 0(unlimited) if Quota[1] is finite

161

First of all update postfix map files as follows

gt python managepy generate_postfix_maps --destdir ltpathgt --force-overwrite

Then modify postfixrsquos configuration as follows

smtpd_sender_login_maps =ltdrivergtltpathgtsql-sender-login-mailboxescfltdrivergtltpathgtsql-sender-login-aliasescfltdrivergtltpathgtsql-sender-login-mailboxes-extracf

Replace ltdrivergt and ltpathgt by your values

Finally reload postfix

This release also deprecates some internal functions As a result several extensions has been updated to maintain thecompatibility If you enabled the notification service yoursquoll find the list of available updates directly in your Modoboaconsole

For the others here is the list

Name Versionmodoboa-amavis 1010modoboa-postfix-autoreply 117modoboa-radicale 105modoboa-stats 109

Command line shortcut

$ pip install modoboa-amavis==1010$ pip install modoboa-postfix-autoreply==117$ pip install modoboa-radicale==105$ pip install modoboa-stats==109

160

Warning You have to upgrade extensions due to coreUser model attribute change (usergroup to userrole) Oth-erwise you will have an internal error after upgrade In particular modoboa-amavisd modoboa-stats modoboa-postfix-autoreply are concerned

36 Chapter 2 Table of contents

Modoboa Documentation Release 1100

An interesting feature brougth by this version is the capability to make different checks about MX records Forexample Modoboa can query main DNSBL providers for every defined domain With this you will quickly know ifone the domains you manage is listed or not To activate it add the following line to your crontab

30 ltoptional_virtualenv_pathgtpython ltmodoboa_instance_dirgtmanagepy modorarr˓check_mx

The communication with Modoboa public API has been reworked Instead of sending direct synchronous queries (forexample to check new versions) a cron job has been added To activate it add the following line to your crontab

0 ltoptional_virtualenv_pathgtpython ltmodoboa_instance_dirgtmanagepyrarr˓communicate_with_public_api

Please also note that public API now uses TLS so you must update your configuration as follows

MODOBOA_API_URL = httpsapimodoboaorg1

Finally it is now possible to declare additional sender addresses on a per-account basis You need to update your postfixconfiguration in order to use this functionality Just edit the maincf file and change the following parameter

smtpd_sender_login_maps =ltdrivergtetcpostfixsql-sender-login-mailboxescfltdrivergtetcpostfixsql-sender-login-aliasescfltdrivergtetcpostfixsql-sender-login-mailboxes-extracf

150

The API has been greatly improved and a documentation is now available To enable it addrest_framework_swagger to the INSTALLED_APPS variable in settingspy as follows

INSTALLED_APPS = (djangocontribauthdjangocontribcontenttypesdjangocontribsessionsdjangocontribmessagesdjangocontribsitesdjangocontribstaticfilesreversionrest_frameworkauthtokenrest_framework_swagger

)

Then add the following content into settingspy just after the REST_FRAMEWORK variable

SWAGGER_SETTINGS = is_authenticated Falseapi_version 10exclude_namespaces []info

contact contactmodoboacomdescription (Modoboa API requires a valid token)title Modoboa API

Yoursquore done The documentation is now available at the following address

22 Upgrade 37

Modoboa Documentation Release 1100

httpltyour instance addressgtdocsapi

Finally if you find a TEMPLATE_CONTEXT_PROCESSORS variable in your settingspy file make sure it lookslike this

TEMPLATE_CONTEXT_PROCESSORS = global_settingsTEMPLATE_CONTEXT_PROCESSORS + [modoboacorecontext_processorstop_notifications

]

140

Warning Please make sure to use Modoboa 135 with an up-to-date database before an upgrade to 140

Warning Do not follow the regular upgrade procedure for this version

Some extension have been moved back into the main repository The main reason for that is that using Modoboawithout them doesnrsquot make sense

First of all you must rename the following applications listed inside the MODOBOA_APPS variable

Old name New namemodoboa_admin modoboaadminmodoboa_admin_limits modoboalimitsmodoboa_admin_relaydomains modoboarelaydomains

Then apply the following steps

1 Uninstall old extensions

$ pip uninstall modoboa-admin modoboa-admin-limits modoboa-admin-relaydomains

2 Install all extension updates using pip (check the Modoboa gt Information page)

3 Manually migrate database

$ cd ltinstance_dirgt$ python managepy migrate auth$ python managepy migrate admin 0001 --fake$ python managepy migrate admin$ python managepy migrate limits 0001 --fake$ python managepy migrate relaydomains 0001 --fake$ python managepy migrate

4 Finally update static files

$ python managepy collectstatic

This version also introduces a REST API To enable it

1 Add rest_frameworkauthtoken to the INSTALLED_APPS variable

2 Add the following configuration inside settingspy

38 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Rest framework settings

REST_FRAMEWORK = DEFAULT_AUTHENTICATION_CLASSES (

rest_frameworkauthenticationTokenAuthentication)DEFAULT_PERMISSION_CLASSES (

rest_frameworkpermissionsIsAuthenticated)

3 Run the following command

$ python managepy migrate

135

To enhance security Modoboa now checks the strength of user passwords lthttpsgithubcomdstufftdjango-passwordsgt_

To use this feature add the following configuration into the settingspy file

django-passwords

PASSWORD_MIN_LENGTH = 8

PASSWORD_COMPLEXITY = UPPER 1LOWER 1DIGITS 1

132

Modoboa now uses the atomic requests mode to preserve database consistency (reference)

To enable it update the DATABASES variable in settingspy as follows

DATABASES = default

stuff beforeATOMIC_REQUESTS True

amavis

stuff beforeATOMIC_REQUESTS True

130

This release does not bring awesome new features but it is a necessary bridge to the future of Modoboa All extensionsnow have their own git repository and the deploy process has been updated to reflect this change

22 Upgrade 39

Modoboa Documentation Release 1100

Another important update is the use of Django 17 Besides its new features the migration system has been reworkedand is now more robust than before

Before we begin with the procedure here is a table showing old extension names and their new name

Old name New package name New module namemodoboaextensionsadmin modoboa-admin modoboa_adminmodoboaextensionslimits modoboa-admin-limits modoboa_admin_limitsmodoboaextensionspostfix_autoreply modoboa-postfix-autoreply modoboa_postfix_autoreplymodoboaextensionspostfix_relay_domains modoboa-admin-relaydomains modoboa_admin_relaydomainsmodoboaextensionsradicale modoboa-radicale modoboa_radicalemodoboaextensionssievefilters modoboa-sievefilters modoboa_sievefiltersmodoboaextensionsstats modoboa-stats modoboa_statsmodoboaextensionswebmail modoboa-webmail modoboa_webmail

Here are the required steps

1 Install the extensions using pip (look at the second column in the table above)

$ pip install ltthe extensions you wantgt

2 Remove south from INSTALLED_APPS

3 Rename old extension names inside MODOBOA_APPS (look at the third column in the table above)

4 Remove modoboalibmiddlewareExtControlMiddleware from MIDDLEWARE_CLASSES

5 Change DATABASE_ROUTERS to

DATABASE_ROUTERS = [modoboa_amavisdbrouterAmavisRouter]

6 Run the following commands

$ cd ltmodoboa_instance_dirgt$ python managepy migrate

7 Reply yes to the question

8 Run the following commands

$ python managepy load_initial_data$ python managepy collectstatic

9 The cleanup job has been renamed in Django so you have to modify your crontab entry

- 0 0 ltmodoboa_sitegtmanagepy cleanup+ 0 0 ltmodoboa_sitegtmanagepy clearsessions

120

A new notification service let administrators know about new Modoboa versions To activate it you need to updatethe TEMPLATE_CONTEXT_PROCESSORS variable like this

from djangoconf import global_settings

TEMPLATE_CONTEXT_PROCESSORS = global_settingsTEMPLATE_CONTEXT_PROCESSORS + (

(continues on next page)

40 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

modoboacorecontext_processorstop_notifications)

and to define the new MODOBOA_API_URL variable

MODOBOA_API_URL = httpapimodoboaorg1

The location of external static files has changed To use them add a new path to the STATICFILES_DIRS

Additional locations of static filesSTATICFILES_DIRS = (

Put strings here like homehtmlstatic or Cwwwdjangostatic Always use forward slashes even on Windows Dont forget to use absolute paths not relative pathsltpathtomodoboainstalldirgtbower_components

)

Run the following commands to define the hostname of your instance

$ cd ltmodoboa_instance_dirgt$ python managepy set_default_site lthostnamegt

If you plan to use the Radicale extension

1 Add modoboaextensionsradicale to the MODOBOA_APPS variable

2 Run the following commands

$ cd ltmodoboa_instance_dirgt$ python managepy syncdb

Warning You also have to note that the sitestatic directory has moved from ltpath to your sitesdirgt to ltmodoboas root urlgt (itrsquos probably the parent directory) You have to adapt your web serverconfiguration to reflect this change

23 Configuration

231 Online parameters

Modoboa provides online panels to modify internal parameters There are two available levels

bull Application level global parameters define how the application behaves Available at Modoboa gt Parameters

bull User level per user customization Available at User gt Settings gt Preferences

Regardless level parameters are displayed using tabs each tab corresponding to one application

General parameters

The admin application exposes several parameters they are presented below

23 Configuration 41

Modoboa Documentation Release 1100

Name Tab Description Default valueAuthentication type General The backend used for au-

thenticationLocal

Default password scheme General Scheme used to cryptmailbox passwords

crypt

Rounds General Number of rounds (onlyused by sha256cryptand sha512crypt) Mustbe between 1000 and999999999 inclusive

70000

Secret key General A key used to encryptusersrsquo password in ses-sions

random value

Sender address General Email address used tosend notifications

Enable communication General Enable communicationwith Modoboa public API

yes

Check new versions General Automatically checks if anewer version is available

yes

Send statistics General Send statistics to Mod-oboa public API (countersand used extensions)

yes

Top notifications check in-terval

General Interval between two topnotification checks (inseconds)

30

Maximum log record age General The maximum age in daysof a log record

365

Items per page General Number of displayeditems per page

30

Default top redirection General The default redirectionused when no applicationis specified

userprefs

Enable MX checks Admin Check that every domainhas a valid MX record

yes

Valid MXs Admin A list of IP or networkaddress every MX shouldmatch A warning will besent if a record does notrespect this it

Enable DNSBL checks Admin Check every domainagainst major DNSBLproviders

yes

DKIM keys storage direc-tory

AdminPath to a directory where DKIM

generated keys willbe stored

Default DKIM key length Admin The default size (in bits)for new keys

2048

Handle mailboxes onfilesystem

Admin Rename or remove mail-boxes on the filesystemwhen they get renamed orremoved within Modoboa

no

Mailboxes owner Admin The UNIX account whoowns mailboxes on thefilesystem

vmail

Default domain quota Admin Default quota (in MB) ap-plied to freshly createddomains with no valuespecified A value of 0means no quota

0

Automatic accountremoval

Admin When a mailbox is re-moved also remove theassociated account

no

Automatic do-mainmailbox creation

Admin Create a domain and amailbox when an accountis automatically created

yes

42 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Note If you are not familiar with virtual domain hosting you should take a look at postfixrsquos documentation ThisHow to also contains useful information

Note A random secret key will be generated each time the Parameters page is refreshed and until you save parametersat least once

Note Specific LDAP parameters are also available see LDAP authentication

232 Media files

Modoboa uses a specific directory to upload files (ie when the webmail is in use) or to create ones (ex graphical statis-tics) This directory is named media and is located inside modoboarsquos installation directory (called modoboa_sitein this documentation)

To work properly the system user which runs modoboa (www-data apache whatever) must have write access tothis directory

233 Customization

Custom logo

You have the possibility to use a custom logo instead of the default one on the login page

To do so open the settingspy file and add a MODOBOA_CUSTOM_LOGO variable This variable must containthe relative URL of your logo under MEDIA_URL For example

MODOBOA_CUSTOM_LOGO = ospathjoin(MEDIA_URL custom_logopng)

Then copy your logo file into the directory indicated by MEDIA_ROOT

234 Host configuration

Note This section is only relevant when Modoboa handles mailboxes renaming and removal from the filesystem

To manipulate mailboxes on the filesystem you must allow the user who runs Modoboa to execute commands as theuser who owns mailboxes

To do so edit the etcsudoers file and add the following inside

ltuser_that_runs_modoboagt ALL=(ltmailboxes ownergt) NOPASSWD ALL

Replace values between ltgt by the ones you use

23 Configuration 43

Modoboa Documentation Release 1100

235 Time zone and language

Modoboa is available in many languages

To specify the default language to use edit the settingspy file and modify the LANGUAGE_CODE variable

LANGUAGE_CODE = fr or en for english etc

Note Each user has the possibility to define the language he prefers

In the same configuration file specify the timezone to use by modifying the TIME_ZONE variable For example

TIME_ZONE = EuropeParis

236 Sessions management

Modoboa uses Djangorsquos session framework to store per-user information

Few parameters need to be set in the settingspy configuration file to make Modoboa behave as expected

SESSION_EXPIRE_AT_BROWSER_CLOSE = False Default value

This parameter is optional but you must ensure it is set to False (the default value)

The default configuration file provided by the modoboa-adminpy command is properly configured

237 Logging authentication

To trace login attempts to the web interface Modoboa uses python SysLogHandler so you can see them in your syslogauthentication log file (varlogauthlog in most cases)

Depending on your configuration you may have to edit the settingspy file and add lsquoaddressrsquo lsquodevlogrsquo to thelogging section

syslog-auth class logginghandlersSysLogHandlerfacility SysLogHandlerLOG_AUTHaddress devlogformatter syslog

238 External authentication

LDAP

Modoboa supports external LDAP authentication using the following extra components

bull Python LDAP client

bull Django LDAP authentication backend

If you want to use this feature you must first install those components

44 Chapter 2 Table of contents

Modoboa Documentation Release 1100

$ pip install python-ldap django-auth-ldap

Then all you have to do is to modify the settingspy file Add a new authentication backend to the AUTHENTI-CATION_BACKENDS variable like this

AUTHENTICATION_BACKENDS = (modoboalibauthbackendsLDAPBackend modoboalibauthbackendsLDAPSecondaryBackend Useful for a fallback

rarr˓mechanismdjangocontribauthbackendsModelBackend

)

Finally go to Modoboa gt Parameters gt General and set Authentication type to LDAP

From there new parameters will appear to let you configure the way Modoboa should connect to your LDAP serverThey are described just below

Name Description De-faultvalue

Server address The IP address of the DNS name of the LDAP server local-host

Server port The TCP port number used by the LDAP server 389Use a secureconnection

Use an SSLTLS connection to access the LDAP server no

Authenticationmethod

Choose the authentication method to use Directbind

User DN tem-plate (directbind mode)

The template used to construct a userrsquos DN It should contain one placeholder (ie(user)s)

Bind BN The distinguished name to use when binding to the LDAP server Leave empty for ananonymous bind

Bind password The password to use when binding to the LDAP server (with lsquoBind DNrsquo)Search base The distinguished name of the search baseSearch filter An optional filter string (eg lsquo(objectClass=person)rsquo) In order to be valid it must be

enclosed in parentheses(mail=(user)s)

Passwordattribute

The attribute used to store user passwords user-Pass-word

Active Direc-tory

Tell if the LDAP server is an Active Directory one no

Administratorgroups

Members of those LDAP Posix groups will be created ad domain administrators Uselsquorsquo characters to separate groups

Group type The type of group used by your LDAP directory Posix-Group

Groups searchbase

The distinguished name of the search base used to find groups

Do-mainmailboxcreation

Automatically create a domain and a mailbox when a new user is created just after thefirst successful authentication You will generally want to disable this feature whenthe relay domains extension is in use

yes

If you need additional parameters you will find a detailed documentation here

Once the authentication is properly configured the users defined in your LDAP directory will be able to connect to

23 Configuration 45

Modoboa Documentation Release 1100

Modoboa the associated domain and mailboxes will be automatically created if needed

The first time a user connects to Modoboa a local account is created if the LDAP username is a valid email addressBy default this account belongs to the SimpleUsers group and it has a mailbox

To automatically create domain administrators you can use the Administrator groups setting If a LDAP user belongsto one the listed groups its local account will belong to the DomainAdmins group In this case the username is notnecessarily an email address

Users will also be able to update their LDAP password directly from Modoboa

Note Modoboa doesnrsquot provide any synchronization mechanism once a user is registered into the database Anymodification done from the directory to a user account will not be reported to Modoboa (an email address change forexample) Currently the only solution is to manually delete the Modoboa record it will be recreated on the next userlogin

SMTP

It is possible to use an existing SMTP server as an authentication source To enable this feature edit the settingspy file and change the following setting

AUTHENTICATION_BACKENDS = (modoboalibauthbackendsSMTPBackenddjangocontribauthbackendsModelBackend

)

SMTP server location can be customized using the following settings

AUTH_SMTP_SERVER_ADDRESS = localhostAUTH_SMTP_SERVER_PORT = 25AUTH_SMTP_SECURED_MODE = None ssl or starttls are accepted

239 LDAP synchronization

Modoboa can synchronize accounts with an LDAP directory (tested with OpenLDAP) but this feature is not enabledby default To activate it add modoboaldapsync to MODOBOA_APPS in the settingspy file

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboaldapsync

)

and enable it from the admin panel

46 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning Make sure to install additional requirements otherwise it wonrsquot work

The following parameters are available and must be filled

Name Description Defaultvalue

Enable LDAP synchro-nization

Control LDAP synchronization state no

Bind DN The DN of a user with write permission to createupdate accountsBind password The associated passwordAccount DN template The template used to build account DNs (must contain a (user)s

placeholder

2310 Database maintenance

Cleaning the logs table

Modoboa logs administrator specific actions into the database A clean-up script is provided to automatically removeoldest records The maximum log record age can be configured through the online panel

To use it you can setup a cron job to run every night

0 0 ltmodoboa_sitegtmanagepy cleanlogs Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy cleanlogs

Cleaning the session table

Django does not provide automatic purging Therefore itrsquos your job to purge expired sessions on a regular basis

Django provides a sample clean-up script django-adminpy clearsessions That script deletes any sessionin the session table whose expire_date is in the past

For example you could setup a cron job to run this script every night

0 0 ltmodoboa_sitegtmanagepy clearsessions Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy clearsessions

Cleaning inactive accounts

Thanks to Last-login tracking it is now possible to monitor inactive accounts An account is considered inactive if nologin has been recorded for the last 30 days (this value can be changed through the admin panel)

A management command is available to disable or delete inactive accounts For example you could setup a cron jobto run it every night

23 Configuration 47

Modoboa Documentation Release 1100

0 0 ltmodoboa_sitegtmanagepy clean_inactive_accounts Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy clean_inactive_rarr˓accounts

The default behaviour is to disable accounts You can delete them using the --delete option

24 Moving to Modoboa

You have an existing platform and yoursquod like to move to Modoboa the following tools could help you

241 From postfixadmin

A dedicated command allows you to convert an existing postfixadmin database to a Modoboa one Consult the docu-mentation to know more about the process

242 Using CSV files

Modoboa allows you to import any object (domain domain alias mailbox and alias) using a simple CSV file encodedusing UTF8 Each line corresponds to a single object and must respect one of the following format

domain ltname stringgt ltquota integergt ltdefault mailbox quota integergt ltenabledrarr˓booleangtdomainalias ltname stringgt lttargeted domain stringgt ltenabled booleangtrelaydomain ltname stringgt lttarget host stringgt lttarget port integergt ltservicerarr˓stringgt ltenabled booleangt ltverify recipients booleangtaccount ltloginname stringgt ltpassword stringgt ltfirst name stringgt ltlast namerarr˓stringgt ltenabled booleangt ltgroup stringgt ltaddress stringgt ltquota integergt [rarr˓ltdomain stringgt ]alias ltaddress stringgt ltenabled booleangt ltrecipient stringgt

Boolean fields accept the following values true 1 yes y (case insensitive) Any other value will be evaluated asfalse

Warning The order does matter Objects are created sequencially so a domain must be created before itsmailboxes and aliases and a mailbox must created before its alias(es)

To actually import such a file

gt sudo -u ltmodoboa_usergt -igt source ltvirtualenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy modo import ltyour filegt

Available options can be listed using the following command

gt python managepy modo import -h

48 Chapter 2 Table of contents

Modoboa Documentation Release 1100

25 REST API

To ease the integration with external sources (software or other) Modoboa provides a REST API

Every installed instance comes with a ready-to-use API and a documentation You will find them using the followingurl patterns

bull API httplthostnamegtapiv1

bull Documentation httplthostnamegtdocsapi

An example of this documentation is available on the official demo

Using this API requires an authentication and for now only a token based authentication is supported To get a validtoken log-in to your instance with a super administrator go to Settings gt API and activate the API access Press theUpdate button and wait until the page is reloaded the token will be displayed

To make valid API calls every requests you send must embed this token within an Authorization HTTP header likethis

Authorization Token ltYOUR_TOKENgt

and the content type of those requests must be applicationjson

26 How to contribute

Contributions are always welcome If you want to submit a patch please respect the following rules

bull Open a pull request on the appropriate repository

bull Respect PEP8

bull Document your patch and respect PEP 257

bull Add unit tests and make sure the global coverage does not decrease

If all those steps are validated your contribution will generally be integrated

261 Table of contents

25 REST API 49

Modoboa Documentation Release 1100

Useful tips

You would like to work on Modoboa but you donrsquot know where to start Yoursquore at the right place Browse this pageto learn useful tips

Docker

A docker image is available for developers To use it you must install docker and docker-compose first

Then just run the following command

$ docker-compose up

It will start the docker environment and make a Modoboa instance available at httplocalhost8000

If you donrsquot want to use docker or need a more complex development setup go to the next section

Prepare a virtual environment

A virtual environment is a good way to setup a development environment on your machine

To do so run the following commands

$ python3 -m venv ltpathgt$ source ltpathgtbinactivate$ git clone httpsgithubcommodoboamodoboagit$ cd modoboa$ python setuppy develop$ pip install -r dev-requirementstxt

The develop command creates a symbolic link to your local copy so any modification you make will be automati-cally available in your environment no need to copy them

Deploy an instance for development

Warning Make sure to create a database before running this step The format of the database url is also describedin this page

Now that you have a running environment yoursquore ready to deploy a test instance

$ cd ltpathgt$ modoboa-adminpy deploy --dburl defaultltdatabase urlgt --domain localhost --develrarr˓instance$ python managepy runserver

Yoursquore ready to go You should be able to access Modoboa at httplocalhost8000 usingadminpassword as credentials

Manage static files

Modoboa uses bower (thanks to django-bower) to manage its CSS and javascript dependencies

50 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Those dependencies are listed in a file called dev_settingspy located inside the ltpath_to_local_copygtmodoboacore directory

If you want to add a new dependency just complete the BOWER_INSTALLED_APPS parameter and run the followingcommand

$ python managepy bower install

It will download and store the required files into the ltpath_to_local_copygtmodoboabower_components directory

Test your modifications

If you deployed a specific instance for your development needs you can run the tests suite as follows

gt python managepy test modoboacore modoboalib modoboaadmin modoboalimits modoboararr˓relaydomains

Otherwise you can run the tests suite from the repository using tox

Start a basic Modoboa instance

From the repository run the following command to launch a simple instance with a few fixtures

gt tox -e serve

You can use adminpassword to log in

Build the documentation

If you need to modify the documenation and want to see the result you can build it as follows

gt tox -e docgt firefox toxdoctmphtmlindexhtml

FAQ

bower command is missing in managepy

bower command is missing in managepy if you donrsquot use the --devel option of the modoboa-adminpydeploy command

To fix it regenerate your instance or update your settingspy file manually Look at devmode in httpsgithubcomtonioomodoboablobmastermodoboacorecommandstemplatessettingspytpl

Create a new plugin

Introduction

Modoboa offers a plugin API to expand its capabilities The current implementation provides the following possibili-ties

26 How to contribute 51

Modoboa Documentation Release 1100

bull Expand navigation by adding entry points to your plugin inside the GUI

bull Access and modify administrative objects (domains mailboxes etc)

bull Register callback actions for specific events

Plugins are nothing more than Django applications with an extra piece of code that integrates them into Modoboa Themodo_extensionpy file will contain a complete description of the plugin

bull Admin and user parameters

bull Custom menu entries

The communication between both applications is provided by Django signals

The following subsections describe the plugin architecture and explain how you can create your own

The required glue

To create a new plugin just start a new django application like this (into Modoboarsquos directory)

$ python managepy startapp

Then you need to register this application using the provided API Just copypaste the following example into themodo_extensionpy file of the future extension

from modoboacoreextensions import ModoExtension exts_pool

class MyExtension(ModoExtension)My custom Modoboa extension

name = myextlabel = My Extensionversion = 01description = A descriptionurl = myext_root_location optional name is used if not defined

def load(self)This method is called when Modoboa loads available and activated plugins

Declare parameters and register events herepass

def load_initial_data(self)Optional provide initial data for your extension herepass

exts_poolregister_extension(MyExtension)

Once done simply add your extensionrsquos module name to the MODOBOA_APPS variable located inside settingspy Finally run the following commands

$ python managepy migrate$ python managepy load_initial_data$ python managepy collectstatic

52 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Parameters

A plugin can declare its own parameters There are two levels available

bull lsquoGlobalrsquo parameters used to configure the plugin editable inside the Admin gt Settings gt Parameters page

bull lsquoUserrsquo parameters per-user parameters (or preferences) editable inside the Options gt Preferences page

Playing with parameters

Parameters are defined using Django forms and Modoboa adds two special forms you can inherit depending on thelevel of parameter(s) you want to add

bull modoboaparametersformsAdminParametersForm for general parameters

bull modoboaparametersformsUserParametersForm for user parameters

To register new parameters add the following line into the load method of your plugin class

from modoboaparameters import tools as param_toolsparam_toolsregistryadd(

LEVEL YourForm ugettext_lazy(Title))

Replace LEVEL by global or user

Custom role permissions

Modoboa uses Djangorsquos internal permission system Administrative roles are nothing more than groups (Groupinstances)

An extension can add new permissions to a group by listening to the extra_role_permissions signal Here isan example

from djangodispatch import receiverfrom modoboacore import signals as core_signals

PERMISSIONS = Resellers [

(relaydomains relaydomain add_relaydomain)(relaydomains relaydomain change_relaydomain)(relaydomains relaydomain delete_relaydomain)(relaydomains service add_service)(relaydomains service change_service)(relaydomains service delete_service)

]

receiver(core_signalsextra_role_permissions)def extra_role_permissions(sender role kwargs)

Add permissions to the Resellers groupreturn constantsPERMISSIONSget(role [])

Extending admin forms

The forms used to edit objects (account domain etc) through the admin panel are composed of tabs You can extendthem (ie add new tabs) in a pretty easy way thanks to custom signals

26 How to contribute 53

Modoboa Documentation Release 1100

Account

To add a new tab to the account edition form define new listeners (handlers) for the following signals

bull modoboaadminsignalsextra_account_forms

bull modoboaadminsignalsget_account_form_instances

bull modoboaadminsignalscheck_extra_account_form (optional)

Example

from djangodispatch import receiverfrom modoboaadmin import signals as admin_signals

receiver(admin_signalsextra_account_forms)def extra_account_form(sender user account kwargs)

return [id tabid title Title cls MyFormClass

]

receiver(admin_signalsget_account_form_instances)def fill_my_tab(sender user account kwargs)

return id my_instance

Domain

To add a new tab to the domain edition form define new listeners (handlers) for the following signals

bull modoboaadminsignalsextra_domain_forms

bull modoboaadminsignalsget_domain_form_instances

Example

from djangodispatch import receiverfrom modoboaadmin import signals as admin_signals

receiver(admin_signalsextra_domain_forms)def extra_account_form(sender user domain kwargs)

return [id tabid title Title cls MyFormClass

]

receiver(admin_signalsget_domain_form_instances)def fill_my_tab(sender user domain kwargs)

return id my_instance

27 Contributors

bull Antidot

bull Bearstech

bull CAP-REL

54 Chapter 2 Table of contents

Modoboa Documentation Release 1100

bull Dalnix

27 Contributors 55

  • Overview
  • Table of contents
Page 12: Modoboa Documentation

Modoboa Documentation Release 1100

(continued from previous page)

Operations on mailboxes

vmail $PYTHON $INSTANCEmanagepy handle_mailbox_operations

Generate DKIM keys (they will belong to the user running this job)

root umask 077 ampamp $PYTHON $INSTANCEmanagepy modo manage_dkim_rarr˓keys

Sessions table cleanup0 0 modoboa $PYTHON $INSTANCEmanagepy clearsessions Logs table cleanup0 0 modoboa $PYTHON $INSTANCEmanagepy cleanlogs DNSBL checks

30 modoboa $PYTHON $INSTANCEmanagepy modo check_mx Public API communication0 modoboa $PYTHON $INSTANCEmanagepy communicate_with_public_api

Policy daemon

Modoboa comes with a built-in Policy Daemon for Postfix Current features are

bull Define daily sending limits for domains andor accounts

A redis server is required to run this new daemon

You can launch it manually using the following command

(env)gt python managepy policy_daemon

But we recommend an automatic start using systemd or supervisor Here is a configuration example forsupervisor

[programpolicyd]autostart=trueautorestart=truecommand=srvmodoboaenvbinpython srvmodoboainstancemanagepy policy_daemondirectory=srvmodoboaredirect_stderr=trueuser=modoboanumprocs=1

It will listen by default on 127001 and port 9999 The policy daemon wonrsquot do anything unless you tell postfixto use it

Now you can continue to the Web server section

Web server

Note The following instructions are meant to help you get your site up and running quickly However it is notpossible for the people contributing documentation to Modoboa to test every single combination of web server wsgiserver distribution etc So it is possible that your installation of uwsgi or nginx or Apache or what-have-you worksdifferently Keep this in mind

21 Installation 9

Modoboa Documentation Release 1100

Apache2

First make sure that mod_wsgi is installed on your server

Create a new virtualhost in your Apache configuration and put the following content inside

ltVirtualHost 80gtServerName ltyour valuegtDocumentRoot ltmodoboa_instance_pathgt

Alias media ltmodoboa_instance_pathgtmedialtDirectory ltmodoboa_instance_pathgtmediagtOrder denyallowAllow from all

ltDirectorygt

Alias sitestatic ltmodoboa_instance_pathgtsitestaticltDirectory ltmodoboa_instance_pathgtsitestaticgtOrder denyallowAllow from all

ltDirectorygt

WSGIScriptAlias ltmodoboa_instance_pathgtltinstance_namegtwsgipy

Pass Authorization header to enable API usageWSGIPassAuthorization On

ltVirtualHostgt

This is just one possible configuration

To use mod_wsgi daemon mode add the two following directives just under WSGIScriptAlias

WSGIDaemonProcess examplecom python-path=ltmodoboa_instancegtltvirtualenv pathgtlibrarr˓python37site-packagesWSGIProcessGroup examplecom

Replace values between ltgt with yours If you donrsquot use a virtualenv just remove the last part of theWSGIDaemonProcess directive

Note You will certainly need more configuration in order to launch Apache

Now you can go the Dovecot section to continue the installation

Nginx

This section covers two different ways of running Modoboa behind Nginx using a WSGI application server Choosethe one you prefer between Green Unicorn or uWSGI

In both cases yoursquoll need to download and install nginx

Green Unicorn

Firstly Download and install gunicorn Then use the following sample gunicorn configuration (create a new filenamed gunicornconfpy inside Modoboarsquos root dir)

10 Chapter 2 Table of contents

Modoboa Documentation Release 1100

backlog = 2048bind = unixvarrungunicornmodoboasockpidfile = varrungunicornmodoboapiddaemon = Truedebug = Falseworkers = 2logfile = varloggunicornmodoboalogloglevel = info

To start gunicorn execute the following commands

$ cd ltmodoboa dirgt$ gunicorn -c gunicornconfpy ltmodoboa dirgtwsgiapplication

Now the nginx part Just create a new virtual host and use the following configuration

upstream modoboa server unixvarrungunicornmodoboasock fail_timeout=0

server listen 443 sslssl onkeepalive_timeout 70

server_name lthost fqdngtroot ltmodoboa_instance_pathgt

access_log varlognginxlthost fqdngtaccesslogerror_log varlognginxlthost fqdngterrorlog

ssl_certificate ltssl certificate for your sitegtssl_certificate_key ltssl certificate key for your sitegt

location sitestatic autoindex on

location media autoindex on

location proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_forproxy_set_header Host $http_hostproxy_redirect offproxy_set_header X-Forwarded-Protocol sslproxy_pass httpmodoboa

If you do not plan to use SSL then change the listen directive to listen 80 and delete each of the followingdirectives

ssl onkeepalive_timeout 70ssl_certificate ltssl certificate for your sitegt

(continues on next page)

21 Installation 11

Modoboa Documentation Release 1100

(continued from previous page)

ssl_certificate_key ltssl certificate key for your sitegtproxy_set_header X-Forwarded-Protocol ssl

If you do plan to use SSL yoursquoll have to generate a certificate and a key This article contains information about howto do it

Paste this content to your configuration (replace values between ltgt with yours) and restart nginx

Now you can go the Dovecot section to continue the installation

uWSGI

The following setup is meant to get you started quickly You should read the documentation of both nginx and uwsgito understand how to optimize their configuration for your site

The Django documentation includes the following warning regarding uwsgi

Warning Use uwsgi 126 or newer If you do not you will run into problems Modoboa will fail in obscureways

To use this setup first download and install uwsgi

Here is a sample nginx configuration

server listen 443 sslssl onkeepalive_timeout 70

server_name lthost fqdngtroot ltmodoboas settings dirgt

ssl_certificate ltssl certificate for your sitegtssl_certificate_key ltssl certificate key for your sitegt

access_log varlognginxlthost fqdngtaccesslogerror_log varlognginxlthost fqdngterrorlog

location ltmodoboas root urlgtsitestatic autoindex onalias ltlocation of sitestatic on your file systemgt

Whether or not Modoboa uses a media directory depends on how you configured Modoboa It does not hurt to have thislocation ltmodoboas root urlgtmedia

autoindex onalias ltlocation of media on your file systemgt

This denies access to any file that begins with ht Apaches htaccess and htpasswd are such files A Modoboa installed from scratch would not contain any such files but you never know what the future holds

(continues on next page)

12 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

location ~ ht deny all

location ltmodobas root urlgt include uwsgi_paramsuwsgi_pass ltuwsgi portgtuwsgi_param UWSGI_SCRIPT ltmodoboa instance namegtwsgiapplicationuwsgi_param UWSGI_SCHEME https

ltmodoboa instance namegt must be replaced by the value you used when you deployed your instance

If you do not plan to use SSL then change the listen directive to listen 80 and delete each of the followingdirectives

ssl onkeepalive_timeout 70ssl_certificate ltssl certificate for your sitegtssl_certificate_key ltssl certificate key for your sitegtuwsgi_param UWSGI_SCHEME https

If you do plan to use SSL yoursquoll have to generate a certificate and a key This article contains information about howto do it

Make sure to replace the ltgt in the sample configuration with appropriate values Here are some explanations forthe cases that may not be completely self-explanatory

ltmodoboas settings dirgt Where Modoboarsquos settingspy resides This is also where thesitestatic and media directories reside

ltmodoboas root urlgt This is the URL which will be the root of your Modoboa site at your domain For in-stance if your Modoboa installation is reachable at at httpsfoomodoboa then ltmodoboas rooturlgt is modoboa In this case you probably also have to set the alias directives to point to where Mod-oboarsquos sitestatic and media directories are because otherwise nginx wonrsquot be able to find them

If Modoboa is at the root of your domain then ltmodoboa root urlgt is an empty string and can be deletedfrom the configuration above In this case you probably do not need the alias directives

ltuwsgi portgt The location where uwsig is listening It could be a unix domain socket or an addressport combi-nation Ubuntu configures uwsgi so that the port is

unixrunuwsgiappltapp namegtsocket

where ltapp namegt is the name of the application

Your uwsgi configuration should be

[uwsgi] Not needed when using uwsgi from pip plugins = pythonchdir = ltmodoboas top dirgtmodule = ltnamegtwsgiapplicationmaster = trueharakiri = 60processes = 4vhost = trueno-default-app = true

21 Installation 13

Modoboa Documentation Release 1100

The plugins directive should be turned on if you use a uwsgi installation that requires it If uwsgi was installed frompip it does not require it In the configuration above

ltmodoboas top dirgt The directory where managepy resides This directory is the parent of ltmodoboassettings dirgt

ltnamegt The name that you passed to modoboa-adminpy deploy when you created your Modoboa instance

Now you can go the Dovecot section to continue the installation

Dovecot

Modoboa requires Dovecot 2+ to work so the following documentation is suitable for this combination

In this section we assume dovecotrsquos configuration resides in etcdovecot all pathes will be relative to thisdirectory

Mailboxes

First edit the confd10-mailconf and set the mail_location variable

maildirmail_location = maildir~maildir

Then edit the inbox namespace and add the following lines

inbox = yes

mailbox Drafts auto = subscribespecial_use = Drafts

mailbox Junk

auto = subscribespecial_use = Junk

mailbox Sent

auto = subscribespecial_use = Sent

mailbox Trash

auto = subscribespecial_use = Trash

With dovecot 21+ it ensures all the special mailboxes will be automaticaly created for new accounts

For dovecot 20 and older use the autocreate plugin

Operations on the file system

14 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning Modoboa needs to access the dovecot binary to check its version To find the binary path weuse the which command first and then try known locations (usrsbindovecot and usrlocalsbindovecot) If you installed dovecot in a custom location please tell us where the binary is by usingthe DOVECOT_LOOKUP_PATH setting (see settingspy)

Three operation types are considered

1 Mailbox creation

2 Mailbox renaming

3 Mailbox deletion

The first one is managed by Dovecot The last two ones may be managed by Modoboa if it can access the file systemwhere the mailboxes are stored (see General parameters to activate this feature)

Those operations are treated asynchronously by a cron script For example when you rename an e-mail addressthrough the web UI the associated mailbox on the file system is not modified directly Instead of that a renameorder is created for this mailbox The mailbox will be considered unavailable until the order is executed (see Postfixconfiguration)

Edit the crontab of the user who owns the mailboxes on the file system

$ crontab -u ltusergt -e

And add the following line inside

python ltmodoboa_sitegtmanagepy handle_mailbox_operations

Warning The cron script must be executed by the system user owning the mailboxes

Warning The user running the cron script must have access to the settingspy file of the modoboa instance

The result of each order is recorded into Modoboarsquos log Go to Modoboa gt Logs to consult them

Authentication

To make the authentication work edit the confd10-authconf and uncomment the following line at the end

include auth-systemconfextinclude auth-sqlconfextinclude auth-ldapconfextinclude auth-passwdfileconfextinclude auth-checkpasswordconfextinclude auth-vpopmailconfextinclude auth-staticconfext

Then edit the confdauth-sqlconfext file and add the following content inside

passdb sql driver = sql Path for SQL configuration file see example-configdovecot-sqlconfext

(continues on next page)

21 Installation 15

Modoboa Documentation Release 1100

(continued from previous page)

args = etcdovecotdovecot-sqlconfext

userdb sql driver = sqlargs = etcdovecotdovecot-sqlconfext

Make sure to activate only one backend (per type) inside your configuration (just comment the other ones)

Edit the dovecot-sqlconfext and modify the configuration according to your database engine

MySQL users

driver = mysql

connect = host=ltmysqld socketgt dbname=ltdatabasegt user=ltusergt password=ltpasswordgt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user WHERE email=Lu andrarr˓is_active=1

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid concat(bytes= mbquota M) AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

PostgreSQL users

driver = pgsql

connect = host=ltpostgres socketgt dbname=ltdatabasegt user=ltusergt password=ltpasswordgt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user u INNER JOIN admin_rarr˓mailbox mb ON uid=mbuser_id INNER JOIN admin_domain dom ON mbdomain_id=domidrarr˓WHERE uemail=Lu AND uis_active AND domenabled

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid bytes= || mbquota || M AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

16 Chapter 2 Table of contents

Modoboa Documentation Release 1100

SQLite users

driver = sqlite

connect = ltpath to the sqlite db filegt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user u INNER JOIN admin_rarr˓mailbox mb ON uid=mbuser_id INNER JOIN admin_domain dom ON mbdomain_id=domidrarr˓WHERE uemail=Lu AND uis_active=1 AND domenabled=1

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid (bytes= || mbquota || M) AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

Note Replace values between ltgt with yours

LDAP

To make the LDAP authentication work edit the confd10-authconf and uncomment the following line atthe end

include auth-ldapconfext

Then edit the confdauth-ldapconfext and edit the passdb section as following You should comment theuserdb section which will be managed by SQL with modoboa database

passdb driver = ldap

Path for LDAP configuration file see example-configdovecot-ldapconfextargs = etcdovecotdovecot-ldapconfext

userdb driver = ldapargs = etcdovecotdovecot-ldapconfext

Default fields can be used to specify defaults that LDAP may overridedefault_fields = home=homevirtualu

Your own dovecot LDAP configuration file is now etcdovecotdovecot-ldapconfext You can addyour default LDAP conf in it following the official documentation

Synchronize dovecot LDAP conf with modoboa LDAP conf

To make dovecot LDAP configuration synchronized with modoboa LDAP configuration you should create a dedicateddovecot conf file At the end of your dovecot configuration file (dovecot-ldapconfext) add the following

21 Installation 17

Modoboa Documentation Release 1100

line

include_try dovecot-modoboaconfext

Then set modoboa parameter Enable Dovecot LDAP sync to Yes Then set the Dovecot LDAP config file following theprevious step (etcdovecotdovecot-modoboaconfext in the example)

The last step is to add the command update_dovecot_conf to the cron job of modoboa Then each time your modoboaLDAP configuration is updated your dovecot LDAP configuration will also be

LMTP

Local Mail Transport Protocol is used to let Postfix deliver messages to Dovecot

First make sure the protocol is activated by looking at the protocols setting (generally inside dovecotconf)It should be similar to the following example

protocols = imap pop3 lmtp

Then open the confd10-masterconf look for lmtp service definition and add the following content inside

service lmtp stuff beforeunix_listener varspoolpostfixprivatedovecot-lmtp mode = 0600user = postfixgroup = postfix

stuff after

We assume here that Postfix is chrooted within varspoolpostfix

Finally open the confd20-lmtpconf and modify it as follows

protocol lmtp postmaster_address = postmasterltdomaingtmail_plugins = $mail_plugins quota sieve

Replace ltdomaingt by the appropriate value

Note If you donrsquot plan to apply quota or to use filters just adapt the content of the mail_plugins setting

Quota

Modoboa lets adminstrators define per-domain andor per-account limits (quota) It also lists the current quota usageof each account Those features require Dovecot to be configured in a specific way

Inside confd10-mailconf add the quota plugin to the default activated ones

mail_plugins = quota

Inside confd10-masterconf update the dict service to set proper permissions

18 Chapter 2 Table of contents

Modoboa Documentation Release 1100

service dict If dict proxy is used mail processes should have access to its socket For example mode=0660 group=vmail and global mail_access_groups=vmailunix_listener dict mode = 0600user = ltuser owning mailboxesgtgroup =

Inside confd20-imapconf activate the imap_quota plugin

protocol imap

mail_plugins = $mail_plugins imap_quota

Inside dovecotconf activate the quota SQL dictionary backend

dict quota = ltdrivergtetcdovecotdovecot-dict-sqlconfext

Inside confd90-quotaconf activate the quota dictionary backend

plugin quota = dictUser quotaproxyquota

It will tell Dovecot to keep quota usage in the SQL dictionary

Finally edit the dovecot-dict-sqlconfext file and put the following content inside

connect = host=ltdb hostgt dbname=ltdb namegt user=ltdb usergt password=ltpasswordgt SQLite users connect = pathtothedatabasedb

map pattern = privquotastoragetable = admin_quotausername_field = usernamevalue_field = bytes

map

pattern = privquotamessagestable = admin_quotausername_field = usernamevalue_field = messages

PostgreSQL users

21 Installation 19

Modoboa Documentation Release 1100

Database schema update

The admin_quota table is created by Django but unfortunately it doesnrsquot support DEFAULT constraints (it onlysimulates them when the ORM is used) As PostgreSQL is a bit strict about constraint violations you must executethe following query manually

db=gt ALTER TABLE admin_quota ALTER COLUMN bytes SET DEFAULT 0db=gt ALTER TABLE admin_quota ALTER COLUMN messages SET DEFAULT 0

Trigger

As indicated on Dovecotrsquos wiki you need a trigger to properly update the quota

A working copy of this trigger is available on Github

Download this file and copy it on the server running postgres Then execute the following commands

$ su - postgres$ psql [modoboa database] lt pathtomodoboa_postgres_triggersql$ exit

Replace [modoboa database] by the appropriate value

Forcing recalculation

For existing installations Dovecot (gt 2) offers a command to recalculate the current quota usages For example if youwant to update all usages run the following command

$ doveadm quota recalc -A

Be carefull it can take a while to execute

ManageSieveSieve

Modoboa lets users define filtering rules from the web interface To do so it requires ManageSieve to be activated onyour server

Inside confd20-managesieveconf make sure the following lines are uncommented

protocols = $protocols sieve

service managesieve-login

service managesieve

protocol sieve

20 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Messages filtering using Sieve is done by the LDA

Inside confd15-ldaconf activate the sieve plugin like this

protocol lda Space separated list of plugins to load (default is global mail_plugins)mail_plugins = $mail_plugins sieve

Finally configure the sieve plugin by editing the confd90-sieveconf file Put the follwing caontent inside

plugin Location of the active script When ManageSieve is used this is actually a symlink pointing to the active script in the sieve storage directorysieve = ~dovecotsieve

The path to the directory where the personal Sieve scripts are stored For ManageSieve this is where the uploaded scripts are storedsieve_dir = ~sieve

Restart Dovecot

Now you can go to the Postfix section to finish the installation

Last-login tracking

To update the last_login attribute of an account after a succesful IMAP or POP3 login you can configure apost-login script

Open confd10-masterconf add the following configuration (imap and pop3 services are already definedyou just need to update them)

service imap executable = imap postlogin

service pop3 executable = pop3 postlogin

service postlogin executable = script-login usrlocalbinpostloginshuser = modoboaunix_listener postlogin

Then you must create a script named usrlocalbinpostloginsh According to your database enginethe content will differ

PostgreSQL

21 Installation 21

Modoboa Documentation Release 1100

binsh

psql -c UPDATE core_user SET last_login=now() WHERE username=$USER gt devnull

exec $

MySQL

binsh

DBNAME=XXXDBUSER=XXXDBPASSWORD=XXX

echo UPDATE core_user SET last_login=now() WHERE username=$USER | mysql -urarr˓$DBUSER -p$DBPASSWORD $DBNAME

exec $

Postfix

This section gives an example about building a simple virtual hosting configuration with Postfix Refer to the officialdocumentation for more explanation

Map files

You first need to create configuration files (or map files) that will be used by Postfix to lookup into Modoboa tables

To automaticaly generate the requested map files and store them in a directory run the following command

gt cd ltmodoboa_instance_pathgtgt python managepy generate_postfix_maps --destdir ltdirectorygt

ltdirectorygt is the directory where the files will be stored Answer the few questions and yoursquore done

Configuration

Use the following configuration in the etcpostfixmaincf file (this is just one possible configuration)

Stuff beforevirtual_transport = lmtpunixprivatedovecot-lmtp

virtual_mailbox_domains = ltdrivergtetcpostfixsql-domainscfvirtual_alias_domains = ltdrivergtetcpostfixsql-domain-aliasescfvirtual_alias_maps = ltdrivergtetcpostfixsql-aliasescf

relay_domains = ltdrivergtetcpostfixsql-relaydomainscftransport_maps =

ltdrivergtetcpostfixsql-transportcfltdrivergtetcpostfixsql-spliteddomains-transportcf

(continues on next page)

22 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

smtpd_recipient_restrictions = check_recipient_access

ltdrivergtetcpostfixsql-maintaincfltdrivergtetcpostfixsql-relay-recipient-verificationcf

permit_mynetworksreject_unauth_destinationreject_unverified_recipient

smtpd_sender_login_maps = ltdrivergtetcpostfixsql-sender-login-mapcf

smtpd_sender_restrictions =reject_sender_login_mismatch

Stuff after

Replace ltdrivergt by the name of the database you use

Restart Postfix

Policy daemon

If you want to enable the built-in policy daemon add the following content to the etcpostfixmaincf file

smtpd_recipient_restrictions = check_policy_service inet1270019999

And reload postfix

Note The check_policy_service line must be placed before the permit_mynetworks one otherwise thedaemon wonrsquot be called

OpenDKIM

Modoboa can generate DKIM keys for the hosted domains but it wonrsquot sign or check messages To do that you needa dedicated software like OpenDKIM

Note The cron job in charge of creating DKIM keys must be run using the same user than OpenDKIM (ie opendkimin most cases)

Database

Since keys related information is stored in Modoboarsquos database you need to tell OpenDKIM how it can access it

First make sure to install the required additional packages on your system (libopendbx1- on debian baseddistributions or opendbx- on CentOS the complete name depends on your database engine)

Then insert the following SQL view into Modoboarsquos database

21 Installation 23

Modoboa Documentation Release 1100

PostgreSQL

CREATE OR REPLACE VIEW dkim AS (SELECT id name as domain_name dkim_private_key_path AS private_key_path

dkim_key_selector AS selectorFROM admin_domain WHERE enable_dkim

)

MySQLMariaDB

CREATE OR REPLACE VIEW dkim AS (SELECT id name as domain_name dkim_private_key_path AS private_key_path

dkim_key_selector AS selectorFROM admin_domain WHERE enable_dkim=1

)

Configuration

You should find OpenDKIMrsquos configuration file at etcopendkimconf

Add the following content to it

KeyTable dsnltdrivergtltusergtltpasswordgtltdb hostgtltdb namegttable=dkimrarr˓keycol=iddatacol=domain_nameselectorprivate_key_pathSigningTable dsnltdrivergtltusergtltpasswordgtltdb hostgtltdb namegttable=dkimrarr˓keycol=domain_namedatacol=idSocket inet12345localhost

Replace values between ltgt by yours Accepted values for driver are pgsql or mysql Make sure the user youspecify has read permission on the view created previously

If you run a debian based system make sure to adjust the following setting in the etcdefaultopendkim file

SOCKET=inet12345localhost

Eventually reload OpenDKIM

Postfix integration

Add the following lines to the etcpostfixmaincf file

smtpd_milters = inet12700112345non_smtpd_milters = inet12700112345milter_default_action = acceptmilter_content_timeout = 30s

and reload postfix

Extensions

Only few commands are needed to add a new extension to your setup

24 Chapter 2 Table of contents

Modoboa Documentation Release 1100

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install ltEXTENSIONgt==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Then restart your web server

22 Upgrade

221 Modoboa

Warning The new version you are going to install may need to modify your database Before you start makesure to backup everything

Most of the time upgrading your installation to a newer Modoboa version only requires a few actions In every caseyou will need to apply the general procedure first and then check if the version you are installing requires specificactions

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install modoboa==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Once done check if the version you are installing requires Specific instructions

Finally restart your web server

Sometimes you might need to upgrade postfix map files too To do so just run the generate_postfix_mapscommand on the same directory than the one used for installation (etcpostfix by default)

Make sure to use root privileges and run the following command

gt python managepy generate_postfix_maps --destdir ltdirectorygt

Then reload postfix

22 Upgrade 25

Modoboa Documentation Release 1100

222 Extensions

If a new version is available for an extension yoursquore using it is recommanded to install it Upgrading an extensions ispretty and the procedure is almost the same than the one used for Modoboa

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install ltEXTENSIONgt==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Finally restart your web server

It is a generic upgrade procedure which will be enough most of the time but it is generally a good idea to check theassociated documentation

223 Rebuild Virtual Environment

Sometimes when upgrading your Operating System (eg from Ubuntu 1704 to Ubuntu 1710) your virtual environmentrunning modoboa can get corrupted Your first response will be to panic but fear not The solution is in this document

First things first

Recover your database password

You will need to recover your database password (if using mysql or postgresql) You will find this in etcpostfixsql-aliasescf or any file with sql-cf in the etcpostfix directory

Make note of this as you will need it when reconfiguring modoboa

Reinstall Modoboa

Start out by backup up your modoboa settings file located in the modoboa instance directory (srvmodoboainstanceinstancesettingspy if you used the default installer configuration) This contains your currentconfiguration

Next you want to remove all current modoboa files

After doing this follow the manual installation instructions for Modoboa only as everything should be working prop-erly

After this completes simply restore your backed up settings file to srvinstanceinstancesettingspy(if you used installer default configuration) You will then need to reinstall your extensions

You can find which plugins you had in your settingspy file under the MODOBOA_APPS variable

Instructions to install extensions can also be found here

Once you have completed this step you will need to run the following commands

26 Chapter 2 Table of contents

Modoboa Documentation Release 1100

gt (env) $ cd ltinstance_dirgtgt (env) $ python managepy migrategt (env) $ python managepy collectstatic

You will then see a message similar to

You have requested to collect static files at the destinationlocation as specified in your settings

srvmodoboainstancesitestatic

This will overwrite existing filesAre you sure you want to do this

Type yes to continue or no to cancel

You will want to answer yes here then simply restart the uwsgi process with service uwsgi restart andyou should be up and running again

Simply log into your modoboa web panel and verify that your extensions and webmail box is working

224 Information

Rebuild instructions from httpshelppythonanywherecompagesRebuildingVirtualenvs

225 Specific instructions

1160

A new policy daemon has been added

Make sure to have a Redis instance running on your server

Add modoboapolicyd to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboapolicyd

)

Add the following settings to your settingspy file

REDIS_HOST = ltIP or hostname heregtREDIS_PORT = 6379REDIS_QUOTA_DB = 0REDIS_URL = redisformat(REDIS_HOST REDIS_PORT REDIS_QUOTA_DB)

Once done you can start the policy daemon using the following commands

22 Upgrade 27

Modoboa Documentation Release 1100

gt python managepy policy_daemon

Donrsquot forget to configure _policyd_config if you want to use this feature

The modoboa-stats plugin has been merged into the core

Add modoboamaillog to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboapolicydmodoboamaillog

)

And remove any reference to modoboa_stats in this same variable

1150

This version drops Python 2 support so donrsquot forget to update all the extensions you use

Warning If you upgrade an existing python 2 installation you will need to create a new Python 3 virtualenvironment You can remove the existing virtual environment and replace it by the new one so you wonrsquot have tomodify your configuration files

Add the following new setting

DISABLE_DASHBOARD_EXTERNAL_QUERIES = False

Reload uwsgigunicornapache depending on your setup

Finally Make sure to use root privileges and run the following command

gt python managepy generate_postfix_maps --destdir ltdirectorygt

Then reload postfix

1140

This release introduces an optional LDAP synchronization process If you want to use it please follow the dedicatedprocedure

1131

Upgrade postfix maps files as follows

28 Chapter 2 Table of contents

Modoboa Documentation Release 1100

gt python managepy generate_postfix_maps --destdir ltpathgt --force-overwrite

1130

Add modoboadnstools to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstools

)

Add the following new settings

CSRF_COOKIE_SECURE = TrueSESSION_COOKIE_SECURE = True

modoboa-postfix-autoreply 150

Edit the etcpostfixmaincf file and remove the sql-autoreplies-transportcf map from thetransport_maps if present Remove the corresponding proxy_read_maps entry if relevant

Reload postfix

1100

Warning Upgrade installed extensions BEFORE running check or migrate commands

Upgrade all your installed plugins to the following versions

Warning If you use the amavis plugin make sure to include its configuration as follows into settingspy

from modoboa_amavis import settings as modoboa_amavis_settingsmodoboa_amavis_settingsapply(globals())

22 Upgrade 29

Modoboa Documentation Release 1100

Name Versionmodoboa-amavis 120modoboa-contacts 050modoboa-dmarc 110modoboa-imap-migration 120modoboa-pdfcredentials 130modoboa-postfix-autoreply 140modoboa-radicale 120modoboa-sievefilters 140modoboa-stats 140modoboa-webmail 140

Edit the settingspy file and apply the following modifications

Add modoboatransport to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparameters

)

Replace the following line

MIDDLEWARE_CLASSES = (

by

MIDDLEWARE = (

Update postfix map files as follows

gt rm -f ltpathgtmodoboa-postfix-mapschkgt python managepy generate_postfix_maps --force --destdir ltpathgt

Then modify postfixrsquos configuration as follows

smtpd_sender_login_maps =ltdrivergtltpathgtsql-sender-login-mapcf

transport_maps =ltdrivergtltpathgtsql-transportcfltdrivergtltpathgtsql-spliteddomains-transportcf other map files

Replace ltdrivergt and ltpathgt by your values

If transport_maps contains sql-relaydomains-transportcf remove it

30 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning If you make use of postfixrsquos proxymap server you must also update the proxy_read_maps setting

Reload postfix

Add the following cron job in order to generate DKIM keys

Generate DKIM keys (they will belong to the user running this job)

root $PYTHON $INSTANCEmanagepy modorarr˓manage_dkim_keys

190

If you want to manage inactive accounts look at Cleaning inactive accounts

183

Edit the settingspy file and replace the following line

BASE_DIR = ospathdirname(ospathdirname(__file__))

by

BASE_DIR = ospathrealpath(ospathdirname(ospathdirname(__file__)))

180

Modoboa now relies on Djangorsquos builtin password validation system to validate user passwords instead ofdjango-passwords

Remove django-passwords from your system

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt pip uninstall django-passwords

Edit the settingspy file and remove the following content

django-passwords

PASSWORD_MIN_LENGTH = 8

PASSWORD_COMPLEXITY = UPPER 1LOWER 1DIGITS 1

Add the following lines

Password validation rulesAUTH_PASSWORD_VALIDATORS = [

NAME djangocontribauthpassword_validation

rarr˓UserAttributeSimilarityValidator (continues on next page)

22 Upgrade 31

Modoboa Documentation Release 1100

(continued from previous page)

NAME djangocontribauthpassword_validationMinimumLengthValidator

NAME djangocontribauthpassword_validationCommonPasswordValidator

NAME djangocontribauthpassword_validationNumericPasswordValidator

NAME modoboacorepassword_validationComplexityValidatorOPTIONS

upper 1lower 1digits 1specials 0

]

172

API documentation has evolved (because of the upgrade to Django Rest Framework 36) and CKeditor is now embed-ded by default (thanks to the django-ckeditor package) Some configuration changes are required

Edit your settingspy file and apply the following modifications

bull Update the INSTALLED_APPS variable as follows

INSTALLED_APPS = (djangocontribauthdjangocontribcontenttypesdjangocontribsessionsdjangocontribmessagesdjangocontribsitesdjangocontribstaticfilesreversionckeditorckeditor_uploaderrest_frameworkrest_frameworkauthtoken

)

bull Update the REST_FRAMEWORK variable as follows

REST_FRAMEWORK = DEFAULT_AUTHENTICATION_CLASSES (

rest_frameworkauthenticationTokenAuthenticationrest_frameworkauthenticationSessionAuthentication

)

bull Remove the SWAGGER_SETTINGS variable

bull Add the following content

32 Chapter 2 Table of contents

Modoboa Documentation Release 1100

CKeditor

CKEDITOR_UPLOAD_PATH = uploads

CKEDITOR_IMAGE_BACKEND = pillow

CKEDITOR_RESTRICT_BY_USER = True

CKEDITOR_BROWSE_SHOW_DIRS = True

CKEDITOR_ALLOW_NONIMAGE_FILES = False

CKEDITOR_CONFIGS = default

allowedContent Truetoolbar Modoboawidth Nonetoolbar_Modoboa [

[Bold Italic Underline][JustifyLeft JustifyCenter JustifyRight JustifyBlock][BidiLtr BidiRtl Language][NumberedList BulletedList - Outdent Indent][Undo Redo][Link Unlink Anchor - Smiley][TextColor BGColor - Source][Font FontSize][Image ][SpellChecker]

]

Donrsquot forget to run the following command

gt python managepy collectstatic

171

If you used 170 for a fresh installation please run the following commands

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy load_initial_data

170

This version requires Django gt= 110 so you need to make some modifications It also brings internal API changeswhich are not backward compatible so installed extensions must be upgraded too

First of all deactivate all installed extensions (edit the settingspy file and comment the corresponding lines inMODOBOA_APPS)

Edit the urlspy file of your local instance and replace its content by the following one

22 Upgrade 33

Modoboa Documentation Release 1100

from djangoconfurls import include url

urlpatterns = [url(r include(modoboaurls))

]

Edit the settingspy and apply the following changes

bull Add modoboaparameters to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboarelaydomainsmodoboalimitsmodoboaparameters Modoboa extensions here

)

bull Add modoboacoremiddlewareLocalConfigMiddleware to MIDDLEWARE_CLASSES

MIDDLEWARE_CLASSES = (djangocontribsessionsmiddlewareSessionMiddlewaredjangomiddlewarecommonCommonMiddlewaredjangomiddlewarecsrfCsrfViewMiddlewaredjangocontribauthmiddlewareAuthenticationMiddlewaredjangocontribmessagesmiddlewareMessageMiddlewaredjangomiddlewarelocaleLocaleMiddlewaredjangomiddlewareclickjackingXFrameOptionsMiddlewaremodoboacoremiddlewareLocalConfigMiddlewaremodoboalibmiddlewareAjaxLoginRedirectmodoboalibmiddlewareCommonExceptionCatchermodoboalibmiddlewareRequestCatcherMiddleware

)

bull Modoboa used to provide a custom authentication backend (modoboalibauthbackendsSimpleBackend) but it has been removed Replace it as follows

AUTHENTICATION_BACKENDS = ( Other backends beforedjangocontribauthbackendsModelBackend

)

bull Remove TEMPLATE_CONTEXT_PROCESSORS and replace it by

TEMPLATES = [

BACKEND djangotemplatebackendsdjangoDjangoTemplatesDIRS []APP_DIRS TrueOPTIONS

context_processors [djangotemplatecontext_processorsdebugdjangotemplatecontext_processorsrequestdjangocontribauthcontext_processorsauth

(continues on next page)

34 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

djangotemplatecontext_processorsi18ndjangotemplatecontext_processorsmediadjangotemplatecontext_processorsstaticdjangotemplatecontext_processorstzdjangocontribmessagescontext_processorsmessagesmodoboacorecontext_processorstop_notifications

]debug False

]

Run the following commands (load virtualenv if you use one)

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstatic

Finally upgrade your extensions and reactivate them

Name Versionmodoboa-amavis 110modoboa-dmarc 100modoboa-imap-migration 110modoboa-pdfcredentials 110modoboa-postfix-autoreply 120modoboa-radicale 110modoboa-sievefilters 110modoboa-stats 110modoboa-webmail 110

Command line shortcuts

$ pip install modoboa-amavis==110$ pip install modoboa-dmarc==100$ pip install modoboa-imap-migration==110$ pip install modoboa-pdfcredentials==110$ pip install modoboa-postfix-autoreply==120$ pip install modoboa-radicale==110$ pip install modoboa-sievefilters==110$ pip install modoboa-stats==110$ pip install modoboa-webmail==110

And please make sure you use the latest version of the django-versionfield2 package

$ pip install -U django-versionfield2

Notes about quota changes and resellers

Reseller users now have a quota option in Resources tab This is the quota that a reseller can share between all itsdomains

22 Upgrade 35

Modoboa Documentation Release 1100

There are two quotas for a domain in the new version

1 Quota amp

2 Default mailbox quota

[1] Quota quota shared between mailboxes This quota is shared between all the mailboxes of this domain This valuecannot exceed resellerrsquos quota and hence cannot be 0(unlimited) if reseller has finite quota

[2] Default mailbox quota default quota applied to mailboxes This quota is the default quota applied to new mail-boxes This value cannot exceed Quota[1] and hence cannot be 0(unlimited) if Quota[1] is finite

161

First of all update postfix map files as follows

gt python managepy generate_postfix_maps --destdir ltpathgt --force-overwrite

Then modify postfixrsquos configuration as follows

smtpd_sender_login_maps =ltdrivergtltpathgtsql-sender-login-mailboxescfltdrivergtltpathgtsql-sender-login-aliasescfltdrivergtltpathgtsql-sender-login-mailboxes-extracf

Replace ltdrivergt and ltpathgt by your values

Finally reload postfix

This release also deprecates some internal functions As a result several extensions has been updated to maintain thecompatibility If you enabled the notification service yoursquoll find the list of available updates directly in your Modoboaconsole

For the others here is the list

Name Versionmodoboa-amavis 1010modoboa-postfix-autoreply 117modoboa-radicale 105modoboa-stats 109

Command line shortcut

$ pip install modoboa-amavis==1010$ pip install modoboa-postfix-autoreply==117$ pip install modoboa-radicale==105$ pip install modoboa-stats==109

160

Warning You have to upgrade extensions due to coreUser model attribute change (usergroup to userrole) Oth-erwise you will have an internal error after upgrade In particular modoboa-amavisd modoboa-stats modoboa-postfix-autoreply are concerned

36 Chapter 2 Table of contents

Modoboa Documentation Release 1100

An interesting feature brougth by this version is the capability to make different checks about MX records Forexample Modoboa can query main DNSBL providers for every defined domain With this you will quickly know ifone the domains you manage is listed or not To activate it add the following line to your crontab

30 ltoptional_virtualenv_pathgtpython ltmodoboa_instance_dirgtmanagepy modorarr˓check_mx

The communication with Modoboa public API has been reworked Instead of sending direct synchronous queries (forexample to check new versions) a cron job has been added To activate it add the following line to your crontab

0 ltoptional_virtualenv_pathgtpython ltmodoboa_instance_dirgtmanagepyrarr˓communicate_with_public_api

Please also note that public API now uses TLS so you must update your configuration as follows

MODOBOA_API_URL = httpsapimodoboaorg1

Finally it is now possible to declare additional sender addresses on a per-account basis You need to update your postfixconfiguration in order to use this functionality Just edit the maincf file and change the following parameter

smtpd_sender_login_maps =ltdrivergtetcpostfixsql-sender-login-mailboxescfltdrivergtetcpostfixsql-sender-login-aliasescfltdrivergtetcpostfixsql-sender-login-mailboxes-extracf

150

The API has been greatly improved and a documentation is now available To enable it addrest_framework_swagger to the INSTALLED_APPS variable in settingspy as follows

INSTALLED_APPS = (djangocontribauthdjangocontribcontenttypesdjangocontribsessionsdjangocontribmessagesdjangocontribsitesdjangocontribstaticfilesreversionrest_frameworkauthtokenrest_framework_swagger

)

Then add the following content into settingspy just after the REST_FRAMEWORK variable

SWAGGER_SETTINGS = is_authenticated Falseapi_version 10exclude_namespaces []info

contact contactmodoboacomdescription (Modoboa API requires a valid token)title Modoboa API

Yoursquore done The documentation is now available at the following address

22 Upgrade 37

Modoboa Documentation Release 1100

httpltyour instance addressgtdocsapi

Finally if you find a TEMPLATE_CONTEXT_PROCESSORS variable in your settingspy file make sure it lookslike this

TEMPLATE_CONTEXT_PROCESSORS = global_settingsTEMPLATE_CONTEXT_PROCESSORS + [modoboacorecontext_processorstop_notifications

]

140

Warning Please make sure to use Modoboa 135 with an up-to-date database before an upgrade to 140

Warning Do not follow the regular upgrade procedure for this version

Some extension have been moved back into the main repository The main reason for that is that using Modoboawithout them doesnrsquot make sense

First of all you must rename the following applications listed inside the MODOBOA_APPS variable

Old name New namemodoboa_admin modoboaadminmodoboa_admin_limits modoboalimitsmodoboa_admin_relaydomains modoboarelaydomains

Then apply the following steps

1 Uninstall old extensions

$ pip uninstall modoboa-admin modoboa-admin-limits modoboa-admin-relaydomains

2 Install all extension updates using pip (check the Modoboa gt Information page)

3 Manually migrate database

$ cd ltinstance_dirgt$ python managepy migrate auth$ python managepy migrate admin 0001 --fake$ python managepy migrate admin$ python managepy migrate limits 0001 --fake$ python managepy migrate relaydomains 0001 --fake$ python managepy migrate

4 Finally update static files

$ python managepy collectstatic

This version also introduces a REST API To enable it

1 Add rest_frameworkauthtoken to the INSTALLED_APPS variable

2 Add the following configuration inside settingspy

38 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Rest framework settings

REST_FRAMEWORK = DEFAULT_AUTHENTICATION_CLASSES (

rest_frameworkauthenticationTokenAuthentication)DEFAULT_PERMISSION_CLASSES (

rest_frameworkpermissionsIsAuthenticated)

3 Run the following command

$ python managepy migrate

135

To enhance security Modoboa now checks the strength of user passwords lthttpsgithubcomdstufftdjango-passwordsgt_

To use this feature add the following configuration into the settingspy file

django-passwords

PASSWORD_MIN_LENGTH = 8

PASSWORD_COMPLEXITY = UPPER 1LOWER 1DIGITS 1

132

Modoboa now uses the atomic requests mode to preserve database consistency (reference)

To enable it update the DATABASES variable in settingspy as follows

DATABASES = default

stuff beforeATOMIC_REQUESTS True

amavis

stuff beforeATOMIC_REQUESTS True

130

This release does not bring awesome new features but it is a necessary bridge to the future of Modoboa All extensionsnow have their own git repository and the deploy process has been updated to reflect this change

22 Upgrade 39

Modoboa Documentation Release 1100

Another important update is the use of Django 17 Besides its new features the migration system has been reworkedand is now more robust than before

Before we begin with the procedure here is a table showing old extension names and their new name

Old name New package name New module namemodoboaextensionsadmin modoboa-admin modoboa_adminmodoboaextensionslimits modoboa-admin-limits modoboa_admin_limitsmodoboaextensionspostfix_autoreply modoboa-postfix-autoreply modoboa_postfix_autoreplymodoboaextensionspostfix_relay_domains modoboa-admin-relaydomains modoboa_admin_relaydomainsmodoboaextensionsradicale modoboa-radicale modoboa_radicalemodoboaextensionssievefilters modoboa-sievefilters modoboa_sievefiltersmodoboaextensionsstats modoboa-stats modoboa_statsmodoboaextensionswebmail modoboa-webmail modoboa_webmail

Here are the required steps

1 Install the extensions using pip (look at the second column in the table above)

$ pip install ltthe extensions you wantgt

2 Remove south from INSTALLED_APPS

3 Rename old extension names inside MODOBOA_APPS (look at the third column in the table above)

4 Remove modoboalibmiddlewareExtControlMiddleware from MIDDLEWARE_CLASSES

5 Change DATABASE_ROUTERS to

DATABASE_ROUTERS = [modoboa_amavisdbrouterAmavisRouter]

6 Run the following commands

$ cd ltmodoboa_instance_dirgt$ python managepy migrate

7 Reply yes to the question

8 Run the following commands

$ python managepy load_initial_data$ python managepy collectstatic

9 The cleanup job has been renamed in Django so you have to modify your crontab entry

- 0 0 ltmodoboa_sitegtmanagepy cleanup+ 0 0 ltmodoboa_sitegtmanagepy clearsessions

120

A new notification service let administrators know about new Modoboa versions To activate it you need to updatethe TEMPLATE_CONTEXT_PROCESSORS variable like this

from djangoconf import global_settings

TEMPLATE_CONTEXT_PROCESSORS = global_settingsTEMPLATE_CONTEXT_PROCESSORS + (

(continues on next page)

40 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

modoboacorecontext_processorstop_notifications)

and to define the new MODOBOA_API_URL variable

MODOBOA_API_URL = httpapimodoboaorg1

The location of external static files has changed To use them add a new path to the STATICFILES_DIRS

Additional locations of static filesSTATICFILES_DIRS = (

Put strings here like homehtmlstatic or Cwwwdjangostatic Always use forward slashes even on Windows Dont forget to use absolute paths not relative pathsltpathtomodoboainstalldirgtbower_components

)

Run the following commands to define the hostname of your instance

$ cd ltmodoboa_instance_dirgt$ python managepy set_default_site lthostnamegt

If you plan to use the Radicale extension

1 Add modoboaextensionsradicale to the MODOBOA_APPS variable

2 Run the following commands

$ cd ltmodoboa_instance_dirgt$ python managepy syncdb

Warning You also have to note that the sitestatic directory has moved from ltpath to your sitesdirgt to ltmodoboas root urlgt (itrsquos probably the parent directory) You have to adapt your web serverconfiguration to reflect this change

23 Configuration

231 Online parameters

Modoboa provides online panels to modify internal parameters There are two available levels

bull Application level global parameters define how the application behaves Available at Modoboa gt Parameters

bull User level per user customization Available at User gt Settings gt Preferences

Regardless level parameters are displayed using tabs each tab corresponding to one application

General parameters

The admin application exposes several parameters they are presented below

23 Configuration 41

Modoboa Documentation Release 1100

Name Tab Description Default valueAuthentication type General The backend used for au-

thenticationLocal

Default password scheme General Scheme used to cryptmailbox passwords

crypt

Rounds General Number of rounds (onlyused by sha256cryptand sha512crypt) Mustbe between 1000 and999999999 inclusive

70000

Secret key General A key used to encryptusersrsquo password in ses-sions

random value

Sender address General Email address used tosend notifications

Enable communication General Enable communicationwith Modoboa public API

yes

Check new versions General Automatically checks if anewer version is available

yes

Send statistics General Send statistics to Mod-oboa public API (countersand used extensions)

yes

Top notifications check in-terval

General Interval between two topnotification checks (inseconds)

30

Maximum log record age General The maximum age in daysof a log record

365

Items per page General Number of displayeditems per page

30

Default top redirection General The default redirectionused when no applicationis specified

userprefs

Enable MX checks Admin Check that every domainhas a valid MX record

yes

Valid MXs Admin A list of IP or networkaddress every MX shouldmatch A warning will besent if a record does notrespect this it

Enable DNSBL checks Admin Check every domainagainst major DNSBLproviders

yes

DKIM keys storage direc-tory

AdminPath to a directory where DKIM

generated keys willbe stored

Default DKIM key length Admin The default size (in bits)for new keys

2048

Handle mailboxes onfilesystem

Admin Rename or remove mail-boxes on the filesystemwhen they get renamed orremoved within Modoboa

no

Mailboxes owner Admin The UNIX account whoowns mailboxes on thefilesystem

vmail

Default domain quota Admin Default quota (in MB) ap-plied to freshly createddomains with no valuespecified A value of 0means no quota

0

Automatic accountremoval

Admin When a mailbox is re-moved also remove theassociated account

no

Automatic do-mainmailbox creation

Admin Create a domain and amailbox when an accountis automatically created

yes

42 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Note If you are not familiar with virtual domain hosting you should take a look at postfixrsquos documentation ThisHow to also contains useful information

Note A random secret key will be generated each time the Parameters page is refreshed and until you save parametersat least once

Note Specific LDAP parameters are also available see LDAP authentication

232 Media files

Modoboa uses a specific directory to upload files (ie when the webmail is in use) or to create ones (ex graphical statis-tics) This directory is named media and is located inside modoboarsquos installation directory (called modoboa_sitein this documentation)

To work properly the system user which runs modoboa (www-data apache whatever) must have write access tothis directory

233 Customization

Custom logo

You have the possibility to use a custom logo instead of the default one on the login page

To do so open the settingspy file and add a MODOBOA_CUSTOM_LOGO variable This variable must containthe relative URL of your logo under MEDIA_URL For example

MODOBOA_CUSTOM_LOGO = ospathjoin(MEDIA_URL custom_logopng)

Then copy your logo file into the directory indicated by MEDIA_ROOT

234 Host configuration

Note This section is only relevant when Modoboa handles mailboxes renaming and removal from the filesystem

To manipulate mailboxes on the filesystem you must allow the user who runs Modoboa to execute commands as theuser who owns mailboxes

To do so edit the etcsudoers file and add the following inside

ltuser_that_runs_modoboagt ALL=(ltmailboxes ownergt) NOPASSWD ALL

Replace values between ltgt by the ones you use

23 Configuration 43

Modoboa Documentation Release 1100

235 Time zone and language

Modoboa is available in many languages

To specify the default language to use edit the settingspy file and modify the LANGUAGE_CODE variable

LANGUAGE_CODE = fr or en for english etc

Note Each user has the possibility to define the language he prefers

In the same configuration file specify the timezone to use by modifying the TIME_ZONE variable For example

TIME_ZONE = EuropeParis

236 Sessions management

Modoboa uses Djangorsquos session framework to store per-user information

Few parameters need to be set in the settingspy configuration file to make Modoboa behave as expected

SESSION_EXPIRE_AT_BROWSER_CLOSE = False Default value

This parameter is optional but you must ensure it is set to False (the default value)

The default configuration file provided by the modoboa-adminpy command is properly configured

237 Logging authentication

To trace login attempts to the web interface Modoboa uses python SysLogHandler so you can see them in your syslogauthentication log file (varlogauthlog in most cases)

Depending on your configuration you may have to edit the settingspy file and add lsquoaddressrsquo lsquodevlogrsquo to thelogging section

syslog-auth class logginghandlersSysLogHandlerfacility SysLogHandlerLOG_AUTHaddress devlogformatter syslog

238 External authentication

LDAP

Modoboa supports external LDAP authentication using the following extra components

bull Python LDAP client

bull Django LDAP authentication backend

If you want to use this feature you must first install those components

44 Chapter 2 Table of contents

Modoboa Documentation Release 1100

$ pip install python-ldap django-auth-ldap

Then all you have to do is to modify the settingspy file Add a new authentication backend to the AUTHENTI-CATION_BACKENDS variable like this

AUTHENTICATION_BACKENDS = (modoboalibauthbackendsLDAPBackend modoboalibauthbackendsLDAPSecondaryBackend Useful for a fallback

rarr˓mechanismdjangocontribauthbackendsModelBackend

)

Finally go to Modoboa gt Parameters gt General and set Authentication type to LDAP

From there new parameters will appear to let you configure the way Modoboa should connect to your LDAP serverThey are described just below

Name Description De-faultvalue

Server address The IP address of the DNS name of the LDAP server local-host

Server port The TCP port number used by the LDAP server 389Use a secureconnection

Use an SSLTLS connection to access the LDAP server no

Authenticationmethod

Choose the authentication method to use Directbind

User DN tem-plate (directbind mode)

The template used to construct a userrsquos DN It should contain one placeholder (ie(user)s)

Bind BN The distinguished name to use when binding to the LDAP server Leave empty for ananonymous bind

Bind password The password to use when binding to the LDAP server (with lsquoBind DNrsquo)Search base The distinguished name of the search baseSearch filter An optional filter string (eg lsquo(objectClass=person)rsquo) In order to be valid it must be

enclosed in parentheses(mail=(user)s)

Passwordattribute

The attribute used to store user passwords user-Pass-word

Active Direc-tory

Tell if the LDAP server is an Active Directory one no

Administratorgroups

Members of those LDAP Posix groups will be created ad domain administrators Uselsquorsquo characters to separate groups

Group type The type of group used by your LDAP directory Posix-Group

Groups searchbase

The distinguished name of the search base used to find groups

Do-mainmailboxcreation

Automatically create a domain and a mailbox when a new user is created just after thefirst successful authentication You will generally want to disable this feature whenthe relay domains extension is in use

yes

If you need additional parameters you will find a detailed documentation here

Once the authentication is properly configured the users defined in your LDAP directory will be able to connect to

23 Configuration 45

Modoboa Documentation Release 1100

Modoboa the associated domain and mailboxes will be automatically created if needed

The first time a user connects to Modoboa a local account is created if the LDAP username is a valid email addressBy default this account belongs to the SimpleUsers group and it has a mailbox

To automatically create domain administrators you can use the Administrator groups setting If a LDAP user belongsto one the listed groups its local account will belong to the DomainAdmins group In this case the username is notnecessarily an email address

Users will also be able to update their LDAP password directly from Modoboa

Note Modoboa doesnrsquot provide any synchronization mechanism once a user is registered into the database Anymodification done from the directory to a user account will not be reported to Modoboa (an email address change forexample) Currently the only solution is to manually delete the Modoboa record it will be recreated on the next userlogin

SMTP

It is possible to use an existing SMTP server as an authentication source To enable this feature edit the settingspy file and change the following setting

AUTHENTICATION_BACKENDS = (modoboalibauthbackendsSMTPBackenddjangocontribauthbackendsModelBackend

)

SMTP server location can be customized using the following settings

AUTH_SMTP_SERVER_ADDRESS = localhostAUTH_SMTP_SERVER_PORT = 25AUTH_SMTP_SECURED_MODE = None ssl or starttls are accepted

239 LDAP synchronization

Modoboa can synchronize accounts with an LDAP directory (tested with OpenLDAP) but this feature is not enabledby default To activate it add modoboaldapsync to MODOBOA_APPS in the settingspy file

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboaldapsync

)

and enable it from the admin panel

46 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning Make sure to install additional requirements otherwise it wonrsquot work

The following parameters are available and must be filled

Name Description Defaultvalue

Enable LDAP synchro-nization

Control LDAP synchronization state no

Bind DN The DN of a user with write permission to createupdate accountsBind password The associated passwordAccount DN template The template used to build account DNs (must contain a (user)s

placeholder

2310 Database maintenance

Cleaning the logs table

Modoboa logs administrator specific actions into the database A clean-up script is provided to automatically removeoldest records The maximum log record age can be configured through the online panel

To use it you can setup a cron job to run every night

0 0 ltmodoboa_sitegtmanagepy cleanlogs Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy cleanlogs

Cleaning the session table

Django does not provide automatic purging Therefore itrsquos your job to purge expired sessions on a regular basis

Django provides a sample clean-up script django-adminpy clearsessions That script deletes any sessionin the session table whose expire_date is in the past

For example you could setup a cron job to run this script every night

0 0 ltmodoboa_sitegtmanagepy clearsessions Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy clearsessions

Cleaning inactive accounts

Thanks to Last-login tracking it is now possible to monitor inactive accounts An account is considered inactive if nologin has been recorded for the last 30 days (this value can be changed through the admin panel)

A management command is available to disable or delete inactive accounts For example you could setup a cron jobto run it every night

23 Configuration 47

Modoboa Documentation Release 1100

0 0 ltmodoboa_sitegtmanagepy clean_inactive_accounts Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy clean_inactive_rarr˓accounts

The default behaviour is to disable accounts You can delete them using the --delete option

24 Moving to Modoboa

You have an existing platform and yoursquod like to move to Modoboa the following tools could help you

241 From postfixadmin

A dedicated command allows you to convert an existing postfixadmin database to a Modoboa one Consult the docu-mentation to know more about the process

242 Using CSV files

Modoboa allows you to import any object (domain domain alias mailbox and alias) using a simple CSV file encodedusing UTF8 Each line corresponds to a single object and must respect one of the following format

domain ltname stringgt ltquota integergt ltdefault mailbox quota integergt ltenabledrarr˓booleangtdomainalias ltname stringgt lttargeted domain stringgt ltenabled booleangtrelaydomain ltname stringgt lttarget host stringgt lttarget port integergt ltservicerarr˓stringgt ltenabled booleangt ltverify recipients booleangtaccount ltloginname stringgt ltpassword stringgt ltfirst name stringgt ltlast namerarr˓stringgt ltenabled booleangt ltgroup stringgt ltaddress stringgt ltquota integergt [rarr˓ltdomain stringgt ]alias ltaddress stringgt ltenabled booleangt ltrecipient stringgt

Boolean fields accept the following values true 1 yes y (case insensitive) Any other value will be evaluated asfalse

Warning The order does matter Objects are created sequencially so a domain must be created before itsmailboxes and aliases and a mailbox must created before its alias(es)

To actually import such a file

gt sudo -u ltmodoboa_usergt -igt source ltvirtualenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy modo import ltyour filegt

Available options can be listed using the following command

gt python managepy modo import -h

48 Chapter 2 Table of contents

Modoboa Documentation Release 1100

25 REST API

To ease the integration with external sources (software or other) Modoboa provides a REST API

Every installed instance comes with a ready-to-use API and a documentation You will find them using the followingurl patterns

bull API httplthostnamegtapiv1

bull Documentation httplthostnamegtdocsapi

An example of this documentation is available on the official demo

Using this API requires an authentication and for now only a token based authentication is supported To get a validtoken log-in to your instance with a super administrator go to Settings gt API and activate the API access Press theUpdate button and wait until the page is reloaded the token will be displayed

To make valid API calls every requests you send must embed this token within an Authorization HTTP header likethis

Authorization Token ltYOUR_TOKENgt

and the content type of those requests must be applicationjson

26 How to contribute

Contributions are always welcome If you want to submit a patch please respect the following rules

bull Open a pull request on the appropriate repository

bull Respect PEP8

bull Document your patch and respect PEP 257

bull Add unit tests and make sure the global coverage does not decrease

If all those steps are validated your contribution will generally be integrated

261 Table of contents

25 REST API 49

Modoboa Documentation Release 1100

Useful tips

You would like to work on Modoboa but you donrsquot know where to start Yoursquore at the right place Browse this pageto learn useful tips

Docker

A docker image is available for developers To use it you must install docker and docker-compose first

Then just run the following command

$ docker-compose up

It will start the docker environment and make a Modoboa instance available at httplocalhost8000

If you donrsquot want to use docker or need a more complex development setup go to the next section

Prepare a virtual environment

A virtual environment is a good way to setup a development environment on your machine

To do so run the following commands

$ python3 -m venv ltpathgt$ source ltpathgtbinactivate$ git clone httpsgithubcommodoboamodoboagit$ cd modoboa$ python setuppy develop$ pip install -r dev-requirementstxt

The develop command creates a symbolic link to your local copy so any modification you make will be automati-cally available in your environment no need to copy them

Deploy an instance for development

Warning Make sure to create a database before running this step The format of the database url is also describedin this page

Now that you have a running environment yoursquore ready to deploy a test instance

$ cd ltpathgt$ modoboa-adminpy deploy --dburl defaultltdatabase urlgt --domain localhost --develrarr˓instance$ python managepy runserver

Yoursquore ready to go You should be able to access Modoboa at httplocalhost8000 usingadminpassword as credentials

Manage static files

Modoboa uses bower (thanks to django-bower) to manage its CSS and javascript dependencies

50 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Those dependencies are listed in a file called dev_settingspy located inside the ltpath_to_local_copygtmodoboacore directory

If you want to add a new dependency just complete the BOWER_INSTALLED_APPS parameter and run the followingcommand

$ python managepy bower install

It will download and store the required files into the ltpath_to_local_copygtmodoboabower_components directory

Test your modifications

If you deployed a specific instance for your development needs you can run the tests suite as follows

gt python managepy test modoboacore modoboalib modoboaadmin modoboalimits modoboararr˓relaydomains

Otherwise you can run the tests suite from the repository using tox

Start a basic Modoboa instance

From the repository run the following command to launch a simple instance with a few fixtures

gt tox -e serve

You can use adminpassword to log in

Build the documentation

If you need to modify the documenation and want to see the result you can build it as follows

gt tox -e docgt firefox toxdoctmphtmlindexhtml

FAQ

bower command is missing in managepy

bower command is missing in managepy if you donrsquot use the --devel option of the modoboa-adminpydeploy command

To fix it regenerate your instance or update your settingspy file manually Look at devmode in httpsgithubcomtonioomodoboablobmastermodoboacorecommandstemplatessettingspytpl

Create a new plugin

Introduction

Modoboa offers a plugin API to expand its capabilities The current implementation provides the following possibili-ties

26 How to contribute 51

Modoboa Documentation Release 1100

bull Expand navigation by adding entry points to your plugin inside the GUI

bull Access and modify administrative objects (domains mailboxes etc)

bull Register callback actions for specific events

Plugins are nothing more than Django applications with an extra piece of code that integrates them into Modoboa Themodo_extensionpy file will contain a complete description of the plugin

bull Admin and user parameters

bull Custom menu entries

The communication between both applications is provided by Django signals

The following subsections describe the plugin architecture and explain how you can create your own

The required glue

To create a new plugin just start a new django application like this (into Modoboarsquos directory)

$ python managepy startapp

Then you need to register this application using the provided API Just copypaste the following example into themodo_extensionpy file of the future extension

from modoboacoreextensions import ModoExtension exts_pool

class MyExtension(ModoExtension)My custom Modoboa extension

name = myextlabel = My Extensionversion = 01description = A descriptionurl = myext_root_location optional name is used if not defined

def load(self)This method is called when Modoboa loads available and activated plugins

Declare parameters and register events herepass

def load_initial_data(self)Optional provide initial data for your extension herepass

exts_poolregister_extension(MyExtension)

Once done simply add your extensionrsquos module name to the MODOBOA_APPS variable located inside settingspy Finally run the following commands

$ python managepy migrate$ python managepy load_initial_data$ python managepy collectstatic

52 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Parameters

A plugin can declare its own parameters There are two levels available

bull lsquoGlobalrsquo parameters used to configure the plugin editable inside the Admin gt Settings gt Parameters page

bull lsquoUserrsquo parameters per-user parameters (or preferences) editable inside the Options gt Preferences page

Playing with parameters

Parameters are defined using Django forms and Modoboa adds two special forms you can inherit depending on thelevel of parameter(s) you want to add

bull modoboaparametersformsAdminParametersForm for general parameters

bull modoboaparametersformsUserParametersForm for user parameters

To register new parameters add the following line into the load method of your plugin class

from modoboaparameters import tools as param_toolsparam_toolsregistryadd(

LEVEL YourForm ugettext_lazy(Title))

Replace LEVEL by global or user

Custom role permissions

Modoboa uses Djangorsquos internal permission system Administrative roles are nothing more than groups (Groupinstances)

An extension can add new permissions to a group by listening to the extra_role_permissions signal Here isan example

from djangodispatch import receiverfrom modoboacore import signals as core_signals

PERMISSIONS = Resellers [

(relaydomains relaydomain add_relaydomain)(relaydomains relaydomain change_relaydomain)(relaydomains relaydomain delete_relaydomain)(relaydomains service add_service)(relaydomains service change_service)(relaydomains service delete_service)

]

receiver(core_signalsextra_role_permissions)def extra_role_permissions(sender role kwargs)

Add permissions to the Resellers groupreturn constantsPERMISSIONSget(role [])

Extending admin forms

The forms used to edit objects (account domain etc) through the admin panel are composed of tabs You can extendthem (ie add new tabs) in a pretty easy way thanks to custom signals

26 How to contribute 53

Modoboa Documentation Release 1100

Account

To add a new tab to the account edition form define new listeners (handlers) for the following signals

bull modoboaadminsignalsextra_account_forms

bull modoboaadminsignalsget_account_form_instances

bull modoboaadminsignalscheck_extra_account_form (optional)

Example

from djangodispatch import receiverfrom modoboaadmin import signals as admin_signals

receiver(admin_signalsextra_account_forms)def extra_account_form(sender user account kwargs)

return [id tabid title Title cls MyFormClass

]

receiver(admin_signalsget_account_form_instances)def fill_my_tab(sender user account kwargs)

return id my_instance

Domain

To add a new tab to the domain edition form define new listeners (handlers) for the following signals

bull modoboaadminsignalsextra_domain_forms

bull modoboaadminsignalsget_domain_form_instances

Example

from djangodispatch import receiverfrom modoboaadmin import signals as admin_signals

receiver(admin_signalsextra_domain_forms)def extra_account_form(sender user domain kwargs)

return [id tabid title Title cls MyFormClass

]

receiver(admin_signalsget_domain_form_instances)def fill_my_tab(sender user domain kwargs)

return id my_instance

27 Contributors

bull Antidot

bull Bearstech

bull CAP-REL

54 Chapter 2 Table of contents

Modoboa Documentation Release 1100

bull Dalnix

27 Contributors 55

  • Overview
  • Table of contents
Page 13: Modoboa Documentation

Modoboa Documentation Release 1100

Apache2

First make sure that mod_wsgi is installed on your server

Create a new virtualhost in your Apache configuration and put the following content inside

ltVirtualHost 80gtServerName ltyour valuegtDocumentRoot ltmodoboa_instance_pathgt

Alias media ltmodoboa_instance_pathgtmedialtDirectory ltmodoboa_instance_pathgtmediagtOrder denyallowAllow from all

ltDirectorygt

Alias sitestatic ltmodoboa_instance_pathgtsitestaticltDirectory ltmodoboa_instance_pathgtsitestaticgtOrder denyallowAllow from all

ltDirectorygt

WSGIScriptAlias ltmodoboa_instance_pathgtltinstance_namegtwsgipy

Pass Authorization header to enable API usageWSGIPassAuthorization On

ltVirtualHostgt

This is just one possible configuration

To use mod_wsgi daemon mode add the two following directives just under WSGIScriptAlias

WSGIDaemonProcess examplecom python-path=ltmodoboa_instancegtltvirtualenv pathgtlibrarr˓python37site-packagesWSGIProcessGroup examplecom

Replace values between ltgt with yours If you donrsquot use a virtualenv just remove the last part of theWSGIDaemonProcess directive

Note You will certainly need more configuration in order to launch Apache

Now you can go the Dovecot section to continue the installation

Nginx

This section covers two different ways of running Modoboa behind Nginx using a WSGI application server Choosethe one you prefer between Green Unicorn or uWSGI

In both cases yoursquoll need to download and install nginx

Green Unicorn

Firstly Download and install gunicorn Then use the following sample gunicorn configuration (create a new filenamed gunicornconfpy inside Modoboarsquos root dir)

10 Chapter 2 Table of contents

Modoboa Documentation Release 1100

backlog = 2048bind = unixvarrungunicornmodoboasockpidfile = varrungunicornmodoboapiddaemon = Truedebug = Falseworkers = 2logfile = varloggunicornmodoboalogloglevel = info

To start gunicorn execute the following commands

$ cd ltmodoboa dirgt$ gunicorn -c gunicornconfpy ltmodoboa dirgtwsgiapplication

Now the nginx part Just create a new virtual host and use the following configuration

upstream modoboa server unixvarrungunicornmodoboasock fail_timeout=0

server listen 443 sslssl onkeepalive_timeout 70

server_name lthost fqdngtroot ltmodoboa_instance_pathgt

access_log varlognginxlthost fqdngtaccesslogerror_log varlognginxlthost fqdngterrorlog

ssl_certificate ltssl certificate for your sitegtssl_certificate_key ltssl certificate key for your sitegt

location sitestatic autoindex on

location media autoindex on

location proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_forproxy_set_header Host $http_hostproxy_redirect offproxy_set_header X-Forwarded-Protocol sslproxy_pass httpmodoboa

If you do not plan to use SSL then change the listen directive to listen 80 and delete each of the followingdirectives

ssl onkeepalive_timeout 70ssl_certificate ltssl certificate for your sitegt

(continues on next page)

21 Installation 11

Modoboa Documentation Release 1100

(continued from previous page)

ssl_certificate_key ltssl certificate key for your sitegtproxy_set_header X-Forwarded-Protocol ssl

If you do plan to use SSL yoursquoll have to generate a certificate and a key This article contains information about howto do it

Paste this content to your configuration (replace values between ltgt with yours) and restart nginx

Now you can go the Dovecot section to continue the installation

uWSGI

The following setup is meant to get you started quickly You should read the documentation of both nginx and uwsgito understand how to optimize their configuration for your site

The Django documentation includes the following warning regarding uwsgi

Warning Use uwsgi 126 or newer If you do not you will run into problems Modoboa will fail in obscureways

To use this setup first download and install uwsgi

Here is a sample nginx configuration

server listen 443 sslssl onkeepalive_timeout 70

server_name lthost fqdngtroot ltmodoboas settings dirgt

ssl_certificate ltssl certificate for your sitegtssl_certificate_key ltssl certificate key for your sitegt

access_log varlognginxlthost fqdngtaccesslogerror_log varlognginxlthost fqdngterrorlog

location ltmodoboas root urlgtsitestatic autoindex onalias ltlocation of sitestatic on your file systemgt

Whether or not Modoboa uses a media directory depends on how you configured Modoboa It does not hurt to have thislocation ltmodoboas root urlgtmedia

autoindex onalias ltlocation of media on your file systemgt

This denies access to any file that begins with ht Apaches htaccess and htpasswd are such files A Modoboa installed from scratch would not contain any such files but you never know what the future holds

(continues on next page)

12 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

location ~ ht deny all

location ltmodobas root urlgt include uwsgi_paramsuwsgi_pass ltuwsgi portgtuwsgi_param UWSGI_SCRIPT ltmodoboa instance namegtwsgiapplicationuwsgi_param UWSGI_SCHEME https

ltmodoboa instance namegt must be replaced by the value you used when you deployed your instance

If you do not plan to use SSL then change the listen directive to listen 80 and delete each of the followingdirectives

ssl onkeepalive_timeout 70ssl_certificate ltssl certificate for your sitegtssl_certificate_key ltssl certificate key for your sitegtuwsgi_param UWSGI_SCHEME https

If you do plan to use SSL yoursquoll have to generate a certificate and a key This article contains information about howto do it

Make sure to replace the ltgt in the sample configuration with appropriate values Here are some explanations forthe cases that may not be completely self-explanatory

ltmodoboas settings dirgt Where Modoboarsquos settingspy resides This is also where thesitestatic and media directories reside

ltmodoboas root urlgt This is the URL which will be the root of your Modoboa site at your domain For in-stance if your Modoboa installation is reachable at at httpsfoomodoboa then ltmodoboas rooturlgt is modoboa In this case you probably also have to set the alias directives to point to where Mod-oboarsquos sitestatic and media directories are because otherwise nginx wonrsquot be able to find them

If Modoboa is at the root of your domain then ltmodoboa root urlgt is an empty string and can be deletedfrom the configuration above In this case you probably do not need the alias directives

ltuwsgi portgt The location where uwsig is listening It could be a unix domain socket or an addressport combi-nation Ubuntu configures uwsgi so that the port is

unixrunuwsgiappltapp namegtsocket

where ltapp namegt is the name of the application

Your uwsgi configuration should be

[uwsgi] Not needed when using uwsgi from pip plugins = pythonchdir = ltmodoboas top dirgtmodule = ltnamegtwsgiapplicationmaster = trueharakiri = 60processes = 4vhost = trueno-default-app = true

21 Installation 13

Modoboa Documentation Release 1100

The plugins directive should be turned on if you use a uwsgi installation that requires it If uwsgi was installed frompip it does not require it In the configuration above

ltmodoboas top dirgt The directory where managepy resides This directory is the parent of ltmodoboassettings dirgt

ltnamegt The name that you passed to modoboa-adminpy deploy when you created your Modoboa instance

Now you can go the Dovecot section to continue the installation

Dovecot

Modoboa requires Dovecot 2+ to work so the following documentation is suitable for this combination

In this section we assume dovecotrsquos configuration resides in etcdovecot all pathes will be relative to thisdirectory

Mailboxes

First edit the confd10-mailconf and set the mail_location variable

maildirmail_location = maildir~maildir

Then edit the inbox namespace and add the following lines

inbox = yes

mailbox Drafts auto = subscribespecial_use = Drafts

mailbox Junk

auto = subscribespecial_use = Junk

mailbox Sent

auto = subscribespecial_use = Sent

mailbox Trash

auto = subscribespecial_use = Trash

With dovecot 21+ it ensures all the special mailboxes will be automaticaly created for new accounts

For dovecot 20 and older use the autocreate plugin

Operations on the file system

14 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning Modoboa needs to access the dovecot binary to check its version To find the binary path weuse the which command first and then try known locations (usrsbindovecot and usrlocalsbindovecot) If you installed dovecot in a custom location please tell us where the binary is by usingthe DOVECOT_LOOKUP_PATH setting (see settingspy)

Three operation types are considered

1 Mailbox creation

2 Mailbox renaming

3 Mailbox deletion

The first one is managed by Dovecot The last two ones may be managed by Modoboa if it can access the file systemwhere the mailboxes are stored (see General parameters to activate this feature)

Those operations are treated asynchronously by a cron script For example when you rename an e-mail addressthrough the web UI the associated mailbox on the file system is not modified directly Instead of that a renameorder is created for this mailbox The mailbox will be considered unavailable until the order is executed (see Postfixconfiguration)

Edit the crontab of the user who owns the mailboxes on the file system

$ crontab -u ltusergt -e

And add the following line inside

python ltmodoboa_sitegtmanagepy handle_mailbox_operations

Warning The cron script must be executed by the system user owning the mailboxes

Warning The user running the cron script must have access to the settingspy file of the modoboa instance

The result of each order is recorded into Modoboarsquos log Go to Modoboa gt Logs to consult them

Authentication

To make the authentication work edit the confd10-authconf and uncomment the following line at the end

include auth-systemconfextinclude auth-sqlconfextinclude auth-ldapconfextinclude auth-passwdfileconfextinclude auth-checkpasswordconfextinclude auth-vpopmailconfextinclude auth-staticconfext

Then edit the confdauth-sqlconfext file and add the following content inside

passdb sql driver = sql Path for SQL configuration file see example-configdovecot-sqlconfext

(continues on next page)

21 Installation 15

Modoboa Documentation Release 1100

(continued from previous page)

args = etcdovecotdovecot-sqlconfext

userdb sql driver = sqlargs = etcdovecotdovecot-sqlconfext

Make sure to activate only one backend (per type) inside your configuration (just comment the other ones)

Edit the dovecot-sqlconfext and modify the configuration according to your database engine

MySQL users

driver = mysql

connect = host=ltmysqld socketgt dbname=ltdatabasegt user=ltusergt password=ltpasswordgt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user WHERE email=Lu andrarr˓is_active=1

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid concat(bytes= mbquota M) AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

PostgreSQL users

driver = pgsql

connect = host=ltpostgres socketgt dbname=ltdatabasegt user=ltusergt password=ltpasswordgt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user u INNER JOIN admin_rarr˓mailbox mb ON uid=mbuser_id INNER JOIN admin_domain dom ON mbdomain_id=domidrarr˓WHERE uemail=Lu AND uis_active AND domenabled

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid bytes= || mbquota || M AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

16 Chapter 2 Table of contents

Modoboa Documentation Release 1100

SQLite users

driver = sqlite

connect = ltpath to the sqlite db filegt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user u INNER JOIN admin_rarr˓mailbox mb ON uid=mbuser_id INNER JOIN admin_domain dom ON mbdomain_id=domidrarr˓WHERE uemail=Lu AND uis_active=1 AND domenabled=1

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid (bytes= || mbquota || M) AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

Note Replace values between ltgt with yours

LDAP

To make the LDAP authentication work edit the confd10-authconf and uncomment the following line atthe end

include auth-ldapconfext

Then edit the confdauth-ldapconfext and edit the passdb section as following You should comment theuserdb section which will be managed by SQL with modoboa database

passdb driver = ldap

Path for LDAP configuration file see example-configdovecot-ldapconfextargs = etcdovecotdovecot-ldapconfext

userdb driver = ldapargs = etcdovecotdovecot-ldapconfext

Default fields can be used to specify defaults that LDAP may overridedefault_fields = home=homevirtualu

Your own dovecot LDAP configuration file is now etcdovecotdovecot-ldapconfext You can addyour default LDAP conf in it following the official documentation

Synchronize dovecot LDAP conf with modoboa LDAP conf

To make dovecot LDAP configuration synchronized with modoboa LDAP configuration you should create a dedicateddovecot conf file At the end of your dovecot configuration file (dovecot-ldapconfext) add the following

21 Installation 17

Modoboa Documentation Release 1100

line

include_try dovecot-modoboaconfext

Then set modoboa parameter Enable Dovecot LDAP sync to Yes Then set the Dovecot LDAP config file following theprevious step (etcdovecotdovecot-modoboaconfext in the example)

The last step is to add the command update_dovecot_conf to the cron job of modoboa Then each time your modoboaLDAP configuration is updated your dovecot LDAP configuration will also be

LMTP

Local Mail Transport Protocol is used to let Postfix deliver messages to Dovecot

First make sure the protocol is activated by looking at the protocols setting (generally inside dovecotconf)It should be similar to the following example

protocols = imap pop3 lmtp

Then open the confd10-masterconf look for lmtp service definition and add the following content inside

service lmtp stuff beforeunix_listener varspoolpostfixprivatedovecot-lmtp mode = 0600user = postfixgroup = postfix

stuff after

We assume here that Postfix is chrooted within varspoolpostfix

Finally open the confd20-lmtpconf and modify it as follows

protocol lmtp postmaster_address = postmasterltdomaingtmail_plugins = $mail_plugins quota sieve

Replace ltdomaingt by the appropriate value

Note If you donrsquot plan to apply quota or to use filters just adapt the content of the mail_plugins setting

Quota

Modoboa lets adminstrators define per-domain andor per-account limits (quota) It also lists the current quota usageof each account Those features require Dovecot to be configured in a specific way

Inside confd10-mailconf add the quota plugin to the default activated ones

mail_plugins = quota

Inside confd10-masterconf update the dict service to set proper permissions

18 Chapter 2 Table of contents

Modoboa Documentation Release 1100

service dict If dict proxy is used mail processes should have access to its socket For example mode=0660 group=vmail and global mail_access_groups=vmailunix_listener dict mode = 0600user = ltuser owning mailboxesgtgroup =

Inside confd20-imapconf activate the imap_quota plugin

protocol imap

mail_plugins = $mail_plugins imap_quota

Inside dovecotconf activate the quota SQL dictionary backend

dict quota = ltdrivergtetcdovecotdovecot-dict-sqlconfext

Inside confd90-quotaconf activate the quota dictionary backend

plugin quota = dictUser quotaproxyquota

It will tell Dovecot to keep quota usage in the SQL dictionary

Finally edit the dovecot-dict-sqlconfext file and put the following content inside

connect = host=ltdb hostgt dbname=ltdb namegt user=ltdb usergt password=ltpasswordgt SQLite users connect = pathtothedatabasedb

map pattern = privquotastoragetable = admin_quotausername_field = usernamevalue_field = bytes

map

pattern = privquotamessagestable = admin_quotausername_field = usernamevalue_field = messages

PostgreSQL users

21 Installation 19

Modoboa Documentation Release 1100

Database schema update

The admin_quota table is created by Django but unfortunately it doesnrsquot support DEFAULT constraints (it onlysimulates them when the ORM is used) As PostgreSQL is a bit strict about constraint violations you must executethe following query manually

db=gt ALTER TABLE admin_quota ALTER COLUMN bytes SET DEFAULT 0db=gt ALTER TABLE admin_quota ALTER COLUMN messages SET DEFAULT 0

Trigger

As indicated on Dovecotrsquos wiki you need a trigger to properly update the quota

A working copy of this trigger is available on Github

Download this file and copy it on the server running postgres Then execute the following commands

$ su - postgres$ psql [modoboa database] lt pathtomodoboa_postgres_triggersql$ exit

Replace [modoboa database] by the appropriate value

Forcing recalculation

For existing installations Dovecot (gt 2) offers a command to recalculate the current quota usages For example if youwant to update all usages run the following command

$ doveadm quota recalc -A

Be carefull it can take a while to execute

ManageSieveSieve

Modoboa lets users define filtering rules from the web interface To do so it requires ManageSieve to be activated onyour server

Inside confd20-managesieveconf make sure the following lines are uncommented

protocols = $protocols sieve

service managesieve-login

service managesieve

protocol sieve

20 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Messages filtering using Sieve is done by the LDA

Inside confd15-ldaconf activate the sieve plugin like this

protocol lda Space separated list of plugins to load (default is global mail_plugins)mail_plugins = $mail_plugins sieve

Finally configure the sieve plugin by editing the confd90-sieveconf file Put the follwing caontent inside

plugin Location of the active script When ManageSieve is used this is actually a symlink pointing to the active script in the sieve storage directorysieve = ~dovecotsieve

The path to the directory where the personal Sieve scripts are stored For ManageSieve this is where the uploaded scripts are storedsieve_dir = ~sieve

Restart Dovecot

Now you can go to the Postfix section to finish the installation

Last-login tracking

To update the last_login attribute of an account after a succesful IMAP or POP3 login you can configure apost-login script

Open confd10-masterconf add the following configuration (imap and pop3 services are already definedyou just need to update them)

service imap executable = imap postlogin

service pop3 executable = pop3 postlogin

service postlogin executable = script-login usrlocalbinpostloginshuser = modoboaunix_listener postlogin

Then you must create a script named usrlocalbinpostloginsh According to your database enginethe content will differ

PostgreSQL

21 Installation 21

Modoboa Documentation Release 1100

binsh

psql -c UPDATE core_user SET last_login=now() WHERE username=$USER gt devnull

exec $

MySQL

binsh

DBNAME=XXXDBUSER=XXXDBPASSWORD=XXX

echo UPDATE core_user SET last_login=now() WHERE username=$USER | mysql -urarr˓$DBUSER -p$DBPASSWORD $DBNAME

exec $

Postfix

This section gives an example about building a simple virtual hosting configuration with Postfix Refer to the officialdocumentation for more explanation

Map files

You first need to create configuration files (or map files) that will be used by Postfix to lookup into Modoboa tables

To automaticaly generate the requested map files and store them in a directory run the following command

gt cd ltmodoboa_instance_pathgtgt python managepy generate_postfix_maps --destdir ltdirectorygt

ltdirectorygt is the directory where the files will be stored Answer the few questions and yoursquore done

Configuration

Use the following configuration in the etcpostfixmaincf file (this is just one possible configuration)

Stuff beforevirtual_transport = lmtpunixprivatedovecot-lmtp

virtual_mailbox_domains = ltdrivergtetcpostfixsql-domainscfvirtual_alias_domains = ltdrivergtetcpostfixsql-domain-aliasescfvirtual_alias_maps = ltdrivergtetcpostfixsql-aliasescf

relay_domains = ltdrivergtetcpostfixsql-relaydomainscftransport_maps =

ltdrivergtetcpostfixsql-transportcfltdrivergtetcpostfixsql-spliteddomains-transportcf

(continues on next page)

22 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

smtpd_recipient_restrictions = check_recipient_access

ltdrivergtetcpostfixsql-maintaincfltdrivergtetcpostfixsql-relay-recipient-verificationcf

permit_mynetworksreject_unauth_destinationreject_unverified_recipient

smtpd_sender_login_maps = ltdrivergtetcpostfixsql-sender-login-mapcf

smtpd_sender_restrictions =reject_sender_login_mismatch

Stuff after

Replace ltdrivergt by the name of the database you use

Restart Postfix

Policy daemon

If you want to enable the built-in policy daemon add the following content to the etcpostfixmaincf file

smtpd_recipient_restrictions = check_policy_service inet1270019999

And reload postfix

Note The check_policy_service line must be placed before the permit_mynetworks one otherwise thedaemon wonrsquot be called

OpenDKIM

Modoboa can generate DKIM keys for the hosted domains but it wonrsquot sign or check messages To do that you needa dedicated software like OpenDKIM

Note The cron job in charge of creating DKIM keys must be run using the same user than OpenDKIM (ie opendkimin most cases)

Database

Since keys related information is stored in Modoboarsquos database you need to tell OpenDKIM how it can access it

First make sure to install the required additional packages on your system (libopendbx1- on debian baseddistributions or opendbx- on CentOS the complete name depends on your database engine)

Then insert the following SQL view into Modoboarsquos database

21 Installation 23

Modoboa Documentation Release 1100

PostgreSQL

CREATE OR REPLACE VIEW dkim AS (SELECT id name as domain_name dkim_private_key_path AS private_key_path

dkim_key_selector AS selectorFROM admin_domain WHERE enable_dkim

)

MySQLMariaDB

CREATE OR REPLACE VIEW dkim AS (SELECT id name as domain_name dkim_private_key_path AS private_key_path

dkim_key_selector AS selectorFROM admin_domain WHERE enable_dkim=1

)

Configuration

You should find OpenDKIMrsquos configuration file at etcopendkimconf

Add the following content to it

KeyTable dsnltdrivergtltusergtltpasswordgtltdb hostgtltdb namegttable=dkimrarr˓keycol=iddatacol=domain_nameselectorprivate_key_pathSigningTable dsnltdrivergtltusergtltpasswordgtltdb hostgtltdb namegttable=dkimrarr˓keycol=domain_namedatacol=idSocket inet12345localhost

Replace values between ltgt by yours Accepted values for driver are pgsql or mysql Make sure the user youspecify has read permission on the view created previously

If you run a debian based system make sure to adjust the following setting in the etcdefaultopendkim file

SOCKET=inet12345localhost

Eventually reload OpenDKIM

Postfix integration

Add the following lines to the etcpostfixmaincf file

smtpd_milters = inet12700112345non_smtpd_milters = inet12700112345milter_default_action = acceptmilter_content_timeout = 30s

and reload postfix

Extensions

Only few commands are needed to add a new extension to your setup

24 Chapter 2 Table of contents

Modoboa Documentation Release 1100

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install ltEXTENSIONgt==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Then restart your web server

22 Upgrade

221 Modoboa

Warning The new version you are going to install may need to modify your database Before you start makesure to backup everything

Most of the time upgrading your installation to a newer Modoboa version only requires a few actions In every caseyou will need to apply the general procedure first and then check if the version you are installing requires specificactions

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install modoboa==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Once done check if the version you are installing requires Specific instructions

Finally restart your web server

Sometimes you might need to upgrade postfix map files too To do so just run the generate_postfix_mapscommand on the same directory than the one used for installation (etcpostfix by default)

Make sure to use root privileges and run the following command

gt python managepy generate_postfix_maps --destdir ltdirectorygt

Then reload postfix

22 Upgrade 25

Modoboa Documentation Release 1100

222 Extensions

If a new version is available for an extension yoursquore using it is recommanded to install it Upgrading an extensions ispretty and the procedure is almost the same than the one used for Modoboa

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install ltEXTENSIONgt==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Finally restart your web server

It is a generic upgrade procedure which will be enough most of the time but it is generally a good idea to check theassociated documentation

223 Rebuild Virtual Environment

Sometimes when upgrading your Operating System (eg from Ubuntu 1704 to Ubuntu 1710) your virtual environmentrunning modoboa can get corrupted Your first response will be to panic but fear not The solution is in this document

First things first

Recover your database password

You will need to recover your database password (if using mysql or postgresql) You will find this in etcpostfixsql-aliasescf or any file with sql-cf in the etcpostfix directory

Make note of this as you will need it when reconfiguring modoboa

Reinstall Modoboa

Start out by backup up your modoboa settings file located in the modoboa instance directory (srvmodoboainstanceinstancesettingspy if you used the default installer configuration) This contains your currentconfiguration

Next you want to remove all current modoboa files

After doing this follow the manual installation instructions for Modoboa only as everything should be working prop-erly

After this completes simply restore your backed up settings file to srvinstanceinstancesettingspy(if you used installer default configuration) You will then need to reinstall your extensions

You can find which plugins you had in your settingspy file under the MODOBOA_APPS variable

Instructions to install extensions can also be found here

Once you have completed this step you will need to run the following commands

26 Chapter 2 Table of contents

Modoboa Documentation Release 1100

gt (env) $ cd ltinstance_dirgtgt (env) $ python managepy migrategt (env) $ python managepy collectstatic

You will then see a message similar to

You have requested to collect static files at the destinationlocation as specified in your settings

srvmodoboainstancesitestatic

This will overwrite existing filesAre you sure you want to do this

Type yes to continue or no to cancel

You will want to answer yes here then simply restart the uwsgi process with service uwsgi restart andyou should be up and running again

Simply log into your modoboa web panel and verify that your extensions and webmail box is working

224 Information

Rebuild instructions from httpshelppythonanywherecompagesRebuildingVirtualenvs

225 Specific instructions

1160

A new policy daemon has been added

Make sure to have a Redis instance running on your server

Add modoboapolicyd to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboapolicyd

)

Add the following settings to your settingspy file

REDIS_HOST = ltIP or hostname heregtREDIS_PORT = 6379REDIS_QUOTA_DB = 0REDIS_URL = redisformat(REDIS_HOST REDIS_PORT REDIS_QUOTA_DB)

Once done you can start the policy daemon using the following commands

22 Upgrade 27

Modoboa Documentation Release 1100

gt python managepy policy_daemon

Donrsquot forget to configure _policyd_config if you want to use this feature

The modoboa-stats plugin has been merged into the core

Add modoboamaillog to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboapolicydmodoboamaillog

)

And remove any reference to modoboa_stats in this same variable

1150

This version drops Python 2 support so donrsquot forget to update all the extensions you use

Warning If you upgrade an existing python 2 installation you will need to create a new Python 3 virtualenvironment You can remove the existing virtual environment and replace it by the new one so you wonrsquot have tomodify your configuration files

Add the following new setting

DISABLE_DASHBOARD_EXTERNAL_QUERIES = False

Reload uwsgigunicornapache depending on your setup

Finally Make sure to use root privileges and run the following command

gt python managepy generate_postfix_maps --destdir ltdirectorygt

Then reload postfix

1140

This release introduces an optional LDAP synchronization process If you want to use it please follow the dedicatedprocedure

1131

Upgrade postfix maps files as follows

28 Chapter 2 Table of contents

Modoboa Documentation Release 1100

gt python managepy generate_postfix_maps --destdir ltpathgt --force-overwrite

1130

Add modoboadnstools to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstools

)

Add the following new settings

CSRF_COOKIE_SECURE = TrueSESSION_COOKIE_SECURE = True

modoboa-postfix-autoreply 150

Edit the etcpostfixmaincf file and remove the sql-autoreplies-transportcf map from thetransport_maps if present Remove the corresponding proxy_read_maps entry if relevant

Reload postfix

1100

Warning Upgrade installed extensions BEFORE running check or migrate commands

Upgrade all your installed plugins to the following versions

Warning If you use the amavis plugin make sure to include its configuration as follows into settingspy

from modoboa_amavis import settings as modoboa_amavis_settingsmodoboa_amavis_settingsapply(globals())

22 Upgrade 29

Modoboa Documentation Release 1100

Name Versionmodoboa-amavis 120modoboa-contacts 050modoboa-dmarc 110modoboa-imap-migration 120modoboa-pdfcredentials 130modoboa-postfix-autoreply 140modoboa-radicale 120modoboa-sievefilters 140modoboa-stats 140modoboa-webmail 140

Edit the settingspy file and apply the following modifications

Add modoboatransport to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparameters

)

Replace the following line

MIDDLEWARE_CLASSES = (

by

MIDDLEWARE = (

Update postfix map files as follows

gt rm -f ltpathgtmodoboa-postfix-mapschkgt python managepy generate_postfix_maps --force --destdir ltpathgt

Then modify postfixrsquos configuration as follows

smtpd_sender_login_maps =ltdrivergtltpathgtsql-sender-login-mapcf

transport_maps =ltdrivergtltpathgtsql-transportcfltdrivergtltpathgtsql-spliteddomains-transportcf other map files

Replace ltdrivergt and ltpathgt by your values

If transport_maps contains sql-relaydomains-transportcf remove it

30 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning If you make use of postfixrsquos proxymap server you must also update the proxy_read_maps setting

Reload postfix

Add the following cron job in order to generate DKIM keys

Generate DKIM keys (they will belong to the user running this job)

root $PYTHON $INSTANCEmanagepy modorarr˓manage_dkim_keys

190

If you want to manage inactive accounts look at Cleaning inactive accounts

183

Edit the settingspy file and replace the following line

BASE_DIR = ospathdirname(ospathdirname(__file__))

by

BASE_DIR = ospathrealpath(ospathdirname(ospathdirname(__file__)))

180

Modoboa now relies on Djangorsquos builtin password validation system to validate user passwords instead ofdjango-passwords

Remove django-passwords from your system

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt pip uninstall django-passwords

Edit the settingspy file and remove the following content

django-passwords

PASSWORD_MIN_LENGTH = 8

PASSWORD_COMPLEXITY = UPPER 1LOWER 1DIGITS 1

Add the following lines

Password validation rulesAUTH_PASSWORD_VALIDATORS = [

NAME djangocontribauthpassword_validation

rarr˓UserAttributeSimilarityValidator (continues on next page)

22 Upgrade 31

Modoboa Documentation Release 1100

(continued from previous page)

NAME djangocontribauthpassword_validationMinimumLengthValidator

NAME djangocontribauthpassword_validationCommonPasswordValidator

NAME djangocontribauthpassword_validationNumericPasswordValidator

NAME modoboacorepassword_validationComplexityValidatorOPTIONS

upper 1lower 1digits 1specials 0

]

172

API documentation has evolved (because of the upgrade to Django Rest Framework 36) and CKeditor is now embed-ded by default (thanks to the django-ckeditor package) Some configuration changes are required

Edit your settingspy file and apply the following modifications

bull Update the INSTALLED_APPS variable as follows

INSTALLED_APPS = (djangocontribauthdjangocontribcontenttypesdjangocontribsessionsdjangocontribmessagesdjangocontribsitesdjangocontribstaticfilesreversionckeditorckeditor_uploaderrest_frameworkrest_frameworkauthtoken

)

bull Update the REST_FRAMEWORK variable as follows

REST_FRAMEWORK = DEFAULT_AUTHENTICATION_CLASSES (

rest_frameworkauthenticationTokenAuthenticationrest_frameworkauthenticationSessionAuthentication

)

bull Remove the SWAGGER_SETTINGS variable

bull Add the following content

32 Chapter 2 Table of contents

Modoboa Documentation Release 1100

CKeditor

CKEDITOR_UPLOAD_PATH = uploads

CKEDITOR_IMAGE_BACKEND = pillow

CKEDITOR_RESTRICT_BY_USER = True

CKEDITOR_BROWSE_SHOW_DIRS = True

CKEDITOR_ALLOW_NONIMAGE_FILES = False

CKEDITOR_CONFIGS = default

allowedContent Truetoolbar Modoboawidth Nonetoolbar_Modoboa [

[Bold Italic Underline][JustifyLeft JustifyCenter JustifyRight JustifyBlock][BidiLtr BidiRtl Language][NumberedList BulletedList - Outdent Indent][Undo Redo][Link Unlink Anchor - Smiley][TextColor BGColor - Source][Font FontSize][Image ][SpellChecker]

]

Donrsquot forget to run the following command

gt python managepy collectstatic

171

If you used 170 for a fresh installation please run the following commands

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy load_initial_data

170

This version requires Django gt= 110 so you need to make some modifications It also brings internal API changeswhich are not backward compatible so installed extensions must be upgraded too

First of all deactivate all installed extensions (edit the settingspy file and comment the corresponding lines inMODOBOA_APPS)

Edit the urlspy file of your local instance and replace its content by the following one

22 Upgrade 33

Modoboa Documentation Release 1100

from djangoconfurls import include url

urlpatterns = [url(r include(modoboaurls))

]

Edit the settingspy and apply the following changes

bull Add modoboaparameters to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboarelaydomainsmodoboalimitsmodoboaparameters Modoboa extensions here

)

bull Add modoboacoremiddlewareLocalConfigMiddleware to MIDDLEWARE_CLASSES

MIDDLEWARE_CLASSES = (djangocontribsessionsmiddlewareSessionMiddlewaredjangomiddlewarecommonCommonMiddlewaredjangomiddlewarecsrfCsrfViewMiddlewaredjangocontribauthmiddlewareAuthenticationMiddlewaredjangocontribmessagesmiddlewareMessageMiddlewaredjangomiddlewarelocaleLocaleMiddlewaredjangomiddlewareclickjackingXFrameOptionsMiddlewaremodoboacoremiddlewareLocalConfigMiddlewaremodoboalibmiddlewareAjaxLoginRedirectmodoboalibmiddlewareCommonExceptionCatchermodoboalibmiddlewareRequestCatcherMiddleware

)

bull Modoboa used to provide a custom authentication backend (modoboalibauthbackendsSimpleBackend) but it has been removed Replace it as follows

AUTHENTICATION_BACKENDS = ( Other backends beforedjangocontribauthbackendsModelBackend

)

bull Remove TEMPLATE_CONTEXT_PROCESSORS and replace it by

TEMPLATES = [

BACKEND djangotemplatebackendsdjangoDjangoTemplatesDIRS []APP_DIRS TrueOPTIONS

context_processors [djangotemplatecontext_processorsdebugdjangotemplatecontext_processorsrequestdjangocontribauthcontext_processorsauth

(continues on next page)

34 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

djangotemplatecontext_processorsi18ndjangotemplatecontext_processorsmediadjangotemplatecontext_processorsstaticdjangotemplatecontext_processorstzdjangocontribmessagescontext_processorsmessagesmodoboacorecontext_processorstop_notifications

]debug False

]

Run the following commands (load virtualenv if you use one)

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstatic

Finally upgrade your extensions and reactivate them

Name Versionmodoboa-amavis 110modoboa-dmarc 100modoboa-imap-migration 110modoboa-pdfcredentials 110modoboa-postfix-autoreply 120modoboa-radicale 110modoboa-sievefilters 110modoboa-stats 110modoboa-webmail 110

Command line shortcuts

$ pip install modoboa-amavis==110$ pip install modoboa-dmarc==100$ pip install modoboa-imap-migration==110$ pip install modoboa-pdfcredentials==110$ pip install modoboa-postfix-autoreply==120$ pip install modoboa-radicale==110$ pip install modoboa-sievefilters==110$ pip install modoboa-stats==110$ pip install modoboa-webmail==110

And please make sure you use the latest version of the django-versionfield2 package

$ pip install -U django-versionfield2

Notes about quota changes and resellers

Reseller users now have a quota option in Resources tab This is the quota that a reseller can share between all itsdomains

22 Upgrade 35

Modoboa Documentation Release 1100

There are two quotas for a domain in the new version

1 Quota amp

2 Default mailbox quota

[1] Quota quota shared between mailboxes This quota is shared between all the mailboxes of this domain This valuecannot exceed resellerrsquos quota and hence cannot be 0(unlimited) if reseller has finite quota

[2] Default mailbox quota default quota applied to mailboxes This quota is the default quota applied to new mail-boxes This value cannot exceed Quota[1] and hence cannot be 0(unlimited) if Quota[1] is finite

161

First of all update postfix map files as follows

gt python managepy generate_postfix_maps --destdir ltpathgt --force-overwrite

Then modify postfixrsquos configuration as follows

smtpd_sender_login_maps =ltdrivergtltpathgtsql-sender-login-mailboxescfltdrivergtltpathgtsql-sender-login-aliasescfltdrivergtltpathgtsql-sender-login-mailboxes-extracf

Replace ltdrivergt and ltpathgt by your values

Finally reload postfix

This release also deprecates some internal functions As a result several extensions has been updated to maintain thecompatibility If you enabled the notification service yoursquoll find the list of available updates directly in your Modoboaconsole

For the others here is the list

Name Versionmodoboa-amavis 1010modoboa-postfix-autoreply 117modoboa-radicale 105modoboa-stats 109

Command line shortcut

$ pip install modoboa-amavis==1010$ pip install modoboa-postfix-autoreply==117$ pip install modoboa-radicale==105$ pip install modoboa-stats==109

160

Warning You have to upgrade extensions due to coreUser model attribute change (usergroup to userrole) Oth-erwise you will have an internal error after upgrade In particular modoboa-amavisd modoboa-stats modoboa-postfix-autoreply are concerned

36 Chapter 2 Table of contents

Modoboa Documentation Release 1100

An interesting feature brougth by this version is the capability to make different checks about MX records Forexample Modoboa can query main DNSBL providers for every defined domain With this you will quickly know ifone the domains you manage is listed or not To activate it add the following line to your crontab

30 ltoptional_virtualenv_pathgtpython ltmodoboa_instance_dirgtmanagepy modorarr˓check_mx

The communication with Modoboa public API has been reworked Instead of sending direct synchronous queries (forexample to check new versions) a cron job has been added To activate it add the following line to your crontab

0 ltoptional_virtualenv_pathgtpython ltmodoboa_instance_dirgtmanagepyrarr˓communicate_with_public_api

Please also note that public API now uses TLS so you must update your configuration as follows

MODOBOA_API_URL = httpsapimodoboaorg1

Finally it is now possible to declare additional sender addresses on a per-account basis You need to update your postfixconfiguration in order to use this functionality Just edit the maincf file and change the following parameter

smtpd_sender_login_maps =ltdrivergtetcpostfixsql-sender-login-mailboxescfltdrivergtetcpostfixsql-sender-login-aliasescfltdrivergtetcpostfixsql-sender-login-mailboxes-extracf

150

The API has been greatly improved and a documentation is now available To enable it addrest_framework_swagger to the INSTALLED_APPS variable in settingspy as follows

INSTALLED_APPS = (djangocontribauthdjangocontribcontenttypesdjangocontribsessionsdjangocontribmessagesdjangocontribsitesdjangocontribstaticfilesreversionrest_frameworkauthtokenrest_framework_swagger

)

Then add the following content into settingspy just after the REST_FRAMEWORK variable

SWAGGER_SETTINGS = is_authenticated Falseapi_version 10exclude_namespaces []info

contact contactmodoboacomdescription (Modoboa API requires a valid token)title Modoboa API

Yoursquore done The documentation is now available at the following address

22 Upgrade 37

Modoboa Documentation Release 1100

httpltyour instance addressgtdocsapi

Finally if you find a TEMPLATE_CONTEXT_PROCESSORS variable in your settingspy file make sure it lookslike this

TEMPLATE_CONTEXT_PROCESSORS = global_settingsTEMPLATE_CONTEXT_PROCESSORS + [modoboacorecontext_processorstop_notifications

]

140

Warning Please make sure to use Modoboa 135 with an up-to-date database before an upgrade to 140

Warning Do not follow the regular upgrade procedure for this version

Some extension have been moved back into the main repository The main reason for that is that using Modoboawithout them doesnrsquot make sense

First of all you must rename the following applications listed inside the MODOBOA_APPS variable

Old name New namemodoboa_admin modoboaadminmodoboa_admin_limits modoboalimitsmodoboa_admin_relaydomains modoboarelaydomains

Then apply the following steps

1 Uninstall old extensions

$ pip uninstall modoboa-admin modoboa-admin-limits modoboa-admin-relaydomains

2 Install all extension updates using pip (check the Modoboa gt Information page)

3 Manually migrate database

$ cd ltinstance_dirgt$ python managepy migrate auth$ python managepy migrate admin 0001 --fake$ python managepy migrate admin$ python managepy migrate limits 0001 --fake$ python managepy migrate relaydomains 0001 --fake$ python managepy migrate

4 Finally update static files

$ python managepy collectstatic

This version also introduces a REST API To enable it

1 Add rest_frameworkauthtoken to the INSTALLED_APPS variable

2 Add the following configuration inside settingspy

38 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Rest framework settings

REST_FRAMEWORK = DEFAULT_AUTHENTICATION_CLASSES (

rest_frameworkauthenticationTokenAuthentication)DEFAULT_PERMISSION_CLASSES (

rest_frameworkpermissionsIsAuthenticated)

3 Run the following command

$ python managepy migrate

135

To enhance security Modoboa now checks the strength of user passwords lthttpsgithubcomdstufftdjango-passwordsgt_

To use this feature add the following configuration into the settingspy file

django-passwords

PASSWORD_MIN_LENGTH = 8

PASSWORD_COMPLEXITY = UPPER 1LOWER 1DIGITS 1

132

Modoboa now uses the atomic requests mode to preserve database consistency (reference)

To enable it update the DATABASES variable in settingspy as follows

DATABASES = default

stuff beforeATOMIC_REQUESTS True

amavis

stuff beforeATOMIC_REQUESTS True

130

This release does not bring awesome new features but it is a necessary bridge to the future of Modoboa All extensionsnow have their own git repository and the deploy process has been updated to reflect this change

22 Upgrade 39

Modoboa Documentation Release 1100

Another important update is the use of Django 17 Besides its new features the migration system has been reworkedand is now more robust than before

Before we begin with the procedure here is a table showing old extension names and their new name

Old name New package name New module namemodoboaextensionsadmin modoboa-admin modoboa_adminmodoboaextensionslimits modoboa-admin-limits modoboa_admin_limitsmodoboaextensionspostfix_autoreply modoboa-postfix-autoreply modoboa_postfix_autoreplymodoboaextensionspostfix_relay_domains modoboa-admin-relaydomains modoboa_admin_relaydomainsmodoboaextensionsradicale modoboa-radicale modoboa_radicalemodoboaextensionssievefilters modoboa-sievefilters modoboa_sievefiltersmodoboaextensionsstats modoboa-stats modoboa_statsmodoboaextensionswebmail modoboa-webmail modoboa_webmail

Here are the required steps

1 Install the extensions using pip (look at the second column in the table above)

$ pip install ltthe extensions you wantgt

2 Remove south from INSTALLED_APPS

3 Rename old extension names inside MODOBOA_APPS (look at the third column in the table above)

4 Remove modoboalibmiddlewareExtControlMiddleware from MIDDLEWARE_CLASSES

5 Change DATABASE_ROUTERS to

DATABASE_ROUTERS = [modoboa_amavisdbrouterAmavisRouter]

6 Run the following commands

$ cd ltmodoboa_instance_dirgt$ python managepy migrate

7 Reply yes to the question

8 Run the following commands

$ python managepy load_initial_data$ python managepy collectstatic

9 The cleanup job has been renamed in Django so you have to modify your crontab entry

- 0 0 ltmodoboa_sitegtmanagepy cleanup+ 0 0 ltmodoboa_sitegtmanagepy clearsessions

120

A new notification service let administrators know about new Modoboa versions To activate it you need to updatethe TEMPLATE_CONTEXT_PROCESSORS variable like this

from djangoconf import global_settings

TEMPLATE_CONTEXT_PROCESSORS = global_settingsTEMPLATE_CONTEXT_PROCESSORS + (

(continues on next page)

40 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

modoboacorecontext_processorstop_notifications)

and to define the new MODOBOA_API_URL variable

MODOBOA_API_URL = httpapimodoboaorg1

The location of external static files has changed To use them add a new path to the STATICFILES_DIRS

Additional locations of static filesSTATICFILES_DIRS = (

Put strings here like homehtmlstatic or Cwwwdjangostatic Always use forward slashes even on Windows Dont forget to use absolute paths not relative pathsltpathtomodoboainstalldirgtbower_components

)

Run the following commands to define the hostname of your instance

$ cd ltmodoboa_instance_dirgt$ python managepy set_default_site lthostnamegt

If you plan to use the Radicale extension

1 Add modoboaextensionsradicale to the MODOBOA_APPS variable

2 Run the following commands

$ cd ltmodoboa_instance_dirgt$ python managepy syncdb

Warning You also have to note that the sitestatic directory has moved from ltpath to your sitesdirgt to ltmodoboas root urlgt (itrsquos probably the parent directory) You have to adapt your web serverconfiguration to reflect this change

23 Configuration

231 Online parameters

Modoboa provides online panels to modify internal parameters There are two available levels

bull Application level global parameters define how the application behaves Available at Modoboa gt Parameters

bull User level per user customization Available at User gt Settings gt Preferences

Regardless level parameters are displayed using tabs each tab corresponding to one application

General parameters

The admin application exposes several parameters they are presented below

23 Configuration 41

Modoboa Documentation Release 1100

Name Tab Description Default valueAuthentication type General The backend used for au-

thenticationLocal

Default password scheme General Scheme used to cryptmailbox passwords

crypt

Rounds General Number of rounds (onlyused by sha256cryptand sha512crypt) Mustbe between 1000 and999999999 inclusive

70000

Secret key General A key used to encryptusersrsquo password in ses-sions

random value

Sender address General Email address used tosend notifications

Enable communication General Enable communicationwith Modoboa public API

yes

Check new versions General Automatically checks if anewer version is available

yes

Send statistics General Send statistics to Mod-oboa public API (countersand used extensions)

yes

Top notifications check in-terval

General Interval between two topnotification checks (inseconds)

30

Maximum log record age General The maximum age in daysof a log record

365

Items per page General Number of displayeditems per page

30

Default top redirection General The default redirectionused when no applicationis specified

userprefs

Enable MX checks Admin Check that every domainhas a valid MX record

yes

Valid MXs Admin A list of IP or networkaddress every MX shouldmatch A warning will besent if a record does notrespect this it

Enable DNSBL checks Admin Check every domainagainst major DNSBLproviders

yes

DKIM keys storage direc-tory

AdminPath to a directory where DKIM

generated keys willbe stored

Default DKIM key length Admin The default size (in bits)for new keys

2048

Handle mailboxes onfilesystem

Admin Rename or remove mail-boxes on the filesystemwhen they get renamed orremoved within Modoboa

no

Mailboxes owner Admin The UNIX account whoowns mailboxes on thefilesystem

vmail

Default domain quota Admin Default quota (in MB) ap-plied to freshly createddomains with no valuespecified A value of 0means no quota

0

Automatic accountremoval

Admin When a mailbox is re-moved also remove theassociated account

no

Automatic do-mainmailbox creation

Admin Create a domain and amailbox when an accountis automatically created

yes

42 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Note If you are not familiar with virtual domain hosting you should take a look at postfixrsquos documentation ThisHow to also contains useful information

Note A random secret key will be generated each time the Parameters page is refreshed and until you save parametersat least once

Note Specific LDAP parameters are also available see LDAP authentication

232 Media files

Modoboa uses a specific directory to upload files (ie when the webmail is in use) or to create ones (ex graphical statis-tics) This directory is named media and is located inside modoboarsquos installation directory (called modoboa_sitein this documentation)

To work properly the system user which runs modoboa (www-data apache whatever) must have write access tothis directory

233 Customization

Custom logo

You have the possibility to use a custom logo instead of the default one on the login page

To do so open the settingspy file and add a MODOBOA_CUSTOM_LOGO variable This variable must containthe relative URL of your logo under MEDIA_URL For example

MODOBOA_CUSTOM_LOGO = ospathjoin(MEDIA_URL custom_logopng)

Then copy your logo file into the directory indicated by MEDIA_ROOT

234 Host configuration

Note This section is only relevant when Modoboa handles mailboxes renaming and removal from the filesystem

To manipulate mailboxes on the filesystem you must allow the user who runs Modoboa to execute commands as theuser who owns mailboxes

To do so edit the etcsudoers file and add the following inside

ltuser_that_runs_modoboagt ALL=(ltmailboxes ownergt) NOPASSWD ALL

Replace values between ltgt by the ones you use

23 Configuration 43

Modoboa Documentation Release 1100

235 Time zone and language

Modoboa is available in many languages

To specify the default language to use edit the settingspy file and modify the LANGUAGE_CODE variable

LANGUAGE_CODE = fr or en for english etc

Note Each user has the possibility to define the language he prefers

In the same configuration file specify the timezone to use by modifying the TIME_ZONE variable For example

TIME_ZONE = EuropeParis

236 Sessions management

Modoboa uses Djangorsquos session framework to store per-user information

Few parameters need to be set in the settingspy configuration file to make Modoboa behave as expected

SESSION_EXPIRE_AT_BROWSER_CLOSE = False Default value

This parameter is optional but you must ensure it is set to False (the default value)

The default configuration file provided by the modoboa-adminpy command is properly configured

237 Logging authentication

To trace login attempts to the web interface Modoboa uses python SysLogHandler so you can see them in your syslogauthentication log file (varlogauthlog in most cases)

Depending on your configuration you may have to edit the settingspy file and add lsquoaddressrsquo lsquodevlogrsquo to thelogging section

syslog-auth class logginghandlersSysLogHandlerfacility SysLogHandlerLOG_AUTHaddress devlogformatter syslog

238 External authentication

LDAP

Modoboa supports external LDAP authentication using the following extra components

bull Python LDAP client

bull Django LDAP authentication backend

If you want to use this feature you must first install those components

44 Chapter 2 Table of contents

Modoboa Documentation Release 1100

$ pip install python-ldap django-auth-ldap

Then all you have to do is to modify the settingspy file Add a new authentication backend to the AUTHENTI-CATION_BACKENDS variable like this

AUTHENTICATION_BACKENDS = (modoboalibauthbackendsLDAPBackend modoboalibauthbackendsLDAPSecondaryBackend Useful for a fallback

rarr˓mechanismdjangocontribauthbackendsModelBackend

)

Finally go to Modoboa gt Parameters gt General and set Authentication type to LDAP

From there new parameters will appear to let you configure the way Modoboa should connect to your LDAP serverThey are described just below

Name Description De-faultvalue

Server address The IP address of the DNS name of the LDAP server local-host

Server port The TCP port number used by the LDAP server 389Use a secureconnection

Use an SSLTLS connection to access the LDAP server no

Authenticationmethod

Choose the authentication method to use Directbind

User DN tem-plate (directbind mode)

The template used to construct a userrsquos DN It should contain one placeholder (ie(user)s)

Bind BN The distinguished name to use when binding to the LDAP server Leave empty for ananonymous bind

Bind password The password to use when binding to the LDAP server (with lsquoBind DNrsquo)Search base The distinguished name of the search baseSearch filter An optional filter string (eg lsquo(objectClass=person)rsquo) In order to be valid it must be

enclosed in parentheses(mail=(user)s)

Passwordattribute

The attribute used to store user passwords user-Pass-word

Active Direc-tory

Tell if the LDAP server is an Active Directory one no

Administratorgroups

Members of those LDAP Posix groups will be created ad domain administrators Uselsquorsquo characters to separate groups

Group type The type of group used by your LDAP directory Posix-Group

Groups searchbase

The distinguished name of the search base used to find groups

Do-mainmailboxcreation

Automatically create a domain and a mailbox when a new user is created just after thefirst successful authentication You will generally want to disable this feature whenthe relay domains extension is in use

yes

If you need additional parameters you will find a detailed documentation here

Once the authentication is properly configured the users defined in your LDAP directory will be able to connect to

23 Configuration 45

Modoboa Documentation Release 1100

Modoboa the associated domain and mailboxes will be automatically created if needed

The first time a user connects to Modoboa a local account is created if the LDAP username is a valid email addressBy default this account belongs to the SimpleUsers group and it has a mailbox

To automatically create domain administrators you can use the Administrator groups setting If a LDAP user belongsto one the listed groups its local account will belong to the DomainAdmins group In this case the username is notnecessarily an email address

Users will also be able to update their LDAP password directly from Modoboa

Note Modoboa doesnrsquot provide any synchronization mechanism once a user is registered into the database Anymodification done from the directory to a user account will not be reported to Modoboa (an email address change forexample) Currently the only solution is to manually delete the Modoboa record it will be recreated on the next userlogin

SMTP

It is possible to use an existing SMTP server as an authentication source To enable this feature edit the settingspy file and change the following setting

AUTHENTICATION_BACKENDS = (modoboalibauthbackendsSMTPBackenddjangocontribauthbackendsModelBackend

)

SMTP server location can be customized using the following settings

AUTH_SMTP_SERVER_ADDRESS = localhostAUTH_SMTP_SERVER_PORT = 25AUTH_SMTP_SECURED_MODE = None ssl or starttls are accepted

239 LDAP synchronization

Modoboa can synchronize accounts with an LDAP directory (tested with OpenLDAP) but this feature is not enabledby default To activate it add modoboaldapsync to MODOBOA_APPS in the settingspy file

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboaldapsync

)

and enable it from the admin panel

46 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning Make sure to install additional requirements otherwise it wonrsquot work

The following parameters are available and must be filled

Name Description Defaultvalue

Enable LDAP synchro-nization

Control LDAP synchronization state no

Bind DN The DN of a user with write permission to createupdate accountsBind password The associated passwordAccount DN template The template used to build account DNs (must contain a (user)s

placeholder

2310 Database maintenance

Cleaning the logs table

Modoboa logs administrator specific actions into the database A clean-up script is provided to automatically removeoldest records The maximum log record age can be configured through the online panel

To use it you can setup a cron job to run every night

0 0 ltmodoboa_sitegtmanagepy cleanlogs Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy cleanlogs

Cleaning the session table

Django does not provide automatic purging Therefore itrsquos your job to purge expired sessions on a regular basis

Django provides a sample clean-up script django-adminpy clearsessions That script deletes any sessionin the session table whose expire_date is in the past

For example you could setup a cron job to run this script every night

0 0 ltmodoboa_sitegtmanagepy clearsessions Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy clearsessions

Cleaning inactive accounts

Thanks to Last-login tracking it is now possible to monitor inactive accounts An account is considered inactive if nologin has been recorded for the last 30 days (this value can be changed through the admin panel)

A management command is available to disable or delete inactive accounts For example you could setup a cron jobto run it every night

23 Configuration 47

Modoboa Documentation Release 1100

0 0 ltmodoboa_sitegtmanagepy clean_inactive_accounts Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy clean_inactive_rarr˓accounts

The default behaviour is to disable accounts You can delete them using the --delete option

24 Moving to Modoboa

You have an existing platform and yoursquod like to move to Modoboa the following tools could help you

241 From postfixadmin

A dedicated command allows you to convert an existing postfixadmin database to a Modoboa one Consult the docu-mentation to know more about the process

242 Using CSV files

Modoboa allows you to import any object (domain domain alias mailbox and alias) using a simple CSV file encodedusing UTF8 Each line corresponds to a single object and must respect one of the following format

domain ltname stringgt ltquota integergt ltdefault mailbox quota integergt ltenabledrarr˓booleangtdomainalias ltname stringgt lttargeted domain stringgt ltenabled booleangtrelaydomain ltname stringgt lttarget host stringgt lttarget port integergt ltservicerarr˓stringgt ltenabled booleangt ltverify recipients booleangtaccount ltloginname stringgt ltpassword stringgt ltfirst name stringgt ltlast namerarr˓stringgt ltenabled booleangt ltgroup stringgt ltaddress stringgt ltquota integergt [rarr˓ltdomain stringgt ]alias ltaddress stringgt ltenabled booleangt ltrecipient stringgt

Boolean fields accept the following values true 1 yes y (case insensitive) Any other value will be evaluated asfalse

Warning The order does matter Objects are created sequencially so a domain must be created before itsmailboxes and aliases and a mailbox must created before its alias(es)

To actually import such a file

gt sudo -u ltmodoboa_usergt -igt source ltvirtualenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy modo import ltyour filegt

Available options can be listed using the following command

gt python managepy modo import -h

48 Chapter 2 Table of contents

Modoboa Documentation Release 1100

25 REST API

To ease the integration with external sources (software or other) Modoboa provides a REST API

Every installed instance comes with a ready-to-use API and a documentation You will find them using the followingurl patterns

bull API httplthostnamegtapiv1

bull Documentation httplthostnamegtdocsapi

An example of this documentation is available on the official demo

Using this API requires an authentication and for now only a token based authentication is supported To get a validtoken log-in to your instance with a super administrator go to Settings gt API and activate the API access Press theUpdate button and wait until the page is reloaded the token will be displayed

To make valid API calls every requests you send must embed this token within an Authorization HTTP header likethis

Authorization Token ltYOUR_TOKENgt

and the content type of those requests must be applicationjson

26 How to contribute

Contributions are always welcome If you want to submit a patch please respect the following rules

bull Open a pull request on the appropriate repository

bull Respect PEP8

bull Document your patch and respect PEP 257

bull Add unit tests and make sure the global coverage does not decrease

If all those steps are validated your contribution will generally be integrated

261 Table of contents

25 REST API 49

Modoboa Documentation Release 1100

Useful tips

You would like to work on Modoboa but you donrsquot know where to start Yoursquore at the right place Browse this pageto learn useful tips

Docker

A docker image is available for developers To use it you must install docker and docker-compose first

Then just run the following command

$ docker-compose up

It will start the docker environment and make a Modoboa instance available at httplocalhost8000

If you donrsquot want to use docker or need a more complex development setup go to the next section

Prepare a virtual environment

A virtual environment is a good way to setup a development environment on your machine

To do so run the following commands

$ python3 -m venv ltpathgt$ source ltpathgtbinactivate$ git clone httpsgithubcommodoboamodoboagit$ cd modoboa$ python setuppy develop$ pip install -r dev-requirementstxt

The develop command creates a symbolic link to your local copy so any modification you make will be automati-cally available in your environment no need to copy them

Deploy an instance for development

Warning Make sure to create a database before running this step The format of the database url is also describedin this page

Now that you have a running environment yoursquore ready to deploy a test instance

$ cd ltpathgt$ modoboa-adminpy deploy --dburl defaultltdatabase urlgt --domain localhost --develrarr˓instance$ python managepy runserver

Yoursquore ready to go You should be able to access Modoboa at httplocalhost8000 usingadminpassword as credentials

Manage static files

Modoboa uses bower (thanks to django-bower) to manage its CSS and javascript dependencies

50 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Those dependencies are listed in a file called dev_settingspy located inside the ltpath_to_local_copygtmodoboacore directory

If you want to add a new dependency just complete the BOWER_INSTALLED_APPS parameter and run the followingcommand

$ python managepy bower install

It will download and store the required files into the ltpath_to_local_copygtmodoboabower_components directory

Test your modifications

If you deployed a specific instance for your development needs you can run the tests suite as follows

gt python managepy test modoboacore modoboalib modoboaadmin modoboalimits modoboararr˓relaydomains

Otherwise you can run the tests suite from the repository using tox

Start a basic Modoboa instance

From the repository run the following command to launch a simple instance with a few fixtures

gt tox -e serve

You can use adminpassword to log in

Build the documentation

If you need to modify the documenation and want to see the result you can build it as follows

gt tox -e docgt firefox toxdoctmphtmlindexhtml

FAQ

bower command is missing in managepy

bower command is missing in managepy if you donrsquot use the --devel option of the modoboa-adminpydeploy command

To fix it regenerate your instance or update your settingspy file manually Look at devmode in httpsgithubcomtonioomodoboablobmastermodoboacorecommandstemplatessettingspytpl

Create a new plugin

Introduction

Modoboa offers a plugin API to expand its capabilities The current implementation provides the following possibili-ties

26 How to contribute 51

Modoboa Documentation Release 1100

bull Expand navigation by adding entry points to your plugin inside the GUI

bull Access and modify administrative objects (domains mailboxes etc)

bull Register callback actions for specific events

Plugins are nothing more than Django applications with an extra piece of code that integrates them into Modoboa Themodo_extensionpy file will contain a complete description of the plugin

bull Admin and user parameters

bull Custom menu entries

The communication between both applications is provided by Django signals

The following subsections describe the plugin architecture and explain how you can create your own

The required glue

To create a new plugin just start a new django application like this (into Modoboarsquos directory)

$ python managepy startapp

Then you need to register this application using the provided API Just copypaste the following example into themodo_extensionpy file of the future extension

from modoboacoreextensions import ModoExtension exts_pool

class MyExtension(ModoExtension)My custom Modoboa extension

name = myextlabel = My Extensionversion = 01description = A descriptionurl = myext_root_location optional name is used if not defined

def load(self)This method is called when Modoboa loads available and activated plugins

Declare parameters and register events herepass

def load_initial_data(self)Optional provide initial data for your extension herepass

exts_poolregister_extension(MyExtension)

Once done simply add your extensionrsquos module name to the MODOBOA_APPS variable located inside settingspy Finally run the following commands

$ python managepy migrate$ python managepy load_initial_data$ python managepy collectstatic

52 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Parameters

A plugin can declare its own parameters There are two levels available

bull lsquoGlobalrsquo parameters used to configure the plugin editable inside the Admin gt Settings gt Parameters page

bull lsquoUserrsquo parameters per-user parameters (or preferences) editable inside the Options gt Preferences page

Playing with parameters

Parameters are defined using Django forms and Modoboa adds two special forms you can inherit depending on thelevel of parameter(s) you want to add

bull modoboaparametersformsAdminParametersForm for general parameters

bull modoboaparametersformsUserParametersForm for user parameters

To register new parameters add the following line into the load method of your plugin class

from modoboaparameters import tools as param_toolsparam_toolsregistryadd(

LEVEL YourForm ugettext_lazy(Title))

Replace LEVEL by global or user

Custom role permissions

Modoboa uses Djangorsquos internal permission system Administrative roles are nothing more than groups (Groupinstances)

An extension can add new permissions to a group by listening to the extra_role_permissions signal Here isan example

from djangodispatch import receiverfrom modoboacore import signals as core_signals

PERMISSIONS = Resellers [

(relaydomains relaydomain add_relaydomain)(relaydomains relaydomain change_relaydomain)(relaydomains relaydomain delete_relaydomain)(relaydomains service add_service)(relaydomains service change_service)(relaydomains service delete_service)

]

receiver(core_signalsextra_role_permissions)def extra_role_permissions(sender role kwargs)

Add permissions to the Resellers groupreturn constantsPERMISSIONSget(role [])

Extending admin forms

The forms used to edit objects (account domain etc) through the admin panel are composed of tabs You can extendthem (ie add new tabs) in a pretty easy way thanks to custom signals

26 How to contribute 53

Modoboa Documentation Release 1100

Account

To add a new tab to the account edition form define new listeners (handlers) for the following signals

bull modoboaadminsignalsextra_account_forms

bull modoboaadminsignalsget_account_form_instances

bull modoboaadminsignalscheck_extra_account_form (optional)

Example

from djangodispatch import receiverfrom modoboaadmin import signals as admin_signals

receiver(admin_signalsextra_account_forms)def extra_account_form(sender user account kwargs)

return [id tabid title Title cls MyFormClass

]

receiver(admin_signalsget_account_form_instances)def fill_my_tab(sender user account kwargs)

return id my_instance

Domain

To add a new tab to the domain edition form define new listeners (handlers) for the following signals

bull modoboaadminsignalsextra_domain_forms

bull modoboaadminsignalsget_domain_form_instances

Example

from djangodispatch import receiverfrom modoboaadmin import signals as admin_signals

receiver(admin_signalsextra_domain_forms)def extra_account_form(sender user domain kwargs)

return [id tabid title Title cls MyFormClass

]

receiver(admin_signalsget_domain_form_instances)def fill_my_tab(sender user domain kwargs)

return id my_instance

27 Contributors

bull Antidot

bull Bearstech

bull CAP-REL

54 Chapter 2 Table of contents

Modoboa Documentation Release 1100

bull Dalnix

27 Contributors 55

  • Overview
  • Table of contents
Page 14: Modoboa Documentation

Modoboa Documentation Release 1100

backlog = 2048bind = unixvarrungunicornmodoboasockpidfile = varrungunicornmodoboapiddaemon = Truedebug = Falseworkers = 2logfile = varloggunicornmodoboalogloglevel = info

To start gunicorn execute the following commands

$ cd ltmodoboa dirgt$ gunicorn -c gunicornconfpy ltmodoboa dirgtwsgiapplication

Now the nginx part Just create a new virtual host and use the following configuration

upstream modoboa server unixvarrungunicornmodoboasock fail_timeout=0

server listen 443 sslssl onkeepalive_timeout 70

server_name lthost fqdngtroot ltmodoboa_instance_pathgt

access_log varlognginxlthost fqdngtaccesslogerror_log varlognginxlthost fqdngterrorlog

ssl_certificate ltssl certificate for your sitegtssl_certificate_key ltssl certificate key for your sitegt

location sitestatic autoindex on

location media autoindex on

location proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_forproxy_set_header Host $http_hostproxy_redirect offproxy_set_header X-Forwarded-Protocol sslproxy_pass httpmodoboa

If you do not plan to use SSL then change the listen directive to listen 80 and delete each of the followingdirectives

ssl onkeepalive_timeout 70ssl_certificate ltssl certificate for your sitegt

(continues on next page)

21 Installation 11

Modoboa Documentation Release 1100

(continued from previous page)

ssl_certificate_key ltssl certificate key for your sitegtproxy_set_header X-Forwarded-Protocol ssl

If you do plan to use SSL yoursquoll have to generate a certificate and a key This article contains information about howto do it

Paste this content to your configuration (replace values between ltgt with yours) and restart nginx

Now you can go the Dovecot section to continue the installation

uWSGI

The following setup is meant to get you started quickly You should read the documentation of both nginx and uwsgito understand how to optimize their configuration for your site

The Django documentation includes the following warning regarding uwsgi

Warning Use uwsgi 126 or newer If you do not you will run into problems Modoboa will fail in obscureways

To use this setup first download and install uwsgi

Here is a sample nginx configuration

server listen 443 sslssl onkeepalive_timeout 70

server_name lthost fqdngtroot ltmodoboas settings dirgt

ssl_certificate ltssl certificate for your sitegtssl_certificate_key ltssl certificate key for your sitegt

access_log varlognginxlthost fqdngtaccesslogerror_log varlognginxlthost fqdngterrorlog

location ltmodoboas root urlgtsitestatic autoindex onalias ltlocation of sitestatic on your file systemgt

Whether or not Modoboa uses a media directory depends on how you configured Modoboa It does not hurt to have thislocation ltmodoboas root urlgtmedia

autoindex onalias ltlocation of media on your file systemgt

This denies access to any file that begins with ht Apaches htaccess and htpasswd are such files A Modoboa installed from scratch would not contain any such files but you never know what the future holds

(continues on next page)

12 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

location ~ ht deny all

location ltmodobas root urlgt include uwsgi_paramsuwsgi_pass ltuwsgi portgtuwsgi_param UWSGI_SCRIPT ltmodoboa instance namegtwsgiapplicationuwsgi_param UWSGI_SCHEME https

ltmodoboa instance namegt must be replaced by the value you used when you deployed your instance

If you do not plan to use SSL then change the listen directive to listen 80 and delete each of the followingdirectives

ssl onkeepalive_timeout 70ssl_certificate ltssl certificate for your sitegtssl_certificate_key ltssl certificate key for your sitegtuwsgi_param UWSGI_SCHEME https

If you do plan to use SSL yoursquoll have to generate a certificate and a key This article contains information about howto do it

Make sure to replace the ltgt in the sample configuration with appropriate values Here are some explanations forthe cases that may not be completely self-explanatory

ltmodoboas settings dirgt Where Modoboarsquos settingspy resides This is also where thesitestatic and media directories reside

ltmodoboas root urlgt This is the URL which will be the root of your Modoboa site at your domain For in-stance if your Modoboa installation is reachable at at httpsfoomodoboa then ltmodoboas rooturlgt is modoboa In this case you probably also have to set the alias directives to point to where Mod-oboarsquos sitestatic and media directories are because otherwise nginx wonrsquot be able to find them

If Modoboa is at the root of your domain then ltmodoboa root urlgt is an empty string and can be deletedfrom the configuration above In this case you probably do not need the alias directives

ltuwsgi portgt The location where uwsig is listening It could be a unix domain socket or an addressport combi-nation Ubuntu configures uwsgi so that the port is

unixrunuwsgiappltapp namegtsocket

where ltapp namegt is the name of the application

Your uwsgi configuration should be

[uwsgi] Not needed when using uwsgi from pip plugins = pythonchdir = ltmodoboas top dirgtmodule = ltnamegtwsgiapplicationmaster = trueharakiri = 60processes = 4vhost = trueno-default-app = true

21 Installation 13

Modoboa Documentation Release 1100

The plugins directive should be turned on if you use a uwsgi installation that requires it If uwsgi was installed frompip it does not require it In the configuration above

ltmodoboas top dirgt The directory where managepy resides This directory is the parent of ltmodoboassettings dirgt

ltnamegt The name that you passed to modoboa-adminpy deploy when you created your Modoboa instance

Now you can go the Dovecot section to continue the installation

Dovecot

Modoboa requires Dovecot 2+ to work so the following documentation is suitable for this combination

In this section we assume dovecotrsquos configuration resides in etcdovecot all pathes will be relative to thisdirectory

Mailboxes

First edit the confd10-mailconf and set the mail_location variable

maildirmail_location = maildir~maildir

Then edit the inbox namespace and add the following lines

inbox = yes

mailbox Drafts auto = subscribespecial_use = Drafts

mailbox Junk

auto = subscribespecial_use = Junk

mailbox Sent

auto = subscribespecial_use = Sent

mailbox Trash

auto = subscribespecial_use = Trash

With dovecot 21+ it ensures all the special mailboxes will be automaticaly created for new accounts

For dovecot 20 and older use the autocreate plugin

Operations on the file system

14 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning Modoboa needs to access the dovecot binary to check its version To find the binary path weuse the which command first and then try known locations (usrsbindovecot and usrlocalsbindovecot) If you installed dovecot in a custom location please tell us where the binary is by usingthe DOVECOT_LOOKUP_PATH setting (see settingspy)

Three operation types are considered

1 Mailbox creation

2 Mailbox renaming

3 Mailbox deletion

The first one is managed by Dovecot The last two ones may be managed by Modoboa if it can access the file systemwhere the mailboxes are stored (see General parameters to activate this feature)

Those operations are treated asynchronously by a cron script For example when you rename an e-mail addressthrough the web UI the associated mailbox on the file system is not modified directly Instead of that a renameorder is created for this mailbox The mailbox will be considered unavailable until the order is executed (see Postfixconfiguration)

Edit the crontab of the user who owns the mailboxes on the file system

$ crontab -u ltusergt -e

And add the following line inside

python ltmodoboa_sitegtmanagepy handle_mailbox_operations

Warning The cron script must be executed by the system user owning the mailboxes

Warning The user running the cron script must have access to the settingspy file of the modoboa instance

The result of each order is recorded into Modoboarsquos log Go to Modoboa gt Logs to consult them

Authentication

To make the authentication work edit the confd10-authconf and uncomment the following line at the end

include auth-systemconfextinclude auth-sqlconfextinclude auth-ldapconfextinclude auth-passwdfileconfextinclude auth-checkpasswordconfextinclude auth-vpopmailconfextinclude auth-staticconfext

Then edit the confdauth-sqlconfext file and add the following content inside

passdb sql driver = sql Path for SQL configuration file see example-configdovecot-sqlconfext

(continues on next page)

21 Installation 15

Modoboa Documentation Release 1100

(continued from previous page)

args = etcdovecotdovecot-sqlconfext

userdb sql driver = sqlargs = etcdovecotdovecot-sqlconfext

Make sure to activate only one backend (per type) inside your configuration (just comment the other ones)

Edit the dovecot-sqlconfext and modify the configuration according to your database engine

MySQL users

driver = mysql

connect = host=ltmysqld socketgt dbname=ltdatabasegt user=ltusergt password=ltpasswordgt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user WHERE email=Lu andrarr˓is_active=1

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid concat(bytes= mbquota M) AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

PostgreSQL users

driver = pgsql

connect = host=ltpostgres socketgt dbname=ltdatabasegt user=ltusergt password=ltpasswordgt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user u INNER JOIN admin_rarr˓mailbox mb ON uid=mbuser_id INNER JOIN admin_domain dom ON mbdomain_id=domidrarr˓WHERE uemail=Lu AND uis_active AND domenabled

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid bytes= || mbquota || M AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

16 Chapter 2 Table of contents

Modoboa Documentation Release 1100

SQLite users

driver = sqlite

connect = ltpath to the sqlite db filegt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user u INNER JOIN admin_rarr˓mailbox mb ON uid=mbuser_id INNER JOIN admin_domain dom ON mbdomain_id=domidrarr˓WHERE uemail=Lu AND uis_active=1 AND domenabled=1

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid (bytes= || mbquota || M) AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

Note Replace values between ltgt with yours

LDAP

To make the LDAP authentication work edit the confd10-authconf and uncomment the following line atthe end

include auth-ldapconfext

Then edit the confdauth-ldapconfext and edit the passdb section as following You should comment theuserdb section which will be managed by SQL with modoboa database

passdb driver = ldap

Path for LDAP configuration file see example-configdovecot-ldapconfextargs = etcdovecotdovecot-ldapconfext

userdb driver = ldapargs = etcdovecotdovecot-ldapconfext

Default fields can be used to specify defaults that LDAP may overridedefault_fields = home=homevirtualu

Your own dovecot LDAP configuration file is now etcdovecotdovecot-ldapconfext You can addyour default LDAP conf in it following the official documentation

Synchronize dovecot LDAP conf with modoboa LDAP conf

To make dovecot LDAP configuration synchronized with modoboa LDAP configuration you should create a dedicateddovecot conf file At the end of your dovecot configuration file (dovecot-ldapconfext) add the following

21 Installation 17

Modoboa Documentation Release 1100

line

include_try dovecot-modoboaconfext

Then set modoboa parameter Enable Dovecot LDAP sync to Yes Then set the Dovecot LDAP config file following theprevious step (etcdovecotdovecot-modoboaconfext in the example)

The last step is to add the command update_dovecot_conf to the cron job of modoboa Then each time your modoboaLDAP configuration is updated your dovecot LDAP configuration will also be

LMTP

Local Mail Transport Protocol is used to let Postfix deliver messages to Dovecot

First make sure the protocol is activated by looking at the protocols setting (generally inside dovecotconf)It should be similar to the following example

protocols = imap pop3 lmtp

Then open the confd10-masterconf look for lmtp service definition and add the following content inside

service lmtp stuff beforeunix_listener varspoolpostfixprivatedovecot-lmtp mode = 0600user = postfixgroup = postfix

stuff after

We assume here that Postfix is chrooted within varspoolpostfix

Finally open the confd20-lmtpconf and modify it as follows

protocol lmtp postmaster_address = postmasterltdomaingtmail_plugins = $mail_plugins quota sieve

Replace ltdomaingt by the appropriate value

Note If you donrsquot plan to apply quota or to use filters just adapt the content of the mail_plugins setting

Quota

Modoboa lets adminstrators define per-domain andor per-account limits (quota) It also lists the current quota usageof each account Those features require Dovecot to be configured in a specific way

Inside confd10-mailconf add the quota plugin to the default activated ones

mail_plugins = quota

Inside confd10-masterconf update the dict service to set proper permissions

18 Chapter 2 Table of contents

Modoboa Documentation Release 1100

service dict If dict proxy is used mail processes should have access to its socket For example mode=0660 group=vmail and global mail_access_groups=vmailunix_listener dict mode = 0600user = ltuser owning mailboxesgtgroup =

Inside confd20-imapconf activate the imap_quota plugin

protocol imap

mail_plugins = $mail_plugins imap_quota

Inside dovecotconf activate the quota SQL dictionary backend

dict quota = ltdrivergtetcdovecotdovecot-dict-sqlconfext

Inside confd90-quotaconf activate the quota dictionary backend

plugin quota = dictUser quotaproxyquota

It will tell Dovecot to keep quota usage in the SQL dictionary

Finally edit the dovecot-dict-sqlconfext file and put the following content inside

connect = host=ltdb hostgt dbname=ltdb namegt user=ltdb usergt password=ltpasswordgt SQLite users connect = pathtothedatabasedb

map pattern = privquotastoragetable = admin_quotausername_field = usernamevalue_field = bytes

map

pattern = privquotamessagestable = admin_quotausername_field = usernamevalue_field = messages

PostgreSQL users

21 Installation 19

Modoboa Documentation Release 1100

Database schema update

The admin_quota table is created by Django but unfortunately it doesnrsquot support DEFAULT constraints (it onlysimulates them when the ORM is used) As PostgreSQL is a bit strict about constraint violations you must executethe following query manually

db=gt ALTER TABLE admin_quota ALTER COLUMN bytes SET DEFAULT 0db=gt ALTER TABLE admin_quota ALTER COLUMN messages SET DEFAULT 0

Trigger

As indicated on Dovecotrsquos wiki you need a trigger to properly update the quota

A working copy of this trigger is available on Github

Download this file and copy it on the server running postgres Then execute the following commands

$ su - postgres$ psql [modoboa database] lt pathtomodoboa_postgres_triggersql$ exit

Replace [modoboa database] by the appropriate value

Forcing recalculation

For existing installations Dovecot (gt 2) offers a command to recalculate the current quota usages For example if youwant to update all usages run the following command

$ doveadm quota recalc -A

Be carefull it can take a while to execute

ManageSieveSieve

Modoboa lets users define filtering rules from the web interface To do so it requires ManageSieve to be activated onyour server

Inside confd20-managesieveconf make sure the following lines are uncommented

protocols = $protocols sieve

service managesieve-login

service managesieve

protocol sieve

20 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Messages filtering using Sieve is done by the LDA

Inside confd15-ldaconf activate the sieve plugin like this

protocol lda Space separated list of plugins to load (default is global mail_plugins)mail_plugins = $mail_plugins sieve

Finally configure the sieve plugin by editing the confd90-sieveconf file Put the follwing caontent inside

plugin Location of the active script When ManageSieve is used this is actually a symlink pointing to the active script in the sieve storage directorysieve = ~dovecotsieve

The path to the directory where the personal Sieve scripts are stored For ManageSieve this is where the uploaded scripts are storedsieve_dir = ~sieve

Restart Dovecot

Now you can go to the Postfix section to finish the installation

Last-login tracking

To update the last_login attribute of an account after a succesful IMAP or POP3 login you can configure apost-login script

Open confd10-masterconf add the following configuration (imap and pop3 services are already definedyou just need to update them)

service imap executable = imap postlogin

service pop3 executable = pop3 postlogin

service postlogin executable = script-login usrlocalbinpostloginshuser = modoboaunix_listener postlogin

Then you must create a script named usrlocalbinpostloginsh According to your database enginethe content will differ

PostgreSQL

21 Installation 21

Modoboa Documentation Release 1100

binsh

psql -c UPDATE core_user SET last_login=now() WHERE username=$USER gt devnull

exec $

MySQL

binsh

DBNAME=XXXDBUSER=XXXDBPASSWORD=XXX

echo UPDATE core_user SET last_login=now() WHERE username=$USER | mysql -urarr˓$DBUSER -p$DBPASSWORD $DBNAME

exec $

Postfix

This section gives an example about building a simple virtual hosting configuration with Postfix Refer to the officialdocumentation for more explanation

Map files

You first need to create configuration files (or map files) that will be used by Postfix to lookup into Modoboa tables

To automaticaly generate the requested map files and store them in a directory run the following command

gt cd ltmodoboa_instance_pathgtgt python managepy generate_postfix_maps --destdir ltdirectorygt

ltdirectorygt is the directory where the files will be stored Answer the few questions and yoursquore done

Configuration

Use the following configuration in the etcpostfixmaincf file (this is just one possible configuration)

Stuff beforevirtual_transport = lmtpunixprivatedovecot-lmtp

virtual_mailbox_domains = ltdrivergtetcpostfixsql-domainscfvirtual_alias_domains = ltdrivergtetcpostfixsql-domain-aliasescfvirtual_alias_maps = ltdrivergtetcpostfixsql-aliasescf

relay_domains = ltdrivergtetcpostfixsql-relaydomainscftransport_maps =

ltdrivergtetcpostfixsql-transportcfltdrivergtetcpostfixsql-spliteddomains-transportcf

(continues on next page)

22 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

smtpd_recipient_restrictions = check_recipient_access

ltdrivergtetcpostfixsql-maintaincfltdrivergtetcpostfixsql-relay-recipient-verificationcf

permit_mynetworksreject_unauth_destinationreject_unverified_recipient

smtpd_sender_login_maps = ltdrivergtetcpostfixsql-sender-login-mapcf

smtpd_sender_restrictions =reject_sender_login_mismatch

Stuff after

Replace ltdrivergt by the name of the database you use

Restart Postfix

Policy daemon

If you want to enable the built-in policy daemon add the following content to the etcpostfixmaincf file

smtpd_recipient_restrictions = check_policy_service inet1270019999

And reload postfix

Note The check_policy_service line must be placed before the permit_mynetworks one otherwise thedaemon wonrsquot be called

OpenDKIM

Modoboa can generate DKIM keys for the hosted domains but it wonrsquot sign or check messages To do that you needa dedicated software like OpenDKIM

Note The cron job in charge of creating DKIM keys must be run using the same user than OpenDKIM (ie opendkimin most cases)

Database

Since keys related information is stored in Modoboarsquos database you need to tell OpenDKIM how it can access it

First make sure to install the required additional packages on your system (libopendbx1- on debian baseddistributions or opendbx- on CentOS the complete name depends on your database engine)

Then insert the following SQL view into Modoboarsquos database

21 Installation 23

Modoboa Documentation Release 1100

PostgreSQL

CREATE OR REPLACE VIEW dkim AS (SELECT id name as domain_name dkim_private_key_path AS private_key_path

dkim_key_selector AS selectorFROM admin_domain WHERE enable_dkim

)

MySQLMariaDB

CREATE OR REPLACE VIEW dkim AS (SELECT id name as domain_name dkim_private_key_path AS private_key_path

dkim_key_selector AS selectorFROM admin_domain WHERE enable_dkim=1

)

Configuration

You should find OpenDKIMrsquos configuration file at etcopendkimconf

Add the following content to it

KeyTable dsnltdrivergtltusergtltpasswordgtltdb hostgtltdb namegttable=dkimrarr˓keycol=iddatacol=domain_nameselectorprivate_key_pathSigningTable dsnltdrivergtltusergtltpasswordgtltdb hostgtltdb namegttable=dkimrarr˓keycol=domain_namedatacol=idSocket inet12345localhost

Replace values between ltgt by yours Accepted values for driver are pgsql or mysql Make sure the user youspecify has read permission on the view created previously

If you run a debian based system make sure to adjust the following setting in the etcdefaultopendkim file

SOCKET=inet12345localhost

Eventually reload OpenDKIM

Postfix integration

Add the following lines to the etcpostfixmaincf file

smtpd_milters = inet12700112345non_smtpd_milters = inet12700112345milter_default_action = acceptmilter_content_timeout = 30s

and reload postfix

Extensions

Only few commands are needed to add a new extension to your setup

24 Chapter 2 Table of contents

Modoboa Documentation Release 1100

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install ltEXTENSIONgt==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Then restart your web server

22 Upgrade

221 Modoboa

Warning The new version you are going to install may need to modify your database Before you start makesure to backup everything

Most of the time upgrading your installation to a newer Modoboa version only requires a few actions In every caseyou will need to apply the general procedure first and then check if the version you are installing requires specificactions

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install modoboa==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Once done check if the version you are installing requires Specific instructions

Finally restart your web server

Sometimes you might need to upgrade postfix map files too To do so just run the generate_postfix_mapscommand on the same directory than the one used for installation (etcpostfix by default)

Make sure to use root privileges and run the following command

gt python managepy generate_postfix_maps --destdir ltdirectorygt

Then reload postfix

22 Upgrade 25

Modoboa Documentation Release 1100

222 Extensions

If a new version is available for an extension yoursquore using it is recommanded to install it Upgrading an extensions ispretty and the procedure is almost the same than the one used for Modoboa

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install ltEXTENSIONgt==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Finally restart your web server

It is a generic upgrade procedure which will be enough most of the time but it is generally a good idea to check theassociated documentation

223 Rebuild Virtual Environment

Sometimes when upgrading your Operating System (eg from Ubuntu 1704 to Ubuntu 1710) your virtual environmentrunning modoboa can get corrupted Your first response will be to panic but fear not The solution is in this document

First things first

Recover your database password

You will need to recover your database password (if using mysql or postgresql) You will find this in etcpostfixsql-aliasescf or any file with sql-cf in the etcpostfix directory

Make note of this as you will need it when reconfiguring modoboa

Reinstall Modoboa

Start out by backup up your modoboa settings file located in the modoboa instance directory (srvmodoboainstanceinstancesettingspy if you used the default installer configuration) This contains your currentconfiguration

Next you want to remove all current modoboa files

After doing this follow the manual installation instructions for Modoboa only as everything should be working prop-erly

After this completes simply restore your backed up settings file to srvinstanceinstancesettingspy(if you used installer default configuration) You will then need to reinstall your extensions

You can find which plugins you had in your settingspy file under the MODOBOA_APPS variable

Instructions to install extensions can also be found here

Once you have completed this step you will need to run the following commands

26 Chapter 2 Table of contents

Modoboa Documentation Release 1100

gt (env) $ cd ltinstance_dirgtgt (env) $ python managepy migrategt (env) $ python managepy collectstatic

You will then see a message similar to

You have requested to collect static files at the destinationlocation as specified in your settings

srvmodoboainstancesitestatic

This will overwrite existing filesAre you sure you want to do this

Type yes to continue or no to cancel

You will want to answer yes here then simply restart the uwsgi process with service uwsgi restart andyou should be up and running again

Simply log into your modoboa web panel and verify that your extensions and webmail box is working

224 Information

Rebuild instructions from httpshelppythonanywherecompagesRebuildingVirtualenvs

225 Specific instructions

1160

A new policy daemon has been added

Make sure to have a Redis instance running on your server

Add modoboapolicyd to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboapolicyd

)

Add the following settings to your settingspy file

REDIS_HOST = ltIP or hostname heregtREDIS_PORT = 6379REDIS_QUOTA_DB = 0REDIS_URL = redisformat(REDIS_HOST REDIS_PORT REDIS_QUOTA_DB)

Once done you can start the policy daemon using the following commands

22 Upgrade 27

Modoboa Documentation Release 1100

gt python managepy policy_daemon

Donrsquot forget to configure _policyd_config if you want to use this feature

The modoboa-stats plugin has been merged into the core

Add modoboamaillog to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboapolicydmodoboamaillog

)

And remove any reference to modoboa_stats in this same variable

1150

This version drops Python 2 support so donrsquot forget to update all the extensions you use

Warning If you upgrade an existing python 2 installation you will need to create a new Python 3 virtualenvironment You can remove the existing virtual environment and replace it by the new one so you wonrsquot have tomodify your configuration files

Add the following new setting

DISABLE_DASHBOARD_EXTERNAL_QUERIES = False

Reload uwsgigunicornapache depending on your setup

Finally Make sure to use root privileges and run the following command

gt python managepy generate_postfix_maps --destdir ltdirectorygt

Then reload postfix

1140

This release introduces an optional LDAP synchronization process If you want to use it please follow the dedicatedprocedure

1131

Upgrade postfix maps files as follows

28 Chapter 2 Table of contents

Modoboa Documentation Release 1100

gt python managepy generate_postfix_maps --destdir ltpathgt --force-overwrite

1130

Add modoboadnstools to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstools

)

Add the following new settings

CSRF_COOKIE_SECURE = TrueSESSION_COOKIE_SECURE = True

modoboa-postfix-autoreply 150

Edit the etcpostfixmaincf file and remove the sql-autoreplies-transportcf map from thetransport_maps if present Remove the corresponding proxy_read_maps entry if relevant

Reload postfix

1100

Warning Upgrade installed extensions BEFORE running check or migrate commands

Upgrade all your installed plugins to the following versions

Warning If you use the amavis plugin make sure to include its configuration as follows into settingspy

from modoboa_amavis import settings as modoboa_amavis_settingsmodoboa_amavis_settingsapply(globals())

22 Upgrade 29

Modoboa Documentation Release 1100

Name Versionmodoboa-amavis 120modoboa-contacts 050modoboa-dmarc 110modoboa-imap-migration 120modoboa-pdfcredentials 130modoboa-postfix-autoreply 140modoboa-radicale 120modoboa-sievefilters 140modoboa-stats 140modoboa-webmail 140

Edit the settingspy file and apply the following modifications

Add modoboatransport to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparameters

)

Replace the following line

MIDDLEWARE_CLASSES = (

by

MIDDLEWARE = (

Update postfix map files as follows

gt rm -f ltpathgtmodoboa-postfix-mapschkgt python managepy generate_postfix_maps --force --destdir ltpathgt

Then modify postfixrsquos configuration as follows

smtpd_sender_login_maps =ltdrivergtltpathgtsql-sender-login-mapcf

transport_maps =ltdrivergtltpathgtsql-transportcfltdrivergtltpathgtsql-spliteddomains-transportcf other map files

Replace ltdrivergt and ltpathgt by your values

If transport_maps contains sql-relaydomains-transportcf remove it

30 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning If you make use of postfixrsquos proxymap server you must also update the proxy_read_maps setting

Reload postfix

Add the following cron job in order to generate DKIM keys

Generate DKIM keys (they will belong to the user running this job)

root $PYTHON $INSTANCEmanagepy modorarr˓manage_dkim_keys

190

If you want to manage inactive accounts look at Cleaning inactive accounts

183

Edit the settingspy file and replace the following line

BASE_DIR = ospathdirname(ospathdirname(__file__))

by

BASE_DIR = ospathrealpath(ospathdirname(ospathdirname(__file__)))

180

Modoboa now relies on Djangorsquos builtin password validation system to validate user passwords instead ofdjango-passwords

Remove django-passwords from your system

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt pip uninstall django-passwords

Edit the settingspy file and remove the following content

django-passwords

PASSWORD_MIN_LENGTH = 8

PASSWORD_COMPLEXITY = UPPER 1LOWER 1DIGITS 1

Add the following lines

Password validation rulesAUTH_PASSWORD_VALIDATORS = [

NAME djangocontribauthpassword_validation

rarr˓UserAttributeSimilarityValidator (continues on next page)

22 Upgrade 31

Modoboa Documentation Release 1100

(continued from previous page)

NAME djangocontribauthpassword_validationMinimumLengthValidator

NAME djangocontribauthpassword_validationCommonPasswordValidator

NAME djangocontribauthpassword_validationNumericPasswordValidator

NAME modoboacorepassword_validationComplexityValidatorOPTIONS

upper 1lower 1digits 1specials 0

]

172

API documentation has evolved (because of the upgrade to Django Rest Framework 36) and CKeditor is now embed-ded by default (thanks to the django-ckeditor package) Some configuration changes are required

Edit your settingspy file and apply the following modifications

bull Update the INSTALLED_APPS variable as follows

INSTALLED_APPS = (djangocontribauthdjangocontribcontenttypesdjangocontribsessionsdjangocontribmessagesdjangocontribsitesdjangocontribstaticfilesreversionckeditorckeditor_uploaderrest_frameworkrest_frameworkauthtoken

)

bull Update the REST_FRAMEWORK variable as follows

REST_FRAMEWORK = DEFAULT_AUTHENTICATION_CLASSES (

rest_frameworkauthenticationTokenAuthenticationrest_frameworkauthenticationSessionAuthentication

)

bull Remove the SWAGGER_SETTINGS variable

bull Add the following content

32 Chapter 2 Table of contents

Modoboa Documentation Release 1100

CKeditor

CKEDITOR_UPLOAD_PATH = uploads

CKEDITOR_IMAGE_BACKEND = pillow

CKEDITOR_RESTRICT_BY_USER = True

CKEDITOR_BROWSE_SHOW_DIRS = True

CKEDITOR_ALLOW_NONIMAGE_FILES = False

CKEDITOR_CONFIGS = default

allowedContent Truetoolbar Modoboawidth Nonetoolbar_Modoboa [

[Bold Italic Underline][JustifyLeft JustifyCenter JustifyRight JustifyBlock][BidiLtr BidiRtl Language][NumberedList BulletedList - Outdent Indent][Undo Redo][Link Unlink Anchor - Smiley][TextColor BGColor - Source][Font FontSize][Image ][SpellChecker]

]

Donrsquot forget to run the following command

gt python managepy collectstatic

171

If you used 170 for a fresh installation please run the following commands

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy load_initial_data

170

This version requires Django gt= 110 so you need to make some modifications It also brings internal API changeswhich are not backward compatible so installed extensions must be upgraded too

First of all deactivate all installed extensions (edit the settingspy file and comment the corresponding lines inMODOBOA_APPS)

Edit the urlspy file of your local instance and replace its content by the following one

22 Upgrade 33

Modoboa Documentation Release 1100

from djangoconfurls import include url

urlpatterns = [url(r include(modoboaurls))

]

Edit the settingspy and apply the following changes

bull Add modoboaparameters to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboarelaydomainsmodoboalimitsmodoboaparameters Modoboa extensions here

)

bull Add modoboacoremiddlewareLocalConfigMiddleware to MIDDLEWARE_CLASSES

MIDDLEWARE_CLASSES = (djangocontribsessionsmiddlewareSessionMiddlewaredjangomiddlewarecommonCommonMiddlewaredjangomiddlewarecsrfCsrfViewMiddlewaredjangocontribauthmiddlewareAuthenticationMiddlewaredjangocontribmessagesmiddlewareMessageMiddlewaredjangomiddlewarelocaleLocaleMiddlewaredjangomiddlewareclickjackingXFrameOptionsMiddlewaremodoboacoremiddlewareLocalConfigMiddlewaremodoboalibmiddlewareAjaxLoginRedirectmodoboalibmiddlewareCommonExceptionCatchermodoboalibmiddlewareRequestCatcherMiddleware

)

bull Modoboa used to provide a custom authentication backend (modoboalibauthbackendsSimpleBackend) but it has been removed Replace it as follows

AUTHENTICATION_BACKENDS = ( Other backends beforedjangocontribauthbackendsModelBackend

)

bull Remove TEMPLATE_CONTEXT_PROCESSORS and replace it by

TEMPLATES = [

BACKEND djangotemplatebackendsdjangoDjangoTemplatesDIRS []APP_DIRS TrueOPTIONS

context_processors [djangotemplatecontext_processorsdebugdjangotemplatecontext_processorsrequestdjangocontribauthcontext_processorsauth

(continues on next page)

34 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

djangotemplatecontext_processorsi18ndjangotemplatecontext_processorsmediadjangotemplatecontext_processorsstaticdjangotemplatecontext_processorstzdjangocontribmessagescontext_processorsmessagesmodoboacorecontext_processorstop_notifications

]debug False

]

Run the following commands (load virtualenv if you use one)

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstatic

Finally upgrade your extensions and reactivate them

Name Versionmodoboa-amavis 110modoboa-dmarc 100modoboa-imap-migration 110modoboa-pdfcredentials 110modoboa-postfix-autoreply 120modoboa-radicale 110modoboa-sievefilters 110modoboa-stats 110modoboa-webmail 110

Command line shortcuts

$ pip install modoboa-amavis==110$ pip install modoboa-dmarc==100$ pip install modoboa-imap-migration==110$ pip install modoboa-pdfcredentials==110$ pip install modoboa-postfix-autoreply==120$ pip install modoboa-radicale==110$ pip install modoboa-sievefilters==110$ pip install modoboa-stats==110$ pip install modoboa-webmail==110

And please make sure you use the latest version of the django-versionfield2 package

$ pip install -U django-versionfield2

Notes about quota changes and resellers

Reseller users now have a quota option in Resources tab This is the quota that a reseller can share between all itsdomains

22 Upgrade 35

Modoboa Documentation Release 1100

There are two quotas for a domain in the new version

1 Quota amp

2 Default mailbox quota

[1] Quota quota shared between mailboxes This quota is shared between all the mailboxes of this domain This valuecannot exceed resellerrsquos quota and hence cannot be 0(unlimited) if reseller has finite quota

[2] Default mailbox quota default quota applied to mailboxes This quota is the default quota applied to new mail-boxes This value cannot exceed Quota[1] and hence cannot be 0(unlimited) if Quota[1] is finite

161

First of all update postfix map files as follows

gt python managepy generate_postfix_maps --destdir ltpathgt --force-overwrite

Then modify postfixrsquos configuration as follows

smtpd_sender_login_maps =ltdrivergtltpathgtsql-sender-login-mailboxescfltdrivergtltpathgtsql-sender-login-aliasescfltdrivergtltpathgtsql-sender-login-mailboxes-extracf

Replace ltdrivergt and ltpathgt by your values

Finally reload postfix

This release also deprecates some internal functions As a result several extensions has been updated to maintain thecompatibility If you enabled the notification service yoursquoll find the list of available updates directly in your Modoboaconsole

For the others here is the list

Name Versionmodoboa-amavis 1010modoboa-postfix-autoreply 117modoboa-radicale 105modoboa-stats 109

Command line shortcut

$ pip install modoboa-amavis==1010$ pip install modoboa-postfix-autoreply==117$ pip install modoboa-radicale==105$ pip install modoboa-stats==109

160

Warning You have to upgrade extensions due to coreUser model attribute change (usergroup to userrole) Oth-erwise you will have an internal error after upgrade In particular modoboa-amavisd modoboa-stats modoboa-postfix-autoreply are concerned

36 Chapter 2 Table of contents

Modoboa Documentation Release 1100

An interesting feature brougth by this version is the capability to make different checks about MX records Forexample Modoboa can query main DNSBL providers for every defined domain With this you will quickly know ifone the domains you manage is listed or not To activate it add the following line to your crontab

30 ltoptional_virtualenv_pathgtpython ltmodoboa_instance_dirgtmanagepy modorarr˓check_mx

The communication with Modoboa public API has been reworked Instead of sending direct synchronous queries (forexample to check new versions) a cron job has been added To activate it add the following line to your crontab

0 ltoptional_virtualenv_pathgtpython ltmodoboa_instance_dirgtmanagepyrarr˓communicate_with_public_api

Please also note that public API now uses TLS so you must update your configuration as follows

MODOBOA_API_URL = httpsapimodoboaorg1

Finally it is now possible to declare additional sender addresses on a per-account basis You need to update your postfixconfiguration in order to use this functionality Just edit the maincf file and change the following parameter

smtpd_sender_login_maps =ltdrivergtetcpostfixsql-sender-login-mailboxescfltdrivergtetcpostfixsql-sender-login-aliasescfltdrivergtetcpostfixsql-sender-login-mailboxes-extracf

150

The API has been greatly improved and a documentation is now available To enable it addrest_framework_swagger to the INSTALLED_APPS variable in settingspy as follows

INSTALLED_APPS = (djangocontribauthdjangocontribcontenttypesdjangocontribsessionsdjangocontribmessagesdjangocontribsitesdjangocontribstaticfilesreversionrest_frameworkauthtokenrest_framework_swagger

)

Then add the following content into settingspy just after the REST_FRAMEWORK variable

SWAGGER_SETTINGS = is_authenticated Falseapi_version 10exclude_namespaces []info

contact contactmodoboacomdescription (Modoboa API requires a valid token)title Modoboa API

Yoursquore done The documentation is now available at the following address

22 Upgrade 37

Modoboa Documentation Release 1100

httpltyour instance addressgtdocsapi

Finally if you find a TEMPLATE_CONTEXT_PROCESSORS variable in your settingspy file make sure it lookslike this

TEMPLATE_CONTEXT_PROCESSORS = global_settingsTEMPLATE_CONTEXT_PROCESSORS + [modoboacorecontext_processorstop_notifications

]

140

Warning Please make sure to use Modoboa 135 with an up-to-date database before an upgrade to 140

Warning Do not follow the regular upgrade procedure for this version

Some extension have been moved back into the main repository The main reason for that is that using Modoboawithout them doesnrsquot make sense

First of all you must rename the following applications listed inside the MODOBOA_APPS variable

Old name New namemodoboa_admin modoboaadminmodoboa_admin_limits modoboalimitsmodoboa_admin_relaydomains modoboarelaydomains

Then apply the following steps

1 Uninstall old extensions

$ pip uninstall modoboa-admin modoboa-admin-limits modoboa-admin-relaydomains

2 Install all extension updates using pip (check the Modoboa gt Information page)

3 Manually migrate database

$ cd ltinstance_dirgt$ python managepy migrate auth$ python managepy migrate admin 0001 --fake$ python managepy migrate admin$ python managepy migrate limits 0001 --fake$ python managepy migrate relaydomains 0001 --fake$ python managepy migrate

4 Finally update static files

$ python managepy collectstatic

This version also introduces a REST API To enable it

1 Add rest_frameworkauthtoken to the INSTALLED_APPS variable

2 Add the following configuration inside settingspy

38 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Rest framework settings

REST_FRAMEWORK = DEFAULT_AUTHENTICATION_CLASSES (

rest_frameworkauthenticationTokenAuthentication)DEFAULT_PERMISSION_CLASSES (

rest_frameworkpermissionsIsAuthenticated)

3 Run the following command

$ python managepy migrate

135

To enhance security Modoboa now checks the strength of user passwords lthttpsgithubcomdstufftdjango-passwordsgt_

To use this feature add the following configuration into the settingspy file

django-passwords

PASSWORD_MIN_LENGTH = 8

PASSWORD_COMPLEXITY = UPPER 1LOWER 1DIGITS 1

132

Modoboa now uses the atomic requests mode to preserve database consistency (reference)

To enable it update the DATABASES variable in settingspy as follows

DATABASES = default

stuff beforeATOMIC_REQUESTS True

amavis

stuff beforeATOMIC_REQUESTS True

130

This release does not bring awesome new features but it is a necessary bridge to the future of Modoboa All extensionsnow have their own git repository and the deploy process has been updated to reflect this change

22 Upgrade 39

Modoboa Documentation Release 1100

Another important update is the use of Django 17 Besides its new features the migration system has been reworkedand is now more robust than before

Before we begin with the procedure here is a table showing old extension names and their new name

Old name New package name New module namemodoboaextensionsadmin modoboa-admin modoboa_adminmodoboaextensionslimits modoboa-admin-limits modoboa_admin_limitsmodoboaextensionspostfix_autoreply modoboa-postfix-autoreply modoboa_postfix_autoreplymodoboaextensionspostfix_relay_domains modoboa-admin-relaydomains modoboa_admin_relaydomainsmodoboaextensionsradicale modoboa-radicale modoboa_radicalemodoboaextensionssievefilters modoboa-sievefilters modoboa_sievefiltersmodoboaextensionsstats modoboa-stats modoboa_statsmodoboaextensionswebmail modoboa-webmail modoboa_webmail

Here are the required steps

1 Install the extensions using pip (look at the second column in the table above)

$ pip install ltthe extensions you wantgt

2 Remove south from INSTALLED_APPS

3 Rename old extension names inside MODOBOA_APPS (look at the third column in the table above)

4 Remove modoboalibmiddlewareExtControlMiddleware from MIDDLEWARE_CLASSES

5 Change DATABASE_ROUTERS to

DATABASE_ROUTERS = [modoboa_amavisdbrouterAmavisRouter]

6 Run the following commands

$ cd ltmodoboa_instance_dirgt$ python managepy migrate

7 Reply yes to the question

8 Run the following commands

$ python managepy load_initial_data$ python managepy collectstatic

9 The cleanup job has been renamed in Django so you have to modify your crontab entry

- 0 0 ltmodoboa_sitegtmanagepy cleanup+ 0 0 ltmodoboa_sitegtmanagepy clearsessions

120

A new notification service let administrators know about new Modoboa versions To activate it you need to updatethe TEMPLATE_CONTEXT_PROCESSORS variable like this

from djangoconf import global_settings

TEMPLATE_CONTEXT_PROCESSORS = global_settingsTEMPLATE_CONTEXT_PROCESSORS + (

(continues on next page)

40 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

modoboacorecontext_processorstop_notifications)

and to define the new MODOBOA_API_URL variable

MODOBOA_API_URL = httpapimodoboaorg1

The location of external static files has changed To use them add a new path to the STATICFILES_DIRS

Additional locations of static filesSTATICFILES_DIRS = (

Put strings here like homehtmlstatic or Cwwwdjangostatic Always use forward slashes even on Windows Dont forget to use absolute paths not relative pathsltpathtomodoboainstalldirgtbower_components

)

Run the following commands to define the hostname of your instance

$ cd ltmodoboa_instance_dirgt$ python managepy set_default_site lthostnamegt

If you plan to use the Radicale extension

1 Add modoboaextensionsradicale to the MODOBOA_APPS variable

2 Run the following commands

$ cd ltmodoboa_instance_dirgt$ python managepy syncdb

Warning You also have to note that the sitestatic directory has moved from ltpath to your sitesdirgt to ltmodoboas root urlgt (itrsquos probably the parent directory) You have to adapt your web serverconfiguration to reflect this change

23 Configuration

231 Online parameters

Modoboa provides online panels to modify internal parameters There are two available levels

bull Application level global parameters define how the application behaves Available at Modoboa gt Parameters

bull User level per user customization Available at User gt Settings gt Preferences

Regardless level parameters are displayed using tabs each tab corresponding to one application

General parameters

The admin application exposes several parameters they are presented below

23 Configuration 41

Modoboa Documentation Release 1100

Name Tab Description Default valueAuthentication type General The backend used for au-

thenticationLocal

Default password scheme General Scheme used to cryptmailbox passwords

crypt

Rounds General Number of rounds (onlyused by sha256cryptand sha512crypt) Mustbe between 1000 and999999999 inclusive

70000

Secret key General A key used to encryptusersrsquo password in ses-sions

random value

Sender address General Email address used tosend notifications

Enable communication General Enable communicationwith Modoboa public API

yes

Check new versions General Automatically checks if anewer version is available

yes

Send statistics General Send statistics to Mod-oboa public API (countersand used extensions)

yes

Top notifications check in-terval

General Interval between two topnotification checks (inseconds)

30

Maximum log record age General The maximum age in daysof a log record

365

Items per page General Number of displayeditems per page

30

Default top redirection General The default redirectionused when no applicationis specified

userprefs

Enable MX checks Admin Check that every domainhas a valid MX record

yes

Valid MXs Admin A list of IP or networkaddress every MX shouldmatch A warning will besent if a record does notrespect this it

Enable DNSBL checks Admin Check every domainagainst major DNSBLproviders

yes

DKIM keys storage direc-tory

AdminPath to a directory where DKIM

generated keys willbe stored

Default DKIM key length Admin The default size (in bits)for new keys

2048

Handle mailboxes onfilesystem

Admin Rename or remove mail-boxes on the filesystemwhen they get renamed orremoved within Modoboa

no

Mailboxes owner Admin The UNIX account whoowns mailboxes on thefilesystem

vmail

Default domain quota Admin Default quota (in MB) ap-plied to freshly createddomains with no valuespecified A value of 0means no quota

0

Automatic accountremoval

Admin When a mailbox is re-moved also remove theassociated account

no

Automatic do-mainmailbox creation

Admin Create a domain and amailbox when an accountis automatically created

yes

42 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Note If you are not familiar with virtual domain hosting you should take a look at postfixrsquos documentation ThisHow to also contains useful information

Note A random secret key will be generated each time the Parameters page is refreshed and until you save parametersat least once

Note Specific LDAP parameters are also available see LDAP authentication

232 Media files

Modoboa uses a specific directory to upload files (ie when the webmail is in use) or to create ones (ex graphical statis-tics) This directory is named media and is located inside modoboarsquos installation directory (called modoboa_sitein this documentation)

To work properly the system user which runs modoboa (www-data apache whatever) must have write access tothis directory

233 Customization

Custom logo

You have the possibility to use a custom logo instead of the default one on the login page

To do so open the settingspy file and add a MODOBOA_CUSTOM_LOGO variable This variable must containthe relative URL of your logo under MEDIA_URL For example

MODOBOA_CUSTOM_LOGO = ospathjoin(MEDIA_URL custom_logopng)

Then copy your logo file into the directory indicated by MEDIA_ROOT

234 Host configuration

Note This section is only relevant when Modoboa handles mailboxes renaming and removal from the filesystem

To manipulate mailboxes on the filesystem you must allow the user who runs Modoboa to execute commands as theuser who owns mailboxes

To do so edit the etcsudoers file and add the following inside

ltuser_that_runs_modoboagt ALL=(ltmailboxes ownergt) NOPASSWD ALL

Replace values between ltgt by the ones you use

23 Configuration 43

Modoboa Documentation Release 1100

235 Time zone and language

Modoboa is available in many languages

To specify the default language to use edit the settingspy file and modify the LANGUAGE_CODE variable

LANGUAGE_CODE = fr or en for english etc

Note Each user has the possibility to define the language he prefers

In the same configuration file specify the timezone to use by modifying the TIME_ZONE variable For example

TIME_ZONE = EuropeParis

236 Sessions management

Modoboa uses Djangorsquos session framework to store per-user information

Few parameters need to be set in the settingspy configuration file to make Modoboa behave as expected

SESSION_EXPIRE_AT_BROWSER_CLOSE = False Default value

This parameter is optional but you must ensure it is set to False (the default value)

The default configuration file provided by the modoboa-adminpy command is properly configured

237 Logging authentication

To trace login attempts to the web interface Modoboa uses python SysLogHandler so you can see them in your syslogauthentication log file (varlogauthlog in most cases)

Depending on your configuration you may have to edit the settingspy file and add lsquoaddressrsquo lsquodevlogrsquo to thelogging section

syslog-auth class logginghandlersSysLogHandlerfacility SysLogHandlerLOG_AUTHaddress devlogformatter syslog

238 External authentication

LDAP

Modoboa supports external LDAP authentication using the following extra components

bull Python LDAP client

bull Django LDAP authentication backend

If you want to use this feature you must first install those components

44 Chapter 2 Table of contents

Modoboa Documentation Release 1100

$ pip install python-ldap django-auth-ldap

Then all you have to do is to modify the settingspy file Add a new authentication backend to the AUTHENTI-CATION_BACKENDS variable like this

AUTHENTICATION_BACKENDS = (modoboalibauthbackendsLDAPBackend modoboalibauthbackendsLDAPSecondaryBackend Useful for a fallback

rarr˓mechanismdjangocontribauthbackendsModelBackend

)

Finally go to Modoboa gt Parameters gt General and set Authentication type to LDAP

From there new parameters will appear to let you configure the way Modoboa should connect to your LDAP serverThey are described just below

Name Description De-faultvalue

Server address The IP address of the DNS name of the LDAP server local-host

Server port The TCP port number used by the LDAP server 389Use a secureconnection

Use an SSLTLS connection to access the LDAP server no

Authenticationmethod

Choose the authentication method to use Directbind

User DN tem-plate (directbind mode)

The template used to construct a userrsquos DN It should contain one placeholder (ie(user)s)

Bind BN The distinguished name to use when binding to the LDAP server Leave empty for ananonymous bind

Bind password The password to use when binding to the LDAP server (with lsquoBind DNrsquo)Search base The distinguished name of the search baseSearch filter An optional filter string (eg lsquo(objectClass=person)rsquo) In order to be valid it must be

enclosed in parentheses(mail=(user)s)

Passwordattribute

The attribute used to store user passwords user-Pass-word

Active Direc-tory

Tell if the LDAP server is an Active Directory one no

Administratorgroups

Members of those LDAP Posix groups will be created ad domain administrators Uselsquorsquo characters to separate groups

Group type The type of group used by your LDAP directory Posix-Group

Groups searchbase

The distinguished name of the search base used to find groups

Do-mainmailboxcreation

Automatically create a domain and a mailbox when a new user is created just after thefirst successful authentication You will generally want to disable this feature whenthe relay domains extension is in use

yes

If you need additional parameters you will find a detailed documentation here

Once the authentication is properly configured the users defined in your LDAP directory will be able to connect to

23 Configuration 45

Modoboa Documentation Release 1100

Modoboa the associated domain and mailboxes will be automatically created if needed

The first time a user connects to Modoboa a local account is created if the LDAP username is a valid email addressBy default this account belongs to the SimpleUsers group and it has a mailbox

To automatically create domain administrators you can use the Administrator groups setting If a LDAP user belongsto one the listed groups its local account will belong to the DomainAdmins group In this case the username is notnecessarily an email address

Users will also be able to update their LDAP password directly from Modoboa

Note Modoboa doesnrsquot provide any synchronization mechanism once a user is registered into the database Anymodification done from the directory to a user account will not be reported to Modoboa (an email address change forexample) Currently the only solution is to manually delete the Modoboa record it will be recreated on the next userlogin

SMTP

It is possible to use an existing SMTP server as an authentication source To enable this feature edit the settingspy file and change the following setting

AUTHENTICATION_BACKENDS = (modoboalibauthbackendsSMTPBackenddjangocontribauthbackendsModelBackend

)

SMTP server location can be customized using the following settings

AUTH_SMTP_SERVER_ADDRESS = localhostAUTH_SMTP_SERVER_PORT = 25AUTH_SMTP_SECURED_MODE = None ssl or starttls are accepted

239 LDAP synchronization

Modoboa can synchronize accounts with an LDAP directory (tested with OpenLDAP) but this feature is not enabledby default To activate it add modoboaldapsync to MODOBOA_APPS in the settingspy file

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboaldapsync

)

and enable it from the admin panel

46 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning Make sure to install additional requirements otherwise it wonrsquot work

The following parameters are available and must be filled

Name Description Defaultvalue

Enable LDAP synchro-nization

Control LDAP synchronization state no

Bind DN The DN of a user with write permission to createupdate accountsBind password The associated passwordAccount DN template The template used to build account DNs (must contain a (user)s

placeholder

2310 Database maintenance

Cleaning the logs table

Modoboa logs administrator specific actions into the database A clean-up script is provided to automatically removeoldest records The maximum log record age can be configured through the online panel

To use it you can setup a cron job to run every night

0 0 ltmodoboa_sitegtmanagepy cleanlogs Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy cleanlogs

Cleaning the session table

Django does not provide automatic purging Therefore itrsquos your job to purge expired sessions on a regular basis

Django provides a sample clean-up script django-adminpy clearsessions That script deletes any sessionin the session table whose expire_date is in the past

For example you could setup a cron job to run this script every night

0 0 ltmodoboa_sitegtmanagepy clearsessions Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy clearsessions

Cleaning inactive accounts

Thanks to Last-login tracking it is now possible to monitor inactive accounts An account is considered inactive if nologin has been recorded for the last 30 days (this value can be changed through the admin panel)

A management command is available to disable or delete inactive accounts For example you could setup a cron jobto run it every night

23 Configuration 47

Modoboa Documentation Release 1100

0 0 ltmodoboa_sitegtmanagepy clean_inactive_accounts Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy clean_inactive_rarr˓accounts

The default behaviour is to disable accounts You can delete them using the --delete option

24 Moving to Modoboa

You have an existing platform and yoursquod like to move to Modoboa the following tools could help you

241 From postfixadmin

A dedicated command allows you to convert an existing postfixadmin database to a Modoboa one Consult the docu-mentation to know more about the process

242 Using CSV files

Modoboa allows you to import any object (domain domain alias mailbox and alias) using a simple CSV file encodedusing UTF8 Each line corresponds to a single object and must respect one of the following format

domain ltname stringgt ltquota integergt ltdefault mailbox quota integergt ltenabledrarr˓booleangtdomainalias ltname stringgt lttargeted domain stringgt ltenabled booleangtrelaydomain ltname stringgt lttarget host stringgt lttarget port integergt ltservicerarr˓stringgt ltenabled booleangt ltverify recipients booleangtaccount ltloginname stringgt ltpassword stringgt ltfirst name stringgt ltlast namerarr˓stringgt ltenabled booleangt ltgroup stringgt ltaddress stringgt ltquota integergt [rarr˓ltdomain stringgt ]alias ltaddress stringgt ltenabled booleangt ltrecipient stringgt

Boolean fields accept the following values true 1 yes y (case insensitive) Any other value will be evaluated asfalse

Warning The order does matter Objects are created sequencially so a domain must be created before itsmailboxes and aliases and a mailbox must created before its alias(es)

To actually import such a file

gt sudo -u ltmodoboa_usergt -igt source ltvirtualenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy modo import ltyour filegt

Available options can be listed using the following command

gt python managepy modo import -h

48 Chapter 2 Table of contents

Modoboa Documentation Release 1100

25 REST API

To ease the integration with external sources (software or other) Modoboa provides a REST API

Every installed instance comes with a ready-to-use API and a documentation You will find them using the followingurl patterns

bull API httplthostnamegtapiv1

bull Documentation httplthostnamegtdocsapi

An example of this documentation is available on the official demo

Using this API requires an authentication and for now only a token based authentication is supported To get a validtoken log-in to your instance with a super administrator go to Settings gt API and activate the API access Press theUpdate button and wait until the page is reloaded the token will be displayed

To make valid API calls every requests you send must embed this token within an Authorization HTTP header likethis

Authorization Token ltYOUR_TOKENgt

and the content type of those requests must be applicationjson

26 How to contribute

Contributions are always welcome If you want to submit a patch please respect the following rules

bull Open a pull request on the appropriate repository

bull Respect PEP8

bull Document your patch and respect PEP 257

bull Add unit tests and make sure the global coverage does not decrease

If all those steps are validated your contribution will generally be integrated

261 Table of contents

25 REST API 49

Modoboa Documentation Release 1100

Useful tips

You would like to work on Modoboa but you donrsquot know where to start Yoursquore at the right place Browse this pageto learn useful tips

Docker

A docker image is available for developers To use it you must install docker and docker-compose first

Then just run the following command

$ docker-compose up

It will start the docker environment and make a Modoboa instance available at httplocalhost8000

If you donrsquot want to use docker or need a more complex development setup go to the next section

Prepare a virtual environment

A virtual environment is a good way to setup a development environment on your machine

To do so run the following commands

$ python3 -m venv ltpathgt$ source ltpathgtbinactivate$ git clone httpsgithubcommodoboamodoboagit$ cd modoboa$ python setuppy develop$ pip install -r dev-requirementstxt

The develop command creates a symbolic link to your local copy so any modification you make will be automati-cally available in your environment no need to copy them

Deploy an instance for development

Warning Make sure to create a database before running this step The format of the database url is also describedin this page

Now that you have a running environment yoursquore ready to deploy a test instance

$ cd ltpathgt$ modoboa-adminpy deploy --dburl defaultltdatabase urlgt --domain localhost --develrarr˓instance$ python managepy runserver

Yoursquore ready to go You should be able to access Modoboa at httplocalhost8000 usingadminpassword as credentials

Manage static files

Modoboa uses bower (thanks to django-bower) to manage its CSS and javascript dependencies

50 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Those dependencies are listed in a file called dev_settingspy located inside the ltpath_to_local_copygtmodoboacore directory

If you want to add a new dependency just complete the BOWER_INSTALLED_APPS parameter and run the followingcommand

$ python managepy bower install

It will download and store the required files into the ltpath_to_local_copygtmodoboabower_components directory

Test your modifications

If you deployed a specific instance for your development needs you can run the tests suite as follows

gt python managepy test modoboacore modoboalib modoboaadmin modoboalimits modoboararr˓relaydomains

Otherwise you can run the tests suite from the repository using tox

Start a basic Modoboa instance

From the repository run the following command to launch a simple instance with a few fixtures

gt tox -e serve

You can use adminpassword to log in

Build the documentation

If you need to modify the documenation and want to see the result you can build it as follows

gt tox -e docgt firefox toxdoctmphtmlindexhtml

FAQ

bower command is missing in managepy

bower command is missing in managepy if you donrsquot use the --devel option of the modoboa-adminpydeploy command

To fix it regenerate your instance or update your settingspy file manually Look at devmode in httpsgithubcomtonioomodoboablobmastermodoboacorecommandstemplatessettingspytpl

Create a new plugin

Introduction

Modoboa offers a plugin API to expand its capabilities The current implementation provides the following possibili-ties

26 How to contribute 51

Modoboa Documentation Release 1100

bull Expand navigation by adding entry points to your plugin inside the GUI

bull Access and modify administrative objects (domains mailboxes etc)

bull Register callback actions for specific events

Plugins are nothing more than Django applications with an extra piece of code that integrates them into Modoboa Themodo_extensionpy file will contain a complete description of the plugin

bull Admin and user parameters

bull Custom menu entries

The communication between both applications is provided by Django signals

The following subsections describe the plugin architecture and explain how you can create your own

The required glue

To create a new plugin just start a new django application like this (into Modoboarsquos directory)

$ python managepy startapp

Then you need to register this application using the provided API Just copypaste the following example into themodo_extensionpy file of the future extension

from modoboacoreextensions import ModoExtension exts_pool

class MyExtension(ModoExtension)My custom Modoboa extension

name = myextlabel = My Extensionversion = 01description = A descriptionurl = myext_root_location optional name is used if not defined

def load(self)This method is called when Modoboa loads available and activated plugins

Declare parameters and register events herepass

def load_initial_data(self)Optional provide initial data for your extension herepass

exts_poolregister_extension(MyExtension)

Once done simply add your extensionrsquos module name to the MODOBOA_APPS variable located inside settingspy Finally run the following commands

$ python managepy migrate$ python managepy load_initial_data$ python managepy collectstatic

52 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Parameters

A plugin can declare its own parameters There are two levels available

bull lsquoGlobalrsquo parameters used to configure the plugin editable inside the Admin gt Settings gt Parameters page

bull lsquoUserrsquo parameters per-user parameters (or preferences) editable inside the Options gt Preferences page

Playing with parameters

Parameters are defined using Django forms and Modoboa adds two special forms you can inherit depending on thelevel of parameter(s) you want to add

bull modoboaparametersformsAdminParametersForm for general parameters

bull modoboaparametersformsUserParametersForm for user parameters

To register new parameters add the following line into the load method of your plugin class

from modoboaparameters import tools as param_toolsparam_toolsregistryadd(

LEVEL YourForm ugettext_lazy(Title))

Replace LEVEL by global or user

Custom role permissions

Modoboa uses Djangorsquos internal permission system Administrative roles are nothing more than groups (Groupinstances)

An extension can add new permissions to a group by listening to the extra_role_permissions signal Here isan example

from djangodispatch import receiverfrom modoboacore import signals as core_signals

PERMISSIONS = Resellers [

(relaydomains relaydomain add_relaydomain)(relaydomains relaydomain change_relaydomain)(relaydomains relaydomain delete_relaydomain)(relaydomains service add_service)(relaydomains service change_service)(relaydomains service delete_service)

]

receiver(core_signalsextra_role_permissions)def extra_role_permissions(sender role kwargs)

Add permissions to the Resellers groupreturn constantsPERMISSIONSget(role [])

Extending admin forms

The forms used to edit objects (account domain etc) through the admin panel are composed of tabs You can extendthem (ie add new tabs) in a pretty easy way thanks to custom signals

26 How to contribute 53

Modoboa Documentation Release 1100

Account

To add a new tab to the account edition form define new listeners (handlers) for the following signals

bull modoboaadminsignalsextra_account_forms

bull modoboaadminsignalsget_account_form_instances

bull modoboaadminsignalscheck_extra_account_form (optional)

Example

from djangodispatch import receiverfrom modoboaadmin import signals as admin_signals

receiver(admin_signalsextra_account_forms)def extra_account_form(sender user account kwargs)

return [id tabid title Title cls MyFormClass

]

receiver(admin_signalsget_account_form_instances)def fill_my_tab(sender user account kwargs)

return id my_instance

Domain

To add a new tab to the domain edition form define new listeners (handlers) for the following signals

bull modoboaadminsignalsextra_domain_forms

bull modoboaadminsignalsget_domain_form_instances

Example

from djangodispatch import receiverfrom modoboaadmin import signals as admin_signals

receiver(admin_signalsextra_domain_forms)def extra_account_form(sender user domain kwargs)

return [id tabid title Title cls MyFormClass

]

receiver(admin_signalsget_domain_form_instances)def fill_my_tab(sender user domain kwargs)

return id my_instance

27 Contributors

bull Antidot

bull Bearstech

bull CAP-REL

54 Chapter 2 Table of contents

Modoboa Documentation Release 1100

bull Dalnix

27 Contributors 55

  • Overview
  • Table of contents
Page 15: Modoboa Documentation

Modoboa Documentation Release 1100

(continued from previous page)

ssl_certificate_key ltssl certificate key for your sitegtproxy_set_header X-Forwarded-Protocol ssl

If you do plan to use SSL yoursquoll have to generate a certificate and a key This article contains information about howto do it

Paste this content to your configuration (replace values between ltgt with yours) and restart nginx

Now you can go the Dovecot section to continue the installation

uWSGI

The following setup is meant to get you started quickly You should read the documentation of both nginx and uwsgito understand how to optimize their configuration for your site

The Django documentation includes the following warning regarding uwsgi

Warning Use uwsgi 126 or newer If you do not you will run into problems Modoboa will fail in obscureways

To use this setup first download and install uwsgi

Here is a sample nginx configuration

server listen 443 sslssl onkeepalive_timeout 70

server_name lthost fqdngtroot ltmodoboas settings dirgt

ssl_certificate ltssl certificate for your sitegtssl_certificate_key ltssl certificate key for your sitegt

access_log varlognginxlthost fqdngtaccesslogerror_log varlognginxlthost fqdngterrorlog

location ltmodoboas root urlgtsitestatic autoindex onalias ltlocation of sitestatic on your file systemgt

Whether or not Modoboa uses a media directory depends on how you configured Modoboa It does not hurt to have thislocation ltmodoboas root urlgtmedia

autoindex onalias ltlocation of media on your file systemgt

This denies access to any file that begins with ht Apaches htaccess and htpasswd are such files A Modoboa installed from scratch would not contain any such files but you never know what the future holds

(continues on next page)

12 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

location ~ ht deny all

location ltmodobas root urlgt include uwsgi_paramsuwsgi_pass ltuwsgi portgtuwsgi_param UWSGI_SCRIPT ltmodoboa instance namegtwsgiapplicationuwsgi_param UWSGI_SCHEME https

ltmodoboa instance namegt must be replaced by the value you used when you deployed your instance

If you do not plan to use SSL then change the listen directive to listen 80 and delete each of the followingdirectives

ssl onkeepalive_timeout 70ssl_certificate ltssl certificate for your sitegtssl_certificate_key ltssl certificate key for your sitegtuwsgi_param UWSGI_SCHEME https

If you do plan to use SSL yoursquoll have to generate a certificate and a key This article contains information about howto do it

Make sure to replace the ltgt in the sample configuration with appropriate values Here are some explanations forthe cases that may not be completely self-explanatory

ltmodoboas settings dirgt Where Modoboarsquos settingspy resides This is also where thesitestatic and media directories reside

ltmodoboas root urlgt This is the URL which will be the root of your Modoboa site at your domain For in-stance if your Modoboa installation is reachable at at httpsfoomodoboa then ltmodoboas rooturlgt is modoboa In this case you probably also have to set the alias directives to point to where Mod-oboarsquos sitestatic and media directories are because otherwise nginx wonrsquot be able to find them

If Modoboa is at the root of your domain then ltmodoboa root urlgt is an empty string and can be deletedfrom the configuration above In this case you probably do not need the alias directives

ltuwsgi portgt The location where uwsig is listening It could be a unix domain socket or an addressport combi-nation Ubuntu configures uwsgi so that the port is

unixrunuwsgiappltapp namegtsocket

where ltapp namegt is the name of the application

Your uwsgi configuration should be

[uwsgi] Not needed when using uwsgi from pip plugins = pythonchdir = ltmodoboas top dirgtmodule = ltnamegtwsgiapplicationmaster = trueharakiri = 60processes = 4vhost = trueno-default-app = true

21 Installation 13

Modoboa Documentation Release 1100

The plugins directive should be turned on if you use a uwsgi installation that requires it If uwsgi was installed frompip it does not require it In the configuration above

ltmodoboas top dirgt The directory where managepy resides This directory is the parent of ltmodoboassettings dirgt

ltnamegt The name that you passed to modoboa-adminpy deploy when you created your Modoboa instance

Now you can go the Dovecot section to continue the installation

Dovecot

Modoboa requires Dovecot 2+ to work so the following documentation is suitable for this combination

In this section we assume dovecotrsquos configuration resides in etcdovecot all pathes will be relative to thisdirectory

Mailboxes

First edit the confd10-mailconf and set the mail_location variable

maildirmail_location = maildir~maildir

Then edit the inbox namespace and add the following lines

inbox = yes

mailbox Drafts auto = subscribespecial_use = Drafts

mailbox Junk

auto = subscribespecial_use = Junk

mailbox Sent

auto = subscribespecial_use = Sent

mailbox Trash

auto = subscribespecial_use = Trash

With dovecot 21+ it ensures all the special mailboxes will be automaticaly created for new accounts

For dovecot 20 and older use the autocreate plugin

Operations on the file system

14 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning Modoboa needs to access the dovecot binary to check its version To find the binary path weuse the which command first and then try known locations (usrsbindovecot and usrlocalsbindovecot) If you installed dovecot in a custom location please tell us where the binary is by usingthe DOVECOT_LOOKUP_PATH setting (see settingspy)

Three operation types are considered

1 Mailbox creation

2 Mailbox renaming

3 Mailbox deletion

The first one is managed by Dovecot The last two ones may be managed by Modoboa if it can access the file systemwhere the mailboxes are stored (see General parameters to activate this feature)

Those operations are treated asynchronously by a cron script For example when you rename an e-mail addressthrough the web UI the associated mailbox on the file system is not modified directly Instead of that a renameorder is created for this mailbox The mailbox will be considered unavailable until the order is executed (see Postfixconfiguration)

Edit the crontab of the user who owns the mailboxes on the file system

$ crontab -u ltusergt -e

And add the following line inside

python ltmodoboa_sitegtmanagepy handle_mailbox_operations

Warning The cron script must be executed by the system user owning the mailboxes

Warning The user running the cron script must have access to the settingspy file of the modoboa instance

The result of each order is recorded into Modoboarsquos log Go to Modoboa gt Logs to consult them

Authentication

To make the authentication work edit the confd10-authconf and uncomment the following line at the end

include auth-systemconfextinclude auth-sqlconfextinclude auth-ldapconfextinclude auth-passwdfileconfextinclude auth-checkpasswordconfextinclude auth-vpopmailconfextinclude auth-staticconfext

Then edit the confdauth-sqlconfext file and add the following content inside

passdb sql driver = sql Path for SQL configuration file see example-configdovecot-sqlconfext

(continues on next page)

21 Installation 15

Modoboa Documentation Release 1100

(continued from previous page)

args = etcdovecotdovecot-sqlconfext

userdb sql driver = sqlargs = etcdovecotdovecot-sqlconfext

Make sure to activate only one backend (per type) inside your configuration (just comment the other ones)

Edit the dovecot-sqlconfext and modify the configuration according to your database engine

MySQL users

driver = mysql

connect = host=ltmysqld socketgt dbname=ltdatabasegt user=ltusergt password=ltpasswordgt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user WHERE email=Lu andrarr˓is_active=1

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid concat(bytes= mbquota M) AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

PostgreSQL users

driver = pgsql

connect = host=ltpostgres socketgt dbname=ltdatabasegt user=ltusergt password=ltpasswordgt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user u INNER JOIN admin_rarr˓mailbox mb ON uid=mbuser_id INNER JOIN admin_domain dom ON mbdomain_id=domidrarr˓WHERE uemail=Lu AND uis_active AND domenabled

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid bytes= || mbquota || M AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

16 Chapter 2 Table of contents

Modoboa Documentation Release 1100

SQLite users

driver = sqlite

connect = ltpath to the sqlite db filegt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user u INNER JOIN admin_rarr˓mailbox mb ON uid=mbuser_id INNER JOIN admin_domain dom ON mbdomain_id=domidrarr˓WHERE uemail=Lu AND uis_active=1 AND domenabled=1

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid (bytes= || mbquota || M) AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

Note Replace values between ltgt with yours

LDAP

To make the LDAP authentication work edit the confd10-authconf and uncomment the following line atthe end

include auth-ldapconfext

Then edit the confdauth-ldapconfext and edit the passdb section as following You should comment theuserdb section which will be managed by SQL with modoboa database

passdb driver = ldap

Path for LDAP configuration file see example-configdovecot-ldapconfextargs = etcdovecotdovecot-ldapconfext

userdb driver = ldapargs = etcdovecotdovecot-ldapconfext

Default fields can be used to specify defaults that LDAP may overridedefault_fields = home=homevirtualu

Your own dovecot LDAP configuration file is now etcdovecotdovecot-ldapconfext You can addyour default LDAP conf in it following the official documentation

Synchronize dovecot LDAP conf with modoboa LDAP conf

To make dovecot LDAP configuration synchronized with modoboa LDAP configuration you should create a dedicateddovecot conf file At the end of your dovecot configuration file (dovecot-ldapconfext) add the following

21 Installation 17

Modoboa Documentation Release 1100

line

include_try dovecot-modoboaconfext

Then set modoboa parameter Enable Dovecot LDAP sync to Yes Then set the Dovecot LDAP config file following theprevious step (etcdovecotdovecot-modoboaconfext in the example)

The last step is to add the command update_dovecot_conf to the cron job of modoboa Then each time your modoboaLDAP configuration is updated your dovecot LDAP configuration will also be

LMTP

Local Mail Transport Protocol is used to let Postfix deliver messages to Dovecot

First make sure the protocol is activated by looking at the protocols setting (generally inside dovecotconf)It should be similar to the following example

protocols = imap pop3 lmtp

Then open the confd10-masterconf look for lmtp service definition and add the following content inside

service lmtp stuff beforeunix_listener varspoolpostfixprivatedovecot-lmtp mode = 0600user = postfixgroup = postfix

stuff after

We assume here that Postfix is chrooted within varspoolpostfix

Finally open the confd20-lmtpconf and modify it as follows

protocol lmtp postmaster_address = postmasterltdomaingtmail_plugins = $mail_plugins quota sieve

Replace ltdomaingt by the appropriate value

Note If you donrsquot plan to apply quota or to use filters just adapt the content of the mail_plugins setting

Quota

Modoboa lets adminstrators define per-domain andor per-account limits (quota) It also lists the current quota usageof each account Those features require Dovecot to be configured in a specific way

Inside confd10-mailconf add the quota plugin to the default activated ones

mail_plugins = quota

Inside confd10-masterconf update the dict service to set proper permissions

18 Chapter 2 Table of contents

Modoboa Documentation Release 1100

service dict If dict proxy is used mail processes should have access to its socket For example mode=0660 group=vmail and global mail_access_groups=vmailunix_listener dict mode = 0600user = ltuser owning mailboxesgtgroup =

Inside confd20-imapconf activate the imap_quota plugin

protocol imap

mail_plugins = $mail_plugins imap_quota

Inside dovecotconf activate the quota SQL dictionary backend

dict quota = ltdrivergtetcdovecotdovecot-dict-sqlconfext

Inside confd90-quotaconf activate the quota dictionary backend

plugin quota = dictUser quotaproxyquota

It will tell Dovecot to keep quota usage in the SQL dictionary

Finally edit the dovecot-dict-sqlconfext file and put the following content inside

connect = host=ltdb hostgt dbname=ltdb namegt user=ltdb usergt password=ltpasswordgt SQLite users connect = pathtothedatabasedb

map pattern = privquotastoragetable = admin_quotausername_field = usernamevalue_field = bytes

map

pattern = privquotamessagestable = admin_quotausername_field = usernamevalue_field = messages

PostgreSQL users

21 Installation 19

Modoboa Documentation Release 1100

Database schema update

The admin_quota table is created by Django but unfortunately it doesnrsquot support DEFAULT constraints (it onlysimulates them when the ORM is used) As PostgreSQL is a bit strict about constraint violations you must executethe following query manually

db=gt ALTER TABLE admin_quota ALTER COLUMN bytes SET DEFAULT 0db=gt ALTER TABLE admin_quota ALTER COLUMN messages SET DEFAULT 0

Trigger

As indicated on Dovecotrsquos wiki you need a trigger to properly update the quota

A working copy of this trigger is available on Github

Download this file and copy it on the server running postgres Then execute the following commands

$ su - postgres$ psql [modoboa database] lt pathtomodoboa_postgres_triggersql$ exit

Replace [modoboa database] by the appropriate value

Forcing recalculation

For existing installations Dovecot (gt 2) offers a command to recalculate the current quota usages For example if youwant to update all usages run the following command

$ doveadm quota recalc -A

Be carefull it can take a while to execute

ManageSieveSieve

Modoboa lets users define filtering rules from the web interface To do so it requires ManageSieve to be activated onyour server

Inside confd20-managesieveconf make sure the following lines are uncommented

protocols = $protocols sieve

service managesieve-login

service managesieve

protocol sieve

20 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Messages filtering using Sieve is done by the LDA

Inside confd15-ldaconf activate the sieve plugin like this

protocol lda Space separated list of plugins to load (default is global mail_plugins)mail_plugins = $mail_plugins sieve

Finally configure the sieve plugin by editing the confd90-sieveconf file Put the follwing caontent inside

plugin Location of the active script When ManageSieve is used this is actually a symlink pointing to the active script in the sieve storage directorysieve = ~dovecotsieve

The path to the directory where the personal Sieve scripts are stored For ManageSieve this is where the uploaded scripts are storedsieve_dir = ~sieve

Restart Dovecot

Now you can go to the Postfix section to finish the installation

Last-login tracking

To update the last_login attribute of an account after a succesful IMAP or POP3 login you can configure apost-login script

Open confd10-masterconf add the following configuration (imap and pop3 services are already definedyou just need to update them)

service imap executable = imap postlogin

service pop3 executable = pop3 postlogin

service postlogin executable = script-login usrlocalbinpostloginshuser = modoboaunix_listener postlogin

Then you must create a script named usrlocalbinpostloginsh According to your database enginethe content will differ

PostgreSQL

21 Installation 21

Modoboa Documentation Release 1100

binsh

psql -c UPDATE core_user SET last_login=now() WHERE username=$USER gt devnull

exec $

MySQL

binsh

DBNAME=XXXDBUSER=XXXDBPASSWORD=XXX

echo UPDATE core_user SET last_login=now() WHERE username=$USER | mysql -urarr˓$DBUSER -p$DBPASSWORD $DBNAME

exec $

Postfix

This section gives an example about building a simple virtual hosting configuration with Postfix Refer to the officialdocumentation for more explanation

Map files

You first need to create configuration files (or map files) that will be used by Postfix to lookup into Modoboa tables

To automaticaly generate the requested map files and store them in a directory run the following command

gt cd ltmodoboa_instance_pathgtgt python managepy generate_postfix_maps --destdir ltdirectorygt

ltdirectorygt is the directory where the files will be stored Answer the few questions and yoursquore done

Configuration

Use the following configuration in the etcpostfixmaincf file (this is just one possible configuration)

Stuff beforevirtual_transport = lmtpunixprivatedovecot-lmtp

virtual_mailbox_domains = ltdrivergtetcpostfixsql-domainscfvirtual_alias_domains = ltdrivergtetcpostfixsql-domain-aliasescfvirtual_alias_maps = ltdrivergtetcpostfixsql-aliasescf

relay_domains = ltdrivergtetcpostfixsql-relaydomainscftransport_maps =

ltdrivergtetcpostfixsql-transportcfltdrivergtetcpostfixsql-spliteddomains-transportcf

(continues on next page)

22 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

smtpd_recipient_restrictions = check_recipient_access

ltdrivergtetcpostfixsql-maintaincfltdrivergtetcpostfixsql-relay-recipient-verificationcf

permit_mynetworksreject_unauth_destinationreject_unverified_recipient

smtpd_sender_login_maps = ltdrivergtetcpostfixsql-sender-login-mapcf

smtpd_sender_restrictions =reject_sender_login_mismatch

Stuff after

Replace ltdrivergt by the name of the database you use

Restart Postfix

Policy daemon

If you want to enable the built-in policy daemon add the following content to the etcpostfixmaincf file

smtpd_recipient_restrictions = check_policy_service inet1270019999

And reload postfix

Note The check_policy_service line must be placed before the permit_mynetworks one otherwise thedaemon wonrsquot be called

OpenDKIM

Modoboa can generate DKIM keys for the hosted domains but it wonrsquot sign or check messages To do that you needa dedicated software like OpenDKIM

Note The cron job in charge of creating DKIM keys must be run using the same user than OpenDKIM (ie opendkimin most cases)

Database

Since keys related information is stored in Modoboarsquos database you need to tell OpenDKIM how it can access it

First make sure to install the required additional packages on your system (libopendbx1- on debian baseddistributions or opendbx- on CentOS the complete name depends on your database engine)

Then insert the following SQL view into Modoboarsquos database

21 Installation 23

Modoboa Documentation Release 1100

PostgreSQL

CREATE OR REPLACE VIEW dkim AS (SELECT id name as domain_name dkim_private_key_path AS private_key_path

dkim_key_selector AS selectorFROM admin_domain WHERE enable_dkim

)

MySQLMariaDB

CREATE OR REPLACE VIEW dkim AS (SELECT id name as domain_name dkim_private_key_path AS private_key_path

dkim_key_selector AS selectorFROM admin_domain WHERE enable_dkim=1

)

Configuration

You should find OpenDKIMrsquos configuration file at etcopendkimconf

Add the following content to it

KeyTable dsnltdrivergtltusergtltpasswordgtltdb hostgtltdb namegttable=dkimrarr˓keycol=iddatacol=domain_nameselectorprivate_key_pathSigningTable dsnltdrivergtltusergtltpasswordgtltdb hostgtltdb namegttable=dkimrarr˓keycol=domain_namedatacol=idSocket inet12345localhost

Replace values between ltgt by yours Accepted values for driver are pgsql or mysql Make sure the user youspecify has read permission on the view created previously

If you run a debian based system make sure to adjust the following setting in the etcdefaultopendkim file

SOCKET=inet12345localhost

Eventually reload OpenDKIM

Postfix integration

Add the following lines to the etcpostfixmaincf file

smtpd_milters = inet12700112345non_smtpd_milters = inet12700112345milter_default_action = acceptmilter_content_timeout = 30s

and reload postfix

Extensions

Only few commands are needed to add a new extension to your setup

24 Chapter 2 Table of contents

Modoboa Documentation Release 1100

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install ltEXTENSIONgt==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Then restart your web server

22 Upgrade

221 Modoboa

Warning The new version you are going to install may need to modify your database Before you start makesure to backup everything

Most of the time upgrading your installation to a newer Modoboa version only requires a few actions In every caseyou will need to apply the general procedure first and then check if the version you are installing requires specificactions

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install modoboa==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Once done check if the version you are installing requires Specific instructions

Finally restart your web server

Sometimes you might need to upgrade postfix map files too To do so just run the generate_postfix_mapscommand on the same directory than the one used for installation (etcpostfix by default)

Make sure to use root privileges and run the following command

gt python managepy generate_postfix_maps --destdir ltdirectorygt

Then reload postfix

22 Upgrade 25

Modoboa Documentation Release 1100

222 Extensions

If a new version is available for an extension yoursquore using it is recommanded to install it Upgrading an extensions ispretty and the procedure is almost the same than the one used for Modoboa

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install ltEXTENSIONgt==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Finally restart your web server

It is a generic upgrade procedure which will be enough most of the time but it is generally a good idea to check theassociated documentation

223 Rebuild Virtual Environment

Sometimes when upgrading your Operating System (eg from Ubuntu 1704 to Ubuntu 1710) your virtual environmentrunning modoboa can get corrupted Your first response will be to panic but fear not The solution is in this document

First things first

Recover your database password

You will need to recover your database password (if using mysql or postgresql) You will find this in etcpostfixsql-aliasescf or any file with sql-cf in the etcpostfix directory

Make note of this as you will need it when reconfiguring modoboa

Reinstall Modoboa

Start out by backup up your modoboa settings file located in the modoboa instance directory (srvmodoboainstanceinstancesettingspy if you used the default installer configuration) This contains your currentconfiguration

Next you want to remove all current modoboa files

After doing this follow the manual installation instructions for Modoboa only as everything should be working prop-erly

After this completes simply restore your backed up settings file to srvinstanceinstancesettingspy(if you used installer default configuration) You will then need to reinstall your extensions

You can find which plugins you had in your settingspy file under the MODOBOA_APPS variable

Instructions to install extensions can also be found here

Once you have completed this step you will need to run the following commands

26 Chapter 2 Table of contents

Modoboa Documentation Release 1100

gt (env) $ cd ltinstance_dirgtgt (env) $ python managepy migrategt (env) $ python managepy collectstatic

You will then see a message similar to

You have requested to collect static files at the destinationlocation as specified in your settings

srvmodoboainstancesitestatic

This will overwrite existing filesAre you sure you want to do this

Type yes to continue or no to cancel

You will want to answer yes here then simply restart the uwsgi process with service uwsgi restart andyou should be up and running again

Simply log into your modoboa web panel and verify that your extensions and webmail box is working

224 Information

Rebuild instructions from httpshelppythonanywherecompagesRebuildingVirtualenvs

225 Specific instructions

1160

A new policy daemon has been added

Make sure to have a Redis instance running on your server

Add modoboapolicyd to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboapolicyd

)

Add the following settings to your settingspy file

REDIS_HOST = ltIP or hostname heregtREDIS_PORT = 6379REDIS_QUOTA_DB = 0REDIS_URL = redisformat(REDIS_HOST REDIS_PORT REDIS_QUOTA_DB)

Once done you can start the policy daemon using the following commands

22 Upgrade 27

Modoboa Documentation Release 1100

gt python managepy policy_daemon

Donrsquot forget to configure _policyd_config if you want to use this feature

The modoboa-stats plugin has been merged into the core

Add modoboamaillog to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboapolicydmodoboamaillog

)

And remove any reference to modoboa_stats in this same variable

1150

This version drops Python 2 support so donrsquot forget to update all the extensions you use

Warning If you upgrade an existing python 2 installation you will need to create a new Python 3 virtualenvironment You can remove the existing virtual environment and replace it by the new one so you wonrsquot have tomodify your configuration files

Add the following new setting

DISABLE_DASHBOARD_EXTERNAL_QUERIES = False

Reload uwsgigunicornapache depending on your setup

Finally Make sure to use root privileges and run the following command

gt python managepy generate_postfix_maps --destdir ltdirectorygt

Then reload postfix

1140

This release introduces an optional LDAP synchronization process If you want to use it please follow the dedicatedprocedure

1131

Upgrade postfix maps files as follows

28 Chapter 2 Table of contents

Modoboa Documentation Release 1100

gt python managepy generate_postfix_maps --destdir ltpathgt --force-overwrite

1130

Add modoboadnstools to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstools

)

Add the following new settings

CSRF_COOKIE_SECURE = TrueSESSION_COOKIE_SECURE = True

modoboa-postfix-autoreply 150

Edit the etcpostfixmaincf file and remove the sql-autoreplies-transportcf map from thetransport_maps if present Remove the corresponding proxy_read_maps entry if relevant

Reload postfix

1100

Warning Upgrade installed extensions BEFORE running check or migrate commands

Upgrade all your installed plugins to the following versions

Warning If you use the amavis plugin make sure to include its configuration as follows into settingspy

from modoboa_amavis import settings as modoboa_amavis_settingsmodoboa_amavis_settingsapply(globals())

22 Upgrade 29

Modoboa Documentation Release 1100

Name Versionmodoboa-amavis 120modoboa-contacts 050modoboa-dmarc 110modoboa-imap-migration 120modoboa-pdfcredentials 130modoboa-postfix-autoreply 140modoboa-radicale 120modoboa-sievefilters 140modoboa-stats 140modoboa-webmail 140

Edit the settingspy file and apply the following modifications

Add modoboatransport to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparameters

)

Replace the following line

MIDDLEWARE_CLASSES = (

by

MIDDLEWARE = (

Update postfix map files as follows

gt rm -f ltpathgtmodoboa-postfix-mapschkgt python managepy generate_postfix_maps --force --destdir ltpathgt

Then modify postfixrsquos configuration as follows

smtpd_sender_login_maps =ltdrivergtltpathgtsql-sender-login-mapcf

transport_maps =ltdrivergtltpathgtsql-transportcfltdrivergtltpathgtsql-spliteddomains-transportcf other map files

Replace ltdrivergt and ltpathgt by your values

If transport_maps contains sql-relaydomains-transportcf remove it

30 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning If you make use of postfixrsquos proxymap server you must also update the proxy_read_maps setting

Reload postfix

Add the following cron job in order to generate DKIM keys

Generate DKIM keys (they will belong to the user running this job)

root $PYTHON $INSTANCEmanagepy modorarr˓manage_dkim_keys

190

If you want to manage inactive accounts look at Cleaning inactive accounts

183

Edit the settingspy file and replace the following line

BASE_DIR = ospathdirname(ospathdirname(__file__))

by

BASE_DIR = ospathrealpath(ospathdirname(ospathdirname(__file__)))

180

Modoboa now relies on Djangorsquos builtin password validation system to validate user passwords instead ofdjango-passwords

Remove django-passwords from your system

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt pip uninstall django-passwords

Edit the settingspy file and remove the following content

django-passwords

PASSWORD_MIN_LENGTH = 8

PASSWORD_COMPLEXITY = UPPER 1LOWER 1DIGITS 1

Add the following lines

Password validation rulesAUTH_PASSWORD_VALIDATORS = [

NAME djangocontribauthpassword_validation

rarr˓UserAttributeSimilarityValidator (continues on next page)

22 Upgrade 31

Modoboa Documentation Release 1100

(continued from previous page)

NAME djangocontribauthpassword_validationMinimumLengthValidator

NAME djangocontribauthpassword_validationCommonPasswordValidator

NAME djangocontribauthpassword_validationNumericPasswordValidator

NAME modoboacorepassword_validationComplexityValidatorOPTIONS

upper 1lower 1digits 1specials 0

]

172

API documentation has evolved (because of the upgrade to Django Rest Framework 36) and CKeditor is now embed-ded by default (thanks to the django-ckeditor package) Some configuration changes are required

Edit your settingspy file and apply the following modifications

bull Update the INSTALLED_APPS variable as follows

INSTALLED_APPS = (djangocontribauthdjangocontribcontenttypesdjangocontribsessionsdjangocontribmessagesdjangocontribsitesdjangocontribstaticfilesreversionckeditorckeditor_uploaderrest_frameworkrest_frameworkauthtoken

)

bull Update the REST_FRAMEWORK variable as follows

REST_FRAMEWORK = DEFAULT_AUTHENTICATION_CLASSES (

rest_frameworkauthenticationTokenAuthenticationrest_frameworkauthenticationSessionAuthentication

)

bull Remove the SWAGGER_SETTINGS variable

bull Add the following content

32 Chapter 2 Table of contents

Modoboa Documentation Release 1100

CKeditor

CKEDITOR_UPLOAD_PATH = uploads

CKEDITOR_IMAGE_BACKEND = pillow

CKEDITOR_RESTRICT_BY_USER = True

CKEDITOR_BROWSE_SHOW_DIRS = True

CKEDITOR_ALLOW_NONIMAGE_FILES = False

CKEDITOR_CONFIGS = default

allowedContent Truetoolbar Modoboawidth Nonetoolbar_Modoboa [

[Bold Italic Underline][JustifyLeft JustifyCenter JustifyRight JustifyBlock][BidiLtr BidiRtl Language][NumberedList BulletedList - Outdent Indent][Undo Redo][Link Unlink Anchor - Smiley][TextColor BGColor - Source][Font FontSize][Image ][SpellChecker]

]

Donrsquot forget to run the following command

gt python managepy collectstatic

171

If you used 170 for a fresh installation please run the following commands

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy load_initial_data

170

This version requires Django gt= 110 so you need to make some modifications It also brings internal API changeswhich are not backward compatible so installed extensions must be upgraded too

First of all deactivate all installed extensions (edit the settingspy file and comment the corresponding lines inMODOBOA_APPS)

Edit the urlspy file of your local instance and replace its content by the following one

22 Upgrade 33

Modoboa Documentation Release 1100

from djangoconfurls import include url

urlpatterns = [url(r include(modoboaurls))

]

Edit the settingspy and apply the following changes

bull Add modoboaparameters to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboarelaydomainsmodoboalimitsmodoboaparameters Modoboa extensions here

)

bull Add modoboacoremiddlewareLocalConfigMiddleware to MIDDLEWARE_CLASSES

MIDDLEWARE_CLASSES = (djangocontribsessionsmiddlewareSessionMiddlewaredjangomiddlewarecommonCommonMiddlewaredjangomiddlewarecsrfCsrfViewMiddlewaredjangocontribauthmiddlewareAuthenticationMiddlewaredjangocontribmessagesmiddlewareMessageMiddlewaredjangomiddlewarelocaleLocaleMiddlewaredjangomiddlewareclickjackingXFrameOptionsMiddlewaremodoboacoremiddlewareLocalConfigMiddlewaremodoboalibmiddlewareAjaxLoginRedirectmodoboalibmiddlewareCommonExceptionCatchermodoboalibmiddlewareRequestCatcherMiddleware

)

bull Modoboa used to provide a custom authentication backend (modoboalibauthbackendsSimpleBackend) but it has been removed Replace it as follows

AUTHENTICATION_BACKENDS = ( Other backends beforedjangocontribauthbackendsModelBackend

)

bull Remove TEMPLATE_CONTEXT_PROCESSORS and replace it by

TEMPLATES = [

BACKEND djangotemplatebackendsdjangoDjangoTemplatesDIRS []APP_DIRS TrueOPTIONS

context_processors [djangotemplatecontext_processorsdebugdjangotemplatecontext_processorsrequestdjangocontribauthcontext_processorsauth

(continues on next page)

34 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

djangotemplatecontext_processorsi18ndjangotemplatecontext_processorsmediadjangotemplatecontext_processorsstaticdjangotemplatecontext_processorstzdjangocontribmessagescontext_processorsmessagesmodoboacorecontext_processorstop_notifications

]debug False

]

Run the following commands (load virtualenv if you use one)

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstatic

Finally upgrade your extensions and reactivate them

Name Versionmodoboa-amavis 110modoboa-dmarc 100modoboa-imap-migration 110modoboa-pdfcredentials 110modoboa-postfix-autoreply 120modoboa-radicale 110modoboa-sievefilters 110modoboa-stats 110modoboa-webmail 110

Command line shortcuts

$ pip install modoboa-amavis==110$ pip install modoboa-dmarc==100$ pip install modoboa-imap-migration==110$ pip install modoboa-pdfcredentials==110$ pip install modoboa-postfix-autoreply==120$ pip install modoboa-radicale==110$ pip install modoboa-sievefilters==110$ pip install modoboa-stats==110$ pip install modoboa-webmail==110

And please make sure you use the latest version of the django-versionfield2 package

$ pip install -U django-versionfield2

Notes about quota changes and resellers

Reseller users now have a quota option in Resources tab This is the quota that a reseller can share between all itsdomains

22 Upgrade 35

Modoboa Documentation Release 1100

There are two quotas for a domain in the new version

1 Quota amp

2 Default mailbox quota

[1] Quota quota shared between mailboxes This quota is shared between all the mailboxes of this domain This valuecannot exceed resellerrsquos quota and hence cannot be 0(unlimited) if reseller has finite quota

[2] Default mailbox quota default quota applied to mailboxes This quota is the default quota applied to new mail-boxes This value cannot exceed Quota[1] and hence cannot be 0(unlimited) if Quota[1] is finite

161

First of all update postfix map files as follows

gt python managepy generate_postfix_maps --destdir ltpathgt --force-overwrite

Then modify postfixrsquos configuration as follows

smtpd_sender_login_maps =ltdrivergtltpathgtsql-sender-login-mailboxescfltdrivergtltpathgtsql-sender-login-aliasescfltdrivergtltpathgtsql-sender-login-mailboxes-extracf

Replace ltdrivergt and ltpathgt by your values

Finally reload postfix

This release also deprecates some internal functions As a result several extensions has been updated to maintain thecompatibility If you enabled the notification service yoursquoll find the list of available updates directly in your Modoboaconsole

For the others here is the list

Name Versionmodoboa-amavis 1010modoboa-postfix-autoreply 117modoboa-radicale 105modoboa-stats 109

Command line shortcut

$ pip install modoboa-amavis==1010$ pip install modoboa-postfix-autoreply==117$ pip install modoboa-radicale==105$ pip install modoboa-stats==109

160

Warning You have to upgrade extensions due to coreUser model attribute change (usergroup to userrole) Oth-erwise you will have an internal error after upgrade In particular modoboa-amavisd modoboa-stats modoboa-postfix-autoreply are concerned

36 Chapter 2 Table of contents

Modoboa Documentation Release 1100

An interesting feature brougth by this version is the capability to make different checks about MX records Forexample Modoboa can query main DNSBL providers for every defined domain With this you will quickly know ifone the domains you manage is listed or not To activate it add the following line to your crontab

30 ltoptional_virtualenv_pathgtpython ltmodoboa_instance_dirgtmanagepy modorarr˓check_mx

The communication with Modoboa public API has been reworked Instead of sending direct synchronous queries (forexample to check new versions) a cron job has been added To activate it add the following line to your crontab

0 ltoptional_virtualenv_pathgtpython ltmodoboa_instance_dirgtmanagepyrarr˓communicate_with_public_api

Please also note that public API now uses TLS so you must update your configuration as follows

MODOBOA_API_URL = httpsapimodoboaorg1

Finally it is now possible to declare additional sender addresses on a per-account basis You need to update your postfixconfiguration in order to use this functionality Just edit the maincf file and change the following parameter

smtpd_sender_login_maps =ltdrivergtetcpostfixsql-sender-login-mailboxescfltdrivergtetcpostfixsql-sender-login-aliasescfltdrivergtetcpostfixsql-sender-login-mailboxes-extracf

150

The API has been greatly improved and a documentation is now available To enable it addrest_framework_swagger to the INSTALLED_APPS variable in settingspy as follows

INSTALLED_APPS = (djangocontribauthdjangocontribcontenttypesdjangocontribsessionsdjangocontribmessagesdjangocontribsitesdjangocontribstaticfilesreversionrest_frameworkauthtokenrest_framework_swagger

)

Then add the following content into settingspy just after the REST_FRAMEWORK variable

SWAGGER_SETTINGS = is_authenticated Falseapi_version 10exclude_namespaces []info

contact contactmodoboacomdescription (Modoboa API requires a valid token)title Modoboa API

Yoursquore done The documentation is now available at the following address

22 Upgrade 37

Modoboa Documentation Release 1100

httpltyour instance addressgtdocsapi

Finally if you find a TEMPLATE_CONTEXT_PROCESSORS variable in your settingspy file make sure it lookslike this

TEMPLATE_CONTEXT_PROCESSORS = global_settingsTEMPLATE_CONTEXT_PROCESSORS + [modoboacorecontext_processorstop_notifications

]

140

Warning Please make sure to use Modoboa 135 with an up-to-date database before an upgrade to 140

Warning Do not follow the regular upgrade procedure for this version

Some extension have been moved back into the main repository The main reason for that is that using Modoboawithout them doesnrsquot make sense

First of all you must rename the following applications listed inside the MODOBOA_APPS variable

Old name New namemodoboa_admin modoboaadminmodoboa_admin_limits modoboalimitsmodoboa_admin_relaydomains modoboarelaydomains

Then apply the following steps

1 Uninstall old extensions

$ pip uninstall modoboa-admin modoboa-admin-limits modoboa-admin-relaydomains

2 Install all extension updates using pip (check the Modoboa gt Information page)

3 Manually migrate database

$ cd ltinstance_dirgt$ python managepy migrate auth$ python managepy migrate admin 0001 --fake$ python managepy migrate admin$ python managepy migrate limits 0001 --fake$ python managepy migrate relaydomains 0001 --fake$ python managepy migrate

4 Finally update static files

$ python managepy collectstatic

This version also introduces a REST API To enable it

1 Add rest_frameworkauthtoken to the INSTALLED_APPS variable

2 Add the following configuration inside settingspy

38 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Rest framework settings

REST_FRAMEWORK = DEFAULT_AUTHENTICATION_CLASSES (

rest_frameworkauthenticationTokenAuthentication)DEFAULT_PERMISSION_CLASSES (

rest_frameworkpermissionsIsAuthenticated)

3 Run the following command

$ python managepy migrate

135

To enhance security Modoboa now checks the strength of user passwords lthttpsgithubcomdstufftdjango-passwordsgt_

To use this feature add the following configuration into the settingspy file

django-passwords

PASSWORD_MIN_LENGTH = 8

PASSWORD_COMPLEXITY = UPPER 1LOWER 1DIGITS 1

132

Modoboa now uses the atomic requests mode to preserve database consistency (reference)

To enable it update the DATABASES variable in settingspy as follows

DATABASES = default

stuff beforeATOMIC_REQUESTS True

amavis

stuff beforeATOMIC_REQUESTS True

130

This release does not bring awesome new features but it is a necessary bridge to the future of Modoboa All extensionsnow have their own git repository and the deploy process has been updated to reflect this change

22 Upgrade 39

Modoboa Documentation Release 1100

Another important update is the use of Django 17 Besides its new features the migration system has been reworkedand is now more robust than before

Before we begin with the procedure here is a table showing old extension names and their new name

Old name New package name New module namemodoboaextensionsadmin modoboa-admin modoboa_adminmodoboaextensionslimits modoboa-admin-limits modoboa_admin_limitsmodoboaextensionspostfix_autoreply modoboa-postfix-autoreply modoboa_postfix_autoreplymodoboaextensionspostfix_relay_domains modoboa-admin-relaydomains modoboa_admin_relaydomainsmodoboaextensionsradicale modoboa-radicale modoboa_radicalemodoboaextensionssievefilters modoboa-sievefilters modoboa_sievefiltersmodoboaextensionsstats modoboa-stats modoboa_statsmodoboaextensionswebmail modoboa-webmail modoboa_webmail

Here are the required steps

1 Install the extensions using pip (look at the second column in the table above)

$ pip install ltthe extensions you wantgt

2 Remove south from INSTALLED_APPS

3 Rename old extension names inside MODOBOA_APPS (look at the third column in the table above)

4 Remove modoboalibmiddlewareExtControlMiddleware from MIDDLEWARE_CLASSES

5 Change DATABASE_ROUTERS to

DATABASE_ROUTERS = [modoboa_amavisdbrouterAmavisRouter]

6 Run the following commands

$ cd ltmodoboa_instance_dirgt$ python managepy migrate

7 Reply yes to the question

8 Run the following commands

$ python managepy load_initial_data$ python managepy collectstatic

9 The cleanup job has been renamed in Django so you have to modify your crontab entry

- 0 0 ltmodoboa_sitegtmanagepy cleanup+ 0 0 ltmodoboa_sitegtmanagepy clearsessions

120

A new notification service let administrators know about new Modoboa versions To activate it you need to updatethe TEMPLATE_CONTEXT_PROCESSORS variable like this

from djangoconf import global_settings

TEMPLATE_CONTEXT_PROCESSORS = global_settingsTEMPLATE_CONTEXT_PROCESSORS + (

(continues on next page)

40 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

modoboacorecontext_processorstop_notifications)

and to define the new MODOBOA_API_URL variable

MODOBOA_API_URL = httpapimodoboaorg1

The location of external static files has changed To use them add a new path to the STATICFILES_DIRS

Additional locations of static filesSTATICFILES_DIRS = (

Put strings here like homehtmlstatic or Cwwwdjangostatic Always use forward slashes even on Windows Dont forget to use absolute paths not relative pathsltpathtomodoboainstalldirgtbower_components

)

Run the following commands to define the hostname of your instance

$ cd ltmodoboa_instance_dirgt$ python managepy set_default_site lthostnamegt

If you plan to use the Radicale extension

1 Add modoboaextensionsradicale to the MODOBOA_APPS variable

2 Run the following commands

$ cd ltmodoboa_instance_dirgt$ python managepy syncdb

Warning You also have to note that the sitestatic directory has moved from ltpath to your sitesdirgt to ltmodoboas root urlgt (itrsquos probably the parent directory) You have to adapt your web serverconfiguration to reflect this change

23 Configuration

231 Online parameters

Modoboa provides online panels to modify internal parameters There are two available levels

bull Application level global parameters define how the application behaves Available at Modoboa gt Parameters

bull User level per user customization Available at User gt Settings gt Preferences

Regardless level parameters are displayed using tabs each tab corresponding to one application

General parameters

The admin application exposes several parameters they are presented below

23 Configuration 41

Modoboa Documentation Release 1100

Name Tab Description Default valueAuthentication type General The backend used for au-

thenticationLocal

Default password scheme General Scheme used to cryptmailbox passwords

crypt

Rounds General Number of rounds (onlyused by sha256cryptand sha512crypt) Mustbe between 1000 and999999999 inclusive

70000

Secret key General A key used to encryptusersrsquo password in ses-sions

random value

Sender address General Email address used tosend notifications

Enable communication General Enable communicationwith Modoboa public API

yes

Check new versions General Automatically checks if anewer version is available

yes

Send statistics General Send statistics to Mod-oboa public API (countersand used extensions)

yes

Top notifications check in-terval

General Interval between two topnotification checks (inseconds)

30

Maximum log record age General The maximum age in daysof a log record

365

Items per page General Number of displayeditems per page

30

Default top redirection General The default redirectionused when no applicationis specified

userprefs

Enable MX checks Admin Check that every domainhas a valid MX record

yes

Valid MXs Admin A list of IP or networkaddress every MX shouldmatch A warning will besent if a record does notrespect this it

Enable DNSBL checks Admin Check every domainagainst major DNSBLproviders

yes

DKIM keys storage direc-tory

AdminPath to a directory where DKIM

generated keys willbe stored

Default DKIM key length Admin The default size (in bits)for new keys

2048

Handle mailboxes onfilesystem

Admin Rename or remove mail-boxes on the filesystemwhen they get renamed orremoved within Modoboa

no

Mailboxes owner Admin The UNIX account whoowns mailboxes on thefilesystem

vmail

Default domain quota Admin Default quota (in MB) ap-plied to freshly createddomains with no valuespecified A value of 0means no quota

0

Automatic accountremoval

Admin When a mailbox is re-moved also remove theassociated account

no

Automatic do-mainmailbox creation

Admin Create a domain and amailbox when an accountis automatically created

yes

42 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Note If you are not familiar with virtual domain hosting you should take a look at postfixrsquos documentation ThisHow to also contains useful information

Note A random secret key will be generated each time the Parameters page is refreshed and until you save parametersat least once

Note Specific LDAP parameters are also available see LDAP authentication

232 Media files

Modoboa uses a specific directory to upload files (ie when the webmail is in use) or to create ones (ex graphical statis-tics) This directory is named media and is located inside modoboarsquos installation directory (called modoboa_sitein this documentation)

To work properly the system user which runs modoboa (www-data apache whatever) must have write access tothis directory

233 Customization

Custom logo

You have the possibility to use a custom logo instead of the default one on the login page

To do so open the settingspy file and add a MODOBOA_CUSTOM_LOGO variable This variable must containthe relative URL of your logo under MEDIA_URL For example

MODOBOA_CUSTOM_LOGO = ospathjoin(MEDIA_URL custom_logopng)

Then copy your logo file into the directory indicated by MEDIA_ROOT

234 Host configuration

Note This section is only relevant when Modoboa handles mailboxes renaming and removal from the filesystem

To manipulate mailboxes on the filesystem you must allow the user who runs Modoboa to execute commands as theuser who owns mailboxes

To do so edit the etcsudoers file and add the following inside

ltuser_that_runs_modoboagt ALL=(ltmailboxes ownergt) NOPASSWD ALL

Replace values between ltgt by the ones you use

23 Configuration 43

Modoboa Documentation Release 1100

235 Time zone and language

Modoboa is available in many languages

To specify the default language to use edit the settingspy file and modify the LANGUAGE_CODE variable

LANGUAGE_CODE = fr or en for english etc

Note Each user has the possibility to define the language he prefers

In the same configuration file specify the timezone to use by modifying the TIME_ZONE variable For example

TIME_ZONE = EuropeParis

236 Sessions management

Modoboa uses Djangorsquos session framework to store per-user information

Few parameters need to be set in the settingspy configuration file to make Modoboa behave as expected

SESSION_EXPIRE_AT_BROWSER_CLOSE = False Default value

This parameter is optional but you must ensure it is set to False (the default value)

The default configuration file provided by the modoboa-adminpy command is properly configured

237 Logging authentication

To trace login attempts to the web interface Modoboa uses python SysLogHandler so you can see them in your syslogauthentication log file (varlogauthlog in most cases)

Depending on your configuration you may have to edit the settingspy file and add lsquoaddressrsquo lsquodevlogrsquo to thelogging section

syslog-auth class logginghandlersSysLogHandlerfacility SysLogHandlerLOG_AUTHaddress devlogformatter syslog

238 External authentication

LDAP

Modoboa supports external LDAP authentication using the following extra components

bull Python LDAP client

bull Django LDAP authentication backend

If you want to use this feature you must first install those components

44 Chapter 2 Table of contents

Modoboa Documentation Release 1100

$ pip install python-ldap django-auth-ldap

Then all you have to do is to modify the settingspy file Add a new authentication backend to the AUTHENTI-CATION_BACKENDS variable like this

AUTHENTICATION_BACKENDS = (modoboalibauthbackendsLDAPBackend modoboalibauthbackendsLDAPSecondaryBackend Useful for a fallback

rarr˓mechanismdjangocontribauthbackendsModelBackend

)

Finally go to Modoboa gt Parameters gt General and set Authentication type to LDAP

From there new parameters will appear to let you configure the way Modoboa should connect to your LDAP serverThey are described just below

Name Description De-faultvalue

Server address The IP address of the DNS name of the LDAP server local-host

Server port The TCP port number used by the LDAP server 389Use a secureconnection

Use an SSLTLS connection to access the LDAP server no

Authenticationmethod

Choose the authentication method to use Directbind

User DN tem-plate (directbind mode)

The template used to construct a userrsquos DN It should contain one placeholder (ie(user)s)

Bind BN The distinguished name to use when binding to the LDAP server Leave empty for ananonymous bind

Bind password The password to use when binding to the LDAP server (with lsquoBind DNrsquo)Search base The distinguished name of the search baseSearch filter An optional filter string (eg lsquo(objectClass=person)rsquo) In order to be valid it must be

enclosed in parentheses(mail=(user)s)

Passwordattribute

The attribute used to store user passwords user-Pass-word

Active Direc-tory

Tell if the LDAP server is an Active Directory one no

Administratorgroups

Members of those LDAP Posix groups will be created ad domain administrators Uselsquorsquo characters to separate groups

Group type The type of group used by your LDAP directory Posix-Group

Groups searchbase

The distinguished name of the search base used to find groups

Do-mainmailboxcreation

Automatically create a domain and a mailbox when a new user is created just after thefirst successful authentication You will generally want to disable this feature whenthe relay domains extension is in use

yes

If you need additional parameters you will find a detailed documentation here

Once the authentication is properly configured the users defined in your LDAP directory will be able to connect to

23 Configuration 45

Modoboa Documentation Release 1100

Modoboa the associated domain and mailboxes will be automatically created if needed

The first time a user connects to Modoboa a local account is created if the LDAP username is a valid email addressBy default this account belongs to the SimpleUsers group and it has a mailbox

To automatically create domain administrators you can use the Administrator groups setting If a LDAP user belongsto one the listed groups its local account will belong to the DomainAdmins group In this case the username is notnecessarily an email address

Users will also be able to update their LDAP password directly from Modoboa

Note Modoboa doesnrsquot provide any synchronization mechanism once a user is registered into the database Anymodification done from the directory to a user account will not be reported to Modoboa (an email address change forexample) Currently the only solution is to manually delete the Modoboa record it will be recreated on the next userlogin

SMTP

It is possible to use an existing SMTP server as an authentication source To enable this feature edit the settingspy file and change the following setting

AUTHENTICATION_BACKENDS = (modoboalibauthbackendsSMTPBackenddjangocontribauthbackendsModelBackend

)

SMTP server location can be customized using the following settings

AUTH_SMTP_SERVER_ADDRESS = localhostAUTH_SMTP_SERVER_PORT = 25AUTH_SMTP_SECURED_MODE = None ssl or starttls are accepted

239 LDAP synchronization

Modoboa can synchronize accounts with an LDAP directory (tested with OpenLDAP) but this feature is not enabledby default To activate it add modoboaldapsync to MODOBOA_APPS in the settingspy file

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboaldapsync

)

and enable it from the admin panel

46 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning Make sure to install additional requirements otherwise it wonrsquot work

The following parameters are available and must be filled

Name Description Defaultvalue

Enable LDAP synchro-nization

Control LDAP synchronization state no

Bind DN The DN of a user with write permission to createupdate accountsBind password The associated passwordAccount DN template The template used to build account DNs (must contain a (user)s

placeholder

2310 Database maintenance

Cleaning the logs table

Modoboa logs administrator specific actions into the database A clean-up script is provided to automatically removeoldest records The maximum log record age can be configured through the online panel

To use it you can setup a cron job to run every night

0 0 ltmodoboa_sitegtmanagepy cleanlogs Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy cleanlogs

Cleaning the session table

Django does not provide automatic purging Therefore itrsquos your job to purge expired sessions on a regular basis

Django provides a sample clean-up script django-adminpy clearsessions That script deletes any sessionin the session table whose expire_date is in the past

For example you could setup a cron job to run this script every night

0 0 ltmodoboa_sitegtmanagepy clearsessions Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy clearsessions

Cleaning inactive accounts

Thanks to Last-login tracking it is now possible to monitor inactive accounts An account is considered inactive if nologin has been recorded for the last 30 days (this value can be changed through the admin panel)

A management command is available to disable or delete inactive accounts For example you could setup a cron jobto run it every night

23 Configuration 47

Modoboa Documentation Release 1100

0 0 ltmodoboa_sitegtmanagepy clean_inactive_accounts Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy clean_inactive_rarr˓accounts

The default behaviour is to disable accounts You can delete them using the --delete option

24 Moving to Modoboa

You have an existing platform and yoursquod like to move to Modoboa the following tools could help you

241 From postfixadmin

A dedicated command allows you to convert an existing postfixadmin database to a Modoboa one Consult the docu-mentation to know more about the process

242 Using CSV files

Modoboa allows you to import any object (domain domain alias mailbox and alias) using a simple CSV file encodedusing UTF8 Each line corresponds to a single object and must respect one of the following format

domain ltname stringgt ltquota integergt ltdefault mailbox quota integergt ltenabledrarr˓booleangtdomainalias ltname stringgt lttargeted domain stringgt ltenabled booleangtrelaydomain ltname stringgt lttarget host stringgt lttarget port integergt ltservicerarr˓stringgt ltenabled booleangt ltverify recipients booleangtaccount ltloginname stringgt ltpassword stringgt ltfirst name stringgt ltlast namerarr˓stringgt ltenabled booleangt ltgroup stringgt ltaddress stringgt ltquota integergt [rarr˓ltdomain stringgt ]alias ltaddress stringgt ltenabled booleangt ltrecipient stringgt

Boolean fields accept the following values true 1 yes y (case insensitive) Any other value will be evaluated asfalse

Warning The order does matter Objects are created sequencially so a domain must be created before itsmailboxes and aliases and a mailbox must created before its alias(es)

To actually import such a file

gt sudo -u ltmodoboa_usergt -igt source ltvirtualenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy modo import ltyour filegt

Available options can be listed using the following command

gt python managepy modo import -h

48 Chapter 2 Table of contents

Modoboa Documentation Release 1100

25 REST API

To ease the integration with external sources (software or other) Modoboa provides a REST API

Every installed instance comes with a ready-to-use API and a documentation You will find them using the followingurl patterns

bull API httplthostnamegtapiv1

bull Documentation httplthostnamegtdocsapi

An example of this documentation is available on the official demo

Using this API requires an authentication and for now only a token based authentication is supported To get a validtoken log-in to your instance with a super administrator go to Settings gt API and activate the API access Press theUpdate button and wait until the page is reloaded the token will be displayed

To make valid API calls every requests you send must embed this token within an Authorization HTTP header likethis

Authorization Token ltYOUR_TOKENgt

and the content type of those requests must be applicationjson

26 How to contribute

Contributions are always welcome If you want to submit a patch please respect the following rules

bull Open a pull request on the appropriate repository

bull Respect PEP8

bull Document your patch and respect PEP 257

bull Add unit tests and make sure the global coverage does not decrease

If all those steps are validated your contribution will generally be integrated

261 Table of contents

25 REST API 49

Modoboa Documentation Release 1100

Useful tips

You would like to work on Modoboa but you donrsquot know where to start Yoursquore at the right place Browse this pageto learn useful tips

Docker

A docker image is available for developers To use it you must install docker and docker-compose first

Then just run the following command

$ docker-compose up

It will start the docker environment and make a Modoboa instance available at httplocalhost8000

If you donrsquot want to use docker or need a more complex development setup go to the next section

Prepare a virtual environment

A virtual environment is a good way to setup a development environment on your machine

To do so run the following commands

$ python3 -m venv ltpathgt$ source ltpathgtbinactivate$ git clone httpsgithubcommodoboamodoboagit$ cd modoboa$ python setuppy develop$ pip install -r dev-requirementstxt

The develop command creates a symbolic link to your local copy so any modification you make will be automati-cally available in your environment no need to copy them

Deploy an instance for development

Warning Make sure to create a database before running this step The format of the database url is also describedin this page

Now that you have a running environment yoursquore ready to deploy a test instance

$ cd ltpathgt$ modoboa-adminpy deploy --dburl defaultltdatabase urlgt --domain localhost --develrarr˓instance$ python managepy runserver

Yoursquore ready to go You should be able to access Modoboa at httplocalhost8000 usingadminpassword as credentials

Manage static files

Modoboa uses bower (thanks to django-bower) to manage its CSS and javascript dependencies

50 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Those dependencies are listed in a file called dev_settingspy located inside the ltpath_to_local_copygtmodoboacore directory

If you want to add a new dependency just complete the BOWER_INSTALLED_APPS parameter and run the followingcommand

$ python managepy bower install

It will download and store the required files into the ltpath_to_local_copygtmodoboabower_components directory

Test your modifications

If you deployed a specific instance for your development needs you can run the tests suite as follows

gt python managepy test modoboacore modoboalib modoboaadmin modoboalimits modoboararr˓relaydomains

Otherwise you can run the tests suite from the repository using tox

Start a basic Modoboa instance

From the repository run the following command to launch a simple instance with a few fixtures

gt tox -e serve

You can use adminpassword to log in

Build the documentation

If you need to modify the documenation and want to see the result you can build it as follows

gt tox -e docgt firefox toxdoctmphtmlindexhtml

FAQ

bower command is missing in managepy

bower command is missing in managepy if you donrsquot use the --devel option of the modoboa-adminpydeploy command

To fix it regenerate your instance or update your settingspy file manually Look at devmode in httpsgithubcomtonioomodoboablobmastermodoboacorecommandstemplatessettingspytpl

Create a new plugin

Introduction

Modoboa offers a plugin API to expand its capabilities The current implementation provides the following possibili-ties

26 How to contribute 51

Modoboa Documentation Release 1100

bull Expand navigation by adding entry points to your plugin inside the GUI

bull Access and modify administrative objects (domains mailboxes etc)

bull Register callback actions for specific events

Plugins are nothing more than Django applications with an extra piece of code that integrates them into Modoboa Themodo_extensionpy file will contain a complete description of the plugin

bull Admin and user parameters

bull Custom menu entries

The communication between both applications is provided by Django signals

The following subsections describe the plugin architecture and explain how you can create your own

The required glue

To create a new plugin just start a new django application like this (into Modoboarsquos directory)

$ python managepy startapp

Then you need to register this application using the provided API Just copypaste the following example into themodo_extensionpy file of the future extension

from modoboacoreextensions import ModoExtension exts_pool

class MyExtension(ModoExtension)My custom Modoboa extension

name = myextlabel = My Extensionversion = 01description = A descriptionurl = myext_root_location optional name is used if not defined

def load(self)This method is called when Modoboa loads available and activated plugins

Declare parameters and register events herepass

def load_initial_data(self)Optional provide initial data for your extension herepass

exts_poolregister_extension(MyExtension)

Once done simply add your extensionrsquos module name to the MODOBOA_APPS variable located inside settingspy Finally run the following commands

$ python managepy migrate$ python managepy load_initial_data$ python managepy collectstatic

52 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Parameters

A plugin can declare its own parameters There are two levels available

bull lsquoGlobalrsquo parameters used to configure the plugin editable inside the Admin gt Settings gt Parameters page

bull lsquoUserrsquo parameters per-user parameters (or preferences) editable inside the Options gt Preferences page

Playing with parameters

Parameters are defined using Django forms and Modoboa adds two special forms you can inherit depending on thelevel of parameter(s) you want to add

bull modoboaparametersformsAdminParametersForm for general parameters

bull modoboaparametersformsUserParametersForm for user parameters

To register new parameters add the following line into the load method of your plugin class

from modoboaparameters import tools as param_toolsparam_toolsregistryadd(

LEVEL YourForm ugettext_lazy(Title))

Replace LEVEL by global or user

Custom role permissions

Modoboa uses Djangorsquos internal permission system Administrative roles are nothing more than groups (Groupinstances)

An extension can add new permissions to a group by listening to the extra_role_permissions signal Here isan example

from djangodispatch import receiverfrom modoboacore import signals as core_signals

PERMISSIONS = Resellers [

(relaydomains relaydomain add_relaydomain)(relaydomains relaydomain change_relaydomain)(relaydomains relaydomain delete_relaydomain)(relaydomains service add_service)(relaydomains service change_service)(relaydomains service delete_service)

]

receiver(core_signalsextra_role_permissions)def extra_role_permissions(sender role kwargs)

Add permissions to the Resellers groupreturn constantsPERMISSIONSget(role [])

Extending admin forms

The forms used to edit objects (account domain etc) through the admin panel are composed of tabs You can extendthem (ie add new tabs) in a pretty easy way thanks to custom signals

26 How to contribute 53

Modoboa Documentation Release 1100

Account

To add a new tab to the account edition form define new listeners (handlers) for the following signals

bull modoboaadminsignalsextra_account_forms

bull modoboaadminsignalsget_account_form_instances

bull modoboaadminsignalscheck_extra_account_form (optional)

Example

from djangodispatch import receiverfrom modoboaadmin import signals as admin_signals

receiver(admin_signalsextra_account_forms)def extra_account_form(sender user account kwargs)

return [id tabid title Title cls MyFormClass

]

receiver(admin_signalsget_account_form_instances)def fill_my_tab(sender user account kwargs)

return id my_instance

Domain

To add a new tab to the domain edition form define new listeners (handlers) for the following signals

bull modoboaadminsignalsextra_domain_forms

bull modoboaadminsignalsget_domain_form_instances

Example

from djangodispatch import receiverfrom modoboaadmin import signals as admin_signals

receiver(admin_signalsextra_domain_forms)def extra_account_form(sender user domain kwargs)

return [id tabid title Title cls MyFormClass

]

receiver(admin_signalsget_domain_form_instances)def fill_my_tab(sender user domain kwargs)

return id my_instance

27 Contributors

bull Antidot

bull Bearstech

bull CAP-REL

54 Chapter 2 Table of contents

Modoboa Documentation Release 1100

bull Dalnix

27 Contributors 55

  • Overview
  • Table of contents
Page 16: Modoboa Documentation

Modoboa Documentation Release 1100

(continued from previous page)

location ~ ht deny all

location ltmodobas root urlgt include uwsgi_paramsuwsgi_pass ltuwsgi portgtuwsgi_param UWSGI_SCRIPT ltmodoboa instance namegtwsgiapplicationuwsgi_param UWSGI_SCHEME https

ltmodoboa instance namegt must be replaced by the value you used when you deployed your instance

If you do not plan to use SSL then change the listen directive to listen 80 and delete each of the followingdirectives

ssl onkeepalive_timeout 70ssl_certificate ltssl certificate for your sitegtssl_certificate_key ltssl certificate key for your sitegtuwsgi_param UWSGI_SCHEME https

If you do plan to use SSL yoursquoll have to generate a certificate and a key This article contains information about howto do it

Make sure to replace the ltgt in the sample configuration with appropriate values Here are some explanations forthe cases that may not be completely self-explanatory

ltmodoboas settings dirgt Where Modoboarsquos settingspy resides This is also where thesitestatic and media directories reside

ltmodoboas root urlgt This is the URL which will be the root of your Modoboa site at your domain For in-stance if your Modoboa installation is reachable at at httpsfoomodoboa then ltmodoboas rooturlgt is modoboa In this case you probably also have to set the alias directives to point to where Mod-oboarsquos sitestatic and media directories are because otherwise nginx wonrsquot be able to find them

If Modoboa is at the root of your domain then ltmodoboa root urlgt is an empty string and can be deletedfrom the configuration above In this case you probably do not need the alias directives

ltuwsgi portgt The location where uwsig is listening It could be a unix domain socket or an addressport combi-nation Ubuntu configures uwsgi so that the port is

unixrunuwsgiappltapp namegtsocket

where ltapp namegt is the name of the application

Your uwsgi configuration should be

[uwsgi] Not needed when using uwsgi from pip plugins = pythonchdir = ltmodoboas top dirgtmodule = ltnamegtwsgiapplicationmaster = trueharakiri = 60processes = 4vhost = trueno-default-app = true

21 Installation 13

Modoboa Documentation Release 1100

The plugins directive should be turned on if you use a uwsgi installation that requires it If uwsgi was installed frompip it does not require it In the configuration above

ltmodoboas top dirgt The directory where managepy resides This directory is the parent of ltmodoboassettings dirgt

ltnamegt The name that you passed to modoboa-adminpy deploy when you created your Modoboa instance

Now you can go the Dovecot section to continue the installation

Dovecot

Modoboa requires Dovecot 2+ to work so the following documentation is suitable for this combination

In this section we assume dovecotrsquos configuration resides in etcdovecot all pathes will be relative to thisdirectory

Mailboxes

First edit the confd10-mailconf and set the mail_location variable

maildirmail_location = maildir~maildir

Then edit the inbox namespace and add the following lines

inbox = yes

mailbox Drafts auto = subscribespecial_use = Drafts

mailbox Junk

auto = subscribespecial_use = Junk

mailbox Sent

auto = subscribespecial_use = Sent

mailbox Trash

auto = subscribespecial_use = Trash

With dovecot 21+ it ensures all the special mailboxes will be automaticaly created for new accounts

For dovecot 20 and older use the autocreate plugin

Operations on the file system

14 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning Modoboa needs to access the dovecot binary to check its version To find the binary path weuse the which command first and then try known locations (usrsbindovecot and usrlocalsbindovecot) If you installed dovecot in a custom location please tell us where the binary is by usingthe DOVECOT_LOOKUP_PATH setting (see settingspy)

Three operation types are considered

1 Mailbox creation

2 Mailbox renaming

3 Mailbox deletion

The first one is managed by Dovecot The last two ones may be managed by Modoboa if it can access the file systemwhere the mailboxes are stored (see General parameters to activate this feature)

Those operations are treated asynchronously by a cron script For example when you rename an e-mail addressthrough the web UI the associated mailbox on the file system is not modified directly Instead of that a renameorder is created for this mailbox The mailbox will be considered unavailable until the order is executed (see Postfixconfiguration)

Edit the crontab of the user who owns the mailboxes on the file system

$ crontab -u ltusergt -e

And add the following line inside

python ltmodoboa_sitegtmanagepy handle_mailbox_operations

Warning The cron script must be executed by the system user owning the mailboxes

Warning The user running the cron script must have access to the settingspy file of the modoboa instance

The result of each order is recorded into Modoboarsquos log Go to Modoboa gt Logs to consult them

Authentication

To make the authentication work edit the confd10-authconf and uncomment the following line at the end

include auth-systemconfextinclude auth-sqlconfextinclude auth-ldapconfextinclude auth-passwdfileconfextinclude auth-checkpasswordconfextinclude auth-vpopmailconfextinclude auth-staticconfext

Then edit the confdauth-sqlconfext file and add the following content inside

passdb sql driver = sql Path for SQL configuration file see example-configdovecot-sqlconfext

(continues on next page)

21 Installation 15

Modoboa Documentation Release 1100

(continued from previous page)

args = etcdovecotdovecot-sqlconfext

userdb sql driver = sqlargs = etcdovecotdovecot-sqlconfext

Make sure to activate only one backend (per type) inside your configuration (just comment the other ones)

Edit the dovecot-sqlconfext and modify the configuration according to your database engine

MySQL users

driver = mysql

connect = host=ltmysqld socketgt dbname=ltdatabasegt user=ltusergt password=ltpasswordgt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user WHERE email=Lu andrarr˓is_active=1

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid concat(bytes= mbquota M) AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

PostgreSQL users

driver = pgsql

connect = host=ltpostgres socketgt dbname=ltdatabasegt user=ltusergt password=ltpasswordgt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user u INNER JOIN admin_rarr˓mailbox mb ON uid=mbuser_id INNER JOIN admin_domain dom ON mbdomain_id=domidrarr˓WHERE uemail=Lu AND uis_active AND domenabled

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid bytes= || mbquota || M AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

16 Chapter 2 Table of contents

Modoboa Documentation Release 1100

SQLite users

driver = sqlite

connect = ltpath to the sqlite db filegt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user u INNER JOIN admin_rarr˓mailbox mb ON uid=mbuser_id INNER JOIN admin_domain dom ON mbdomain_id=domidrarr˓WHERE uemail=Lu AND uis_active=1 AND domenabled=1

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid (bytes= || mbquota || M) AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

Note Replace values between ltgt with yours

LDAP

To make the LDAP authentication work edit the confd10-authconf and uncomment the following line atthe end

include auth-ldapconfext

Then edit the confdauth-ldapconfext and edit the passdb section as following You should comment theuserdb section which will be managed by SQL with modoboa database

passdb driver = ldap

Path for LDAP configuration file see example-configdovecot-ldapconfextargs = etcdovecotdovecot-ldapconfext

userdb driver = ldapargs = etcdovecotdovecot-ldapconfext

Default fields can be used to specify defaults that LDAP may overridedefault_fields = home=homevirtualu

Your own dovecot LDAP configuration file is now etcdovecotdovecot-ldapconfext You can addyour default LDAP conf in it following the official documentation

Synchronize dovecot LDAP conf with modoboa LDAP conf

To make dovecot LDAP configuration synchronized with modoboa LDAP configuration you should create a dedicateddovecot conf file At the end of your dovecot configuration file (dovecot-ldapconfext) add the following

21 Installation 17

Modoboa Documentation Release 1100

line

include_try dovecot-modoboaconfext

Then set modoboa parameter Enable Dovecot LDAP sync to Yes Then set the Dovecot LDAP config file following theprevious step (etcdovecotdovecot-modoboaconfext in the example)

The last step is to add the command update_dovecot_conf to the cron job of modoboa Then each time your modoboaLDAP configuration is updated your dovecot LDAP configuration will also be

LMTP

Local Mail Transport Protocol is used to let Postfix deliver messages to Dovecot

First make sure the protocol is activated by looking at the protocols setting (generally inside dovecotconf)It should be similar to the following example

protocols = imap pop3 lmtp

Then open the confd10-masterconf look for lmtp service definition and add the following content inside

service lmtp stuff beforeunix_listener varspoolpostfixprivatedovecot-lmtp mode = 0600user = postfixgroup = postfix

stuff after

We assume here that Postfix is chrooted within varspoolpostfix

Finally open the confd20-lmtpconf and modify it as follows

protocol lmtp postmaster_address = postmasterltdomaingtmail_plugins = $mail_plugins quota sieve

Replace ltdomaingt by the appropriate value

Note If you donrsquot plan to apply quota or to use filters just adapt the content of the mail_plugins setting

Quota

Modoboa lets adminstrators define per-domain andor per-account limits (quota) It also lists the current quota usageof each account Those features require Dovecot to be configured in a specific way

Inside confd10-mailconf add the quota plugin to the default activated ones

mail_plugins = quota

Inside confd10-masterconf update the dict service to set proper permissions

18 Chapter 2 Table of contents

Modoboa Documentation Release 1100

service dict If dict proxy is used mail processes should have access to its socket For example mode=0660 group=vmail and global mail_access_groups=vmailunix_listener dict mode = 0600user = ltuser owning mailboxesgtgroup =

Inside confd20-imapconf activate the imap_quota plugin

protocol imap

mail_plugins = $mail_plugins imap_quota

Inside dovecotconf activate the quota SQL dictionary backend

dict quota = ltdrivergtetcdovecotdovecot-dict-sqlconfext

Inside confd90-quotaconf activate the quota dictionary backend

plugin quota = dictUser quotaproxyquota

It will tell Dovecot to keep quota usage in the SQL dictionary

Finally edit the dovecot-dict-sqlconfext file and put the following content inside

connect = host=ltdb hostgt dbname=ltdb namegt user=ltdb usergt password=ltpasswordgt SQLite users connect = pathtothedatabasedb

map pattern = privquotastoragetable = admin_quotausername_field = usernamevalue_field = bytes

map

pattern = privquotamessagestable = admin_quotausername_field = usernamevalue_field = messages

PostgreSQL users

21 Installation 19

Modoboa Documentation Release 1100

Database schema update

The admin_quota table is created by Django but unfortunately it doesnrsquot support DEFAULT constraints (it onlysimulates them when the ORM is used) As PostgreSQL is a bit strict about constraint violations you must executethe following query manually

db=gt ALTER TABLE admin_quota ALTER COLUMN bytes SET DEFAULT 0db=gt ALTER TABLE admin_quota ALTER COLUMN messages SET DEFAULT 0

Trigger

As indicated on Dovecotrsquos wiki you need a trigger to properly update the quota

A working copy of this trigger is available on Github

Download this file and copy it on the server running postgres Then execute the following commands

$ su - postgres$ psql [modoboa database] lt pathtomodoboa_postgres_triggersql$ exit

Replace [modoboa database] by the appropriate value

Forcing recalculation

For existing installations Dovecot (gt 2) offers a command to recalculate the current quota usages For example if youwant to update all usages run the following command

$ doveadm quota recalc -A

Be carefull it can take a while to execute

ManageSieveSieve

Modoboa lets users define filtering rules from the web interface To do so it requires ManageSieve to be activated onyour server

Inside confd20-managesieveconf make sure the following lines are uncommented

protocols = $protocols sieve

service managesieve-login

service managesieve

protocol sieve

20 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Messages filtering using Sieve is done by the LDA

Inside confd15-ldaconf activate the sieve plugin like this

protocol lda Space separated list of plugins to load (default is global mail_plugins)mail_plugins = $mail_plugins sieve

Finally configure the sieve plugin by editing the confd90-sieveconf file Put the follwing caontent inside

plugin Location of the active script When ManageSieve is used this is actually a symlink pointing to the active script in the sieve storage directorysieve = ~dovecotsieve

The path to the directory where the personal Sieve scripts are stored For ManageSieve this is where the uploaded scripts are storedsieve_dir = ~sieve

Restart Dovecot

Now you can go to the Postfix section to finish the installation

Last-login tracking

To update the last_login attribute of an account after a succesful IMAP or POP3 login you can configure apost-login script

Open confd10-masterconf add the following configuration (imap and pop3 services are already definedyou just need to update them)

service imap executable = imap postlogin

service pop3 executable = pop3 postlogin

service postlogin executable = script-login usrlocalbinpostloginshuser = modoboaunix_listener postlogin

Then you must create a script named usrlocalbinpostloginsh According to your database enginethe content will differ

PostgreSQL

21 Installation 21

Modoboa Documentation Release 1100

binsh

psql -c UPDATE core_user SET last_login=now() WHERE username=$USER gt devnull

exec $

MySQL

binsh

DBNAME=XXXDBUSER=XXXDBPASSWORD=XXX

echo UPDATE core_user SET last_login=now() WHERE username=$USER | mysql -urarr˓$DBUSER -p$DBPASSWORD $DBNAME

exec $

Postfix

This section gives an example about building a simple virtual hosting configuration with Postfix Refer to the officialdocumentation for more explanation

Map files

You first need to create configuration files (or map files) that will be used by Postfix to lookup into Modoboa tables

To automaticaly generate the requested map files and store them in a directory run the following command

gt cd ltmodoboa_instance_pathgtgt python managepy generate_postfix_maps --destdir ltdirectorygt

ltdirectorygt is the directory where the files will be stored Answer the few questions and yoursquore done

Configuration

Use the following configuration in the etcpostfixmaincf file (this is just one possible configuration)

Stuff beforevirtual_transport = lmtpunixprivatedovecot-lmtp

virtual_mailbox_domains = ltdrivergtetcpostfixsql-domainscfvirtual_alias_domains = ltdrivergtetcpostfixsql-domain-aliasescfvirtual_alias_maps = ltdrivergtetcpostfixsql-aliasescf

relay_domains = ltdrivergtetcpostfixsql-relaydomainscftransport_maps =

ltdrivergtetcpostfixsql-transportcfltdrivergtetcpostfixsql-spliteddomains-transportcf

(continues on next page)

22 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

smtpd_recipient_restrictions = check_recipient_access

ltdrivergtetcpostfixsql-maintaincfltdrivergtetcpostfixsql-relay-recipient-verificationcf

permit_mynetworksreject_unauth_destinationreject_unverified_recipient

smtpd_sender_login_maps = ltdrivergtetcpostfixsql-sender-login-mapcf

smtpd_sender_restrictions =reject_sender_login_mismatch

Stuff after

Replace ltdrivergt by the name of the database you use

Restart Postfix

Policy daemon

If you want to enable the built-in policy daemon add the following content to the etcpostfixmaincf file

smtpd_recipient_restrictions = check_policy_service inet1270019999

And reload postfix

Note The check_policy_service line must be placed before the permit_mynetworks one otherwise thedaemon wonrsquot be called

OpenDKIM

Modoboa can generate DKIM keys for the hosted domains but it wonrsquot sign or check messages To do that you needa dedicated software like OpenDKIM

Note The cron job in charge of creating DKIM keys must be run using the same user than OpenDKIM (ie opendkimin most cases)

Database

Since keys related information is stored in Modoboarsquos database you need to tell OpenDKIM how it can access it

First make sure to install the required additional packages on your system (libopendbx1- on debian baseddistributions or opendbx- on CentOS the complete name depends on your database engine)

Then insert the following SQL view into Modoboarsquos database

21 Installation 23

Modoboa Documentation Release 1100

PostgreSQL

CREATE OR REPLACE VIEW dkim AS (SELECT id name as domain_name dkim_private_key_path AS private_key_path

dkim_key_selector AS selectorFROM admin_domain WHERE enable_dkim

)

MySQLMariaDB

CREATE OR REPLACE VIEW dkim AS (SELECT id name as domain_name dkim_private_key_path AS private_key_path

dkim_key_selector AS selectorFROM admin_domain WHERE enable_dkim=1

)

Configuration

You should find OpenDKIMrsquos configuration file at etcopendkimconf

Add the following content to it

KeyTable dsnltdrivergtltusergtltpasswordgtltdb hostgtltdb namegttable=dkimrarr˓keycol=iddatacol=domain_nameselectorprivate_key_pathSigningTable dsnltdrivergtltusergtltpasswordgtltdb hostgtltdb namegttable=dkimrarr˓keycol=domain_namedatacol=idSocket inet12345localhost

Replace values between ltgt by yours Accepted values for driver are pgsql or mysql Make sure the user youspecify has read permission on the view created previously

If you run a debian based system make sure to adjust the following setting in the etcdefaultopendkim file

SOCKET=inet12345localhost

Eventually reload OpenDKIM

Postfix integration

Add the following lines to the etcpostfixmaincf file

smtpd_milters = inet12700112345non_smtpd_milters = inet12700112345milter_default_action = acceptmilter_content_timeout = 30s

and reload postfix

Extensions

Only few commands are needed to add a new extension to your setup

24 Chapter 2 Table of contents

Modoboa Documentation Release 1100

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install ltEXTENSIONgt==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Then restart your web server

22 Upgrade

221 Modoboa

Warning The new version you are going to install may need to modify your database Before you start makesure to backup everything

Most of the time upgrading your installation to a newer Modoboa version only requires a few actions In every caseyou will need to apply the general procedure first and then check if the version you are installing requires specificactions

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install modoboa==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Once done check if the version you are installing requires Specific instructions

Finally restart your web server

Sometimes you might need to upgrade postfix map files too To do so just run the generate_postfix_mapscommand on the same directory than the one used for installation (etcpostfix by default)

Make sure to use root privileges and run the following command

gt python managepy generate_postfix_maps --destdir ltdirectorygt

Then reload postfix

22 Upgrade 25

Modoboa Documentation Release 1100

222 Extensions

If a new version is available for an extension yoursquore using it is recommanded to install it Upgrading an extensions ispretty and the procedure is almost the same than the one used for Modoboa

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install ltEXTENSIONgt==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Finally restart your web server

It is a generic upgrade procedure which will be enough most of the time but it is generally a good idea to check theassociated documentation

223 Rebuild Virtual Environment

Sometimes when upgrading your Operating System (eg from Ubuntu 1704 to Ubuntu 1710) your virtual environmentrunning modoboa can get corrupted Your first response will be to panic but fear not The solution is in this document

First things first

Recover your database password

You will need to recover your database password (if using mysql or postgresql) You will find this in etcpostfixsql-aliasescf or any file with sql-cf in the etcpostfix directory

Make note of this as you will need it when reconfiguring modoboa

Reinstall Modoboa

Start out by backup up your modoboa settings file located in the modoboa instance directory (srvmodoboainstanceinstancesettingspy if you used the default installer configuration) This contains your currentconfiguration

Next you want to remove all current modoboa files

After doing this follow the manual installation instructions for Modoboa only as everything should be working prop-erly

After this completes simply restore your backed up settings file to srvinstanceinstancesettingspy(if you used installer default configuration) You will then need to reinstall your extensions

You can find which plugins you had in your settingspy file under the MODOBOA_APPS variable

Instructions to install extensions can also be found here

Once you have completed this step you will need to run the following commands

26 Chapter 2 Table of contents

Modoboa Documentation Release 1100

gt (env) $ cd ltinstance_dirgtgt (env) $ python managepy migrategt (env) $ python managepy collectstatic

You will then see a message similar to

You have requested to collect static files at the destinationlocation as specified in your settings

srvmodoboainstancesitestatic

This will overwrite existing filesAre you sure you want to do this

Type yes to continue or no to cancel

You will want to answer yes here then simply restart the uwsgi process with service uwsgi restart andyou should be up and running again

Simply log into your modoboa web panel and verify that your extensions and webmail box is working

224 Information

Rebuild instructions from httpshelppythonanywherecompagesRebuildingVirtualenvs

225 Specific instructions

1160

A new policy daemon has been added

Make sure to have a Redis instance running on your server

Add modoboapolicyd to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboapolicyd

)

Add the following settings to your settingspy file

REDIS_HOST = ltIP or hostname heregtREDIS_PORT = 6379REDIS_QUOTA_DB = 0REDIS_URL = redisformat(REDIS_HOST REDIS_PORT REDIS_QUOTA_DB)

Once done you can start the policy daemon using the following commands

22 Upgrade 27

Modoboa Documentation Release 1100

gt python managepy policy_daemon

Donrsquot forget to configure _policyd_config if you want to use this feature

The modoboa-stats plugin has been merged into the core

Add modoboamaillog to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboapolicydmodoboamaillog

)

And remove any reference to modoboa_stats in this same variable

1150

This version drops Python 2 support so donrsquot forget to update all the extensions you use

Warning If you upgrade an existing python 2 installation you will need to create a new Python 3 virtualenvironment You can remove the existing virtual environment and replace it by the new one so you wonrsquot have tomodify your configuration files

Add the following new setting

DISABLE_DASHBOARD_EXTERNAL_QUERIES = False

Reload uwsgigunicornapache depending on your setup

Finally Make sure to use root privileges and run the following command

gt python managepy generate_postfix_maps --destdir ltdirectorygt

Then reload postfix

1140

This release introduces an optional LDAP synchronization process If you want to use it please follow the dedicatedprocedure

1131

Upgrade postfix maps files as follows

28 Chapter 2 Table of contents

Modoboa Documentation Release 1100

gt python managepy generate_postfix_maps --destdir ltpathgt --force-overwrite

1130

Add modoboadnstools to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstools

)

Add the following new settings

CSRF_COOKIE_SECURE = TrueSESSION_COOKIE_SECURE = True

modoboa-postfix-autoreply 150

Edit the etcpostfixmaincf file and remove the sql-autoreplies-transportcf map from thetransport_maps if present Remove the corresponding proxy_read_maps entry if relevant

Reload postfix

1100

Warning Upgrade installed extensions BEFORE running check or migrate commands

Upgrade all your installed plugins to the following versions

Warning If you use the amavis plugin make sure to include its configuration as follows into settingspy

from modoboa_amavis import settings as modoboa_amavis_settingsmodoboa_amavis_settingsapply(globals())

22 Upgrade 29

Modoboa Documentation Release 1100

Name Versionmodoboa-amavis 120modoboa-contacts 050modoboa-dmarc 110modoboa-imap-migration 120modoboa-pdfcredentials 130modoboa-postfix-autoreply 140modoboa-radicale 120modoboa-sievefilters 140modoboa-stats 140modoboa-webmail 140

Edit the settingspy file and apply the following modifications

Add modoboatransport to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparameters

)

Replace the following line

MIDDLEWARE_CLASSES = (

by

MIDDLEWARE = (

Update postfix map files as follows

gt rm -f ltpathgtmodoboa-postfix-mapschkgt python managepy generate_postfix_maps --force --destdir ltpathgt

Then modify postfixrsquos configuration as follows

smtpd_sender_login_maps =ltdrivergtltpathgtsql-sender-login-mapcf

transport_maps =ltdrivergtltpathgtsql-transportcfltdrivergtltpathgtsql-spliteddomains-transportcf other map files

Replace ltdrivergt and ltpathgt by your values

If transport_maps contains sql-relaydomains-transportcf remove it

30 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning If you make use of postfixrsquos proxymap server you must also update the proxy_read_maps setting

Reload postfix

Add the following cron job in order to generate DKIM keys

Generate DKIM keys (they will belong to the user running this job)

root $PYTHON $INSTANCEmanagepy modorarr˓manage_dkim_keys

190

If you want to manage inactive accounts look at Cleaning inactive accounts

183

Edit the settingspy file and replace the following line

BASE_DIR = ospathdirname(ospathdirname(__file__))

by

BASE_DIR = ospathrealpath(ospathdirname(ospathdirname(__file__)))

180

Modoboa now relies on Djangorsquos builtin password validation system to validate user passwords instead ofdjango-passwords

Remove django-passwords from your system

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt pip uninstall django-passwords

Edit the settingspy file and remove the following content

django-passwords

PASSWORD_MIN_LENGTH = 8

PASSWORD_COMPLEXITY = UPPER 1LOWER 1DIGITS 1

Add the following lines

Password validation rulesAUTH_PASSWORD_VALIDATORS = [

NAME djangocontribauthpassword_validation

rarr˓UserAttributeSimilarityValidator (continues on next page)

22 Upgrade 31

Modoboa Documentation Release 1100

(continued from previous page)

NAME djangocontribauthpassword_validationMinimumLengthValidator

NAME djangocontribauthpassword_validationCommonPasswordValidator

NAME djangocontribauthpassword_validationNumericPasswordValidator

NAME modoboacorepassword_validationComplexityValidatorOPTIONS

upper 1lower 1digits 1specials 0

]

172

API documentation has evolved (because of the upgrade to Django Rest Framework 36) and CKeditor is now embed-ded by default (thanks to the django-ckeditor package) Some configuration changes are required

Edit your settingspy file and apply the following modifications

bull Update the INSTALLED_APPS variable as follows

INSTALLED_APPS = (djangocontribauthdjangocontribcontenttypesdjangocontribsessionsdjangocontribmessagesdjangocontribsitesdjangocontribstaticfilesreversionckeditorckeditor_uploaderrest_frameworkrest_frameworkauthtoken

)

bull Update the REST_FRAMEWORK variable as follows

REST_FRAMEWORK = DEFAULT_AUTHENTICATION_CLASSES (

rest_frameworkauthenticationTokenAuthenticationrest_frameworkauthenticationSessionAuthentication

)

bull Remove the SWAGGER_SETTINGS variable

bull Add the following content

32 Chapter 2 Table of contents

Modoboa Documentation Release 1100

CKeditor

CKEDITOR_UPLOAD_PATH = uploads

CKEDITOR_IMAGE_BACKEND = pillow

CKEDITOR_RESTRICT_BY_USER = True

CKEDITOR_BROWSE_SHOW_DIRS = True

CKEDITOR_ALLOW_NONIMAGE_FILES = False

CKEDITOR_CONFIGS = default

allowedContent Truetoolbar Modoboawidth Nonetoolbar_Modoboa [

[Bold Italic Underline][JustifyLeft JustifyCenter JustifyRight JustifyBlock][BidiLtr BidiRtl Language][NumberedList BulletedList - Outdent Indent][Undo Redo][Link Unlink Anchor - Smiley][TextColor BGColor - Source][Font FontSize][Image ][SpellChecker]

]

Donrsquot forget to run the following command

gt python managepy collectstatic

171

If you used 170 for a fresh installation please run the following commands

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy load_initial_data

170

This version requires Django gt= 110 so you need to make some modifications It also brings internal API changeswhich are not backward compatible so installed extensions must be upgraded too

First of all deactivate all installed extensions (edit the settingspy file and comment the corresponding lines inMODOBOA_APPS)

Edit the urlspy file of your local instance and replace its content by the following one

22 Upgrade 33

Modoboa Documentation Release 1100

from djangoconfurls import include url

urlpatterns = [url(r include(modoboaurls))

]

Edit the settingspy and apply the following changes

bull Add modoboaparameters to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboarelaydomainsmodoboalimitsmodoboaparameters Modoboa extensions here

)

bull Add modoboacoremiddlewareLocalConfigMiddleware to MIDDLEWARE_CLASSES

MIDDLEWARE_CLASSES = (djangocontribsessionsmiddlewareSessionMiddlewaredjangomiddlewarecommonCommonMiddlewaredjangomiddlewarecsrfCsrfViewMiddlewaredjangocontribauthmiddlewareAuthenticationMiddlewaredjangocontribmessagesmiddlewareMessageMiddlewaredjangomiddlewarelocaleLocaleMiddlewaredjangomiddlewareclickjackingXFrameOptionsMiddlewaremodoboacoremiddlewareLocalConfigMiddlewaremodoboalibmiddlewareAjaxLoginRedirectmodoboalibmiddlewareCommonExceptionCatchermodoboalibmiddlewareRequestCatcherMiddleware

)

bull Modoboa used to provide a custom authentication backend (modoboalibauthbackendsSimpleBackend) but it has been removed Replace it as follows

AUTHENTICATION_BACKENDS = ( Other backends beforedjangocontribauthbackendsModelBackend

)

bull Remove TEMPLATE_CONTEXT_PROCESSORS and replace it by

TEMPLATES = [

BACKEND djangotemplatebackendsdjangoDjangoTemplatesDIRS []APP_DIRS TrueOPTIONS

context_processors [djangotemplatecontext_processorsdebugdjangotemplatecontext_processorsrequestdjangocontribauthcontext_processorsauth

(continues on next page)

34 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

djangotemplatecontext_processorsi18ndjangotemplatecontext_processorsmediadjangotemplatecontext_processorsstaticdjangotemplatecontext_processorstzdjangocontribmessagescontext_processorsmessagesmodoboacorecontext_processorstop_notifications

]debug False

]

Run the following commands (load virtualenv if you use one)

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstatic

Finally upgrade your extensions and reactivate them

Name Versionmodoboa-amavis 110modoboa-dmarc 100modoboa-imap-migration 110modoboa-pdfcredentials 110modoboa-postfix-autoreply 120modoboa-radicale 110modoboa-sievefilters 110modoboa-stats 110modoboa-webmail 110

Command line shortcuts

$ pip install modoboa-amavis==110$ pip install modoboa-dmarc==100$ pip install modoboa-imap-migration==110$ pip install modoboa-pdfcredentials==110$ pip install modoboa-postfix-autoreply==120$ pip install modoboa-radicale==110$ pip install modoboa-sievefilters==110$ pip install modoboa-stats==110$ pip install modoboa-webmail==110

And please make sure you use the latest version of the django-versionfield2 package

$ pip install -U django-versionfield2

Notes about quota changes and resellers

Reseller users now have a quota option in Resources tab This is the quota that a reseller can share between all itsdomains

22 Upgrade 35

Modoboa Documentation Release 1100

There are two quotas for a domain in the new version

1 Quota amp

2 Default mailbox quota

[1] Quota quota shared between mailboxes This quota is shared between all the mailboxes of this domain This valuecannot exceed resellerrsquos quota and hence cannot be 0(unlimited) if reseller has finite quota

[2] Default mailbox quota default quota applied to mailboxes This quota is the default quota applied to new mail-boxes This value cannot exceed Quota[1] and hence cannot be 0(unlimited) if Quota[1] is finite

161

First of all update postfix map files as follows

gt python managepy generate_postfix_maps --destdir ltpathgt --force-overwrite

Then modify postfixrsquos configuration as follows

smtpd_sender_login_maps =ltdrivergtltpathgtsql-sender-login-mailboxescfltdrivergtltpathgtsql-sender-login-aliasescfltdrivergtltpathgtsql-sender-login-mailboxes-extracf

Replace ltdrivergt and ltpathgt by your values

Finally reload postfix

This release also deprecates some internal functions As a result several extensions has been updated to maintain thecompatibility If you enabled the notification service yoursquoll find the list of available updates directly in your Modoboaconsole

For the others here is the list

Name Versionmodoboa-amavis 1010modoboa-postfix-autoreply 117modoboa-radicale 105modoboa-stats 109

Command line shortcut

$ pip install modoboa-amavis==1010$ pip install modoboa-postfix-autoreply==117$ pip install modoboa-radicale==105$ pip install modoboa-stats==109

160

Warning You have to upgrade extensions due to coreUser model attribute change (usergroup to userrole) Oth-erwise you will have an internal error after upgrade In particular modoboa-amavisd modoboa-stats modoboa-postfix-autoreply are concerned

36 Chapter 2 Table of contents

Modoboa Documentation Release 1100

An interesting feature brougth by this version is the capability to make different checks about MX records Forexample Modoboa can query main DNSBL providers for every defined domain With this you will quickly know ifone the domains you manage is listed or not To activate it add the following line to your crontab

30 ltoptional_virtualenv_pathgtpython ltmodoboa_instance_dirgtmanagepy modorarr˓check_mx

The communication with Modoboa public API has been reworked Instead of sending direct synchronous queries (forexample to check new versions) a cron job has been added To activate it add the following line to your crontab

0 ltoptional_virtualenv_pathgtpython ltmodoboa_instance_dirgtmanagepyrarr˓communicate_with_public_api

Please also note that public API now uses TLS so you must update your configuration as follows

MODOBOA_API_URL = httpsapimodoboaorg1

Finally it is now possible to declare additional sender addresses on a per-account basis You need to update your postfixconfiguration in order to use this functionality Just edit the maincf file and change the following parameter

smtpd_sender_login_maps =ltdrivergtetcpostfixsql-sender-login-mailboxescfltdrivergtetcpostfixsql-sender-login-aliasescfltdrivergtetcpostfixsql-sender-login-mailboxes-extracf

150

The API has been greatly improved and a documentation is now available To enable it addrest_framework_swagger to the INSTALLED_APPS variable in settingspy as follows

INSTALLED_APPS = (djangocontribauthdjangocontribcontenttypesdjangocontribsessionsdjangocontribmessagesdjangocontribsitesdjangocontribstaticfilesreversionrest_frameworkauthtokenrest_framework_swagger

)

Then add the following content into settingspy just after the REST_FRAMEWORK variable

SWAGGER_SETTINGS = is_authenticated Falseapi_version 10exclude_namespaces []info

contact contactmodoboacomdescription (Modoboa API requires a valid token)title Modoboa API

Yoursquore done The documentation is now available at the following address

22 Upgrade 37

Modoboa Documentation Release 1100

httpltyour instance addressgtdocsapi

Finally if you find a TEMPLATE_CONTEXT_PROCESSORS variable in your settingspy file make sure it lookslike this

TEMPLATE_CONTEXT_PROCESSORS = global_settingsTEMPLATE_CONTEXT_PROCESSORS + [modoboacorecontext_processorstop_notifications

]

140

Warning Please make sure to use Modoboa 135 with an up-to-date database before an upgrade to 140

Warning Do not follow the regular upgrade procedure for this version

Some extension have been moved back into the main repository The main reason for that is that using Modoboawithout them doesnrsquot make sense

First of all you must rename the following applications listed inside the MODOBOA_APPS variable

Old name New namemodoboa_admin modoboaadminmodoboa_admin_limits modoboalimitsmodoboa_admin_relaydomains modoboarelaydomains

Then apply the following steps

1 Uninstall old extensions

$ pip uninstall modoboa-admin modoboa-admin-limits modoboa-admin-relaydomains

2 Install all extension updates using pip (check the Modoboa gt Information page)

3 Manually migrate database

$ cd ltinstance_dirgt$ python managepy migrate auth$ python managepy migrate admin 0001 --fake$ python managepy migrate admin$ python managepy migrate limits 0001 --fake$ python managepy migrate relaydomains 0001 --fake$ python managepy migrate

4 Finally update static files

$ python managepy collectstatic

This version also introduces a REST API To enable it

1 Add rest_frameworkauthtoken to the INSTALLED_APPS variable

2 Add the following configuration inside settingspy

38 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Rest framework settings

REST_FRAMEWORK = DEFAULT_AUTHENTICATION_CLASSES (

rest_frameworkauthenticationTokenAuthentication)DEFAULT_PERMISSION_CLASSES (

rest_frameworkpermissionsIsAuthenticated)

3 Run the following command

$ python managepy migrate

135

To enhance security Modoboa now checks the strength of user passwords lthttpsgithubcomdstufftdjango-passwordsgt_

To use this feature add the following configuration into the settingspy file

django-passwords

PASSWORD_MIN_LENGTH = 8

PASSWORD_COMPLEXITY = UPPER 1LOWER 1DIGITS 1

132

Modoboa now uses the atomic requests mode to preserve database consistency (reference)

To enable it update the DATABASES variable in settingspy as follows

DATABASES = default

stuff beforeATOMIC_REQUESTS True

amavis

stuff beforeATOMIC_REQUESTS True

130

This release does not bring awesome new features but it is a necessary bridge to the future of Modoboa All extensionsnow have their own git repository and the deploy process has been updated to reflect this change

22 Upgrade 39

Modoboa Documentation Release 1100

Another important update is the use of Django 17 Besides its new features the migration system has been reworkedand is now more robust than before

Before we begin with the procedure here is a table showing old extension names and their new name

Old name New package name New module namemodoboaextensionsadmin modoboa-admin modoboa_adminmodoboaextensionslimits modoboa-admin-limits modoboa_admin_limitsmodoboaextensionspostfix_autoreply modoboa-postfix-autoreply modoboa_postfix_autoreplymodoboaextensionspostfix_relay_domains modoboa-admin-relaydomains modoboa_admin_relaydomainsmodoboaextensionsradicale modoboa-radicale modoboa_radicalemodoboaextensionssievefilters modoboa-sievefilters modoboa_sievefiltersmodoboaextensionsstats modoboa-stats modoboa_statsmodoboaextensionswebmail modoboa-webmail modoboa_webmail

Here are the required steps

1 Install the extensions using pip (look at the second column in the table above)

$ pip install ltthe extensions you wantgt

2 Remove south from INSTALLED_APPS

3 Rename old extension names inside MODOBOA_APPS (look at the third column in the table above)

4 Remove modoboalibmiddlewareExtControlMiddleware from MIDDLEWARE_CLASSES

5 Change DATABASE_ROUTERS to

DATABASE_ROUTERS = [modoboa_amavisdbrouterAmavisRouter]

6 Run the following commands

$ cd ltmodoboa_instance_dirgt$ python managepy migrate

7 Reply yes to the question

8 Run the following commands

$ python managepy load_initial_data$ python managepy collectstatic

9 The cleanup job has been renamed in Django so you have to modify your crontab entry

- 0 0 ltmodoboa_sitegtmanagepy cleanup+ 0 0 ltmodoboa_sitegtmanagepy clearsessions

120

A new notification service let administrators know about new Modoboa versions To activate it you need to updatethe TEMPLATE_CONTEXT_PROCESSORS variable like this

from djangoconf import global_settings

TEMPLATE_CONTEXT_PROCESSORS = global_settingsTEMPLATE_CONTEXT_PROCESSORS + (

(continues on next page)

40 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

modoboacorecontext_processorstop_notifications)

and to define the new MODOBOA_API_URL variable

MODOBOA_API_URL = httpapimodoboaorg1

The location of external static files has changed To use them add a new path to the STATICFILES_DIRS

Additional locations of static filesSTATICFILES_DIRS = (

Put strings here like homehtmlstatic or Cwwwdjangostatic Always use forward slashes even on Windows Dont forget to use absolute paths not relative pathsltpathtomodoboainstalldirgtbower_components

)

Run the following commands to define the hostname of your instance

$ cd ltmodoboa_instance_dirgt$ python managepy set_default_site lthostnamegt

If you plan to use the Radicale extension

1 Add modoboaextensionsradicale to the MODOBOA_APPS variable

2 Run the following commands

$ cd ltmodoboa_instance_dirgt$ python managepy syncdb

Warning You also have to note that the sitestatic directory has moved from ltpath to your sitesdirgt to ltmodoboas root urlgt (itrsquos probably the parent directory) You have to adapt your web serverconfiguration to reflect this change

23 Configuration

231 Online parameters

Modoboa provides online panels to modify internal parameters There are two available levels

bull Application level global parameters define how the application behaves Available at Modoboa gt Parameters

bull User level per user customization Available at User gt Settings gt Preferences

Regardless level parameters are displayed using tabs each tab corresponding to one application

General parameters

The admin application exposes several parameters they are presented below

23 Configuration 41

Modoboa Documentation Release 1100

Name Tab Description Default valueAuthentication type General The backend used for au-

thenticationLocal

Default password scheme General Scheme used to cryptmailbox passwords

crypt

Rounds General Number of rounds (onlyused by sha256cryptand sha512crypt) Mustbe between 1000 and999999999 inclusive

70000

Secret key General A key used to encryptusersrsquo password in ses-sions

random value

Sender address General Email address used tosend notifications

Enable communication General Enable communicationwith Modoboa public API

yes

Check new versions General Automatically checks if anewer version is available

yes

Send statistics General Send statistics to Mod-oboa public API (countersand used extensions)

yes

Top notifications check in-terval

General Interval between two topnotification checks (inseconds)

30

Maximum log record age General The maximum age in daysof a log record

365

Items per page General Number of displayeditems per page

30

Default top redirection General The default redirectionused when no applicationis specified

userprefs

Enable MX checks Admin Check that every domainhas a valid MX record

yes

Valid MXs Admin A list of IP or networkaddress every MX shouldmatch A warning will besent if a record does notrespect this it

Enable DNSBL checks Admin Check every domainagainst major DNSBLproviders

yes

DKIM keys storage direc-tory

AdminPath to a directory where DKIM

generated keys willbe stored

Default DKIM key length Admin The default size (in bits)for new keys

2048

Handle mailboxes onfilesystem

Admin Rename or remove mail-boxes on the filesystemwhen they get renamed orremoved within Modoboa

no

Mailboxes owner Admin The UNIX account whoowns mailboxes on thefilesystem

vmail

Default domain quota Admin Default quota (in MB) ap-plied to freshly createddomains with no valuespecified A value of 0means no quota

0

Automatic accountremoval

Admin When a mailbox is re-moved also remove theassociated account

no

Automatic do-mainmailbox creation

Admin Create a domain and amailbox when an accountis automatically created

yes

42 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Note If you are not familiar with virtual domain hosting you should take a look at postfixrsquos documentation ThisHow to also contains useful information

Note A random secret key will be generated each time the Parameters page is refreshed and until you save parametersat least once

Note Specific LDAP parameters are also available see LDAP authentication

232 Media files

Modoboa uses a specific directory to upload files (ie when the webmail is in use) or to create ones (ex graphical statis-tics) This directory is named media and is located inside modoboarsquos installation directory (called modoboa_sitein this documentation)

To work properly the system user which runs modoboa (www-data apache whatever) must have write access tothis directory

233 Customization

Custom logo

You have the possibility to use a custom logo instead of the default one on the login page

To do so open the settingspy file and add a MODOBOA_CUSTOM_LOGO variable This variable must containthe relative URL of your logo under MEDIA_URL For example

MODOBOA_CUSTOM_LOGO = ospathjoin(MEDIA_URL custom_logopng)

Then copy your logo file into the directory indicated by MEDIA_ROOT

234 Host configuration

Note This section is only relevant when Modoboa handles mailboxes renaming and removal from the filesystem

To manipulate mailboxes on the filesystem you must allow the user who runs Modoboa to execute commands as theuser who owns mailboxes

To do so edit the etcsudoers file and add the following inside

ltuser_that_runs_modoboagt ALL=(ltmailboxes ownergt) NOPASSWD ALL

Replace values between ltgt by the ones you use

23 Configuration 43

Modoboa Documentation Release 1100

235 Time zone and language

Modoboa is available in many languages

To specify the default language to use edit the settingspy file and modify the LANGUAGE_CODE variable

LANGUAGE_CODE = fr or en for english etc

Note Each user has the possibility to define the language he prefers

In the same configuration file specify the timezone to use by modifying the TIME_ZONE variable For example

TIME_ZONE = EuropeParis

236 Sessions management

Modoboa uses Djangorsquos session framework to store per-user information

Few parameters need to be set in the settingspy configuration file to make Modoboa behave as expected

SESSION_EXPIRE_AT_BROWSER_CLOSE = False Default value

This parameter is optional but you must ensure it is set to False (the default value)

The default configuration file provided by the modoboa-adminpy command is properly configured

237 Logging authentication

To trace login attempts to the web interface Modoboa uses python SysLogHandler so you can see them in your syslogauthentication log file (varlogauthlog in most cases)

Depending on your configuration you may have to edit the settingspy file and add lsquoaddressrsquo lsquodevlogrsquo to thelogging section

syslog-auth class logginghandlersSysLogHandlerfacility SysLogHandlerLOG_AUTHaddress devlogformatter syslog

238 External authentication

LDAP

Modoboa supports external LDAP authentication using the following extra components

bull Python LDAP client

bull Django LDAP authentication backend

If you want to use this feature you must first install those components

44 Chapter 2 Table of contents

Modoboa Documentation Release 1100

$ pip install python-ldap django-auth-ldap

Then all you have to do is to modify the settingspy file Add a new authentication backend to the AUTHENTI-CATION_BACKENDS variable like this

AUTHENTICATION_BACKENDS = (modoboalibauthbackendsLDAPBackend modoboalibauthbackendsLDAPSecondaryBackend Useful for a fallback

rarr˓mechanismdjangocontribauthbackendsModelBackend

)

Finally go to Modoboa gt Parameters gt General and set Authentication type to LDAP

From there new parameters will appear to let you configure the way Modoboa should connect to your LDAP serverThey are described just below

Name Description De-faultvalue

Server address The IP address of the DNS name of the LDAP server local-host

Server port The TCP port number used by the LDAP server 389Use a secureconnection

Use an SSLTLS connection to access the LDAP server no

Authenticationmethod

Choose the authentication method to use Directbind

User DN tem-plate (directbind mode)

The template used to construct a userrsquos DN It should contain one placeholder (ie(user)s)

Bind BN The distinguished name to use when binding to the LDAP server Leave empty for ananonymous bind

Bind password The password to use when binding to the LDAP server (with lsquoBind DNrsquo)Search base The distinguished name of the search baseSearch filter An optional filter string (eg lsquo(objectClass=person)rsquo) In order to be valid it must be

enclosed in parentheses(mail=(user)s)

Passwordattribute

The attribute used to store user passwords user-Pass-word

Active Direc-tory

Tell if the LDAP server is an Active Directory one no

Administratorgroups

Members of those LDAP Posix groups will be created ad domain administrators Uselsquorsquo characters to separate groups

Group type The type of group used by your LDAP directory Posix-Group

Groups searchbase

The distinguished name of the search base used to find groups

Do-mainmailboxcreation

Automatically create a domain and a mailbox when a new user is created just after thefirst successful authentication You will generally want to disable this feature whenthe relay domains extension is in use

yes

If you need additional parameters you will find a detailed documentation here

Once the authentication is properly configured the users defined in your LDAP directory will be able to connect to

23 Configuration 45

Modoboa Documentation Release 1100

Modoboa the associated domain and mailboxes will be automatically created if needed

The first time a user connects to Modoboa a local account is created if the LDAP username is a valid email addressBy default this account belongs to the SimpleUsers group and it has a mailbox

To automatically create domain administrators you can use the Administrator groups setting If a LDAP user belongsto one the listed groups its local account will belong to the DomainAdmins group In this case the username is notnecessarily an email address

Users will also be able to update their LDAP password directly from Modoboa

Note Modoboa doesnrsquot provide any synchronization mechanism once a user is registered into the database Anymodification done from the directory to a user account will not be reported to Modoboa (an email address change forexample) Currently the only solution is to manually delete the Modoboa record it will be recreated on the next userlogin

SMTP

It is possible to use an existing SMTP server as an authentication source To enable this feature edit the settingspy file and change the following setting

AUTHENTICATION_BACKENDS = (modoboalibauthbackendsSMTPBackenddjangocontribauthbackendsModelBackend

)

SMTP server location can be customized using the following settings

AUTH_SMTP_SERVER_ADDRESS = localhostAUTH_SMTP_SERVER_PORT = 25AUTH_SMTP_SECURED_MODE = None ssl or starttls are accepted

239 LDAP synchronization

Modoboa can synchronize accounts with an LDAP directory (tested with OpenLDAP) but this feature is not enabledby default To activate it add modoboaldapsync to MODOBOA_APPS in the settingspy file

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboaldapsync

)

and enable it from the admin panel

46 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning Make sure to install additional requirements otherwise it wonrsquot work

The following parameters are available and must be filled

Name Description Defaultvalue

Enable LDAP synchro-nization

Control LDAP synchronization state no

Bind DN The DN of a user with write permission to createupdate accountsBind password The associated passwordAccount DN template The template used to build account DNs (must contain a (user)s

placeholder

2310 Database maintenance

Cleaning the logs table

Modoboa logs administrator specific actions into the database A clean-up script is provided to automatically removeoldest records The maximum log record age can be configured through the online panel

To use it you can setup a cron job to run every night

0 0 ltmodoboa_sitegtmanagepy cleanlogs Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy cleanlogs

Cleaning the session table

Django does not provide automatic purging Therefore itrsquos your job to purge expired sessions on a regular basis

Django provides a sample clean-up script django-adminpy clearsessions That script deletes any sessionin the session table whose expire_date is in the past

For example you could setup a cron job to run this script every night

0 0 ltmodoboa_sitegtmanagepy clearsessions Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy clearsessions

Cleaning inactive accounts

Thanks to Last-login tracking it is now possible to monitor inactive accounts An account is considered inactive if nologin has been recorded for the last 30 days (this value can be changed through the admin panel)

A management command is available to disable or delete inactive accounts For example you could setup a cron jobto run it every night

23 Configuration 47

Modoboa Documentation Release 1100

0 0 ltmodoboa_sitegtmanagepy clean_inactive_accounts Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy clean_inactive_rarr˓accounts

The default behaviour is to disable accounts You can delete them using the --delete option

24 Moving to Modoboa

You have an existing platform and yoursquod like to move to Modoboa the following tools could help you

241 From postfixadmin

A dedicated command allows you to convert an existing postfixadmin database to a Modoboa one Consult the docu-mentation to know more about the process

242 Using CSV files

Modoboa allows you to import any object (domain domain alias mailbox and alias) using a simple CSV file encodedusing UTF8 Each line corresponds to a single object and must respect one of the following format

domain ltname stringgt ltquota integergt ltdefault mailbox quota integergt ltenabledrarr˓booleangtdomainalias ltname stringgt lttargeted domain stringgt ltenabled booleangtrelaydomain ltname stringgt lttarget host stringgt lttarget port integergt ltservicerarr˓stringgt ltenabled booleangt ltverify recipients booleangtaccount ltloginname stringgt ltpassword stringgt ltfirst name stringgt ltlast namerarr˓stringgt ltenabled booleangt ltgroup stringgt ltaddress stringgt ltquota integergt [rarr˓ltdomain stringgt ]alias ltaddress stringgt ltenabled booleangt ltrecipient stringgt

Boolean fields accept the following values true 1 yes y (case insensitive) Any other value will be evaluated asfalse

Warning The order does matter Objects are created sequencially so a domain must be created before itsmailboxes and aliases and a mailbox must created before its alias(es)

To actually import such a file

gt sudo -u ltmodoboa_usergt -igt source ltvirtualenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy modo import ltyour filegt

Available options can be listed using the following command

gt python managepy modo import -h

48 Chapter 2 Table of contents

Modoboa Documentation Release 1100

25 REST API

To ease the integration with external sources (software or other) Modoboa provides a REST API

Every installed instance comes with a ready-to-use API and a documentation You will find them using the followingurl patterns

bull API httplthostnamegtapiv1

bull Documentation httplthostnamegtdocsapi

An example of this documentation is available on the official demo

Using this API requires an authentication and for now only a token based authentication is supported To get a validtoken log-in to your instance with a super administrator go to Settings gt API and activate the API access Press theUpdate button and wait until the page is reloaded the token will be displayed

To make valid API calls every requests you send must embed this token within an Authorization HTTP header likethis

Authorization Token ltYOUR_TOKENgt

and the content type of those requests must be applicationjson

26 How to contribute

Contributions are always welcome If you want to submit a patch please respect the following rules

bull Open a pull request on the appropriate repository

bull Respect PEP8

bull Document your patch and respect PEP 257

bull Add unit tests and make sure the global coverage does not decrease

If all those steps are validated your contribution will generally be integrated

261 Table of contents

25 REST API 49

Modoboa Documentation Release 1100

Useful tips

You would like to work on Modoboa but you donrsquot know where to start Yoursquore at the right place Browse this pageto learn useful tips

Docker

A docker image is available for developers To use it you must install docker and docker-compose first

Then just run the following command

$ docker-compose up

It will start the docker environment and make a Modoboa instance available at httplocalhost8000

If you donrsquot want to use docker or need a more complex development setup go to the next section

Prepare a virtual environment

A virtual environment is a good way to setup a development environment on your machine

To do so run the following commands

$ python3 -m venv ltpathgt$ source ltpathgtbinactivate$ git clone httpsgithubcommodoboamodoboagit$ cd modoboa$ python setuppy develop$ pip install -r dev-requirementstxt

The develop command creates a symbolic link to your local copy so any modification you make will be automati-cally available in your environment no need to copy them

Deploy an instance for development

Warning Make sure to create a database before running this step The format of the database url is also describedin this page

Now that you have a running environment yoursquore ready to deploy a test instance

$ cd ltpathgt$ modoboa-adminpy deploy --dburl defaultltdatabase urlgt --domain localhost --develrarr˓instance$ python managepy runserver

Yoursquore ready to go You should be able to access Modoboa at httplocalhost8000 usingadminpassword as credentials

Manage static files

Modoboa uses bower (thanks to django-bower) to manage its CSS and javascript dependencies

50 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Those dependencies are listed in a file called dev_settingspy located inside the ltpath_to_local_copygtmodoboacore directory

If you want to add a new dependency just complete the BOWER_INSTALLED_APPS parameter and run the followingcommand

$ python managepy bower install

It will download and store the required files into the ltpath_to_local_copygtmodoboabower_components directory

Test your modifications

If you deployed a specific instance for your development needs you can run the tests suite as follows

gt python managepy test modoboacore modoboalib modoboaadmin modoboalimits modoboararr˓relaydomains

Otherwise you can run the tests suite from the repository using tox

Start a basic Modoboa instance

From the repository run the following command to launch a simple instance with a few fixtures

gt tox -e serve

You can use adminpassword to log in

Build the documentation

If you need to modify the documenation and want to see the result you can build it as follows

gt tox -e docgt firefox toxdoctmphtmlindexhtml

FAQ

bower command is missing in managepy

bower command is missing in managepy if you donrsquot use the --devel option of the modoboa-adminpydeploy command

To fix it regenerate your instance or update your settingspy file manually Look at devmode in httpsgithubcomtonioomodoboablobmastermodoboacorecommandstemplatessettingspytpl

Create a new plugin

Introduction

Modoboa offers a plugin API to expand its capabilities The current implementation provides the following possibili-ties

26 How to contribute 51

Modoboa Documentation Release 1100

bull Expand navigation by adding entry points to your plugin inside the GUI

bull Access and modify administrative objects (domains mailboxes etc)

bull Register callback actions for specific events

Plugins are nothing more than Django applications with an extra piece of code that integrates them into Modoboa Themodo_extensionpy file will contain a complete description of the plugin

bull Admin and user parameters

bull Custom menu entries

The communication between both applications is provided by Django signals

The following subsections describe the plugin architecture and explain how you can create your own

The required glue

To create a new plugin just start a new django application like this (into Modoboarsquos directory)

$ python managepy startapp

Then you need to register this application using the provided API Just copypaste the following example into themodo_extensionpy file of the future extension

from modoboacoreextensions import ModoExtension exts_pool

class MyExtension(ModoExtension)My custom Modoboa extension

name = myextlabel = My Extensionversion = 01description = A descriptionurl = myext_root_location optional name is used if not defined

def load(self)This method is called when Modoboa loads available and activated plugins

Declare parameters and register events herepass

def load_initial_data(self)Optional provide initial data for your extension herepass

exts_poolregister_extension(MyExtension)

Once done simply add your extensionrsquos module name to the MODOBOA_APPS variable located inside settingspy Finally run the following commands

$ python managepy migrate$ python managepy load_initial_data$ python managepy collectstatic

52 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Parameters

A plugin can declare its own parameters There are two levels available

bull lsquoGlobalrsquo parameters used to configure the plugin editable inside the Admin gt Settings gt Parameters page

bull lsquoUserrsquo parameters per-user parameters (or preferences) editable inside the Options gt Preferences page

Playing with parameters

Parameters are defined using Django forms and Modoboa adds two special forms you can inherit depending on thelevel of parameter(s) you want to add

bull modoboaparametersformsAdminParametersForm for general parameters

bull modoboaparametersformsUserParametersForm for user parameters

To register new parameters add the following line into the load method of your plugin class

from modoboaparameters import tools as param_toolsparam_toolsregistryadd(

LEVEL YourForm ugettext_lazy(Title))

Replace LEVEL by global or user

Custom role permissions

Modoboa uses Djangorsquos internal permission system Administrative roles are nothing more than groups (Groupinstances)

An extension can add new permissions to a group by listening to the extra_role_permissions signal Here isan example

from djangodispatch import receiverfrom modoboacore import signals as core_signals

PERMISSIONS = Resellers [

(relaydomains relaydomain add_relaydomain)(relaydomains relaydomain change_relaydomain)(relaydomains relaydomain delete_relaydomain)(relaydomains service add_service)(relaydomains service change_service)(relaydomains service delete_service)

]

receiver(core_signalsextra_role_permissions)def extra_role_permissions(sender role kwargs)

Add permissions to the Resellers groupreturn constantsPERMISSIONSget(role [])

Extending admin forms

The forms used to edit objects (account domain etc) through the admin panel are composed of tabs You can extendthem (ie add new tabs) in a pretty easy way thanks to custom signals

26 How to contribute 53

Modoboa Documentation Release 1100

Account

To add a new tab to the account edition form define new listeners (handlers) for the following signals

bull modoboaadminsignalsextra_account_forms

bull modoboaadminsignalsget_account_form_instances

bull modoboaadminsignalscheck_extra_account_form (optional)

Example

from djangodispatch import receiverfrom modoboaadmin import signals as admin_signals

receiver(admin_signalsextra_account_forms)def extra_account_form(sender user account kwargs)

return [id tabid title Title cls MyFormClass

]

receiver(admin_signalsget_account_form_instances)def fill_my_tab(sender user account kwargs)

return id my_instance

Domain

To add a new tab to the domain edition form define new listeners (handlers) for the following signals

bull modoboaadminsignalsextra_domain_forms

bull modoboaadminsignalsget_domain_form_instances

Example

from djangodispatch import receiverfrom modoboaadmin import signals as admin_signals

receiver(admin_signalsextra_domain_forms)def extra_account_form(sender user domain kwargs)

return [id tabid title Title cls MyFormClass

]

receiver(admin_signalsget_domain_form_instances)def fill_my_tab(sender user domain kwargs)

return id my_instance

27 Contributors

bull Antidot

bull Bearstech

bull CAP-REL

54 Chapter 2 Table of contents

Modoboa Documentation Release 1100

bull Dalnix

27 Contributors 55

  • Overview
  • Table of contents
Page 17: Modoboa Documentation

Modoboa Documentation Release 1100

The plugins directive should be turned on if you use a uwsgi installation that requires it If uwsgi was installed frompip it does not require it In the configuration above

ltmodoboas top dirgt The directory where managepy resides This directory is the parent of ltmodoboassettings dirgt

ltnamegt The name that you passed to modoboa-adminpy deploy when you created your Modoboa instance

Now you can go the Dovecot section to continue the installation

Dovecot

Modoboa requires Dovecot 2+ to work so the following documentation is suitable for this combination

In this section we assume dovecotrsquos configuration resides in etcdovecot all pathes will be relative to thisdirectory

Mailboxes

First edit the confd10-mailconf and set the mail_location variable

maildirmail_location = maildir~maildir

Then edit the inbox namespace and add the following lines

inbox = yes

mailbox Drafts auto = subscribespecial_use = Drafts

mailbox Junk

auto = subscribespecial_use = Junk

mailbox Sent

auto = subscribespecial_use = Sent

mailbox Trash

auto = subscribespecial_use = Trash

With dovecot 21+ it ensures all the special mailboxes will be automaticaly created for new accounts

For dovecot 20 and older use the autocreate plugin

Operations on the file system

14 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning Modoboa needs to access the dovecot binary to check its version To find the binary path weuse the which command first and then try known locations (usrsbindovecot and usrlocalsbindovecot) If you installed dovecot in a custom location please tell us where the binary is by usingthe DOVECOT_LOOKUP_PATH setting (see settingspy)

Three operation types are considered

1 Mailbox creation

2 Mailbox renaming

3 Mailbox deletion

The first one is managed by Dovecot The last two ones may be managed by Modoboa if it can access the file systemwhere the mailboxes are stored (see General parameters to activate this feature)

Those operations are treated asynchronously by a cron script For example when you rename an e-mail addressthrough the web UI the associated mailbox on the file system is not modified directly Instead of that a renameorder is created for this mailbox The mailbox will be considered unavailable until the order is executed (see Postfixconfiguration)

Edit the crontab of the user who owns the mailboxes on the file system

$ crontab -u ltusergt -e

And add the following line inside

python ltmodoboa_sitegtmanagepy handle_mailbox_operations

Warning The cron script must be executed by the system user owning the mailboxes

Warning The user running the cron script must have access to the settingspy file of the modoboa instance

The result of each order is recorded into Modoboarsquos log Go to Modoboa gt Logs to consult them

Authentication

To make the authentication work edit the confd10-authconf and uncomment the following line at the end

include auth-systemconfextinclude auth-sqlconfextinclude auth-ldapconfextinclude auth-passwdfileconfextinclude auth-checkpasswordconfextinclude auth-vpopmailconfextinclude auth-staticconfext

Then edit the confdauth-sqlconfext file and add the following content inside

passdb sql driver = sql Path for SQL configuration file see example-configdovecot-sqlconfext

(continues on next page)

21 Installation 15

Modoboa Documentation Release 1100

(continued from previous page)

args = etcdovecotdovecot-sqlconfext

userdb sql driver = sqlargs = etcdovecotdovecot-sqlconfext

Make sure to activate only one backend (per type) inside your configuration (just comment the other ones)

Edit the dovecot-sqlconfext and modify the configuration according to your database engine

MySQL users

driver = mysql

connect = host=ltmysqld socketgt dbname=ltdatabasegt user=ltusergt password=ltpasswordgt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user WHERE email=Lu andrarr˓is_active=1

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid concat(bytes= mbquota M) AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

PostgreSQL users

driver = pgsql

connect = host=ltpostgres socketgt dbname=ltdatabasegt user=ltusergt password=ltpasswordgt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user u INNER JOIN admin_rarr˓mailbox mb ON uid=mbuser_id INNER JOIN admin_domain dom ON mbdomain_id=domidrarr˓WHERE uemail=Lu AND uis_active AND domenabled

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid bytes= || mbquota || M AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

16 Chapter 2 Table of contents

Modoboa Documentation Release 1100

SQLite users

driver = sqlite

connect = ltpath to the sqlite db filegt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user u INNER JOIN admin_rarr˓mailbox mb ON uid=mbuser_id INNER JOIN admin_domain dom ON mbdomain_id=domidrarr˓WHERE uemail=Lu AND uis_active=1 AND domenabled=1

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid (bytes= || mbquota || M) AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

Note Replace values between ltgt with yours

LDAP

To make the LDAP authentication work edit the confd10-authconf and uncomment the following line atthe end

include auth-ldapconfext

Then edit the confdauth-ldapconfext and edit the passdb section as following You should comment theuserdb section which will be managed by SQL with modoboa database

passdb driver = ldap

Path for LDAP configuration file see example-configdovecot-ldapconfextargs = etcdovecotdovecot-ldapconfext

userdb driver = ldapargs = etcdovecotdovecot-ldapconfext

Default fields can be used to specify defaults that LDAP may overridedefault_fields = home=homevirtualu

Your own dovecot LDAP configuration file is now etcdovecotdovecot-ldapconfext You can addyour default LDAP conf in it following the official documentation

Synchronize dovecot LDAP conf with modoboa LDAP conf

To make dovecot LDAP configuration synchronized with modoboa LDAP configuration you should create a dedicateddovecot conf file At the end of your dovecot configuration file (dovecot-ldapconfext) add the following

21 Installation 17

Modoboa Documentation Release 1100

line

include_try dovecot-modoboaconfext

Then set modoboa parameter Enable Dovecot LDAP sync to Yes Then set the Dovecot LDAP config file following theprevious step (etcdovecotdovecot-modoboaconfext in the example)

The last step is to add the command update_dovecot_conf to the cron job of modoboa Then each time your modoboaLDAP configuration is updated your dovecot LDAP configuration will also be

LMTP

Local Mail Transport Protocol is used to let Postfix deliver messages to Dovecot

First make sure the protocol is activated by looking at the protocols setting (generally inside dovecotconf)It should be similar to the following example

protocols = imap pop3 lmtp

Then open the confd10-masterconf look for lmtp service definition and add the following content inside

service lmtp stuff beforeunix_listener varspoolpostfixprivatedovecot-lmtp mode = 0600user = postfixgroup = postfix

stuff after

We assume here that Postfix is chrooted within varspoolpostfix

Finally open the confd20-lmtpconf and modify it as follows

protocol lmtp postmaster_address = postmasterltdomaingtmail_plugins = $mail_plugins quota sieve

Replace ltdomaingt by the appropriate value

Note If you donrsquot plan to apply quota or to use filters just adapt the content of the mail_plugins setting

Quota

Modoboa lets adminstrators define per-domain andor per-account limits (quota) It also lists the current quota usageof each account Those features require Dovecot to be configured in a specific way

Inside confd10-mailconf add the quota plugin to the default activated ones

mail_plugins = quota

Inside confd10-masterconf update the dict service to set proper permissions

18 Chapter 2 Table of contents

Modoboa Documentation Release 1100

service dict If dict proxy is used mail processes should have access to its socket For example mode=0660 group=vmail and global mail_access_groups=vmailunix_listener dict mode = 0600user = ltuser owning mailboxesgtgroup =

Inside confd20-imapconf activate the imap_quota plugin

protocol imap

mail_plugins = $mail_plugins imap_quota

Inside dovecotconf activate the quota SQL dictionary backend

dict quota = ltdrivergtetcdovecotdovecot-dict-sqlconfext

Inside confd90-quotaconf activate the quota dictionary backend

plugin quota = dictUser quotaproxyquota

It will tell Dovecot to keep quota usage in the SQL dictionary

Finally edit the dovecot-dict-sqlconfext file and put the following content inside

connect = host=ltdb hostgt dbname=ltdb namegt user=ltdb usergt password=ltpasswordgt SQLite users connect = pathtothedatabasedb

map pattern = privquotastoragetable = admin_quotausername_field = usernamevalue_field = bytes

map

pattern = privquotamessagestable = admin_quotausername_field = usernamevalue_field = messages

PostgreSQL users

21 Installation 19

Modoboa Documentation Release 1100

Database schema update

The admin_quota table is created by Django but unfortunately it doesnrsquot support DEFAULT constraints (it onlysimulates them when the ORM is used) As PostgreSQL is a bit strict about constraint violations you must executethe following query manually

db=gt ALTER TABLE admin_quota ALTER COLUMN bytes SET DEFAULT 0db=gt ALTER TABLE admin_quota ALTER COLUMN messages SET DEFAULT 0

Trigger

As indicated on Dovecotrsquos wiki you need a trigger to properly update the quota

A working copy of this trigger is available on Github

Download this file and copy it on the server running postgres Then execute the following commands

$ su - postgres$ psql [modoboa database] lt pathtomodoboa_postgres_triggersql$ exit

Replace [modoboa database] by the appropriate value

Forcing recalculation

For existing installations Dovecot (gt 2) offers a command to recalculate the current quota usages For example if youwant to update all usages run the following command

$ doveadm quota recalc -A

Be carefull it can take a while to execute

ManageSieveSieve

Modoboa lets users define filtering rules from the web interface To do so it requires ManageSieve to be activated onyour server

Inside confd20-managesieveconf make sure the following lines are uncommented

protocols = $protocols sieve

service managesieve-login

service managesieve

protocol sieve

20 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Messages filtering using Sieve is done by the LDA

Inside confd15-ldaconf activate the sieve plugin like this

protocol lda Space separated list of plugins to load (default is global mail_plugins)mail_plugins = $mail_plugins sieve

Finally configure the sieve plugin by editing the confd90-sieveconf file Put the follwing caontent inside

plugin Location of the active script When ManageSieve is used this is actually a symlink pointing to the active script in the sieve storage directorysieve = ~dovecotsieve

The path to the directory where the personal Sieve scripts are stored For ManageSieve this is where the uploaded scripts are storedsieve_dir = ~sieve

Restart Dovecot

Now you can go to the Postfix section to finish the installation

Last-login tracking

To update the last_login attribute of an account after a succesful IMAP or POP3 login you can configure apost-login script

Open confd10-masterconf add the following configuration (imap and pop3 services are already definedyou just need to update them)

service imap executable = imap postlogin

service pop3 executable = pop3 postlogin

service postlogin executable = script-login usrlocalbinpostloginshuser = modoboaunix_listener postlogin

Then you must create a script named usrlocalbinpostloginsh According to your database enginethe content will differ

PostgreSQL

21 Installation 21

Modoboa Documentation Release 1100

binsh

psql -c UPDATE core_user SET last_login=now() WHERE username=$USER gt devnull

exec $

MySQL

binsh

DBNAME=XXXDBUSER=XXXDBPASSWORD=XXX

echo UPDATE core_user SET last_login=now() WHERE username=$USER | mysql -urarr˓$DBUSER -p$DBPASSWORD $DBNAME

exec $

Postfix

This section gives an example about building a simple virtual hosting configuration with Postfix Refer to the officialdocumentation for more explanation

Map files

You first need to create configuration files (or map files) that will be used by Postfix to lookup into Modoboa tables

To automaticaly generate the requested map files and store them in a directory run the following command

gt cd ltmodoboa_instance_pathgtgt python managepy generate_postfix_maps --destdir ltdirectorygt

ltdirectorygt is the directory where the files will be stored Answer the few questions and yoursquore done

Configuration

Use the following configuration in the etcpostfixmaincf file (this is just one possible configuration)

Stuff beforevirtual_transport = lmtpunixprivatedovecot-lmtp

virtual_mailbox_domains = ltdrivergtetcpostfixsql-domainscfvirtual_alias_domains = ltdrivergtetcpostfixsql-domain-aliasescfvirtual_alias_maps = ltdrivergtetcpostfixsql-aliasescf

relay_domains = ltdrivergtetcpostfixsql-relaydomainscftransport_maps =

ltdrivergtetcpostfixsql-transportcfltdrivergtetcpostfixsql-spliteddomains-transportcf

(continues on next page)

22 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

smtpd_recipient_restrictions = check_recipient_access

ltdrivergtetcpostfixsql-maintaincfltdrivergtetcpostfixsql-relay-recipient-verificationcf

permit_mynetworksreject_unauth_destinationreject_unverified_recipient

smtpd_sender_login_maps = ltdrivergtetcpostfixsql-sender-login-mapcf

smtpd_sender_restrictions =reject_sender_login_mismatch

Stuff after

Replace ltdrivergt by the name of the database you use

Restart Postfix

Policy daemon

If you want to enable the built-in policy daemon add the following content to the etcpostfixmaincf file

smtpd_recipient_restrictions = check_policy_service inet1270019999

And reload postfix

Note The check_policy_service line must be placed before the permit_mynetworks one otherwise thedaemon wonrsquot be called

OpenDKIM

Modoboa can generate DKIM keys for the hosted domains but it wonrsquot sign or check messages To do that you needa dedicated software like OpenDKIM

Note The cron job in charge of creating DKIM keys must be run using the same user than OpenDKIM (ie opendkimin most cases)

Database

Since keys related information is stored in Modoboarsquos database you need to tell OpenDKIM how it can access it

First make sure to install the required additional packages on your system (libopendbx1- on debian baseddistributions or opendbx- on CentOS the complete name depends on your database engine)

Then insert the following SQL view into Modoboarsquos database

21 Installation 23

Modoboa Documentation Release 1100

PostgreSQL

CREATE OR REPLACE VIEW dkim AS (SELECT id name as domain_name dkim_private_key_path AS private_key_path

dkim_key_selector AS selectorFROM admin_domain WHERE enable_dkim

)

MySQLMariaDB

CREATE OR REPLACE VIEW dkim AS (SELECT id name as domain_name dkim_private_key_path AS private_key_path

dkim_key_selector AS selectorFROM admin_domain WHERE enable_dkim=1

)

Configuration

You should find OpenDKIMrsquos configuration file at etcopendkimconf

Add the following content to it

KeyTable dsnltdrivergtltusergtltpasswordgtltdb hostgtltdb namegttable=dkimrarr˓keycol=iddatacol=domain_nameselectorprivate_key_pathSigningTable dsnltdrivergtltusergtltpasswordgtltdb hostgtltdb namegttable=dkimrarr˓keycol=domain_namedatacol=idSocket inet12345localhost

Replace values between ltgt by yours Accepted values for driver are pgsql or mysql Make sure the user youspecify has read permission on the view created previously

If you run a debian based system make sure to adjust the following setting in the etcdefaultopendkim file

SOCKET=inet12345localhost

Eventually reload OpenDKIM

Postfix integration

Add the following lines to the etcpostfixmaincf file

smtpd_milters = inet12700112345non_smtpd_milters = inet12700112345milter_default_action = acceptmilter_content_timeout = 30s

and reload postfix

Extensions

Only few commands are needed to add a new extension to your setup

24 Chapter 2 Table of contents

Modoboa Documentation Release 1100

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install ltEXTENSIONgt==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Then restart your web server

22 Upgrade

221 Modoboa

Warning The new version you are going to install may need to modify your database Before you start makesure to backup everything

Most of the time upgrading your installation to a newer Modoboa version only requires a few actions In every caseyou will need to apply the general procedure first and then check if the version you are installing requires specificactions

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install modoboa==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Once done check if the version you are installing requires Specific instructions

Finally restart your web server

Sometimes you might need to upgrade postfix map files too To do so just run the generate_postfix_mapscommand on the same directory than the one used for installation (etcpostfix by default)

Make sure to use root privileges and run the following command

gt python managepy generate_postfix_maps --destdir ltdirectorygt

Then reload postfix

22 Upgrade 25

Modoboa Documentation Release 1100

222 Extensions

If a new version is available for an extension yoursquore using it is recommanded to install it Upgrading an extensions ispretty and the procedure is almost the same than the one used for Modoboa

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install ltEXTENSIONgt==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Finally restart your web server

It is a generic upgrade procedure which will be enough most of the time but it is generally a good idea to check theassociated documentation

223 Rebuild Virtual Environment

Sometimes when upgrading your Operating System (eg from Ubuntu 1704 to Ubuntu 1710) your virtual environmentrunning modoboa can get corrupted Your first response will be to panic but fear not The solution is in this document

First things first

Recover your database password

You will need to recover your database password (if using mysql or postgresql) You will find this in etcpostfixsql-aliasescf or any file with sql-cf in the etcpostfix directory

Make note of this as you will need it when reconfiguring modoboa

Reinstall Modoboa

Start out by backup up your modoboa settings file located in the modoboa instance directory (srvmodoboainstanceinstancesettingspy if you used the default installer configuration) This contains your currentconfiguration

Next you want to remove all current modoboa files

After doing this follow the manual installation instructions for Modoboa only as everything should be working prop-erly

After this completes simply restore your backed up settings file to srvinstanceinstancesettingspy(if you used installer default configuration) You will then need to reinstall your extensions

You can find which plugins you had in your settingspy file under the MODOBOA_APPS variable

Instructions to install extensions can also be found here

Once you have completed this step you will need to run the following commands

26 Chapter 2 Table of contents

Modoboa Documentation Release 1100

gt (env) $ cd ltinstance_dirgtgt (env) $ python managepy migrategt (env) $ python managepy collectstatic

You will then see a message similar to

You have requested to collect static files at the destinationlocation as specified in your settings

srvmodoboainstancesitestatic

This will overwrite existing filesAre you sure you want to do this

Type yes to continue or no to cancel

You will want to answer yes here then simply restart the uwsgi process with service uwsgi restart andyou should be up and running again

Simply log into your modoboa web panel and verify that your extensions and webmail box is working

224 Information

Rebuild instructions from httpshelppythonanywherecompagesRebuildingVirtualenvs

225 Specific instructions

1160

A new policy daemon has been added

Make sure to have a Redis instance running on your server

Add modoboapolicyd to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboapolicyd

)

Add the following settings to your settingspy file

REDIS_HOST = ltIP or hostname heregtREDIS_PORT = 6379REDIS_QUOTA_DB = 0REDIS_URL = redisformat(REDIS_HOST REDIS_PORT REDIS_QUOTA_DB)

Once done you can start the policy daemon using the following commands

22 Upgrade 27

Modoboa Documentation Release 1100

gt python managepy policy_daemon

Donrsquot forget to configure _policyd_config if you want to use this feature

The modoboa-stats plugin has been merged into the core

Add modoboamaillog to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboapolicydmodoboamaillog

)

And remove any reference to modoboa_stats in this same variable

1150

This version drops Python 2 support so donrsquot forget to update all the extensions you use

Warning If you upgrade an existing python 2 installation you will need to create a new Python 3 virtualenvironment You can remove the existing virtual environment and replace it by the new one so you wonrsquot have tomodify your configuration files

Add the following new setting

DISABLE_DASHBOARD_EXTERNAL_QUERIES = False

Reload uwsgigunicornapache depending on your setup

Finally Make sure to use root privileges and run the following command

gt python managepy generate_postfix_maps --destdir ltdirectorygt

Then reload postfix

1140

This release introduces an optional LDAP synchronization process If you want to use it please follow the dedicatedprocedure

1131

Upgrade postfix maps files as follows

28 Chapter 2 Table of contents

Modoboa Documentation Release 1100

gt python managepy generate_postfix_maps --destdir ltpathgt --force-overwrite

1130

Add modoboadnstools to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstools

)

Add the following new settings

CSRF_COOKIE_SECURE = TrueSESSION_COOKIE_SECURE = True

modoboa-postfix-autoreply 150

Edit the etcpostfixmaincf file and remove the sql-autoreplies-transportcf map from thetransport_maps if present Remove the corresponding proxy_read_maps entry if relevant

Reload postfix

1100

Warning Upgrade installed extensions BEFORE running check or migrate commands

Upgrade all your installed plugins to the following versions

Warning If you use the amavis plugin make sure to include its configuration as follows into settingspy

from modoboa_amavis import settings as modoboa_amavis_settingsmodoboa_amavis_settingsapply(globals())

22 Upgrade 29

Modoboa Documentation Release 1100

Name Versionmodoboa-amavis 120modoboa-contacts 050modoboa-dmarc 110modoboa-imap-migration 120modoboa-pdfcredentials 130modoboa-postfix-autoreply 140modoboa-radicale 120modoboa-sievefilters 140modoboa-stats 140modoboa-webmail 140

Edit the settingspy file and apply the following modifications

Add modoboatransport to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparameters

)

Replace the following line

MIDDLEWARE_CLASSES = (

by

MIDDLEWARE = (

Update postfix map files as follows

gt rm -f ltpathgtmodoboa-postfix-mapschkgt python managepy generate_postfix_maps --force --destdir ltpathgt

Then modify postfixrsquos configuration as follows

smtpd_sender_login_maps =ltdrivergtltpathgtsql-sender-login-mapcf

transport_maps =ltdrivergtltpathgtsql-transportcfltdrivergtltpathgtsql-spliteddomains-transportcf other map files

Replace ltdrivergt and ltpathgt by your values

If transport_maps contains sql-relaydomains-transportcf remove it

30 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning If you make use of postfixrsquos proxymap server you must also update the proxy_read_maps setting

Reload postfix

Add the following cron job in order to generate DKIM keys

Generate DKIM keys (they will belong to the user running this job)

root $PYTHON $INSTANCEmanagepy modorarr˓manage_dkim_keys

190

If you want to manage inactive accounts look at Cleaning inactive accounts

183

Edit the settingspy file and replace the following line

BASE_DIR = ospathdirname(ospathdirname(__file__))

by

BASE_DIR = ospathrealpath(ospathdirname(ospathdirname(__file__)))

180

Modoboa now relies on Djangorsquos builtin password validation system to validate user passwords instead ofdjango-passwords

Remove django-passwords from your system

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt pip uninstall django-passwords

Edit the settingspy file and remove the following content

django-passwords

PASSWORD_MIN_LENGTH = 8

PASSWORD_COMPLEXITY = UPPER 1LOWER 1DIGITS 1

Add the following lines

Password validation rulesAUTH_PASSWORD_VALIDATORS = [

NAME djangocontribauthpassword_validation

rarr˓UserAttributeSimilarityValidator (continues on next page)

22 Upgrade 31

Modoboa Documentation Release 1100

(continued from previous page)

NAME djangocontribauthpassword_validationMinimumLengthValidator

NAME djangocontribauthpassword_validationCommonPasswordValidator

NAME djangocontribauthpassword_validationNumericPasswordValidator

NAME modoboacorepassword_validationComplexityValidatorOPTIONS

upper 1lower 1digits 1specials 0

]

172

API documentation has evolved (because of the upgrade to Django Rest Framework 36) and CKeditor is now embed-ded by default (thanks to the django-ckeditor package) Some configuration changes are required

Edit your settingspy file and apply the following modifications

bull Update the INSTALLED_APPS variable as follows

INSTALLED_APPS = (djangocontribauthdjangocontribcontenttypesdjangocontribsessionsdjangocontribmessagesdjangocontribsitesdjangocontribstaticfilesreversionckeditorckeditor_uploaderrest_frameworkrest_frameworkauthtoken

)

bull Update the REST_FRAMEWORK variable as follows

REST_FRAMEWORK = DEFAULT_AUTHENTICATION_CLASSES (

rest_frameworkauthenticationTokenAuthenticationrest_frameworkauthenticationSessionAuthentication

)

bull Remove the SWAGGER_SETTINGS variable

bull Add the following content

32 Chapter 2 Table of contents

Modoboa Documentation Release 1100

CKeditor

CKEDITOR_UPLOAD_PATH = uploads

CKEDITOR_IMAGE_BACKEND = pillow

CKEDITOR_RESTRICT_BY_USER = True

CKEDITOR_BROWSE_SHOW_DIRS = True

CKEDITOR_ALLOW_NONIMAGE_FILES = False

CKEDITOR_CONFIGS = default

allowedContent Truetoolbar Modoboawidth Nonetoolbar_Modoboa [

[Bold Italic Underline][JustifyLeft JustifyCenter JustifyRight JustifyBlock][BidiLtr BidiRtl Language][NumberedList BulletedList - Outdent Indent][Undo Redo][Link Unlink Anchor - Smiley][TextColor BGColor - Source][Font FontSize][Image ][SpellChecker]

]

Donrsquot forget to run the following command

gt python managepy collectstatic

171

If you used 170 for a fresh installation please run the following commands

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy load_initial_data

170

This version requires Django gt= 110 so you need to make some modifications It also brings internal API changeswhich are not backward compatible so installed extensions must be upgraded too

First of all deactivate all installed extensions (edit the settingspy file and comment the corresponding lines inMODOBOA_APPS)

Edit the urlspy file of your local instance and replace its content by the following one

22 Upgrade 33

Modoboa Documentation Release 1100

from djangoconfurls import include url

urlpatterns = [url(r include(modoboaurls))

]

Edit the settingspy and apply the following changes

bull Add modoboaparameters to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboarelaydomainsmodoboalimitsmodoboaparameters Modoboa extensions here

)

bull Add modoboacoremiddlewareLocalConfigMiddleware to MIDDLEWARE_CLASSES

MIDDLEWARE_CLASSES = (djangocontribsessionsmiddlewareSessionMiddlewaredjangomiddlewarecommonCommonMiddlewaredjangomiddlewarecsrfCsrfViewMiddlewaredjangocontribauthmiddlewareAuthenticationMiddlewaredjangocontribmessagesmiddlewareMessageMiddlewaredjangomiddlewarelocaleLocaleMiddlewaredjangomiddlewareclickjackingXFrameOptionsMiddlewaremodoboacoremiddlewareLocalConfigMiddlewaremodoboalibmiddlewareAjaxLoginRedirectmodoboalibmiddlewareCommonExceptionCatchermodoboalibmiddlewareRequestCatcherMiddleware

)

bull Modoboa used to provide a custom authentication backend (modoboalibauthbackendsSimpleBackend) but it has been removed Replace it as follows

AUTHENTICATION_BACKENDS = ( Other backends beforedjangocontribauthbackendsModelBackend

)

bull Remove TEMPLATE_CONTEXT_PROCESSORS and replace it by

TEMPLATES = [

BACKEND djangotemplatebackendsdjangoDjangoTemplatesDIRS []APP_DIRS TrueOPTIONS

context_processors [djangotemplatecontext_processorsdebugdjangotemplatecontext_processorsrequestdjangocontribauthcontext_processorsauth

(continues on next page)

34 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

djangotemplatecontext_processorsi18ndjangotemplatecontext_processorsmediadjangotemplatecontext_processorsstaticdjangotemplatecontext_processorstzdjangocontribmessagescontext_processorsmessagesmodoboacorecontext_processorstop_notifications

]debug False

]

Run the following commands (load virtualenv if you use one)

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstatic

Finally upgrade your extensions and reactivate them

Name Versionmodoboa-amavis 110modoboa-dmarc 100modoboa-imap-migration 110modoboa-pdfcredentials 110modoboa-postfix-autoreply 120modoboa-radicale 110modoboa-sievefilters 110modoboa-stats 110modoboa-webmail 110

Command line shortcuts

$ pip install modoboa-amavis==110$ pip install modoboa-dmarc==100$ pip install modoboa-imap-migration==110$ pip install modoboa-pdfcredentials==110$ pip install modoboa-postfix-autoreply==120$ pip install modoboa-radicale==110$ pip install modoboa-sievefilters==110$ pip install modoboa-stats==110$ pip install modoboa-webmail==110

And please make sure you use the latest version of the django-versionfield2 package

$ pip install -U django-versionfield2

Notes about quota changes and resellers

Reseller users now have a quota option in Resources tab This is the quota that a reseller can share between all itsdomains

22 Upgrade 35

Modoboa Documentation Release 1100

There are two quotas for a domain in the new version

1 Quota amp

2 Default mailbox quota

[1] Quota quota shared between mailboxes This quota is shared between all the mailboxes of this domain This valuecannot exceed resellerrsquos quota and hence cannot be 0(unlimited) if reseller has finite quota

[2] Default mailbox quota default quota applied to mailboxes This quota is the default quota applied to new mail-boxes This value cannot exceed Quota[1] and hence cannot be 0(unlimited) if Quota[1] is finite

161

First of all update postfix map files as follows

gt python managepy generate_postfix_maps --destdir ltpathgt --force-overwrite

Then modify postfixrsquos configuration as follows

smtpd_sender_login_maps =ltdrivergtltpathgtsql-sender-login-mailboxescfltdrivergtltpathgtsql-sender-login-aliasescfltdrivergtltpathgtsql-sender-login-mailboxes-extracf

Replace ltdrivergt and ltpathgt by your values

Finally reload postfix

This release also deprecates some internal functions As a result several extensions has been updated to maintain thecompatibility If you enabled the notification service yoursquoll find the list of available updates directly in your Modoboaconsole

For the others here is the list

Name Versionmodoboa-amavis 1010modoboa-postfix-autoreply 117modoboa-radicale 105modoboa-stats 109

Command line shortcut

$ pip install modoboa-amavis==1010$ pip install modoboa-postfix-autoreply==117$ pip install modoboa-radicale==105$ pip install modoboa-stats==109

160

Warning You have to upgrade extensions due to coreUser model attribute change (usergroup to userrole) Oth-erwise you will have an internal error after upgrade In particular modoboa-amavisd modoboa-stats modoboa-postfix-autoreply are concerned

36 Chapter 2 Table of contents

Modoboa Documentation Release 1100

An interesting feature brougth by this version is the capability to make different checks about MX records Forexample Modoboa can query main DNSBL providers for every defined domain With this you will quickly know ifone the domains you manage is listed or not To activate it add the following line to your crontab

30 ltoptional_virtualenv_pathgtpython ltmodoboa_instance_dirgtmanagepy modorarr˓check_mx

The communication with Modoboa public API has been reworked Instead of sending direct synchronous queries (forexample to check new versions) a cron job has been added To activate it add the following line to your crontab

0 ltoptional_virtualenv_pathgtpython ltmodoboa_instance_dirgtmanagepyrarr˓communicate_with_public_api

Please also note that public API now uses TLS so you must update your configuration as follows

MODOBOA_API_URL = httpsapimodoboaorg1

Finally it is now possible to declare additional sender addresses on a per-account basis You need to update your postfixconfiguration in order to use this functionality Just edit the maincf file and change the following parameter

smtpd_sender_login_maps =ltdrivergtetcpostfixsql-sender-login-mailboxescfltdrivergtetcpostfixsql-sender-login-aliasescfltdrivergtetcpostfixsql-sender-login-mailboxes-extracf

150

The API has been greatly improved and a documentation is now available To enable it addrest_framework_swagger to the INSTALLED_APPS variable in settingspy as follows

INSTALLED_APPS = (djangocontribauthdjangocontribcontenttypesdjangocontribsessionsdjangocontribmessagesdjangocontribsitesdjangocontribstaticfilesreversionrest_frameworkauthtokenrest_framework_swagger

)

Then add the following content into settingspy just after the REST_FRAMEWORK variable

SWAGGER_SETTINGS = is_authenticated Falseapi_version 10exclude_namespaces []info

contact contactmodoboacomdescription (Modoboa API requires a valid token)title Modoboa API

Yoursquore done The documentation is now available at the following address

22 Upgrade 37

Modoboa Documentation Release 1100

httpltyour instance addressgtdocsapi

Finally if you find a TEMPLATE_CONTEXT_PROCESSORS variable in your settingspy file make sure it lookslike this

TEMPLATE_CONTEXT_PROCESSORS = global_settingsTEMPLATE_CONTEXT_PROCESSORS + [modoboacorecontext_processorstop_notifications

]

140

Warning Please make sure to use Modoboa 135 with an up-to-date database before an upgrade to 140

Warning Do not follow the regular upgrade procedure for this version

Some extension have been moved back into the main repository The main reason for that is that using Modoboawithout them doesnrsquot make sense

First of all you must rename the following applications listed inside the MODOBOA_APPS variable

Old name New namemodoboa_admin modoboaadminmodoboa_admin_limits modoboalimitsmodoboa_admin_relaydomains modoboarelaydomains

Then apply the following steps

1 Uninstall old extensions

$ pip uninstall modoboa-admin modoboa-admin-limits modoboa-admin-relaydomains

2 Install all extension updates using pip (check the Modoboa gt Information page)

3 Manually migrate database

$ cd ltinstance_dirgt$ python managepy migrate auth$ python managepy migrate admin 0001 --fake$ python managepy migrate admin$ python managepy migrate limits 0001 --fake$ python managepy migrate relaydomains 0001 --fake$ python managepy migrate

4 Finally update static files

$ python managepy collectstatic

This version also introduces a REST API To enable it

1 Add rest_frameworkauthtoken to the INSTALLED_APPS variable

2 Add the following configuration inside settingspy

38 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Rest framework settings

REST_FRAMEWORK = DEFAULT_AUTHENTICATION_CLASSES (

rest_frameworkauthenticationTokenAuthentication)DEFAULT_PERMISSION_CLASSES (

rest_frameworkpermissionsIsAuthenticated)

3 Run the following command

$ python managepy migrate

135

To enhance security Modoboa now checks the strength of user passwords lthttpsgithubcomdstufftdjango-passwordsgt_

To use this feature add the following configuration into the settingspy file

django-passwords

PASSWORD_MIN_LENGTH = 8

PASSWORD_COMPLEXITY = UPPER 1LOWER 1DIGITS 1

132

Modoboa now uses the atomic requests mode to preserve database consistency (reference)

To enable it update the DATABASES variable in settingspy as follows

DATABASES = default

stuff beforeATOMIC_REQUESTS True

amavis

stuff beforeATOMIC_REQUESTS True

130

This release does not bring awesome new features but it is a necessary bridge to the future of Modoboa All extensionsnow have their own git repository and the deploy process has been updated to reflect this change

22 Upgrade 39

Modoboa Documentation Release 1100

Another important update is the use of Django 17 Besides its new features the migration system has been reworkedand is now more robust than before

Before we begin with the procedure here is a table showing old extension names and their new name

Old name New package name New module namemodoboaextensionsadmin modoboa-admin modoboa_adminmodoboaextensionslimits modoboa-admin-limits modoboa_admin_limitsmodoboaextensionspostfix_autoreply modoboa-postfix-autoreply modoboa_postfix_autoreplymodoboaextensionspostfix_relay_domains modoboa-admin-relaydomains modoboa_admin_relaydomainsmodoboaextensionsradicale modoboa-radicale modoboa_radicalemodoboaextensionssievefilters modoboa-sievefilters modoboa_sievefiltersmodoboaextensionsstats modoboa-stats modoboa_statsmodoboaextensionswebmail modoboa-webmail modoboa_webmail

Here are the required steps

1 Install the extensions using pip (look at the second column in the table above)

$ pip install ltthe extensions you wantgt

2 Remove south from INSTALLED_APPS

3 Rename old extension names inside MODOBOA_APPS (look at the third column in the table above)

4 Remove modoboalibmiddlewareExtControlMiddleware from MIDDLEWARE_CLASSES

5 Change DATABASE_ROUTERS to

DATABASE_ROUTERS = [modoboa_amavisdbrouterAmavisRouter]

6 Run the following commands

$ cd ltmodoboa_instance_dirgt$ python managepy migrate

7 Reply yes to the question

8 Run the following commands

$ python managepy load_initial_data$ python managepy collectstatic

9 The cleanup job has been renamed in Django so you have to modify your crontab entry

- 0 0 ltmodoboa_sitegtmanagepy cleanup+ 0 0 ltmodoboa_sitegtmanagepy clearsessions

120

A new notification service let administrators know about new Modoboa versions To activate it you need to updatethe TEMPLATE_CONTEXT_PROCESSORS variable like this

from djangoconf import global_settings

TEMPLATE_CONTEXT_PROCESSORS = global_settingsTEMPLATE_CONTEXT_PROCESSORS + (

(continues on next page)

40 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

modoboacorecontext_processorstop_notifications)

and to define the new MODOBOA_API_URL variable

MODOBOA_API_URL = httpapimodoboaorg1

The location of external static files has changed To use them add a new path to the STATICFILES_DIRS

Additional locations of static filesSTATICFILES_DIRS = (

Put strings here like homehtmlstatic or Cwwwdjangostatic Always use forward slashes even on Windows Dont forget to use absolute paths not relative pathsltpathtomodoboainstalldirgtbower_components

)

Run the following commands to define the hostname of your instance

$ cd ltmodoboa_instance_dirgt$ python managepy set_default_site lthostnamegt

If you plan to use the Radicale extension

1 Add modoboaextensionsradicale to the MODOBOA_APPS variable

2 Run the following commands

$ cd ltmodoboa_instance_dirgt$ python managepy syncdb

Warning You also have to note that the sitestatic directory has moved from ltpath to your sitesdirgt to ltmodoboas root urlgt (itrsquos probably the parent directory) You have to adapt your web serverconfiguration to reflect this change

23 Configuration

231 Online parameters

Modoboa provides online panels to modify internal parameters There are two available levels

bull Application level global parameters define how the application behaves Available at Modoboa gt Parameters

bull User level per user customization Available at User gt Settings gt Preferences

Regardless level parameters are displayed using tabs each tab corresponding to one application

General parameters

The admin application exposes several parameters they are presented below

23 Configuration 41

Modoboa Documentation Release 1100

Name Tab Description Default valueAuthentication type General The backend used for au-

thenticationLocal

Default password scheme General Scheme used to cryptmailbox passwords

crypt

Rounds General Number of rounds (onlyused by sha256cryptand sha512crypt) Mustbe between 1000 and999999999 inclusive

70000

Secret key General A key used to encryptusersrsquo password in ses-sions

random value

Sender address General Email address used tosend notifications

Enable communication General Enable communicationwith Modoboa public API

yes

Check new versions General Automatically checks if anewer version is available

yes

Send statistics General Send statistics to Mod-oboa public API (countersand used extensions)

yes

Top notifications check in-terval

General Interval between two topnotification checks (inseconds)

30

Maximum log record age General The maximum age in daysof a log record

365

Items per page General Number of displayeditems per page

30

Default top redirection General The default redirectionused when no applicationis specified

userprefs

Enable MX checks Admin Check that every domainhas a valid MX record

yes

Valid MXs Admin A list of IP or networkaddress every MX shouldmatch A warning will besent if a record does notrespect this it

Enable DNSBL checks Admin Check every domainagainst major DNSBLproviders

yes

DKIM keys storage direc-tory

AdminPath to a directory where DKIM

generated keys willbe stored

Default DKIM key length Admin The default size (in bits)for new keys

2048

Handle mailboxes onfilesystem

Admin Rename or remove mail-boxes on the filesystemwhen they get renamed orremoved within Modoboa

no

Mailboxes owner Admin The UNIX account whoowns mailboxes on thefilesystem

vmail

Default domain quota Admin Default quota (in MB) ap-plied to freshly createddomains with no valuespecified A value of 0means no quota

0

Automatic accountremoval

Admin When a mailbox is re-moved also remove theassociated account

no

Automatic do-mainmailbox creation

Admin Create a domain and amailbox when an accountis automatically created

yes

42 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Note If you are not familiar with virtual domain hosting you should take a look at postfixrsquos documentation ThisHow to also contains useful information

Note A random secret key will be generated each time the Parameters page is refreshed and until you save parametersat least once

Note Specific LDAP parameters are also available see LDAP authentication

232 Media files

Modoboa uses a specific directory to upload files (ie when the webmail is in use) or to create ones (ex graphical statis-tics) This directory is named media and is located inside modoboarsquos installation directory (called modoboa_sitein this documentation)

To work properly the system user which runs modoboa (www-data apache whatever) must have write access tothis directory

233 Customization

Custom logo

You have the possibility to use a custom logo instead of the default one on the login page

To do so open the settingspy file and add a MODOBOA_CUSTOM_LOGO variable This variable must containthe relative URL of your logo under MEDIA_URL For example

MODOBOA_CUSTOM_LOGO = ospathjoin(MEDIA_URL custom_logopng)

Then copy your logo file into the directory indicated by MEDIA_ROOT

234 Host configuration

Note This section is only relevant when Modoboa handles mailboxes renaming and removal from the filesystem

To manipulate mailboxes on the filesystem you must allow the user who runs Modoboa to execute commands as theuser who owns mailboxes

To do so edit the etcsudoers file and add the following inside

ltuser_that_runs_modoboagt ALL=(ltmailboxes ownergt) NOPASSWD ALL

Replace values between ltgt by the ones you use

23 Configuration 43

Modoboa Documentation Release 1100

235 Time zone and language

Modoboa is available in many languages

To specify the default language to use edit the settingspy file and modify the LANGUAGE_CODE variable

LANGUAGE_CODE = fr or en for english etc

Note Each user has the possibility to define the language he prefers

In the same configuration file specify the timezone to use by modifying the TIME_ZONE variable For example

TIME_ZONE = EuropeParis

236 Sessions management

Modoboa uses Djangorsquos session framework to store per-user information

Few parameters need to be set in the settingspy configuration file to make Modoboa behave as expected

SESSION_EXPIRE_AT_BROWSER_CLOSE = False Default value

This parameter is optional but you must ensure it is set to False (the default value)

The default configuration file provided by the modoboa-adminpy command is properly configured

237 Logging authentication

To trace login attempts to the web interface Modoboa uses python SysLogHandler so you can see them in your syslogauthentication log file (varlogauthlog in most cases)

Depending on your configuration you may have to edit the settingspy file and add lsquoaddressrsquo lsquodevlogrsquo to thelogging section

syslog-auth class logginghandlersSysLogHandlerfacility SysLogHandlerLOG_AUTHaddress devlogformatter syslog

238 External authentication

LDAP

Modoboa supports external LDAP authentication using the following extra components

bull Python LDAP client

bull Django LDAP authentication backend

If you want to use this feature you must first install those components

44 Chapter 2 Table of contents

Modoboa Documentation Release 1100

$ pip install python-ldap django-auth-ldap

Then all you have to do is to modify the settingspy file Add a new authentication backend to the AUTHENTI-CATION_BACKENDS variable like this

AUTHENTICATION_BACKENDS = (modoboalibauthbackendsLDAPBackend modoboalibauthbackendsLDAPSecondaryBackend Useful for a fallback

rarr˓mechanismdjangocontribauthbackendsModelBackend

)

Finally go to Modoboa gt Parameters gt General and set Authentication type to LDAP

From there new parameters will appear to let you configure the way Modoboa should connect to your LDAP serverThey are described just below

Name Description De-faultvalue

Server address The IP address of the DNS name of the LDAP server local-host

Server port The TCP port number used by the LDAP server 389Use a secureconnection

Use an SSLTLS connection to access the LDAP server no

Authenticationmethod

Choose the authentication method to use Directbind

User DN tem-plate (directbind mode)

The template used to construct a userrsquos DN It should contain one placeholder (ie(user)s)

Bind BN The distinguished name to use when binding to the LDAP server Leave empty for ananonymous bind

Bind password The password to use when binding to the LDAP server (with lsquoBind DNrsquo)Search base The distinguished name of the search baseSearch filter An optional filter string (eg lsquo(objectClass=person)rsquo) In order to be valid it must be

enclosed in parentheses(mail=(user)s)

Passwordattribute

The attribute used to store user passwords user-Pass-word

Active Direc-tory

Tell if the LDAP server is an Active Directory one no

Administratorgroups

Members of those LDAP Posix groups will be created ad domain administrators Uselsquorsquo characters to separate groups

Group type The type of group used by your LDAP directory Posix-Group

Groups searchbase

The distinguished name of the search base used to find groups

Do-mainmailboxcreation

Automatically create a domain and a mailbox when a new user is created just after thefirst successful authentication You will generally want to disable this feature whenthe relay domains extension is in use

yes

If you need additional parameters you will find a detailed documentation here

Once the authentication is properly configured the users defined in your LDAP directory will be able to connect to

23 Configuration 45

Modoboa Documentation Release 1100

Modoboa the associated domain and mailboxes will be automatically created if needed

The first time a user connects to Modoboa a local account is created if the LDAP username is a valid email addressBy default this account belongs to the SimpleUsers group and it has a mailbox

To automatically create domain administrators you can use the Administrator groups setting If a LDAP user belongsto one the listed groups its local account will belong to the DomainAdmins group In this case the username is notnecessarily an email address

Users will also be able to update their LDAP password directly from Modoboa

Note Modoboa doesnrsquot provide any synchronization mechanism once a user is registered into the database Anymodification done from the directory to a user account will not be reported to Modoboa (an email address change forexample) Currently the only solution is to manually delete the Modoboa record it will be recreated on the next userlogin

SMTP

It is possible to use an existing SMTP server as an authentication source To enable this feature edit the settingspy file and change the following setting

AUTHENTICATION_BACKENDS = (modoboalibauthbackendsSMTPBackenddjangocontribauthbackendsModelBackend

)

SMTP server location can be customized using the following settings

AUTH_SMTP_SERVER_ADDRESS = localhostAUTH_SMTP_SERVER_PORT = 25AUTH_SMTP_SECURED_MODE = None ssl or starttls are accepted

239 LDAP synchronization

Modoboa can synchronize accounts with an LDAP directory (tested with OpenLDAP) but this feature is not enabledby default To activate it add modoboaldapsync to MODOBOA_APPS in the settingspy file

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboaldapsync

)

and enable it from the admin panel

46 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning Make sure to install additional requirements otherwise it wonrsquot work

The following parameters are available and must be filled

Name Description Defaultvalue

Enable LDAP synchro-nization

Control LDAP synchronization state no

Bind DN The DN of a user with write permission to createupdate accountsBind password The associated passwordAccount DN template The template used to build account DNs (must contain a (user)s

placeholder

2310 Database maintenance

Cleaning the logs table

Modoboa logs administrator specific actions into the database A clean-up script is provided to automatically removeoldest records The maximum log record age can be configured through the online panel

To use it you can setup a cron job to run every night

0 0 ltmodoboa_sitegtmanagepy cleanlogs Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy cleanlogs

Cleaning the session table

Django does not provide automatic purging Therefore itrsquos your job to purge expired sessions on a regular basis

Django provides a sample clean-up script django-adminpy clearsessions That script deletes any sessionin the session table whose expire_date is in the past

For example you could setup a cron job to run this script every night

0 0 ltmodoboa_sitegtmanagepy clearsessions Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy clearsessions

Cleaning inactive accounts

Thanks to Last-login tracking it is now possible to monitor inactive accounts An account is considered inactive if nologin has been recorded for the last 30 days (this value can be changed through the admin panel)

A management command is available to disable or delete inactive accounts For example you could setup a cron jobto run it every night

23 Configuration 47

Modoboa Documentation Release 1100

0 0 ltmodoboa_sitegtmanagepy clean_inactive_accounts Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy clean_inactive_rarr˓accounts

The default behaviour is to disable accounts You can delete them using the --delete option

24 Moving to Modoboa

You have an existing platform and yoursquod like to move to Modoboa the following tools could help you

241 From postfixadmin

A dedicated command allows you to convert an existing postfixadmin database to a Modoboa one Consult the docu-mentation to know more about the process

242 Using CSV files

Modoboa allows you to import any object (domain domain alias mailbox and alias) using a simple CSV file encodedusing UTF8 Each line corresponds to a single object and must respect one of the following format

domain ltname stringgt ltquota integergt ltdefault mailbox quota integergt ltenabledrarr˓booleangtdomainalias ltname stringgt lttargeted domain stringgt ltenabled booleangtrelaydomain ltname stringgt lttarget host stringgt lttarget port integergt ltservicerarr˓stringgt ltenabled booleangt ltverify recipients booleangtaccount ltloginname stringgt ltpassword stringgt ltfirst name stringgt ltlast namerarr˓stringgt ltenabled booleangt ltgroup stringgt ltaddress stringgt ltquota integergt [rarr˓ltdomain stringgt ]alias ltaddress stringgt ltenabled booleangt ltrecipient stringgt

Boolean fields accept the following values true 1 yes y (case insensitive) Any other value will be evaluated asfalse

Warning The order does matter Objects are created sequencially so a domain must be created before itsmailboxes and aliases and a mailbox must created before its alias(es)

To actually import such a file

gt sudo -u ltmodoboa_usergt -igt source ltvirtualenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy modo import ltyour filegt

Available options can be listed using the following command

gt python managepy modo import -h

48 Chapter 2 Table of contents

Modoboa Documentation Release 1100

25 REST API

To ease the integration with external sources (software or other) Modoboa provides a REST API

Every installed instance comes with a ready-to-use API and a documentation You will find them using the followingurl patterns

bull API httplthostnamegtapiv1

bull Documentation httplthostnamegtdocsapi

An example of this documentation is available on the official demo

Using this API requires an authentication and for now only a token based authentication is supported To get a validtoken log-in to your instance with a super administrator go to Settings gt API and activate the API access Press theUpdate button and wait until the page is reloaded the token will be displayed

To make valid API calls every requests you send must embed this token within an Authorization HTTP header likethis

Authorization Token ltYOUR_TOKENgt

and the content type of those requests must be applicationjson

26 How to contribute

Contributions are always welcome If you want to submit a patch please respect the following rules

bull Open a pull request on the appropriate repository

bull Respect PEP8

bull Document your patch and respect PEP 257

bull Add unit tests and make sure the global coverage does not decrease

If all those steps are validated your contribution will generally be integrated

261 Table of contents

25 REST API 49

Modoboa Documentation Release 1100

Useful tips

You would like to work on Modoboa but you donrsquot know where to start Yoursquore at the right place Browse this pageto learn useful tips

Docker

A docker image is available for developers To use it you must install docker and docker-compose first

Then just run the following command

$ docker-compose up

It will start the docker environment and make a Modoboa instance available at httplocalhost8000

If you donrsquot want to use docker or need a more complex development setup go to the next section

Prepare a virtual environment

A virtual environment is a good way to setup a development environment on your machine

To do so run the following commands

$ python3 -m venv ltpathgt$ source ltpathgtbinactivate$ git clone httpsgithubcommodoboamodoboagit$ cd modoboa$ python setuppy develop$ pip install -r dev-requirementstxt

The develop command creates a symbolic link to your local copy so any modification you make will be automati-cally available in your environment no need to copy them

Deploy an instance for development

Warning Make sure to create a database before running this step The format of the database url is also describedin this page

Now that you have a running environment yoursquore ready to deploy a test instance

$ cd ltpathgt$ modoboa-adminpy deploy --dburl defaultltdatabase urlgt --domain localhost --develrarr˓instance$ python managepy runserver

Yoursquore ready to go You should be able to access Modoboa at httplocalhost8000 usingadminpassword as credentials

Manage static files

Modoboa uses bower (thanks to django-bower) to manage its CSS and javascript dependencies

50 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Those dependencies are listed in a file called dev_settingspy located inside the ltpath_to_local_copygtmodoboacore directory

If you want to add a new dependency just complete the BOWER_INSTALLED_APPS parameter and run the followingcommand

$ python managepy bower install

It will download and store the required files into the ltpath_to_local_copygtmodoboabower_components directory

Test your modifications

If you deployed a specific instance for your development needs you can run the tests suite as follows

gt python managepy test modoboacore modoboalib modoboaadmin modoboalimits modoboararr˓relaydomains

Otherwise you can run the tests suite from the repository using tox

Start a basic Modoboa instance

From the repository run the following command to launch a simple instance with a few fixtures

gt tox -e serve

You can use adminpassword to log in

Build the documentation

If you need to modify the documenation and want to see the result you can build it as follows

gt tox -e docgt firefox toxdoctmphtmlindexhtml

FAQ

bower command is missing in managepy

bower command is missing in managepy if you donrsquot use the --devel option of the modoboa-adminpydeploy command

To fix it regenerate your instance or update your settingspy file manually Look at devmode in httpsgithubcomtonioomodoboablobmastermodoboacorecommandstemplatessettingspytpl

Create a new plugin

Introduction

Modoboa offers a plugin API to expand its capabilities The current implementation provides the following possibili-ties

26 How to contribute 51

Modoboa Documentation Release 1100

bull Expand navigation by adding entry points to your plugin inside the GUI

bull Access and modify administrative objects (domains mailboxes etc)

bull Register callback actions for specific events

Plugins are nothing more than Django applications with an extra piece of code that integrates them into Modoboa Themodo_extensionpy file will contain a complete description of the plugin

bull Admin and user parameters

bull Custom menu entries

The communication between both applications is provided by Django signals

The following subsections describe the plugin architecture and explain how you can create your own

The required glue

To create a new plugin just start a new django application like this (into Modoboarsquos directory)

$ python managepy startapp

Then you need to register this application using the provided API Just copypaste the following example into themodo_extensionpy file of the future extension

from modoboacoreextensions import ModoExtension exts_pool

class MyExtension(ModoExtension)My custom Modoboa extension

name = myextlabel = My Extensionversion = 01description = A descriptionurl = myext_root_location optional name is used if not defined

def load(self)This method is called when Modoboa loads available and activated plugins

Declare parameters and register events herepass

def load_initial_data(self)Optional provide initial data for your extension herepass

exts_poolregister_extension(MyExtension)

Once done simply add your extensionrsquos module name to the MODOBOA_APPS variable located inside settingspy Finally run the following commands

$ python managepy migrate$ python managepy load_initial_data$ python managepy collectstatic

52 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Parameters

A plugin can declare its own parameters There are two levels available

bull lsquoGlobalrsquo parameters used to configure the plugin editable inside the Admin gt Settings gt Parameters page

bull lsquoUserrsquo parameters per-user parameters (or preferences) editable inside the Options gt Preferences page

Playing with parameters

Parameters are defined using Django forms and Modoboa adds two special forms you can inherit depending on thelevel of parameter(s) you want to add

bull modoboaparametersformsAdminParametersForm for general parameters

bull modoboaparametersformsUserParametersForm for user parameters

To register new parameters add the following line into the load method of your plugin class

from modoboaparameters import tools as param_toolsparam_toolsregistryadd(

LEVEL YourForm ugettext_lazy(Title))

Replace LEVEL by global or user

Custom role permissions

Modoboa uses Djangorsquos internal permission system Administrative roles are nothing more than groups (Groupinstances)

An extension can add new permissions to a group by listening to the extra_role_permissions signal Here isan example

from djangodispatch import receiverfrom modoboacore import signals as core_signals

PERMISSIONS = Resellers [

(relaydomains relaydomain add_relaydomain)(relaydomains relaydomain change_relaydomain)(relaydomains relaydomain delete_relaydomain)(relaydomains service add_service)(relaydomains service change_service)(relaydomains service delete_service)

]

receiver(core_signalsextra_role_permissions)def extra_role_permissions(sender role kwargs)

Add permissions to the Resellers groupreturn constantsPERMISSIONSget(role [])

Extending admin forms

The forms used to edit objects (account domain etc) through the admin panel are composed of tabs You can extendthem (ie add new tabs) in a pretty easy way thanks to custom signals

26 How to contribute 53

Modoboa Documentation Release 1100

Account

To add a new tab to the account edition form define new listeners (handlers) for the following signals

bull modoboaadminsignalsextra_account_forms

bull modoboaadminsignalsget_account_form_instances

bull modoboaadminsignalscheck_extra_account_form (optional)

Example

from djangodispatch import receiverfrom modoboaadmin import signals as admin_signals

receiver(admin_signalsextra_account_forms)def extra_account_form(sender user account kwargs)

return [id tabid title Title cls MyFormClass

]

receiver(admin_signalsget_account_form_instances)def fill_my_tab(sender user account kwargs)

return id my_instance

Domain

To add a new tab to the domain edition form define new listeners (handlers) for the following signals

bull modoboaadminsignalsextra_domain_forms

bull modoboaadminsignalsget_domain_form_instances

Example

from djangodispatch import receiverfrom modoboaadmin import signals as admin_signals

receiver(admin_signalsextra_domain_forms)def extra_account_form(sender user domain kwargs)

return [id tabid title Title cls MyFormClass

]

receiver(admin_signalsget_domain_form_instances)def fill_my_tab(sender user domain kwargs)

return id my_instance

27 Contributors

bull Antidot

bull Bearstech

bull CAP-REL

54 Chapter 2 Table of contents

Modoboa Documentation Release 1100

bull Dalnix

27 Contributors 55

  • Overview
  • Table of contents
Page 18: Modoboa Documentation

Modoboa Documentation Release 1100

Warning Modoboa needs to access the dovecot binary to check its version To find the binary path weuse the which command first and then try known locations (usrsbindovecot and usrlocalsbindovecot) If you installed dovecot in a custom location please tell us where the binary is by usingthe DOVECOT_LOOKUP_PATH setting (see settingspy)

Three operation types are considered

1 Mailbox creation

2 Mailbox renaming

3 Mailbox deletion

The first one is managed by Dovecot The last two ones may be managed by Modoboa if it can access the file systemwhere the mailboxes are stored (see General parameters to activate this feature)

Those operations are treated asynchronously by a cron script For example when you rename an e-mail addressthrough the web UI the associated mailbox on the file system is not modified directly Instead of that a renameorder is created for this mailbox The mailbox will be considered unavailable until the order is executed (see Postfixconfiguration)

Edit the crontab of the user who owns the mailboxes on the file system

$ crontab -u ltusergt -e

And add the following line inside

python ltmodoboa_sitegtmanagepy handle_mailbox_operations

Warning The cron script must be executed by the system user owning the mailboxes

Warning The user running the cron script must have access to the settingspy file of the modoboa instance

The result of each order is recorded into Modoboarsquos log Go to Modoboa gt Logs to consult them

Authentication

To make the authentication work edit the confd10-authconf and uncomment the following line at the end

include auth-systemconfextinclude auth-sqlconfextinclude auth-ldapconfextinclude auth-passwdfileconfextinclude auth-checkpasswordconfextinclude auth-vpopmailconfextinclude auth-staticconfext

Then edit the confdauth-sqlconfext file and add the following content inside

passdb sql driver = sql Path for SQL configuration file see example-configdovecot-sqlconfext

(continues on next page)

21 Installation 15

Modoboa Documentation Release 1100

(continued from previous page)

args = etcdovecotdovecot-sqlconfext

userdb sql driver = sqlargs = etcdovecotdovecot-sqlconfext

Make sure to activate only one backend (per type) inside your configuration (just comment the other ones)

Edit the dovecot-sqlconfext and modify the configuration according to your database engine

MySQL users

driver = mysql

connect = host=ltmysqld socketgt dbname=ltdatabasegt user=ltusergt password=ltpasswordgt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user WHERE email=Lu andrarr˓is_active=1

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid concat(bytes= mbquota M) AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

PostgreSQL users

driver = pgsql

connect = host=ltpostgres socketgt dbname=ltdatabasegt user=ltusergt password=ltpasswordgt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user u INNER JOIN admin_rarr˓mailbox mb ON uid=mbuser_id INNER JOIN admin_domain dom ON mbdomain_id=domidrarr˓WHERE uemail=Lu AND uis_active AND domenabled

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid bytes= || mbquota || M AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

16 Chapter 2 Table of contents

Modoboa Documentation Release 1100

SQLite users

driver = sqlite

connect = ltpath to the sqlite db filegt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user u INNER JOIN admin_rarr˓mailbox mb ON uid=mbuser_id INNER JOIN admin_domain dom ON mbdomain_id=domidrarr˓WHERE uemail=Lu AND uis_active=1 AND domenabled=1

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid (bytes= || mbquota || M) AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

Note Replace values between ltgt with yours

LDAP

To make the LDAP authentication work edit the confd10-authconf and uncomment the following line atthe end

include auth-ldapconfext

Then edit the confdauth-ldapconfext and edit the passdb section as following You should comment theuserdb section which will be managed by SQL with modoboa database

passdb driver = ldap

Path for LDAP configuration file see example-configdovecot-ldapconfextargs = etcdovecotdovecot-ldapconfext

userdb driver = ldapargs = etcdovecotdovecot-ldapconfext

Default fields can be used to specify defaults that LDAP may overridedefault_fields = home=homevirtualu

Your own dovecot LDAP configuration file is now etcdovecotdovecot-ldapconfext You can addyour default LDAP conf in it following the official documentation

Synchronize dovecot LDAP conf with modoboa LDAP conf

To make dovecot LDAP configuration synchronized with modoboa LDAP configuration you should create a dedicateddovecot conf file At the end of your dovecot configuration file (dovecot-ldapconfext) add the following

21 Installation 17

Modoboa Documentation Release 1100

line

include_try dovecot-modoboaconfext

Then set modoboa parameter Enable Dovecot LDAP sync to Yes Then set the Dovecot LDAP config file following theprevious step (etcdovecotdovecot-modoboaconfext in the example)

The last step is to add the command update_dovecot_conf to the cron job of modoboa Then each time your modoboaLDAP configuration is updated your dovecot LDAP configuration will also be

LMTP

Local Mail Transport Protocol is used to let Postfix deliver messages to Dovecot

First make sure the protocol is activated by looking at the protocols setting (generally inside dovecotconf)It should be similar to the following example

protocols = imap pop3 lmtp

Then open the confd10-masterconf look for lmtp service definition and add the following content inside

service lmtp stuff beforeunix_listener varspoolpostfixprivatedovecot-lmtp mode = 0600user = postfixgroup = postfix

stuff after

We assume here that Postfix is chrooted within varspoolpostfix

Finally open the confd20-lmtpconf and modify it as follows

protocol lmtp postmaster_address = postmasterltdomaingtmail_plugins = $mail_plugins quota sieve

Replace ltdomaingt by the appropriate value

Note If you donrsquot plan to apply quota or to use filters just adapt the content of the mail_plugins setting

Quota

Modoboa lets adminstrators define per-domain andor per-account limits (quota) It also lists the current quota usageof each account Those features require Dovecot to be configured in a specific way

Inside confd10-mailconf add the quota plugin to the default activated ones

mail_plugins = quota

Inside confd10-masterconf update the dict service to set proper permissions

18 Chapter 2 Table of contents

Modoboa Documentation Release 1100

service dict If dict proxy is used mail processes should have access to its socket For example mode=0660 group=vmail and global mail_access_groups=vmailunix_listener dict mode = 0600user = ltuser owning mailboxesgtgroup =

Inside confd20-imapconf activate the imap_quota plugin

protocol imap

mail_plugins = $mail_plugins imap_quota

Inside dovecotconf activate the quota SQL dictionary backend

dict quota = ltdrivergtetcdovecotdovecot-dict-sqlconfext

Inside confd90-quotaconf activate the quota dictionary backend

plugin quota = dictUser quotaproxyquota

It will tell Dovecot to keep quota usage in the SQL dictionary

Finally edit the dovecot-dict-sqlconfext file and put the following content inside

connect = host=ltdb hostgt dbname=ltdb namegt user=ltdb usergt password=ltpasswordgt SQLite users connect = pathtothedatabasedb

map pattern = privquotastoragetable = admin_quotausername_field = usernamevalue_field = bytes

map

pattern = privquotamessagestable = admin_quotausername_field = usernamevalue_field = messages

PostgreSQL users

21 Installation 19

Modoboa Documentation Release 1100

Database schema update

The admin_quota table is created by Django but unfortunately it doesnrsquot support DEFAULT constraints (it onlysimulates them when the ORM is used) As PostgreSQL is a bit strict about constraint violations you must executethe following query manually

db=gt ALTER TABLE admin_quota ALTER COLUMN bytes SET DEFAULT 0db=gt ALTER TABLE admin_quota ALTER COLUMN messages SET DEFAULT 0

Trigger

As indicated on Dovecotrsquos wiki you need a trigger to properly update the quota

A working copy of this trigger is available on Github

Download this file and copy it on the server running postgres Then execute the following commands

$ su - postgres$ psql [modoboa database] lt pathtomodoboa_postgres_triggersql$ exit

Replace [modoboa database] by the appropriate value

Forcing recalculation

For existing installations Dovecot (gt 2) offers a command to recalculate the current quota usages For example if youwant to update all usages run the following command

$ doveadm quota recalc -A

Be carefull it can take a while to execute

ManageSieveSieve

Modoboa lets users define filtering rules from the web interface To do so it requires ManageSieve to be activated onyour server

Inside confd20-managesieveconf make sure the following lines are uncommented

protocols = $protocols sieve

service managesieve-login

service managesieve

protocol sieve

20 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Messages filtering using Sieve is done by the LDA

Inside confd15-ldaconf activate the sieve plugin like this

protocol lda Space separated list of plugins to load (default is global mail_plugins)mail_plugins = $mail_plugins sieve

Finally configure the sieve plugin by editing the confd90-sieveconf file Put the follwing caontent inside

plugin Location of the active script When ManageSieve is used this is actually a symlink pointing to the active script in the sieve storage directorysieve = ~dovecotsieve

The path to the directory where the personal Sieve scripts are stored For ManageSieve this is where the uploaded scripts are storedsieve_dir = ~sieve

Restart Dovecot

Now you can go to the Postfix section to finish the installation

Last-login tracking

To update the last_login attribute of an account after a succesful IMAP or POP3 login you can configure apost-login script

Open confd10-masterconf add the following configuration (imap and pop3 services are already definedyou just need to update them)

service imap executable = imap postlogin

service pop3 executable = pop3 postlogin

service postlogin executable = script-login usrlocalbinpostloginshuser = modoboaunix_listener postlogin

Then you must create a script named usrlocalbinpostloginsh According to your database enginethe content will differ

PostgreSQL

21 Installation 21

Modoboa Documentation Release 1100

binsh

psql -c UPDATE core_user SET last_login=now() WHERE username=$USER gt devnull

exec $

MySQL

binsh

DBNAME=XXXDBUSER=XXXDBPASSWORD=XXX

echo UPDATE core_user SET last_login=now() WHERE username=$USER | mysql -urarr˓$DBUSER -p$DBPASSWORD $DBNAME

exec $

Postfix

This section gives an example about building a simple virtual hosting configuration with Postfix Refer to the officialdocumentation for more explanation

Map files

You first need to create configuration files (or map files) that will be used by Postfix to lookup into Modoboa tables

To automaticaly generate the requested map files and store them in a directory run the following command

gt cd ltmodoboa_instance_pathgtgt python managepy generate_postfix_maps --destdir ltdirectorygt

ltdirectorygt is the directory where the files will be stored Answer the few questions and yoursquore done

Configuration

Use the following configuration in the etcpostfixmaincf file (this is just one possible configuration)

Stuff beforevirtual_transport = lmtpunixprivatedovecot-lmtp

virtual_mailbox_domains = ltdrivergtetcpostfixsql-domainscfvirtual_alias_domains = ltdrivergtetcpostfixsql-domain-aliasescfvirtual_alias_maps = ltdrivergtetcpostfixsql-aliasescf

relay_domains = ltdrivergtetcpostfixsql-relaydomainscftransport_maps =

ltdrivergtetcpostfixsql-transportcfltdrivergtetcpostfixsql-spliteddomains-transportcf

(continues on next page)

22 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

smtpd_recipient_restrictions = check_recipient_access

ltdrivergtetcpostfixsql-maintaincfltdrivergtetcpostfixsql-relay-recipient-verificationcf

permit_mynetworksreject_unauth_destinationreject_unverified_recipient

smtpd_sender_login_maps = ltdrivergtetcpostfixsql-sender-login-mapcf

smtpd_sender_restrictions =reject_sender_login_mismatch

Stuff after

Replace ltdrivergt by the name of the database you use

Restart Postfix

Policy daemon

If you want to enable the built-in policy daemon add the following content to the etcpostfixmaincf file

smtpd_recipient_restrictions = check_policy_service inet1270019999

And reload postfix

Note The check_policy_service line must be placed before the permit_mynetworks one otherwise thedaemon wonrsquot be called

OpenDKIM

Modoboa can generate DKIM keys for the hosted domains but it wonrsquot sign or check messages To do that you needa dedicated software like OpenDKIM

Note The cron job in charge of creating DKIM keys must be run using the same user than OpenDKIM (ie opendkimin most cases)

Database

Since keys related information is stored in Modoboarsquos database you need to tell OpenDKIM how it can access it

First make sure to install the required additional packages on your system (libopendbx1- on debian baseddistributions or opendbx- on CentOS the complete name depends on your database engine)

Then insert the following SQL view into Modoboarsquos database

21 Installation 23

Modoboa Documentation Release 1100

PostgreSQL

CREATE OR REPLACE VIEW dkim AS (SELECT id name as domain_name dkim_private_key_path AS private_key_path

dkim_key_selector AS selectorFROM admin_domain WHERE enable_dkim

)

MySQLMariaDB

CREATE OR REPLACE VIEW dkim AS (SELECT id name as domain_name dkim_private_key_path AS private_key_path

dkim_key_selector AS selectorFROM admin_domain WHERE enable_dkim=1

)

Configuration

You should find OpenDKIMrsquos configuration file at etcopendkimconf

Add the following content to it

KeyTable dsnltdrivergtltusergtltpasswordgtltdb hostgtltdb namegttable=dkimrarr˓keycol=iddatacol=domain_nameselectorprivate_key_pathSigningTable dsnltdrivergtltusergtltpasswordgtltdb hostgtltdb namegttable=dkimrarr˓keycol=domain_namedatacol=idSocket inet12345localhost

Replace values between ltgt by yours Accepted values for driver are pgsql or mysql Make sure the user youspecify has read permission on the view created previously

If you run a debian based system make sure to adjust the following setting in the etcdefaultopendkim file

SOCKET=inet12345localhost

Eventually reload OpenDKIM

Postfix integration

Add the following lines to the etcpostfixmaincf file

smtpd_milters = inet12700112345non_smtpd_milters = inet12700112345milter_default_action = acceptmilter_content_timeout = 30s

and reload postfix

Extensions

Only few commands are needed to add a new extension to your setup

24 Chapter 2 Table of contents

Modoboa Documentation Release 1100

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install ltEXTENSIONgt==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Then restart your web server

22 Upgrade

221 Modoboa

Warning The new version you are going to install may need to modify your database Before you start makesure to backup everything

Most of the time upgrading your installation to a newer Modoboa version only requires a few actions In every caseyou will need to apply the general procedure first and then check if the version you are installing requires specificactions

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install modoboa==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Once done check if the version you are installing requires Specific instructions

Finally restart your web server

Sometimes you might need to upgrade postfix map files too To do so just run the generate_postfix_mapscommand on the same directory than the one used for installation (etcpostfix by default)

Make sure to use root privileges and run the following command

gt python managepy generate_postfix_maps --destdir ltdirectorygt

Then reload postfix

22 Upgrade 25

Modoboa Documentation Release 1100

222 Extensions

If a new version is available for an extension yoursquore using it is recommanded to install it Upgrading an extensions ispretty and the procedure is almost the same than the one used for Modoboa

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install ltEXTENSIONgt==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Finally restart your web server

It is a generic upgrade procedure which will be enough most of the time but it is generally a good idea to check theassociated documentation

223 Rebuild Virtual Environment

Sometimes when upgrading your Operating System (eg from Ubuntu 1704 to Ubuntu 1710) your virtual environmentrunning modoboa can get corrupted Your first response will be to panic but fear not The solution is in this document

First things first

Recover your database password

You will need to recover your database password (if using mysql or postgresql) You will find this in etcpostfixsql-aliasescf or any file with sql-cf in the etcpostfix directory

Make note of this as you will need it when reconfiguring modoboa

Reinstall Modoboa

Start out by backup up your modoboa settings file located in the modoboa instance directory (srvmodoboainstanceinstancesettingspy if you used the default installer configuration) This contains your currentconfiguration

Next you want to remove all current modoboa files

After doing this follow the manual installation instructions for Modoboa only as everything should be working prop-erly

After this completes simply restore your backed up settings file to srvinstanceinstancesettingspy(if you used installer default configuration) You will then need to reinstall your extensions

You can find which plugins you had in your settingspy file under the MODOBOA_APPS variable

Instructions to install extensions can also be found here

Once you have completed this step you will need to run the following commands

26 Chapter 2 Table of contents

Modoboa Documentation Release 1100

gt (env) $ cd ltinstance_dirgtgt (env) $ python managepy migrategt (env) $ python managepy collectstatic

You will then see a message similar to

You have requested to collect static files at the destinationlocation as specified in your settings

srvmodoboainstancesitestatic

This will overwrite existing filesAre you sure you want to do this

Type yes to continue or no to cancel

You will want to answer yes here then simply restart the uwsgi process with service uwsgi restart andyou should be up and running again

Simply log into your modoboa web panel and verify that your extensions and webmail box is working

224 Information

Rebuild instructions from httpshelppythonanywherecompagesRebuildingVirtualenvs

225 Specific instructions

1160

A new policy daemon has been added

Make sure to have a Redis instance running on your server

Add modoboapolicyd to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboapolicyd

)

Add the following settings to your settingspy file

REDIS_HOST = ltIP or hostname heregtREDIS_PORT = 6379REDIS_QUOTA_DB = 0REDIS_URL = redisformat(REDIS_HOST REDIS_PORT REDIS_QUOTA_DB)

Once done you can start the policy daemon using the following commands

22 Upgrade 27

Modoboa Documentation Release 1100

gt python managepy policy_daemon

Donrsquot forget to configure _policyd_config if you want to use this feature

The modoboa-stats plugin has been merged into the core

Add modoboamaillog to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboapolicydmodoboamaillog

)

And remove any reference to modoboa_stats in this same variable

1150

This version drops Python 2 support so donrsquot forget to update all the extensions you use

Warning If you upgrade an existing python 2 installation you will need to create a new Python 3 virtualenvironment You can remove the existing virtual environment and replace it by the new one so you wonrsquot have tomodify your configuration files

Add the following new setting

DISABLE_DASHBOARD_EXTERNAL_QUERIES = False

Reload uwsgigunicornapache depending on your setup

Finally Make sure to use root privileges and run the following command

gt python managepy generate_postfix_maps --destdir ltdirectorygt

Then reload postfix

1140

This release introduces an optional LDAP synchronization process If you want to use it please follow the dedicatedprocedure

1131

Upgrade postfix maps files as follows

28 Chapter 2 Table of contents

Modoboa Documentation Release 1100

gt python managepy generate_postfix_maps --destdir ltpathgt --force-overwrite

1130

Add modoboadnstools to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstools

)

Add the following new settings

CSRF_COOKIE_SECURE = TrueSESSION_COOKIE_SECURE = True

modoboa-postfix-autoreply 150

Edit the etcpostfixmaincf file and remove the sql-autoreplies-transportcf map from thetransport_maps if present Remove the corresponding proxy_read_maps entry if relevant

Reload postfix

1100

Warning Upgrade installed extensions BEFORE running check or migrate commands

Upgrade all your installed plugins to the following versions

Warning If you use the amavis plugin make sure to include its configuration as follows into settingspy

from modoboa_amavis import settings as modoboa_amavis_settingsmodoboa_amavis_settingsapply(globals())

22 Upgrade 29

Modoboa Documentation Release 1100

Name Versionmodoboa-amavis 120modoboa-contacts 050modoboa-dmarc 110modoboa-imap-migration 120modoboa-pdfcredentials 130modoboa-postfix-autoreply 140modoboa-radicale 120modoboa-sievefilters 140modoboa-stats 140modoboa-webmail 140

Edit the settingspy file and apply the following modifications

Add modoboatransport to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparameters

)

Replace the following line

MIDDLEWARE_CLASSES = (

by

MIDDLEWARE = (

Update postfix map files as follows

gt rm -f ltpathgtmodoboa-postfix-mapschkgt python managepy generate_postfix_maps --force --destdir ltpathgt

Then modify postfixrsquos configuration as follows

smtpd_sender_login_maps =ltdrivergtltpathgtsql-sender-login-mapcf

transport_maps =ltdrivergtltpathgtsql-transportcfltdrivergtltpathgtsql-spliteddomains-transportcf other map files

Replace ltdrivergt and ltpathgt by your values

If transport_maps contains sql-relaydomains-transportcf remove it

30 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning If you make use of postfixrsquos proxymap server you must also update the proxy_read_maps setting

Reload postfix

Add the following cron job in order to generate DKIM keys

Generate DKIM keys (they will belong to the user running this job)

root $PYTHON $INSTANCEmanagepy modorarr˓manage_dkim_keys

190

If you want to manage inactive accounts look at Cleaning inactive accounts

183

Edit the settingspy file and replace the following line

BASE_DIR = ospathdirname(ospathdirname(__file__))

by

BASE_DIR = ospathrealpath(ospathdirname(ospathdirname(__file__)))

180

Modoboa now relies on Djangorsquos builtin password validation system to validate user passwords instead ofdjango-passwords

Remove django-passwords from your system

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt pip uninstall django-passwords

Edit the settingspy file and remove the following content

django-passwords

PASSWORD_MIN_LENGTH = 8

PASSWORD_COMPLEXITY = UPPER 1LOWER 1DIGITS 1

Add the following lines

Password validation rulesAUTH_PASSWORD_VALIDATORS = [

NAME djangocontribauthpassword_validation

rarr˓UserAttributeSimilarityValidator (continues on next page)

22 Upgrade 31

Modoboa Documentation Release 1100

(continued from previous page)

NAME djangocontribauthpassword_validationMinimumLengthValidator

NAME djangocontribauthpassword_validationCommonPasswordValidator

NAME djangocontribauthpassword_validationNumericPasswordValidator

NAME modoboacorepassword_validationComplexityValidatorOPTIONS

upper 1lower 1digits 1specials 0

]

172

API documentation has evolved (because of the upgrade to Django Rest Framework 36) and CKeditor is now embed-ded by default (thanks to the django-ckeditor package) Some configuration changes are required

Edit your settingspy file and apply the following modifications

bull Update the INSTALLED_APPS variable as follows

INSTALLED_APPS = (djangocontribauthdjangocontribcontenttypesdjangocontribsessionsdjangocontribmessagesdjangocontribsitesdjangocontribstaticfilesreversionckeditorckeditor_uploaderrest_frameworkrest_frameworkauthtoken

)

bull Update the REST_FRAMEWORK variable as follows

REST_FRAMEWORK = DEFAULT_AUTHENTICATION_CLASSES (

rest_frameworkauthenticationTokenAuthenticationrest_frameworkauthenticationSessionAuthentication

)

bull Remove the SWAGGER_SETTINGS variable

bull Add the following content

32 Chapter 2 Table of contents

Modoboa Documentation Release 1100

CKeditor

CKEDITOR_UPLOAD_PATH = uploads

CKEDITOR_IMAGE_BACKEND = pillow

CKEDITOR_RESTRICT_BY_USER = True

CKEDITOR_BROWSE_SHOW_DIRS = True

CKEDITOR_ALLOW_NONIMAGE_FILES = False

CKEDITOR_CONFIGS = default

allowedContent Truetoolbar Modoboawidth Nonetoolbar_Modoboa [

[Bold Italic Underline][JustifyLeft JustifyCenter JustifyRight JustifyBlock][BidiLtr BidiRtl Language][NumberedList BulletedList - Outdent Indent][Undo Redo][Link Unlink Anchor - Smiley][TextColor BGColor - Source][Font FontSize][Image ][SpellChecker]

]

Donrsquot forget to run the following command

gt python managepy collectstatic

171

If you used 170 for a fresh installation please run the following commands

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy load_initial_data

170

This version requires Django gt= 110 so you need to make some modifications It also brings internal API changeswhich are not backward compatible so installed extensions must be upgraded too

First of all deactivate all installed extensions (edit the settingspy file and comment the corresponding lines inMODOBOA_APPS)

Edit the urlspy file of your local instance and replace its content by the following one

22 Upgrade 33

Modoboa Documentation Release 1100

from djangoconfurls import include url

urlpatterns = [url(r include(modoboaurls))

]

Edit the settingspy and apply the following changes

bull Add modoboaparameters to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboarelaydomainsmodoboalimitsmodoboaparameters Modoboa extensions here

)

bull Add modoboacoremiddlewareLocalConfigMiddleware to MIDDLEWARE_CLASSES

MIDDLEWARE_CLASSES = (djangocontribsessionsmiddlewareSessionMiddlewaredjangomiddlewarecommonCommonMiddlewaredjangomiddlewarecsrfCsrfViewMiddlewaredjangocontribauthmiddlewareAuthenticationMiddlewaredjangocontribmessagesmiddlewareMessageMiddlewaredjangomiddlewarelocaleLocaleMiddlewaredjangomiddlewareclickjackingXFrameOptionsMiddlewaremodoboacoremiddlewareLocalConfigMiddlewaremodoboalibmiddlewareAjaxLoginRedirectmodoboalibmiddlewareCommonExceptionCatchermodoboalibmiddlewareRequestCatcherMiddleware

)

bull Modoboa used to provide a custom authentication backend (modoboalibauthbackendsSimpleBackend) but it has been removed Replace it as follows

AUTHENTICATION_BACKENDS = ( Other backends beforedjangocontribauthbackendsModelBackend

)

bull Remove TEMPLATE_CONTEXT_PROCESSORS and replace it by

TEMPLATES = [

BACKEND djangotemplatebackendsdjangoDjangoTemplatesDIRS []APP_DIRS TrueOPTIONS

context_processors [djangotemplatecontext_processorsdebugdjangotemplatecontext_processorsrequestdjangocontribauthcontext_processorsauth

(continues on next page)

34 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

djangotemplatecontext_processorsi18ndjangotemplatecontext_processorsmediadjangotemplatecontext_processorsstaticdjangotemplatecontext_processorstzdjangocontribmessagescontext_processorsmessagesmodoboacorecontext_processorstop_notifications

]debug False

]

Run the following commands (load virtualenv if you use one)

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstatic

Finally upgrade your extensions and reactivate them

Name Versionmodoboa-amavis 110modoboa-dmarc 100modoboa-imap-migration 110modoboa-pdfcredentials 110modoboa-postfix-autoreply 120modoboa-radicale 110modoboa-sievefilters 110modoboa-stats 110modoboa-webmail 110

Command line shortcuts

$ pip install modoboa-amavis==110$ pip install modoboa-dmarc==100$ pip install modoboa-imap-migration==110$ pip install modoboa-pdfcredentials==110$ pip install modoboa-postfix-autoreply==120$ pip install modoboa-radicale==110$ pip install modoboa-sievefilters==110$ pip install modoboa-stats==110$ pip install modoboa-webmail==110

And please make sure you use the latest version of the django-versionfield2 package

$ pip install -U django-versionfield2

Notes about quota changes and resellers

Reseller users now have a quota option in Resources tab This is the quota that a reseller can share between all itsdomains

22 Upgrade 35

Modoboa Documentation Release 1100

There are two quotas for a domain in the new version

1 Quota amp

2 Default mailbox quota

[1] Quota quota shared between mailboxes This quota is shared between all the mailboxes of this domain This valuecannot exceed resellerrsquos quota and hence cannot be 0(unlimited) if reseller has finite quota

[2] Default mailbox quota default quota applied to mailboxes This quota is the default quota applied to new mail-boxes This value cannot exceed Quota[1] and hence cannot be 0(unlimited) if Quota[1] is finite

161

First of all update postfix map files as follows

gt python managepy generate_postfix_maps --destdir ltpathgt --force-overwrite

Then modify postfixrsquos configuration as follows

smtpd_sender_login_maps =ltdrivergtltpathgtsql-sender-login-mailboxescfltdrivergtltpathgtsql-sender-login-aliasescfltdrivergtltpathgtsql-sender-login-mailboxes-extracf

Replace ltdrivergt and ltpathgt by your values

Finally reload postfix

This release also deprecates some internal functions As a result several extensions has been updated to maintain thecompatibility If you enabled the notification service yoursquoll find the list of available updates directly in your Modoboaconsole

For the others here is the list

Name Versionmodoboa-amavis 1010modoboa-postfix-autoreply 117modoboa-radicale 105modoboa-stats 109

Command line shortcut

$ pip install modoboa-amavis==1010$ pip install modoboa-postfix-autoreply==117$ pip install modoboa-radicale==105$ pip install modoboa-stats==109

160

Warning You have to upgrade extensions due to coreUser model attribute change (usergroup to userrole) Oth-erwise you will have an internal error after upgrade In particular modoboa-amavisd modoboa-stats modoboa-postfix-autoreply are concerned

36 Chapter 2 Table of contents

Modoboa Documentation Release 1100

An interesting feature brougth by this version is the capability to make different checks about MX records Forexample Modoboa can query main DNSBL providers for every defined domain With this you will quickly know ifone the domains you manage is listed or not To activate it add the following line to your crontab

30 ltoptional_virtualenv_pathgtpython ltmodoboa_instance_dirgtmanagepy modorarr˓check_mx

The communication with Modoboa public API has been reworked Instead of sending direct synchronous queries (forexample to check new versions) a cron job has been added To activate it add the following line to your crontab

0 ltoptional_virtualenv_pathgtpython ltmodoboa_instance_dirgtmanagepyrarr˓communicate_with_public_api

Please also note that public API now uses TLS so you must update your configuration as follows

MODOBOA_API_URL = httpsapimodoboaorg1

Finally it is now possible to declare additional sender addresses on a per-account basis You need to update your postfixconfiguration in order to use this functionality Just edit the maincf file and change the following parameter

smtpd_sender_login_maps =ltdrivergtetcpostfixsql-sender-login-mailboxescfltdrivergtetcpostfixsql-sender-login-aliasescfltdrivergtetcpostfixsql-sender-login-mailboxes-extracf

150

The API has been greatly improved and a documentation is now available To enable it addrest_framework_swagger to the INSTALLED_APPS variable in settingspy as follows

INSTALLED_APPS = (djangocontribauthdjangocontribcontenttypesdjangocontribsessionsdjangocontribmessagesdjangocontribsitesdjangocontribstaticfilesreversionrest_frameworkauthtokenrest_framework_swagger

)

Then add the following content into settingspy just after the REST_FRAMEWORK variable

SWAGGER_SETTINGS = is_authenticated Falseapi_version 10exclude_namespaces []info

contact contactmodoboacomdescription (Modoboa API requires a valid token)title Modoboa API

Yoursquore done The documentation is now available at the following address

22 Upgrade 37

Modoboa Documentation Release 1100

httpltyour instance addressgtdocsapi

Finally if you find a TEMPLATE_CONTEXT_PROCESSORS variable in your settingspy file make sure it lookslike this

TEMPLATE_CONTEXT_PROCESSORS = global_settingsTEMPLATE_CONTEXT_PROCESSORS + [modoboacorecontext_processorstop_notifications

]

140

Warning Please make sure to use Modoboa 135 with an up-to-date database before an upgrade to 140

Warning Do not follow the regular upgrade procedure for this version

Some extension have been moved back into the main repository The main reason for that is that using Modoboawithout them doesnrsquot make sense

First of all you must rename the following applications listed inside the MODOBOA_APPS variable

Old name New namemodoboa_admin modoboaadminmodoboa_admin_limits modoboalimitsmodoboa_admin_relaydomains modoboarelaydomains

Then apply the following steps

1 Uninstall old extensions

$ pip uninstall modoboa-admin modoboa-admin-limits modoboa-admin-relaydomains

2 Install all extension updates using pip (check the Modoboa gt Information page)

3 Manually migrate database

$ cd ltinstance_dirgt$ python managepy migrate auth$ python managepy migrate admin 0001 --fake$ python managepy migrate admin$ python managepy migrate limits 0001 --fake$ python managepy migrate relaydomains 0001 --fake$ python managepy migrate

4 Finally update static files

$ python managepy collectstatic

This version also introduces a REST API To enable it

1 Add rest_frameworkauthtoken to the INSTALLED_APPS variable

2 Add the following configuration inside settingspy

38 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Rest framework settings

REST_FRAMEWORK = DEFAULT_AUTHENTICATION_CLASSES (

rest_frameworkauthenticationTokenAuthentication)DEFAULT_PERMISSION_CLASSES (

rest_frameworkpermissionsIsAuthenticated)

3 Run the following command

$ python managepy migrate

135

To enhance security Modoboa now checks the strength of user passwords lthttpsgithubcomdstufftdjango-passwordsgt_

To use this feature add the following configuration into the settingspy file

django-passwords

PASSWORD_MIN_LENGTH = 8

PASSWORD_COMPLEXITY = UPPER 1LOWER 1DIGITS 1

132

Modoboa now uses the atomic requests mode to preserve database consistency (reference)

To enable it update the DATABASES variable in settingspy as follows

DATABASES = default

stuff beforeATOMIC_REQUESTS True

amavis

stuff beforeATOMIC_REQUESTS True

130

This release does not bring awesome new features but it is a necessary bridge to the future of Modoboa All extensionsnow have their own git repository and the deploy process has been updated to reflect this change

22 Upgrade 39

Modoboa Documentation Release 1100

Another important update is the use of Django 17 Besides its new features the migration system has been reworkedand is now more robust than before

Before we begin with the procedure here is a table showing old extension names and their new name

Old name New package name New module namemodoboaextensionsadmin modoboa-admin modoboa_adminmodoboaextensionslimits modoboa-admin-limits modoboa_admin_limitsmodoboaextensionspostfix_autoreply modoboa-postfix-autoreply modoboa_postfix_autoreplymodoboaextensionspostfix_relay_domains modoboa-admin-relaydomains modoboa_admin_relaydomainsmodoboaextensionsradicale modoboa-radicale modoboa_radicalemodoboaextensionssievefilters modoboa-sievefilters modoboa_sievefiltersmodoboaextensionsstats modoboa-stats modoboa_statsmodoboaextensionswebmail modoboa-webmail modoboa_webmail

Here are the required steps

1 Install the extensions using pip (look at the second column in the table above)

$ pip install ltthe extensions you wantgt

2 Remove south from INSTALLED_APPS

3 Rename old extension names inside MODOBOA_APPS (look at the third column in the table above)

4 Remove modoboalibmiddlewareExtControlMiddleware from MIDDLEWARE_CLASSES

5 Change DATABASE_ROUTERS to

DATABASE_ROUTERS = [modoboa_amavisdbrouterAmavisRouter]

6 Run the following commands

$ cd ltmodoboa_instance_dirgt$ python managepy migrate

7 Reply yes to the question

8 Run the following commands

$ python managepy load_initial_data$ python managepy collectstatic

9 The cleanup job has been renamed in Django so you have to modify your crontab entry

- 0 0 ltmodoboa_sitegtmanagepy cleanup+ 0 0 ltmodoboa_sitegtmanagepy clearsessions

120

A new notification service let administrators know about new Modoboa versions To activate it you need to updatethe TEMPLATE_CONTEXT_PROCESSORS variable like this

from djangoconf import global_settings

TEMPLATE_CONTEXT_PROCESSORS = global_settingsTEMPLATE_CONTEXT_PROCESSORS + (

(continues on next page)

40 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

modoboacorecontext_processorstop_notifications)

and to define the new MODOBOA_API_URL variable

MODOBOA_API_URL = httpapimodoboaorg1

The location of external static files has changed To use them add a new path to the STATICFILES_DIRS

Additional locations of static filesSTATICFILES_DIRS = (

Put strings here like homehtmlstatic or Cwwwdjangostatic Always use forward slashes even on Windows Dont forget to use absolute paths not relative pathsltpathtomodoboainstalldirgtbower_components

)

Run the following commands to define the hostname of your instance

$ cd ltmodoboa_instance_dirgt$ python managepy set_default_site lthostnamegt

If you plan to use the Radicale extension

1 Add modoboaextensionsradicale to the MODOBOA_APPS variable

2 Run the following commands

$ cd ltmodoboa_instance_dirgt$ python managepy syncdb

Warning You also have to note that the sitestatic directory has moved from ltpath to your sitesdirgt to ltmodoboas root urlgt (itrsquos probably the parent directory) You have to adapt your web serverconfiguration to reflect this change

23 Configuration

231 Online parameters

Modoboa provides online panels to modify internal parameters There are two available levels

bull Application level global parameters define how the application behaves Available at Modoboa gt Parameters

bull User level per user customization Available at User gt Settings gt Preferences

Regardless level parameters are displayed using tabs each tab corresponding to one application

General parameters

The admin application exposes several parameters they are presented below

23 Configuration 41

Modoboa Documentation Release 1100

Name Tab Description Default valueAuthentication type General The backend used for au-

thenticationLocal

Default password scheme General Scheme used to cryptmailbox passwords

crypt

Rounds General Number of rounds (onlyused by sha256cryptand sha512crypt) Mustbe between 1000 and999999999 inclusive

70000

Secret key General A key used to encryptusersrsquo password in ses-sions

random value

Sender address General Email address used tosend notifications

Enable communication General Enable communicationwith Modoboa public API

yes

Check new versions General Automatically checks if anewer version is available

yes

Send statistics General Send statistics to Mod-oboa public API (countersand used extensions)

yes

Top notifications check in-terval

General Interval between two topnotification checks (inseconds)

30

Maximum log record age General The maximum age in daysof a log record

365

Items per page General Number of displayeditems per page

30

Default top redirection General The default redirectionused when no applicationis specified

userprefs

Enable MX checks Admin Check that every domainhas a valid MX record

yes

Valid MXs Admin A list of IP or networkaddress every MX shouldmatch A warning will besent if a record does notrespect this it

Enable DNSBL checks Admin Check every domainagainst major DNSBLproviders

yes

DKIM keys storage direc-tory

AdminPath to a directory where DKIM

generated keys willbe stored

Default DKIM key length Admin The default size (in bits)for new keys

2048

Handle mailboxes onfilesystem

Admin Rename or remove mail-boxes on the filesystemwhen they get renamed orremoved within Modoboa

no

Mailboxes owner Admin The UNIX account whoowns mailboxes on thefilesystem

vmail

Default domain quota Admin Default quota (in MB) ap-plied to freshly createddomains with no valuespecified A value of 0means no quota

0

Automatic accountremoval

Admin When a mailbox is re-moved also remove theassociated account

no

Automatic do-mainmailbox creation

Admin Create a domain and amailbox when an accountis automatically created

yes

42 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Note If you are not familiar with virtual domain hosting you should take a look at postfixrsquos documentation ThisHow to also contains useful information

Note A random secret key will be generated each time the Parameters page is refreshed and until you save parametersat least once

Note Specific LDAP parameters are also available see LDAP authentication

232 Media files

Modoboa uses a specific directory to upload files (ie when the webmail is in use) or to create ones (ex graphical statis-tics) This directory is named media and is located inside modoboarsquos installation directory (called modoboa_sitein this documentation)

To work properly the system user which runs modoboa (www-data apache whatever) must have write access tothis directory

233 Customization

Custom logo

You have the possibility to use a custom logo instead of the default one on the login page

To do so open the settingspy file and add a MODOBOA_CUSTOM_LOGO variable This variable must containthe relative URL of your logo under MEDIA_URL For example

MODOBOA_CUSTOM_LOGO = ospathjoin(MEDIA_URL custom_logopng)

Then copy your logo file into the directory indicated by MEDIA_ROOT

234 Host configuration

Note This section is only relevant when Modoboa handles mailboxes renaming and removal from the filesystem

To manipulate mailboxes on the filesystem you must allow the user who runs Modoboa to execute commands as theuser who owns mailboxes

To do so edit the etcsudoers file and add the following inside

ltuser_that_runs_modoboagt ALL=(ltmailboxes ownergt) NOPASSWD ALL

Replace values between ltgt by the ones you use

23 Configuration 43

Modoboa Documentation Release 1100

235 Time zone and language

Modoboa is available in many languages

To specify the default language to use edit the settingspy file and modify the LANGUAGE_CODE variable

LANGUAGE_CODE = fr or en for english etc

Note Each user has the possibility to define the language he prefers

In the same configuration file specify the timezone to use by modifying the TIME_ZONE variable For example

TIME_ZONE = EuropeParis

236 Sessions management

Modoboa uses Djangorsquos session framework to store per-user information

Few parameters need to be set in the settingspy configuration file to make Modoboa behave as expected

SESSION_EXPIRE_AT_BROWSER_CLOSE = False Default value

This parameter is optional but you must ensure it is set to False (the default value)

The default configuration file provided by the modoboa-adminpy command is properly configured

237 Logging authentication

To trace login attempts to the web interface Modoboa uses python SysLogHandler so you can see them in your syslogauthentication log file (varlogauthlog in most cases)

Depending on your configuration you may have to edit the settingspy file and add lsquoaddressrsquo lsquodevlogrsquo to thelogging section

syslog-auth class logginghandlersSysLogHandlerfacility SysLogHandlerLOG_AUTHaddress devlogformatter syslog

238 External authentication

LDAP

Modoboa supports external LDAP authentication using the following extra components

bull Python LDAP client

bull Django LDAP authentication backend

If you want to use this feature you must first install those components

44 Chapter 2 Table of contents

Modoboa Documentation Release 1100

$ pip install python-ldap django-auth-ldap

Then all you have to do is to modify the settingspy file Add a new authentication backend to the AUTHENTI-CATION_BACKENDS variable like this

AUTHENTICATION_BACKENDS = (modoboalibauthbackendsLDAPBackend modoboalibauthbackendsLDAPSecondaryBackend Useful for a fallback

rarr˓mechanismdjangocontribauthbackendsModelBackend

)

Finally go to Modoboa gt Parameters gt General and set Authentication type to LDAP

From there new parameters will appear to let you configure the way Modoboa should connect to your LDAP serverThey are described just below

Name Description De-faultvalue

Server address The IP address of the DNS name of the LDAP server local-host

Server port The TCP port number used by the LDAP server 389Use a secureconnection

Use an SSLTLS connection to access the LDAP server no

Authenticationmethod

Choose the authentication method to use Directbind

User DN tem-plate (directbind mode)

The template used to construct a userrsquos DN It should contain one placeholder (ie(user)s)

Bind BN The distinguished name to use when binding to the LDAP server Leave empty for ananonymous bind

Bind password The password to use when binding to the LDAP server (with lsquoBind DNrsquo)Search base The distinguished name of the search baseSearch filter An optional filter string (eg lsquo(objectClass=person)rsquo) In order to be valid it must be

enclosed in parentheses(mail=(user)s)

Passwordattribute

The attribute used to store user passwords user-Pass-word

Active Direc-tory

Tell if the LDAP server is an Active Directory one no

Administratorgroups

Members of those LDAP Posix groups will be created ad domain administrators Uselsquorsquo characters to separate groups

Group type The type of group used by your LDAP directory Posix-Group

Groups searchbase

The distinguished name of the search base used to find groups

Do-mainmailboxcreation

Automatically create a domain and a mailbox when a new user is created just after thefirst successful authentication You will generally want to disable this feature whenthe relay domains extension is in use

yes

If you need additional parameters you will find a detailed documentation here

Once the authentication is properly configured the users defined in your LDAP directory will be able to connect to

23 Configuration 45

Modoboa Documentation Release 1100

Modoboa the associated domain and mailboxes will be automatically created if needed

The first time a user connects to Modoboa a local account is created if the LDAP username is a valid email addressBy default this account belongs to the SimpleUsers group and it has a mailbox

To automatically create domain administrators you can use the Administrator groups setting If a LDAP user belongsto one the listed groups its local account will belong to the DomainAdmins group In this case the username is notnecessarily an email address

Users will also be able to update their LDAP password directly from Modoboa

Note Modoboa doesnrsquot provide any synchronization mechanism once a user is registered into the database Anymodification done from the directory to a user account will not be reported to Modoboa (an email address change forexample) Currently the only solution is to manually delete the Modoboa record it will be recreated on the next userlogin

SMTP

It is possible to use an existing SMTP server as an authentication source To enable this feature edit the settingspy file and change the following setting

AUTHENTICATION_BACKENDS = (modoboalibauthbackendsSMTPBackenddjangocontribauthbackendsModelBackend

)

SMTP server location can be customized using the following settings

AUTH_SMTP_SERVER_ADDRESS = localhostAUTH_SMTP_SERVER_PORT = 25AUTH_SMTP_SECURED_MODE = None ssl or starttls are accepted

239 LDAP synchronization

Modoboa can synchronize accounts with an LDAP directory (tested with OpenLDAP) but this feature is not enabledby default To activate it add modoboaldapsync to MODOBOA_APPS in the settingspy file

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboaldapsync

)

and enable it from the admin panel

46 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning Make sure to install additional requirements otherwise it wonrsquot work

The following parameters are available and must be filled

Name Description Defaultvalue

Enable LDAP synchro-nization

Control LDAP synchronization state no

Bind DN The DN of a user with write permission to createupdate accountsBind password The associated passwordAccount DN template The template used to build account DNs (must contain a (user)s

placeholder

2310 Database maintenance

Cleaning the logs table

Modoboa logs administrator specific actions into the database A clean-up script is provided to automatically removeoldest records The maximum log record age can be configured through the online panel

To use it you can setup a cron job to run every night

0 0 ltmodoboa_sitegtmanagepy cleanlogs Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy cleanlogs

Cleaning the session table

Django does not provide automatic purging Therefore itrsquos your job to purge expired sessions on a regular basis

Django provides a sample clean-up script django-adminpy clearsessions That script deletes any sessionin the session table whose expire_date is in the past

For example you could setup a cron job to run this script every night

0 0 ltmodoboa_sitegtmanagepy clearsessions Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy clearsessions

Cleaning inactive accounts

Thanks to Last-login tracking it is now possible to monitor inactive accounts An account is considered inactive if nologin has been recorded for the last 30 days (this value can be changed through the admin panel)

A management command is available to disable or delete inactive accounts For example you could setup a cron jobto run it every night

23 Configuration 47

Modoboa Documentation Release 1100

0 0 ltmodoboa_sitegtmanagepy clean_inactive_accounts Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy clean_inactive_rarr˓accounts

The default behaviour is to disable accounts You can delete them using the --delete option

24 Moving to Modoboa

You have an existing platform and yoursquod like to move to Modoboa the following tools could help you

241 From postfixadmin

A dedicated command allows you to convert an existing postfixadmin database to a Modoboa one Consult the docu-mentation to know more about the process

242 Using CSV files

Modoboa allows you to import any object (domain domain alias mailbox and alias) using a simple CSV file encodedusing UTF8 Each line corresponds to a single object and must respect one of the following format

domain ltname stringgt ltquota integergt ltdefault mailbox quota integergt ltenabledrarr˓booleangtdomainalias ltname stringgt lttargeted domain stringgt ltenabled booleangtrelaydomain ltname stringgt lttarget host stringgt lttarget port integergt ltservicerarr˓stringgt ltenabled booleangt ltverify recipients booleangtaccount ltloginname stringgt ltpassword stringgt ltfirst name stringgt ltlast namerarr˓stringgt ltenabled booleangt ltgroup stringgt ltaddress stringgt ltquota integergt [rarr˓ltdomain stringgt ]alias ltaddress stringgt ltenabled booleangt ltrecipient stringgt

Boolean fields accept the following values true 1 yes y (case insensitive) Any other value will be evaluated asfalse

Warning The order does matter Objects are created sequencially so a domain must be created before itsmailboxes and aliases and a mailbox must created before its alias(es)

To actually import such a file

gt sudo -u ltmodoboa_usergt -igt source ltvirtualenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy modo import ltyour filegt

Available options can be listed using the following command

gt python managepy modo import -h

48 Chapter 2 Table of contents

Modoboa Documentation Release 1100

25 REST API

To ease the integration with external sources (software or other) Modoboa provides a REST API

Every installed instance comes with a ready-to-use API and a documentation You will find them using the followingurl patterns

bull API httplthostnamegtapiv1

bull Documentation httplthostnamegtdocsapi

An example of this documentation is available on the official demo

Using this API requires an authentication and for now only a token based authentication is supported To get a validtoken log-in to your instance with a super administrator go to Settings gt API and activate the API access Press theUpdate button and wait until the page is reloaded the token will be displayed

To make valid API calls every requests you send must embed this token within an Authorization HTTP header likethis

Authorization Token ltYOUR_TOKENgt

and the content type of those requests must be applicationjson

26 How to contribute

Contributions are always welcome If you want to submit a patch please respect the following rules

bull Open a pull request on the appropriate repository

bull Respect PEP8

bull Document your patch and respect PEP 257

bull Add unit tests and make sure the global coverage does not decrease

If all those steps are validated your contribution will generally be integrated

261 Table of contents

25 REST API 49

Modoboa Documentation Release 1100

Useful tips

You would like to work on Modoboa but you donrsquot know where to start Yoursquore at the right place Browse this pageto learn useful tips

Docker

A docker image is available for developers To use it you must install docker and docker-compose first

Then just run the following command

$ docker-compose up

It will start the docker environment and make a Modoboa instance available at httplocalhost8000

If you donrsquot want to use docker or need a more complex development setup go to the next section

Prepare a virtual environment

A virtual environment is a good way to setup a development environment on your machine

To do so run the following commands

$ python3 -m venv ltpathgt$ source ltpathgtbinactivate$ git clone httpsgithubcommodoboamodoboagit$ cd modoboa$ python setuppy develop$ pip install -r dev-requirementstxt

The develop command creates a symbolic link to your local copy so any modification you make will be automati-cally available in your environment no need to copy them

Deploy an instance for development

Warning Make sure to create a database before running this step The format of the database url is also describedin this page

Now that you have a running environment yoursquore ready to deploy a test instance

$ cd ltpathgt$ modoboa-adminpy deploy --dburl defaultltdatabase urlgt --domain localhost --develrarr˓instance$ python managepy runserver

Yoursquore ready to go You should be able to access Modoboa at httplocalhost8000 usingadminpassword as credentials

Manage static files

Modoboa uses bower (thanks to django-bower) to manage its CSS and javascript dependencies

50 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Those dependencies are listed in a file called dev_settingspy located inside the ltpath_to_local_copygtmodoboacore directory

If you want to add a new dependency just complete the BOWER_INSTALLED_APPS parameter and run the followingcommand

$ python managepy bower install

It will download and store the required files into the ltpath_to_local_copygtmodoboabower_components directory

Test your modifications

If you deployed a specific instance for your development needs you can run the tests suite as follows

gt python managepy test modoboacore modoboalib modoboaadmin modoboalimits modoboararr˓relaydomains

Otherwise you can run the tests suite from the repository using tox

Start a basic Modoboa instance

From the repository run the following command to launch a simple instance with a few fixtures

gt tox -e serve

You can use adminpassword to log in

Build the documentation

If you need to modify the documenation and want to see the result you can build it as follows

gt tox -e docgt firefox toxdoctmphtmlindexhtml

FAQ

bower command is missing in managepy

bower command is missing in managepy if you donrsquot use the --devel option of the modoboa-adminpydeploy command

To fix it regenerate your instance or update your settingspy file manually Look at devmode in httpsgithubcomtonioomodoboablobmastermodoboacorecommandstemplatessettingspytpl

Create a new plugin

Introduction

Modoboa offers a plugin API to expand its capabilities The current implementation provides the following possibili-ties

26 How to contribute 51

Modoboa Documentation Release 1100

bull Expand navigation by adding entry points to your plugin inside the GUI

bull Access and modify administrative objects (domains mailboxes etc)

bull Register callback actions for specific events

Plugins are nothing more than Django applications with an extra piece of code that integrates them into Modoboa Themodo_extensionpy file will contain a complete description of the plugin

bull Admin and user parameters

bull Custom menu entries

The communication between both applications is provided by Django signals

The following subsections describe the plugin architecture and explain how you can create your own

The required glue

To create a new plugin just start a new django application like this (into Modoboarsquos directory)

$ python managepy startapp

Then you need to register this application using the provided API Just copypaste the following example into themodo_extensionpy file of the future extension

from modoboacoreextensions import ModoExtension exts_pool

class MyExtension(ModoExtension)My custom Modoboa extension

name = myextlabel = My Extensionversion = 01description = A descriptionurl = myext_root_location optional name is used if not defined

def load(self)This method is called when Modoboa loads available and activated plugins

Declare parameters and register events herepass

def load_initial_data(self)Optional provide initial data for your extension herepass

exts_poolregister_extension(MyExtension)

Once done simply add your extensionrsquos module name to the MODOBOA_APPS variable located inside settingspy Finally run the following commands

$ python managepy migrate$ python managepy load_initial_data$ python managepy collectstatic

52 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Parameters

A plugin can declare its own parameters There are two levels available

bull lsquoGlobalrsquo parameters used to configure the plugin editable inside the Admin gt Settings gt Parameters page

bull lsquoUserrsquo parameters per-user parameters (or preferences) editable inside the Options gt Preferences page

Playing with parameters

Parameters are defined using Django forms and Modoboa adds two special forms you can inherit depending on thelevel of parameter(s) you want to add

bull modoboaparametersformsAdminParametersForm for general parameters

bull modoboaparametersformsUserParametersForm for user parameters

To register new parameters add the following line into the load method of your plugin class

from modoboaparameters import tools as param_toolsparam_toolsregistryadd(

LEVEL YourForm ugettext_lazy(Title))

Replace LEVEL by global or user

Custom role permissions

Modoboa uses Djangorsquos internal permission system Administrative roles are nothing more than groups (Groupinstances)

An extension can add new permissions to a group by listening to the extra_role_permissions signal Here isan example

from djangodispatch import receiverfrom modoboacore import signals as core_signals

PERMISSIONS = Resellers [

(relaydomains relaydomain add_relaydomain)(relaydomains relaydomain change_relaydomain)(relaydomains relaydomain delete_relaydomain)(relaydomains service add_service)(relaydomains service change_service)(relaydomains service delete_service)

]

receiver(core_signalsextra_role_permissions)def extra_role_permissions(sender role kwargs)

Add permissions to the Resellers groupreturn constantsPERMISSIONSget(role [])

Extending admin forms

The forms used to edit objects (account domain etc) through the admin panel are composed of tabs You can extendthem (ie add new tabs) in a pretty easy way thanks to custom signals

26 How to contribute 53

Modoboa Documentation Release 1100

Account

To add a new tab to the account edition form define new listeners (handlers) for the following signals

bull modoboaadminsignalsextra_account_forms

bull modoboaadminsignalsget_account_form_instances

bull modoboaadminsignalscheck_extra_account_form (optional)

Example

from djangodispatch import receiverfrom modoboaadmin import signals as admin_signals

receiver(admin_signalsextra_account_forms)def extra_account_form(sender user account kwargs)

return [id tabid title Title cls MyFormClass

]

receiver(admin_signalsget_account_form_instances)def fill_my_tab(sender user account kwargs)

return id my_instance

Domain

To add a new tab to the domain edition form define new listeners (handlers) for the following signals

bull modoboaadminsignalsextra_domain_forms

bull modoboaadminsignalsget_domain_form_instances

Example

from djangodispatch import receiverfrom modoboaadmin import signals as admin_signals

receiver(admin_signalsextra_domain_forms)def extra_account_form(sender user domain kwargs)

return [id tabid title Title cls MyFormClass

]

receiver(admin_signalsget_domain_form_instances)def fill_my_tab(sender user domain kwargs)

return id my_instance

27 Contributors

bull Antidot

bull Bearstech

bull CAP-REL

54 Chapter 2 Table of contents

Modoboa Documentation Release 1100

bull Dalnix

27 Contributors 55

  • Overview
  • Table of contents
Page 19: Modoboa Documentation

Modoboa Documentation Release 1100

(continued from previous page)

args = etcdovecotdovecot-sqlconfext

userdb sql driver = sqlargs = etcdovecotdovecot-sqlconfext

Make sure to activate only one backend (per type) inside your configuration (just comment the other ones)

Edit the dovecot-sqlconfext and modify the configuration according to your database engine

MySQL users

driver = mysql

connect = host=ltmysqld socketgt dbname=ltdatabasegt user=ltusergt password=ltpasswordgt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user WHERE email=Lu andrarr˓is_active=1

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid concat(bytes= mbquota M) AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

PostgreSQL users

driver = pgsql

connect = host=ltpostgres socketgt dbname=ltdatabasegt user=ltusergt password=ltpasswordgt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user u INNER JOIN admin_rarr˓mailbox mb ON uid=mbuser_id INNER JOIN admin_domain dom ON mbdomain_id=domidrarr˓WHERE uemail=Lu AND uis_active AND domenabled

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid bytes= || mbquota || M AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

16 Chapter 2 Table of contents

Modoboa Documentation Release 1100

SQLite users

driver = sqlite

connect = ltpath to the sqlite db filegt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user u INNER JOIN admin_rarr˓mailbox mb ON uid=mbuser_id INNER JOIN admin_domain dom ON mbdomain_id=domidrarr˓WHERE uemail=Lu AND uis_active=1 AND domenabled=1

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid (bytes= || mbquota || M) AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

Note Replace values between ltgt with yours

LDAP

To make the LDAP authentication work edit the confd10-authconf and uncomment the following line atthe end

include auth-ldapconfext

Then edit the confdauth-ldapconfext and edit the passdb section as following You should comment theuserdb section which will be managed by SQL with modoboa database

passdb driver = ldap

Path for LDAP configuration file see example-configdovecot-ldapconfextargs = etcdovecotdovecot-ldapconfext

userdb driver = ldapargs = etcdovecotdovecot-ldapconfext

Default fields can be used to specify defaults that LDAP may overridedefault_fields = home=homevirtualu

Your own dovecot LDAP configuration file is now etcdovecotdovecot-ldapconfext You can addyour default LDAP conf in it following the official documentation

Synchronize dovecot LDAP conf with modoboa LDAP conf

To make dovecot LDAP configuration synchronized with modoboa LDAP configuration you should create a dedicateddovecot conf file At the end of your dovecot configuration file (dovecot-ldapconfext) add the following

21 Installation 17

Modoboa Documentation Release 1100

line

include_try dovecot-modoboaconfext

Then set modoboa parameter Enable Dovecot LDAP sync to Yes Then set the Dovecot LDAP config file following theprevious step (etcdovecotdovecot-modoboaconfext in the example)

The last step is to add the command update_dovecot_conf to the cron job of modoboa Then each time your modoboaLDAP configuration is updated your dovecot LDAP configuration will also be

LMTP

Local Mail Transport Protocol is used to let Postfix deliver messages to Dovecot

First make sure the protocol is activated by looking at the protocols setting (generally inside dovecotconf)It should be similar to the following example

protocols = imap pop3 lmtp

Then open the confd10-masterconf look for lmtp service definition and add the following content inside

service lmtp stuff beforeunix_listener varspoolpostfixprivatedovecot-lmtp mode = 0600user = postfixgroup = postfix

stuff after

We assume here that Postfix is chrooted within varspoolpostfix

Finally open the confd20-lmtpconf and modify it as follows

protocol lmtp postmaster_address = postmasterltdomaingtmail_plugins = $mail_plugins quota sieve

Replace ltdomaingt by the appropriate value

Note If you donrsquot plan to apply quota or to use filters just adapt the content of the mail_plugins setting

Quota

Modoboa lets adminstrators define per-domain andor per-account limits (quota) It also lists the current quota usageof each account Those features require Dovecot to be configured in a specific way

Inside confd10-mailconf add the quota plugin to the default activated ones

mail_plugins = quota

Inside confd10-masterconf update the dict service to set proper permissions

18 Chapter 2 Table of contents

Modoboa Documentation Release 1100

service dict If dict proxy is used mail processes should have access to its socket For example mode=0660 group=vmail and global mail_access_groups=vmailunix_listener dict mode = 0600user = ltuser owning mailboxesgtgroup =

Inside confd20-imapconf activate the imap_quota plugin

protocol imap

mail_plugins = $mail_plugins imap_quota

Inside dovecotconf activate the quota SQL dictionary backend

dict quota = ltdrivergtetcdovecotdovecot-dict-sqlconfext

Inside confd90-quotaconf activate the quota dictionary backend

plugin quota = dictUser quotaproxyquota

It will tell Dovecot to keep quota usage in the SQL dictionary

Finally edit the dovecot-dict-sqlconfext file and put the following content inside

connect = host=ltdb hostgt dbname=ltdb namegt user=ltdb usergt password=ltpasswordgt SQLite users connect = pathtothedatabasedb

map pattern = privquotastoragetable = admin_quotausername_field = usernamevalue_field = bytes

map

pattern = privquotamessagestable = admin_quotausername_field = usernamevalue_field = messages

PostgreSQL users

21 Installation 19

Modoboa Documentation Release 1100

Database schema update

The admin_quota table is created by Django but unfortunately it doesnrsquot support DEFAULT constraints (it onlysimulates them when the ORM is used) As PostgreSQL is a bit strict about constraint violations you must executethe following query manually

db=gt ALTER TABLE admin_quota ALTER COLUMN bytes SET DEFAULT 0db=gt ALTER TABLE admin_quota ALTER COLUMN messages SET DEFAULT 0

Trigger

As indicated on Dovecotrsquos wiki you need a trigger to properly update the quota

A working copy of this trigger is available on Github

Download this file and copy it on the server running postgres Then execute the following commands

$ su - postgres$ psql [modoboa database] lt pathtomodoboa_postgres_triggersql$ exit

Replace [modoboa database] by the appropriate value

Forcing recalculation

For existing installations Dovecot (gt 2) offers a command to recalculate the current quota usages For example if youwant to update all usages run the following command

$ doveadm quota recalc -A

Be carefull it can take a while to execute

ManageSieveSieve

Modoboa lets users define filtering rules from the web interface To do so it requires ManageSieve to be activated onyour server

Inside confd20-managesieveconf make sure the following lines are uncommented

protocols = $protocols sieve

service managesieve-login

service managesieve

protocol sieve

20 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Messages filtering using Sieve is done by the LDA

Inside confd15-ldaconf activate the sieve plugin like this

protocol lda Space separated list of plugins to load (default is global mail_plugins)mail_plugins = $mail_plugins sieve

Finally configure the sieve plugin by editing the confd90-sieveconf file Put the follwing caontent inside

plugin Location of the active script When ManageSieve is used this is actually a symlink pointing to the active script in the sieve storage directorysieve = ~dovecotsieve

The path to the directory where the personal Sieve scripts are stored For ManageSieve this is where the uploaded scripts are storedsieve_dir = ~sieve

Restart Dovecot

Now you can go to the Postfix section to finish the installation

Last-login tracking

To update the last_login attribute of an account after a succesful IMAP or POP3 login you can configure apost-login script

Open confd10-masterconf add the following configuration (imap and pop3 services are already definedyou just need to update them)

service imap executable = imap postlogin

service pop3 executable = pop3 postlogin

service postlogin executable = script-login usrlocalbinpostloginshuser = modoboaunix_listener postlogin

Then you must create a script named usrlocalbinpostloginsh According to your database enginethe content will differ

PostgreSQL

21 Installation 21

Modoboa Documentation Release 1100

binsh

psql -c UPDATE core_user SET last_login=now() WHERE username=$USER gt devnull

exec $

MySQL

binsh

DBNAME=XXXDBUSER=XXXDBPASSWORD=XXX

echo UPDATE core_user SET last_login=now() WHERE username=$USER | mysql -urarr˓$DBUSER -p$DBPASSWORD $DBNAME

exec $

Postfix

This section gives an example about building a simple virtual hosting configuration with Postfix Refer to the officialdocumentation for more explanation

Map files

You first need to create configuration files (or map files) that will be used by Postfix to lookup into Modoboa tables

To automaticaly generate the requested map files and store them in a directory run the following command

gt cd ltmodoboa_instance_pathgtgt python managepy generate_postfix_maps --destdir ltdirectorygt

ltdirectorygt is the directory where the files will be stored Answer the few questions and yoursquore done

Configuration

Use the following configuration in the etcpostfixmaincf file (this is just one possible configuration)

Stuff beforevirtual_transport = lmtpunixprivatedovecot-lmtp

virtual_mailbox_domains = ltdrivergtetcpostfixsql-domainscfvirtual_alias_domains = ltdrivergtetcpostfixsql-domain-aliasescfvirtual_alias_maps = ltdrivergtetcpostfixsql-aliasescf

relay_domains = ltdrivergtetcpostfixsql-relaydomainscftransport_maps =

ltdrivergtetcpostfixsql-transportcfltdrivergtetcpostfixsql-spliteddomains-transportcf

(continues on next page)

22 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

smtpd_recipient_restrictions = check_recipient_access

ltdrivergtetcpostfixsql-maintaincfltdrivergtetcpostfixsql-relay-recipient-verificationcf

permit_mynetworksreject_unauth_destinationreject_unverified_recipient

smtpd_sender_login_maps = ltdrivergtetcpostfixsql-sender-login-mapcf

smtpd_sender_restrictions =reject_sender_login_mismatch

Stuff after

Replace ltdrivergt by the name of the database you use

Restart Postfix

Policy daemon

If you want to enable the built-in policy daemon add the following content to the etcpostfixmaincf file

smtpd_recipient_restrictions = check_policy_service inet1270019999

And reload postfix

Note The check_policy_service line must be placed before the permit_mynetworks one otherwise thedaemon wonrsquot be called

OpenDKIM

Modoboa can generate DKIM keys for the hosted domains but it wonrsquot sign or check messages To do that you needa dedicated software like OpenDKIM

Note The cron job in charge of creating DKIM keys must be run using the same user than OpenDKIM (ie opendkimin most cases)

Database

Since keys related information is stored in Modoboarsquos database you need to tell OpenDKIM how it can access it

First make sure to install the required additional packages on your system (libopendbx1- on debian baseddistributions or opendbx- on CentOS the complete name depends on your database engine)

Then insert the following SQL view into Modoboarsquos database

21 Installation 23

Modoboa Documentation Release 1100

PostgreSQL

CREATE OR REPLACE VIEW dkim AS (SELECT id name as domain_name dkim_private_key_path AS private_key_path

dkim_key_selector AS selectorFROM admin_domain WHERE enable_dkim

)

MySQLMariaDB

CREATE OR REPLACE VIEW dkim AS (SELECT id name as domain_name dkim_private_key_path AS private_key_path

dkim_key_selector AS selectorFROM admin_domain WHERE enable_dkim=1

)

Configuration

You should find OpenDKIMrsquos configuration file at etcopendkimconf

Add the following content to it

KeyTable dsnltdrivergtltusergtltpasswordgtltdb hostgtltdb namegttable=dkimrarr˓keycol=iddatacol=domain_nameselectorprivate_key_pathSigningTable dsnltdrivergtltusergtltpasswordgtltdb hostgtltdb namegttable=dkimrarr˓keycol=domain_namedatacol=idSocket inet12345localhost

Replace values between ltgt by yours Accepted values for driver are pgsql or mysql Make sure the user youspecify has read permission on the view created previously

If you run a debian based system make sure to adjust the following setting in the etcdefaultopendkim file

SOCKET=inet12345localhost

Eventually reload OpenDKIM

Postfix integration

Add the following lines to the etcpostfixmaincf file

smtpd_milters = inet12700112345non_smtpd_milters = inet12700112345milter_default_action = acceptmilter_content_timeout = 30s

and reload postfix

Extensions

Only few commands are needed to add a new extension to your setup

24 Chapter 2 Table of contents

Modoboa Documentation Release 1100

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install ltEXTENSIONgt==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Then restart your web server

22 Upgrade

221 Modoboa

Warning The new version you are going to install may need to modify your database Before you start makesure to backup everything

Most of the time upgrading your installation to a newer Modoboa version only requires a few actions In every caseyou will need to apply the general procedure first and then check if the version you are installing requires specificactions

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install modoboa==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Once done check if the version you are installing requires Specific instructions

Finally restart your web server

Sometimes you might need to upgrade postfix map files too To do so just run the generate_postfix_mapscommand on the same directory than the one used for installation (etcpostfix by default)

Make sure to use root privileges and run the following command

gt python managepy generate_postfix_maps --destdir ltdirectorygt

Then reload postfix

22 Upgrade 25

Modoboa Documentation Release 1100

222 Extensions

If a new version is available for an extension yoursquore using it is recommanded to install it Upgrading an extensions ispretty and the procedure is almost the same than the one used for Modoboa

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install ltEXTENSIONgt==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Finally restart your web server

It is a generic upgrade procedure which will be enough most of the time but it is generally a good idea to check theassociated documentation

223 Rebuild Virtual Environment

Sometimes when upgrading your Operating System (eg from Ubuntu 1704 to Ubuntu 1710) your virtual environmentrunning modoboa can get corrupted Your first response will be to panic but fear not The solution is in this document

First things first

Recover your database password

You will need to recover your database password (if using mysql or postgresql) You will find this in etcpostfixsql-aliasescf or any file with sql-cf in the etcpostfix directory

Make note of this as you will need it when reconfiguring modoboa

Reinstall Modoboa

Start out by backup up your modoboa settings file located in the modoboa instance directory (srvmodoboainstanceinstancesettingspy if you used the default installer configuration) This contains your currentconfiguration

Next you want to remove all current modoboa files

After doing this follow the manual installation instructions for Modoboa only as everything should be working prop-erly

After this completes simply restore your backed up settings file to srvinstanceinstancesettingspy(if you used installer default configuration) You will then need to reinstall your extensions

You can find which plugins you had in your settingspy file under the MODOBOA_APPS variable

Instructions to install extensions can also be found here

Once you have completed this step you will need to run the following commands

26 Chapter 2 Table of contents

Modoboa Documentation Release 1100

gt (env) $ cd ltinstance_dirgtgt (env) $ python managepy migrategt (env) $ python managepy collectstatic

You will then see a message similar to

You have requested to collect static files at the destinationlocation as specified in your settings

srvmodoboainstancesitestatic

This will overwrite existing filesAre you sure you want to do this

Type yes to continue or no to cancel

You will want to answer yes here then simply restart the uwsgi process with service uwsgi restart andyou should be up and running again

Simply log into your modoboa web panel and verify that your extensions and webmail box is working

224 Information

Rebuild instructions from httpshelppythonanywherecompagesRebuildingVirtualenvs

225 Specific instructions

1160

A new policy daemon has been added

Make sure to have a Redis instance running on your server

Add modoboapolicyd to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboapolicyd

)

Add the following settings to your settingspy file

REDIS_HOST = ltIP or hostname heregtREDIS_PORT = 6379REDIS_QUOTA_DB = 0REDIS_URL = redisformat(REDIS_HOST REDIS_PORT REDIS_QUOTA_DB)

Once done you can start the policy daemon using the following commands

22 Upgrade 27

Modoboa Documentation Release 1100

gt python managepy policy_daemon

Donrsquot forget to configure _policyd_config if you want to use this feature

The modoboa-stats plugin has been merged into the core

Add modoboamaillog to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboapolicydmodoboamaillog

)

And remove any reference to modoboa_stats in this same variable

1150

This version drops Python 2 support so donrsquot forget to update all the extensions you use

Warning If you upgrade an existing python 2 installation you will need to create a new Python 3 virtualenvironment You can remove the existing virtual environment and replace it by the new one so you wonrsquot have tomodify your configuration files

Add the following new setting

DISABLE_DASHBOARD_EXTERNAL_QUERIES = False

Reload uwsgigunicornapache depending on your setup

Finally Make sure to use root privileges and run the following command

gt python managepy generate_postfix_maps --destdir ltdirectorygt

Then reload postfix

1140

This release introduces an optional LDAP synchronization process If you want to use it please follow the dedicatedprocedure

1131

Upgrade postfix maps files as follows

28 Chapter 2 Table of contents

Modoboa Documentation Release 1100

gt python managepy generate_postfix_maps --destdir ltpathgt --force-overwrite

1130

Add modoboadnstools to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstools

)

Add the following new settings

CSRF_COOKIE_SECURE = TrueSESSION_COOKIE_SECURE = True

modoboa-postfix-autoreply 150

Edit the etcpostfixmaincf file and remove the sql-autoreplies-transportcf map from thetransport_maps if present Remove the corresponding proxy_read_maps entry if relevant

Reload postfix

1100

Warning Upgrade installed extensions BEFORE running check or migrate commands

Upgrade all your installed plugins to the following versions

Warning If you use the amavis plugin make sure to include its configuration as follows into settingspy

from modoboa_amavis import settings as modoboa_amavis_settingsmodoboa_amavis_settingsapply(globals())

22 Upgrade 29

Modoboa Documentation Release 1100

Name Versionmodoboa-amavis 120modoboa-contacts 050modoboa-dmarc 110modoboa-imap-migration 120modoboa-pdfcredentials 130modoboa-postfix-autoreply 140modoboa-radicale 120modoboa-sievefilters 140modoboa-stats 140modoboa-webmail 140

Edit the settingspy file and apply the following modifications

Add modoboatransport to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparameters

)

Replace the following line

MIDDLEWARE_CLASSES = (

by

MIDDLEWARE = (

Update postfix map files as follows

gt rm -f ltpathgtmodoboa-postfix-mapschkgt python managepy generate_postfix_maps --force --destdir ltpathgt

Then modify postfixrsquos configuration as follows

smtpd_sender_login_maps =ltdrivergtltpathgtsql-sender-login-mapcf

transport_maps =ltdrivergtltpathgtsql-transportcfltdrivergtltpathgtsql-spliteddomains-transportcf other map files

Replace ltdrivergt and ltpathgt by your values

If transport_maps contains sql-relaydomains-transportcf remove it

30 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning If you make use of postfixrsquos proxymap server you must also update the proxy_read_maps setting

Reload postfix

Add the following cron job in order to generate DKIM keys

Generate DKIM keys (they will belong to the user running this job)

root $PYTHON $INSTANCEmanagepy modorarr˓manage_dkim_keys

190

If you want to manage inactive accounts look at Cleaning inactive accounts

183

Edit the settingspy file and replace the following line

BASE_DIR = ospathdirname(ospathdirname(__file__))

by

BASE_DIR = ospathrealpath(ospathdirname(ospathdirname(__file__)))

180

Modoboa now relies on Djangorsquos builtin password validation system to validate user passwords instead ofdjango-passwords

Remove django-passwords from your system

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt pip uninstall django-passwords

Edit the settingspy file and remove the following content

django-passwords

PASSWORD_MIN_LENGTH = 8

PASSWORD_COMPLEXITY = UPPER 1LOWER 1DIGITS 1

Add the following lines

Password validation rulesAUTH_PASSWORD_VALIDATORS = [

NAME djangocontribauthpassword_validation

rarr˓UserAttributeSimilarityValidator (continues on next page)

22 Upgrade 31

Modoboa Documentation Release 1100

(continued from previous page)

NAME djangocontribauthpassword_validationMinimumLengthValidator

NAME djangocontribauthpassword_validationCommonPasswordValidator

NAME djangocontribauthpassword_validationNumericPasswordValidator

NAME modoboacorepassword_validationComplexityValidatorOPTIONS

upper 1lower 1digits 1specials 0

]

172

API documentation has evolved (because of the upgrade to Django Rest Framework 36) and CKeditor is now embed-ded by default (thanks to the django-ckeditor package) Some configuration changes are required

Edit your settingspy file and apply the following modifications

bull Update the INSTALLED_APPS variable as follows

INSTALLED_APPS = (djangocontribauthdjangocontribcontenttypesdjangocontribsessionsdjangocontribmessagesdjangocontribsitesdjangocontribstaticfilesreversionckeditorckeditor_uploaderrest_frameworkrest_frameworkauthtoken

)

bull Update the REST_FRAMEWORK variable as follows

REST_FRAMEWORK = DEFAULT_AUTHENTICATION_CLASSES (

rest_frameworkauthenticationTokenAuthenticationrest_frameworkauthenticationSessionAuthentication

)

bull Remove the SWAGGER_SETTINGS variable

bull Add the following content

32 Chapter 2 Table of contents

Modoboa Documentation Release 1100

CKeditor

CKEDITOR_UPLOAD_PATH = uploads

CKEDITOR_IMAGE_BACKEND = pillow

CKEDITOR_RESTRICT_BY_USER = True

CKEDITOR_BROWSE_SHOW_DIRS = True

CKEDITOR_ALLOW_NONIMAGE_FILES = False

CKEDITOR_CONFIGS = default

allowedContent Truetoolbar Modoboawidth Nonetoolbar_Modoboa [

[Bold Italic Underline][JustifyLeft JustifyCenter JustifyRight JustifyBlock][BidiLtr BidiRtl Language][NumberedList BulletedList - Outdent Indent][Undo Redo][Link Unlink Anchor - Smiley][TextColor BGColor - Source][Font FontSize][Image ][SpellChecker]

]

Donrsquot forget to run the following command

gt python managepy collectstatic

171

If you used 170 for a fresh installation please run the following commands

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy load_initial_data

170

This version requires Django gt= 110 so you need to make some modifications It also brings internal API changeswhich are not backward compatible so installed extensions must be upgraded too

First of all deactivate all installed extensions (edit the settingspy file and comment the corresponding lines inMODOBOA_APPS)

Edit the urlspy file of your local instance and replace its content by the following one

22 Upgrade 33

Modoboa Documentation Release 1100

from djangoconfurls import include url

urlpatterns = [url(r include(modoboaurls))

]

Edit the settingspy and apply the following changes

bull Add modoboaparameters to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboarelaydomainsmodoboalimitsmodoboaparameters Modoboa extensions here

)

bull Add modoboacoremiddlewareLocalConfigMiddleware to MIDDLEWARE_CLASSES

MIDDLEWARE_CLASSES = (djangocontribsessionsmiddlewareSessionMiddlewaredjangomiddlewarecommonCommonMiddlewaredjangomiddlewarecsrfCsrfViewMiddlewaredjangocontribauthmiddlewareAuthenticationMiddlewaredjangocontribmessagesmiddlewareMessageMiddlewaredjangomiddlewarelocaleLocaleMiddlewaredjangomiddlewareclickjackingXFrameOptionsMiddlewaremodoboacoremiddlewareLocalConfigMiddlewaremodoboalibmiddlewareAjaxLoginRedirectmodoboalibmiddlewareCommonExceptionCatchermodoboalibmiddlewareRequestCatcherMiddleware

)

bull Modoboa used to provide a custom authentication backend (modoboalibauthbackendsSimpleBackend) but it has been removed Replace it as follows

AUTHENTICATION_BACKENDS = ( Other backends beforedjangocontribauthbackendsModelBackend

)

bull Remove TEMPLATE_CONTEXT_PROCESSORS and replace it by

TEMPLATES = [

BACKEND djangotemplatebackendsdjangoDjangoTemplatesDIRS []APP_DIRS TrueOPTIONS

context_processors [djangotemplatecontext_processorsdebugdjangotemplatecontext_processorsrequestdjangocontribauthcontext_processorsauth

(continues on next page)

34 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

djangotemplatecontext_processorsi18ndjangotemplatecontext_processorsmediadjangotemplatecontext_processorsstaticdjangotemplatecontext_processorstzdjangocontribmessagescontext_processorsmessagesmodoboacorecontext_processorstop_notifications

]debug False

]

Run the following commands (load virtualenv if you use one)

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstatic

Finally upgrade your extensions and reactivate them

Name Versionmodoboa-amavis 110modoboa-dmarc 100modoboa-imap-migration 110modoboa-pdfcredentials 110modoboa-postfix-autoreply 120modoboa-radicale 110modoboa-sievefilters 110modoboa-stats 110modoboa-webmail 110

Command line shortcuts

$ pip install modoboa-amavis==110$ pip install modoboa-dmarc==100$ pip install modoboa-imap-migration==110$ pip install modoboa-pdfcredentials==110$ pip install modoboa-postfix-autoreply==120$ pip install modoboa-radicale==110$ pip install modoboa-sievefilters==110$ pip install modoboa-stats==110$ pip install modoboa-webmail==110

And please make sure you use the latest version of the django-versionfield2 package

$ pip install -U django-versionfield2

Notes about quota changes and resellers

Reseller users now have a quota option in Resources tab This is the quota that a reseller can share between all itsdomains

22 Upgrade 35

Modoboa Documentation Release 1100

There are two quotas for a domain in the new version

1 Quota amp

2 Default mailbox quota

[1] Quota quota shared between mailboxes This quota is shared between all the mailboxes of this domain This valuecannot exceed resellerrsquos quota and hence cannot be 0(unlimited) if reseller has finite quota

[2] Default mailbox quota default quota applied to mailboxes This quota is the default quota applied to new mail-boxes This value cannot exceed Quota[1] and hence cannot be 0(unlimited) if Quota[1] is finite

161

First of all update postfix map files as follows

gt python managepy generate_postfix_maps --destdir ltpathgt --force-overwrite

Then modify postfixrsquos configuration as follows

smtpd_sender_login_maps =ltdrivergtltpathgtsql-sender-login-mailboxescfltdrivergtltpathgtsql-sender-login-aliasescfltdrivergtltpathgtsql-sender-login-mailboxes-extracf

Replace ltdrivergt and ltpathgt by your values

Finally reload postfix

This release also deprecates some internal functions As a result several extensions has been updated to maintain thecompatibility If you enabled the notification service yoursquoll find the list of available updates directly in your Modoboaconsole

For the others here is the list

Name Versionmodoboa-amavis 1010modoboa-postfix-autoreply 117modoboa-radicale 105modoboa-stats 109

Command line shortcut

$ pip install modoboa-amavis==1010$ pip install modoboa-postfix-autoreply==117$ pip install modoboa-radicale==105$ pip install modoboa-stats==109

160

Warning You have to upgrade extensions due to coreUser model attribute change (usergroup to userrole) Oth-erwise you will have an internal error after upgrade In particular modoboa-amavisd modoboa-stats modoboa-postfix-autoreply are concerned

36 Chapter 2 Table of contents

Modoboa Documentation Release 1100

An interesting feature brougth by this version is the capability to make different checks about MX records Forexample Modoboa can query main DNSBL providers for every defined domain With this you will quickly know ifone the domains you manage is listed or not To activate it add the following line to your crontab

30 ltoptional_virtualenv_pathgtpython ltmodoboa_instance_dirgtmanagepy modorarr˓check_mx

The communication with Modoboa public API has been reworked Instead of sending direct synchronous queries (forexample to check new versions) a cron job has been added To activate it add the following line to your crontab

0 ltoptional_virtualenv_pathgtpython ltmodoboa_instance_dirgtmanagepyrarr˓communicate_with_public_api

Please also note that public API now uses TLS so you must update your configuration as follows

MODOBOA_API_URL = httpsapimodoboaorg1

Finally it is now possible to declare additional sender addresses on a per-account basis You need to update your postfixconfiguration in order to use this functionality Just edit the maincf file and change the following parameter

smtpd_sender_login_maps =ltdrivergtetcpostfixsql-sender-login-mailboxescfltdrivergtetcpostfixsql-sender-login-aliasescfltdrivergtetcpostfixsql-sender-login-mailboxes-extracf

150

The API has been greatly improved and a documentation is now available To enable it addrest_framework_swagger to the INSTALLED_APPS variable in settingspy as follows

INSTALLED_APPS = (djangocontribauthdjangocontribcontenttypesdjangocontribsessionsdjangocontribmessagesdjangocontribsitesdjangocontribstaticfilesreversionrest_frameworkauthtokenrest_framework_swagger

)

Then add the following content into settingspy just after the REST_FRAMEWORK variable

SWAGGER_SETTINGS = is_authenticated Falseapi_version 10exclude_namespaces []info

contact contactmodoboacomdescription (Modoboa API requires a valid token)title Modoboa API

Yoursquore done The documentation is now available at the following address

22 Upgrade 37

Modoboa Documentation Release 1100

httpltyour instance addressgtdocsapi

Finally if you find a TEMPLATE_CONTEXT_PROCESSORS variable in your settingspy file make sure it lookslike this

TEMPLATE_CONTEXT_PROCESSORS = global_settingsTEMPLATE_CONTEXT_PROCESSORS + [modoboacorecontext_processorstop_notifications

]

140

Warning Please make sure to use Modoboa 135 with an up-to-date database before an upgrade to 140

Warning Do not follow the regular upgrade procedure for this version

Some extension have been moved back into the main repository The main reason for that is that using Modoboawithout them doesnrsquot make sense

First of all you must rename the following applications listed inside the MODOBOA_APPS variable

Old name New namemodoboa_admin modoboaadminmodoboa_admin_limits modoboalimitsmodoboa_admin_relaydomains modoboarelaydomains

Then apply the following steps

1 Uninstall old extensions

$ pip uninstall modoboa-admin modoboa-admin-limits modoboa-admin-relaydomains

2 Install all extension updates using pip (check the Modoboa gt Information page)

3 Manually migrate database

$ cd ltinstance_dirgt$ python managepy migrate auth$ python managepy migrate admin 0001 --fake$ python managepy migrate admin$ python managepy migrate limits 0001 --fake$ python managepy migrate relaydomains 0001 --fake$ python managepy migrate

4 Finally update static files

$ python managepy collectstatic

This version also introduces a REST API To enable it

1 Add rest_frameworkauthtoken to the INSTALLED_APPS variable

2 Add the following configuration inside settingspy

38 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Rest framework settings

REST_FRAMEWORK = DEFAULT_AUTHENTICATION_CLASSES (

rest_frameworkauthenticationTokenAuthentication)DEFAULT_PERMISSION_CLASSES (

rest_frameworkpermissionsIsAuthenticated)

3 Run the following command

$ python managepy migrate

135

To enhance security Modoboa now checks the strength of user passwords lthttpsgithubcomdstufftdjango-passwordsgt_

To use this feature add the following configuration into the settingspy file

django-passwords

PASSWORD_MIN_LENGTH = 8

PASSWORD_COMPLEXITY = UPPER 1LOWER 1DIGITS 1

132

Modoboa now uses the atomic requests mode to preserve database consistency (reference)

To enable it update the DATABASES variable in settingspy as follows

DATABASES = default

stuff beforeATOMIC_REQUESTS True

amavis

stuff beforeATOMIC_REQUESTS True

130

This release does not bring awesome new features but it is a necessary bridge to the future of Modoboa All extensionsnow have their own git repository and the deploy process has been updated to reflect this change

22 Upgrade 39

Modoboa Documentation Release 1100

Another important update is the use of Django 17 Besides its new features the migration system has been reworkedand is now more robust than before

Before we begin with the procedure here is a table showing old extension names and their new name

Old name New package name New module namemodoboaextensionsadmin modoboa-admin modoboa_adminmodoboaextensionslimits modoboa-admin-limits modoboa_admin_limitsmodoboaextensionspostfix_autoreply modoboa-postfix-autoreply modoboa_postfix_autoreplymodoboaextensionspostfix_relay_domains modoboa-admin-relaydomains modoboa_admin_relaydomainsmodoboaextensionsradicale modoboa-radicale modoboa_radicalemodoboaextensionssievefilters modoboa-sievefilters modoboa_sievefiltersmodoboaextensionsstats modoboa-stats modoboa_statsmodoboaextensionswebmail modoboa-webmail modoboa_webmail

Here are the required steps

1 Install the extensions using pip (look at the second column in the table above)

$ pip install ltthe extensions you wantgt

2 Remove south from INSTALLED_APPS

3 Rename old extension names inside MODOBOA_APPS (look at the third column in the table above)

4 Remove modoboalibmiddlewareExtControlMiddleware from MIDDLEWARE_CLASSES

5 Change DATABASE_ROUTERS to

DATABASE_ROUTERS = [modoboa_amavisdbrouterAmavisRouter]

6 Run the following commands

$ cd ltmodoboa_instance_dirgt$ python managepy migrate

7 Reply yes to the question

8 Run the following commands

$ python managepy load_initial_data$ python managepy collectstatic

9 The cleanup job has been renamed in Django so you have to modify your crontab entry

- 0 0 ltmodoboa_sitegtmanagepy cleanup+ 0 0 ltmodoboa_sitegtmanagepy clearsessions

120

A new notification service let administrators know about new Modoboa versions To activate it you need to updatethe TEMPLATE_CONTEXT_PROCESSORS variable like this

from djangoconf import global_settings

TEMPLATE_CONTEXT_PROCESSORS = global_settingsTEMPLATE_CONTEXT_PROCESSORS + (

(continues on next page)

40 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

modoboacorecontext_processorstop_notifications)

and to define the new MODOBOA_API_URL variable

MODOBOA_API_URL = httpapimodoboaorg1

The location of external static files has changed To use them add a new path to the STATICFILES_DIRS

Additional locations of static filesSTATICFILES_DIRS = (

Put strings here like homehtmlstatic or Cwwwdjangostatic Always use forward slashes even on Windows Dont forget to use absolute paths not relative pathsltpathtomodoboainstalldirgtbower_components

)

Run the following commands to define the hostname of your instance

$ cd ltmodoboa_instance_dirgt$ python managepy set_default_site lthostnamegt

If you plan to use the Radicale extension

1 Add modoboaextensionsradicale to the MODOBOA_APPS variable

2 Run the following commands

$ cd ltmodoboa_instance_dirgt$ python managepy syncdb

Warning You also have to note that the sitestatic directory has moved from ltpath to your sitesdirgt to ltmodoboas root urlgt (itrsquos probably the parent directory) You have to adapt your web serverconfiguration to reflect this change

23 Configuration

231 Online parameters

Modoboa provides online panels to modify internal parameters There are two available levels

bull Application level global parameters define how the application behaves Available at Modoboa gt Parameters

bull User level per user customization Available at User gt Settings gt Preferences

Regardless level parameters are displayed using tabs each tab corresponding to one application

General parameters

The admin application exposes several parameters they are presented below

23 Configuration 41

Modoboa Documentation Release 1100

Name Tab Description Default valueAuthentication type General The backend used for au-

thenticationLocal

Default password scheme General Scheme used to cryptmailbox passwords

crypt

Rounds General Number of rounds (onlyused by sha256cryptand sha512crypt) Mustbe between 1000 and999999999 inclusive

70000

Secret key General A key used to encryptusersrsquo password in ses-sions

random value

Sender address General Email address used tosend notifications

Enable communication General Enable communicationwith Modoboa public API

yes

Check new versions General Automatically checks if anewer version is available

yes

Send statistics General Send statistics to Mod-oboa public API (countersand used extensions)

yes

Top notifications check in-terval

General Interval between two topnotification checks (inseconds)

30

Maximum log record age General The maximum age in daysof a log record

365

Items per page General Number of displayeditems per page

30

Default top redirection General The default redirectionused when no applicationis specified

userprefs

Enable MX checks Admin Check that every domainhas a valid MX record

yes

Valid MXs Admin A list of IP or networkaddress every MX shouldmatch A warning will besent if a record does notrespect this it

Enable DNSBL checks Admin Check every domainagainst major DNSBLproviders

yes

DKIM keys storage direc-tory

AdminPath to a directory where DKIM

generated keys willbe stored

Default DKIM key length Admin The default size (in bits)for new keys

2048

Handle mailboxes onfilesystem

Admin Rename or remove mail-boxes on the filesystemwhen they get renamed orremoved within Modoboa

no

Mailboxes owner Admin The UNIX account whoowns mailboxes on thefilesystem

vmail

Default domain quota Admin Default quota (in MB) ap-plied to freshly createddomains with no valuespecified A value of 0means no quota

0

Automatic accountremoval

Admin When a mailbox is re-moved also remove theassociated account

no

Automatic do-mainmailbox creation

Admin Create a domain and amailbox when an accountis automatically created

yes

42 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Note If you are not familiar with virtual domain hosting you should take a look at postfixrsquos documentation ThisHow to also contains useful information

Note A random secret key will be generated each time the Parameters page is refreshed and until you save parametersat least once

Note Specific LDAP parameters are also available see LDAP authentication

232 Media files

Modoboa uses a specific directory to upload files (ie when the webmail is in use) or to create ones (ex graphical statis-tics) This directory is named media and is located inside modoboarsquos installation directory (called modoboa_sitein this documentation)

To work properly the system user which runs modoboa (www-data apache whatever) must have write access tothis directory

233 Customization

Custom logo

You have the possibility to use a custom logo instead of the default one on the login page

To do so open the settingspy file and add a MODOBOA_CUSTOM_LOGO variable This variable must containthe relative URL of your logo under MEDIA_URL For example

MODOBOA_CUSTOM_LOGO = ospathjoin(MEDIA_URL custom_logopng)

Then copy your logo file into the directory indicated by MEDIA_ROOT

234 Host configuration

Note This section is only relevant when Modoboa handles mailboxes renaming and removal from the filesystem

To manipulate mailboxes on the filesystem you must allow the user who runs Modoboa to execute commands as theuser who owns mailboxes

To do so edit the etcsudoers file and add the following inside

ltuser_that_runs_modoboagt ALL=(ltmailboxes ownergt) NOPASSWD ALL

Replace values between ltgt by the ones you use

23 Configuration 43

Modoboa Documentation Release 1100

235 Time zone and language

Modoboa is available in many languages

To specify the default language to use edit the settingspy file and modify the LANGUAGE_CODE variable

LANGUAGE_CODE = fr or en for english etc

Note Each user has the possibility to define the language he prefers

In the same configuration file specify the timezone to use by modifying the TIME_ZONE variable For example

TIME_ZONE = EuropeParis

236 Sessions management

Modoboa uses Djangorsquos session framework to store per-user information

Few parameters need to be set in the settingspy configuration file to make Modoboa behave as expected

SESSION_EXPIRE_AT_BROWSER_CLOSE = False Default value

This parameter is optional but you must ensure it is set to False (the default value)

The default configuration file provided by the modoboa-adminpy command is properly configured

237 Logging authentication

To trace login attempts to the web interface Modoboa uses python SysLogHandler so you can see them in your syslogauthentication log file (varlogauthlog in most cases)

Depending on your configuration you may have to edit the settingspy file and add lsquoaddressrsquo lsquodevlogrsquo to thelogging section

syslog-auth class logginghandlersSysLogHandlerfacility SysLogHandlerLOG_AUTHaddress devlogformatter syslog

238 External authentication

LDAP

Modoboa supports external LDAP authentication using the following extra components

bull Python LDAP client

bull Django LDAP authentication backend

If you want to use this feature you must first install those components

44 Chapter 2 Table of contents

Modoboa Documentation Release 1100

$ pip install python-ldap django-auth-ldap

Then all you have to do is to modify the settingspy file Add a new authentication backend to the AUTHENTI-CATION_BACKENDS variable like this

AUTHENTICATION_BACKENDS = (modoboalibauthbackendsLDAPBackend modoboalibauthbackendsLDAPSecondaryBackend Useful for a fallback

rarr˓mechanismdjangocontribauthbackendsModelBackend

)

Finally go to Modoboa gt Parameters gt General and set Authentication type to LDAP

From there new parameters will appear to let you configure the way Modoboa should connect to your LDAP serverThey are described just below

Name Description De-faultvalue

Server address The IP address of the DNS name of the LDAP server local-host

Server port The TCP port number used by the LDAP server 389Use a secureconnection

Use an SSLTLS connection to access the LDAP server no

Authenticationmethod

Choose the authentication method to use Directbind

User DN tem-plate (directbind mode)

The template used to construct a userrsquos DN It should contain one placeholder (ie(user)s)

Bind BN The distinguished name to use when binding to the LDAP server Leave empty for ananonymous bind

Bind password The password to use when binding to the LDAP server (with lsquoBind DNrsquo)Search base The distinguished name of the search baseSearch filter An optional filter string (eg lsquo(objectClass=person)rsquo) In order to be valid it must be

enclosed in parentheses(mail=(user)s)

Passwordattribute

The attribute used to store user passwords user-Pass-word

Active Direc-tory

Tell if the LDAP server is an Active Directory one no

Administratorgroups

Members of those LDAP Posix groups will be created ad domain administrators Uselsquorsquo characters to separate groups

Group type The type of group used by your LDAP directory Posix-Group

Groups searchbase

The distinguished name of the search base used to find groups

Do-mainmailboxcreation

Automatically create a domain and a mailbox when a new user is created just after thefirst successful authentication You will generally want to disable this feature whenthe relay domains extension is in use

yes

If you need additional parameters you will find a detailed documentation here

Once the authentication is properly configured the users defined in your LDAP directory will be able to connect to

23 Configuration 45

Modoboa Documentation Release 1100

Modoboa the associated domain and mailboxes will be automatically created if needed

The first time a user connects to Modoboa a local account is created if the LDAP username is a valid email addressBy default this account belongs to the SimpleUsers group and it has a mailbox

To automatically create domain administrators you can use the Administrator groups setting If a LDAP user belongsto one the listed groups its local account will belong to the DomainAdmins group In this case the username is notnecessarily an email address

Users will also be able to update their LDAP password directly from Modoboa

Note Modoboa doesnrsquot provide any synchronization mechanism once a user is registered into the database Anymodification done from the directory to a user account will not be reported to Modoboa (an email address change forexample) Currently the only solution is to manually delete the Modoboa record it will be recreated on the next userlogin

SMTP

It is possible to use an existing SMTP server as an authentication source To enable this feature edit the settingspy file and change the following setting

AUTHENTICATION_BACKENDS = (modoboalibauthbackendsSMTPBackenddjangocontribauthbackendsModelBackend

)

SMTP server location can be customized using the following settings

AUTH_SMTP_SERVER_ADDRESS = localhostAUTH_SMTP_SERVER_PORT = 25AUTH_SMTP_SECURED_MODE = None ssl or starttls are accepted

239 LDAP synchronization

Modoboa can synchronize accounts with an LDAP directory (tested with OpenLDAP) but this feature is not enabledby default To activate it add modoboaldapsync to MODOBOA_APPS in the settingspy file

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboaldapsync

)

and enable it from the admin panel

46 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning Make sure to install additional requirements otherwise it wonrsquot work

The following parameters are available and must be filled

Name Description Defaultvalue

Enable LDAP synchro-nization

Control LDAP synchronization state no

Bind DN The DN of a user with write permission to createupdate accountsBind password The associated passwordAccount DN template The template used to build account DNs (must contain a (user)s

placeholder

2310 Database maintenance

Cleaning the logs table

Modoboa logs administrator specific actions into the database A clean-up script is provided to automatically removeoldest records The maximum log record age can be configured through the online panel

To use it you can setup a cron job to run every night

0 0 ltmodoboa_sitegtmanagepy cleanlogs Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy cleanlogs

Cleaning the session table

Django does not provide automatic purging Therefore itrsquos your job to purge expired sessions on a regular basis

Django provides a sample clean-up script django-adminpy clearsessions That script deletes any sessionin the session table whose expire_date is in the past

For example you could setup a cron job to run this script every night

0 0 ltmodoboa_sitegtmanagepy clearsessions Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy clearsessions

Cleaning inactive accounts

Thanks to Last-login tracking it is now possible to monitor inactive accounts An account is considered inactive if nologin has been recorded for the last 30 days (this value can be changed through the admin panel)

A management command is available to disable or delete inactive accounts For example you could setup a cron jobto run it every night

23 Configuration 47

Modoboa Documentation Release 1100

0 0 ltmodoboa_sitegtmanagepy clean_inactive_accounts Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy clean_inactive_rarr˓accounts

The default behaviour is to disable accounts You can delete them using the --delete option

24 Moving to Modoboa

You have an existing platform and yoursquod like to move to Modoboa the following tools could help you

241 From postfixadmin

A dedicated command allows you to convert an existing postfixadmin database to a Modoboa one Consult the docu-mentation to know more about the process

242 Using CSV files

Modoboa allows you to import any object (domain domain alias mailbox and alias) using a simple CSV file encodedusing UTF8 Each line corresponds to a single object and must respect one of the following format

domain ltname stringgt ltquota integergt ltdefault mailbox quota integergt ltenabledrarr˓booleangtdomainalias ltname stringgt lttargeted domain stringgt ltenabled booleangtrelaydomain ltname stringgt lttarget host stringgt lttarget port integergt ltservicerarr˓stringgt ltenabled booleangt ltverify recipients booleangtaccount ltloginname stringgt ltpassword stringgt ltfirst name stringgt ltlast namerarr˓stringgt ltenabled booleangt ltgroup stringgt ltaddress stringgt ltquota integergt [rarr˓ltdomain stringgt ]alias ltaddress stringgt ltenabled booleangt ltrecipient stringgt

Boolean fields accept the following values true 1 yes y (case insensitive) Any other value will be evaluated asfalse

Warning The order does matter Objects are created sequencially so a domain must be created before itsmailboxes and aliases and a mailbox must created before its alias(es)

To actually import such a file

gt sudo -u ltmodoboa_usergt -igt source ltvirtualenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy modo import ltyour filegt

Available options can be listed using the following command

gt python managepy modo import -h

48 Chapter 2 Table of contents

Modoboa Documentation Release 1100

25 REST API

To ease the integration with external sources (software or other) Modoboa provides a REST API

Every installed instance comes with a ready-to-use API and a documentation You will find them using the followingurl patterns

bull API httplthostnamegtapiv1

bull Documentation httplthostnamegtdocsapi

An example of this documentation is available on the official demo

Using this API requires an authentication and for now only a token based authentication is supported To get a validtoken log-in to your instance with a super administrator go to Settings gt API and activate the API access Press theUpdate button and wait until the page is reloaded the token will be displayed

To make valid API calls every requests you send must embed this token within an Authorization HTTP header likethis

Authorization Token ltYOUR_TOKENgt

and the content type of those requests must be applicationjson

26 How to contribute

Contributions are always welcome If you want to submit a patch please respect the following rules

bull Open a pull request on the appropriate repository

bull Respect PEP8

bull Document your patch and respect PEP 257

bull Add unit tests and make sure the global coverage does not decrease

If all those steps are validated your contribution will generally be integrated

261 Table of contents

25 REST API 49

Modoboa Documentation Release 1100

Useful tips

You would like to work on Modoboa but you donrsquot know where to start Yoursquore at the right place Browse this pageto learn useful tips

Docker

A docker image is available for developers To use it you must install docker and docker-compose first

Then just run the following command

$ docker-compose up

It will start the docker environment and make a Modoboa instance available at httplocalhost8000

If you donrsquot want to use docker or need a more complex development setup go to the next section

Prepare a virtual environment

A virtual environment is a good way to setup a development environment on your machine

To do so run the following commands

$ python3 -m venv ltpathgt$ source ltpathgtbinactivate$ git clone httpsgithubcommodoboamodoboagit$ cd modoboa$ python setuppy develop$ pip install -r dev-requirementstxt

The develop command creates a symbolic link to your local copy so any modification you make will be automati-cally available in your environment no need to copy them

Deploy an instance for development

Warning Make sure to create a database before running this step The format of the database url is also describedin this page

Now that you have a running environment yoursquore ready to deploy a test instance

$ cd ltpathgt$ modoboa-adminpy deploy --dburl defaultltdatabase urlgt --domain localhost --develrarr˓instance$ python managepy runserver

Yoursquore ready to go You should be able to access Modoboa at httplocalhost8000 usingadminpassword as credentials

Manage static files

Modoboa uses bower (thanks to django-bower) to manage its CSS and javascript dependencies

50 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Those dependencies are listed in a file called dev_settingspy located inside the ltpath_to_local_copygtmodoboacore directory

If you want to add a new dependency just complete the BOWER_INSTALLED_APPS parameter and run the followingcommand

$ python managepy bower install

It will download and store the required files into the ltpath_to_local_copygtmodoboabower_components directory

Test your modifications

If you deployed a specific instance for your development needs you can run the tests suite as follows

gt python managepy test modoboacore modoboalib modoboaadmin modoboalimits modoboararr˓relaydomains

Otherwise you can run the tests suite from the repository using tox

Start a basic Modoboa instance

From the repository run the following command to launch a simple instance with a few fixtures

gt tox -e serve

You can use adminpassword to log in

Build the documentation

If you need to modify the documenation and want to see the result you can build it as follows

gt tox -e docgt firefox toxdoctmphtmlindexhtml

FAQ

bower command is missing in managepy

bower command is missing in managepy if you donrsquot use the --devel option of the modoboa-adminpydeploy command

To fix it regenerate your instance or update your settingspy file manually Look at devmode in httpsgithubcomtonioomodoboablobmastermodoboacorecommandstemplatessettingspytpl

Create a new plugin

Introduction

Modoboa offers a plugin API to expand its capabilities The current implementation provides the following possibili-ties

26 How to contribute 51

Modoboa Documentation Release 1100

bull Expand navigation by adding entry points to your plugin inside the GUI

bull Access and modify administrative objects (domains mailboxes etc)

bull Register callback actions for specific events

Plugins are nothing more than Django applications with an extra piece of code that integrates them into Modoboa Themodo_extensionpy file will contain a complete description of the plugin

bull Admin and user parameters

bull Custom menu entries

The communication between both applications is provided by Django signals

The following subsections describe the plugin architecture and explain how you can create your own

The required glue

To create a new plugin just start a new django application like this (into Modoboarsquos directory)

$ python managepy startapp

Then you need to register this application using the provided API Just copypaste the following example into themodo_extensionpy file of the future extension

from modoboacoreextensions import ModoExtension exts_pool

class MyExtension(ModoExtension)My custom Modoboa extension

name = myextlabel = My Extensionversion = 01description = A descriptionurl = myext_root_location optional name is used if not defined

def load(self)This method is called when Modoboa loads available and activated plugins

Declare parameters and register events herepass

def load_initial_data(self)Optional provide initial data for your extension herepass

exts_poolregister_extension(MyExtension)

Once done simply add your extensionrsquos module name to the MODOBOA_APPS variable located inside settingspy Finally run the following commands

$ python managepy migrate$ python managepy load_initial_data$ python managepy collectstatic

52 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Parameters

A plugin can declare its own parameters There are two levels available

bull lsquoGlobalrsquo parameters used to configure the plugin editable inside the Admin gt Settings gt Parameters page

bull lsquoUserrsquo parameters per-user parameters (or preferences) editable inside the Options gt Preferences page

Playing with parameters

Parameters are defined using Django forms and Modoboa adds two special forms you can inherit depending on thelevel of parameter(s) you want to add

bull modoboaparametersformsAdminParametersForm for general parameters

bull modoboaparametersformsUserParametersForm for user parameters

To register new parameters add the following line into the load method of your plugin class

from modoboaparameters import tools as param_toolsparam_toolsregistryadd(

LEVEL YourForm ugettext_lazy(Title))

Replace LEVEL by global or user

Custom role permissions

Modoboa uses Djangorsquos internal permission system Administrative roles are nothing more than groups (Groupinstances)

An extension can add new permissions to a group by listening to the extra_role_permissions signal Here isan example

from djangodispatch import receiverfrom modoboacore import signals as core_signals

PERMISSIONS = Resellers [

(relaydomains relaydomain add_relaydomain)(relaydomains relaydomain change_relaydomain)(relaydomains relaydomain delete_relaydomain)(relaydomains service add_service)(relaydomains service change_service)(relaydomains service delete_service)

]

receiver(core_signalsextra_role_permissions)def extra_role_permissions(sender role kwargs)

Add permissions to the Resellers groupreturn constantsPERMISSIONSget(role [])

Extending admin forms

The forms used to edit objects (account domain etc) through the admin panel are composed of tabs You can extendthem (ie add new tabs) in a pretty easy way thanks to custom signals

26 How to contribute 53

Modoboa Documentation Release 1100

Account

To add a new tab to the account edition form define new listeners (handlers) for the following signals

bull modoboaadminsignalsextra_account_forms

bull modoboaadminsignalsget_account_form_instances

bull modoboaadminsignalscheck_extra_account_form (optional)

Example

from djangodispatch import receiverfrom modoboaadmin import signals as admin_signals

receiver(admin_signalsextra_account_forms)def extra_account_form(sender user account kwargs)

return [id tabid title Title cls MyFormClass

]

receiver(admin_signalsget_account_form_instances)def fill_my_tab(sender user account kwargs)

return id my_instance

Domain

To add a new tab to the domain edition form define new listeners (handlers) for the following signals

bull modoboaadminsignalsextra_domain_forms

bull modoboaadminsignalsget_domain_form_instances

Example

from djangodispatch import receiverfrom modoboaadmin import signals as admin_signals

receiver(admin_signalsextra_domain_forms)def extra_account_form(sender user domain kwargs)

return [id tabid title Title cls MyFormClass

]

receiver(admin_signalsget_domain_form_instances)def fill_my_tab(sender user domain kwargs)

return id my_instance

27 Contributors

bull Antidot

bull Bearstech

bull CAP-REL

54 Chapter 2 Table of contents

Modoboa Documentation Release 1100

bull Dalnix

27 Contributors 55

  • Overview
  • Table of contents
Page 20: Modoboa Documentation

Modoboa Documentation Release 1100

SQLite users

driver = sqlite

connect = ltpath to the sqlite db filegt

default_pass_scheme = CRYPT

password_query = SELECT email AS user password FROM core_user u INNER JOIN admin_rarr˓mailbox mb ON uid=mbuser_id INNER JOIN admin_domain dom ON mbdomain_id=domidrarr˓WHERE uemail=Lu AND uis_active=1 AND domenabled=1

user_query = SELECT ltmailboxes storage directorygtLdLn AS home ltuidgt as uidrarr˓ltgidgt as gid (bytes= || mbquota || M) AS quota_rule FROM admin_mailbox mbrarr˓INNER JOIN admin_domain dom ON mbdomain_id=domid WHERE mbaddress=Ln AND domrarr˓name=Ld

iterate_query = SELECT email AS user FROM core_user

Note Replace values between ltgt with yours

LDAP

To make the LDAP authentication work edit the confd10-authconf and uncomment the following line atthe end

include auth-ldapconfext

Then edit the confdauth-ldapconfext and edit the passdb section as following You should comment theuserdb section which will be managed by SQL with modoboa database

passdb driver = ldap

Path for LDAP configuration file see example-configdovecot-ldapconfextargs = etcdovecotdovecot-ldapconfext

userdb driver = ldapargs = etcdovecotdovecot-ldapconfext

Default fields can be used to specify defaults that LDAP may overridedefault_fields = home=homevirtualu

Your own dovecot LDAP configuration file is now etcdovecotdovecot-ldapconfext You can addyour default LDAP conf in it following the official documentation

Synchronize dovecot LDAP conf with modoboa LDAP conf

To make dovecot LDAP configuration synchronized with modoboa LDAP configuration you should create a dedicateddovecot conf file At the end of your dovecot configuration file (dovecot-ldapconfext) add the following

21 Installation 17

Modoboa Documentation Release 1100

line

include_try dovecot-modoboaconfext

Then set modoboa parameter Enable Dovecot LDAP sync to Yes Then set the Dovecot LDAP config file following theprevious step (etcdovecotdovecot-modoboaconfext in the example)

The last step is to add the command update_dovecot_conf to the cron job of modoboa Then each time your modoboaLDAP configuration is updated your dovecot LDAP configuration will also be

LMTP

Local Mail Transport Protocol is used to let Postfix deliver messages to Dovecot

First make sure the protocol is activated by looking at the protocols setting (generally inside dovecotconf)It should be similar to the following example

protocols = imap pop3 lmtp

Then open the confd10-masterconf look for lmtp service definition and add the following content inside

service lmtp stuff beforeunix_listener varspoolpostfixprivatedovecot-lmtp mode = 0600user = postfixgroup = postfix

stuff after

We assume here that Postfix is chrooted within varspoolpostfix

Finally open the confd20-lmtpconf and modify it as follows

protocol lmtp postmaster_address = postmasterltdomaingtmail_plugins = $mail_plugins quota sieve

Replace ltdomaingt by the appropriate value

Note If you donrsquot plan to apply quota or to use filters just adapt the content of the mail_plugins setting

Quota

Modoboa lets adminstrators define per-domain andor per-account limits (quota) It also lists the current quota usageof each account Those features require Dovecot to be configured in a specific way

Inside confd10-mailconf add the quota plugin to the default activated ones

mail_plugins = quota

Inside confd10-masterconf update the dict service to set proper permissions

18 Chapter 2 Table of contents

Modoboa Documentation Release 1100

service dict If dict proxy is used mail processes should have access to its socket For example mode=0660 group=vmail and global mail_access_groups=vmailunix_listener dict mode = 0600user = ltuser owning mailboxesgtgroup =

Inside confd20-imapconf activate the imap_quota plugin

protocol imap

mail_plugins = $mail_plugins imap_quota

Inside dovecotconf activate the quota SQL dictionary backend

dict quota = ltdrivergtetcdovecotdovecot-dict-sqlconfext

Inside confd90-quotaconf activate the quota dictionary backend

plugin quota = dictUser quotaproxyquota

It will tell Dovecot to keep quota usage in the SQL dictionary

Finally edit the dovecot-dict-sqlconfext file and put the following content inside

connect = host=ltdb hostgt dbname=ltdb namegt user=ltdb usergt password=ltpasswordgt SQLite users connect = pathtothedatabasedb

map pattern = privquotastoragetable = admin_quotausername_field = usernamevalue_field = bytes

map

pattern = privquotamessagestable = admin_quotausername_field = usernamevalue_field = messages

PostgreSQL users

21 Installation 19

Modoboa Documentation Release 1100

Database schema update

The admin_quota table is created by Django but unfortunately it doesnrsquot support DEFAULT constraints (it onlysimulates them when the ORM is used) As PostgreSQL is a bit strict about constraint violations you must executethe following query manually

db=gt ALTER TABLE admin_quota ALTER COLUMN bytes SET DEFAULT 0db=gt ALTER TABLE admin_quota ALTER COLUMN messages SET DEFAULT 0

Trigger

As indicated on Dovecotrsquos wiki you need a trigger to properly update the quota

A working copy of this trigger is available on Github

Download this file and copy it on the server running postgres Then execute the following commands

$ su - postgres$ psql [modoboa database] lt pathtomodoboa_postgres_triggersql$ exit

Replace [modoboa database] by the appropriate value

Forcing recalculation

For existing installations Dovecot (gt 2) offers a command to recalculate the current quota usages For example if youwant to update all usages run the following command

$ doveadm quota recalc -A

Be carefull it can take a while to execute

ManageSieveSieve

Modoboa lets users define filtering rules from the web interface To do so it requires ManageSieve to be activated onyour server

Inside confd20-managesieveconf make sure the following lines are uncommented

protocols = $protocols sieve

service managesieve-login

service managesieve

protocol sieve

20 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Messages filtering using Sieve is done by the LDA

Inside confd15-ldaconf activate the sieve plugin like this

protocol lda Space separated list of plugins to load (default is global mail_plugins)mail_plugins = $mail_plugins sieve

Finally configure the sieve plugin by editing the confd90-sieveconf file Put the follwing caontent inside

plugin Location of the active script When ManageSieve is used this is actually a symlink pointing to the active script in the sieve storage directorysieve = ~dovecotsieve

The path to the directory where the personal Sieve scripts are stored For ManageSieve this is where the uploaded scripts are storedsieve_dir = ~sieve

Restart Dovecot

Now you can go to the Postfix section to finish the installation

Last-login tracking

To update the last_login attribute of an account after a succesful IMAP or POP3 login you can configure apost-login script

Open confd10-masterconf add the following configuration (imap and pop3 services are already definedyou just need to update them)

service imap executable = imap postlogin

service pop3 executable = pop3 postlogin

service postlogin executable = script-login usrlocalbinpostloginshuser = modoboaunix_listener postlogin

Then you must create a script named usrlocalbinpostloginsh According to your database enginethe content will differ

PostgreSQL

21 Installation 21

Modoboa Documentation Release 1100

binsh

psql -c UPDATE core_user SET last_login=now() WHERE username=$USER gt devnull

exec $

MySQL

binsh

DBNAME=XXXDBUSER=XXXDBPASSWORD=XXX

echo UPDATE core_user SET last_login=now() WHERE username=$USER | mysql -urarr˓$DBUSER -p$DBPASSWORD $DBNAME

exec $

Postfix

This section gives an example about building a simple virtual hosting configuration with Postfix Refer to the officialdocumentation for more explanation

Map files

You first need to create configuration files (or map files) that will be used by Postfix to lookup into Modoboa tables

To automaticaly generate the requested map files and store them in a directory run the following command

gt cd ltmodoboa_instance_pathgtgt python managepy generate_postfix_maps --destdir ltdirectorygt

ltdirectorygt is the directory where the files will be stored Answer the few questions and yoursquore done

Configuration

Use the following configuration in the etcpostfixmaincf file (this is just one possible configuration)

Stuff beforevirtual_transport = lmtpunixprivatedovecot-lmtp

virtual_mailbox_domains = ltdrivergtetcpostfixsql-domainscfvirtual_alias_domains = ltdrivergtetcpostfixsql-domain-aliasescfvirtual_alias_maps = ltdrivergtetcpostfixsql-aliasescf

relay_domains = ltdrivergtetcpostfixsql-relaydomainscftransport_maps =

ltdrivergtetcpostfixsql-transportcfltdrivergtetcpostfixsql-spliteddomains-transportcf

(continues on next page)

22 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

smtpd_recipient_restrictions = check_recipient_access

ltdrivergtetcpostfixsql-maintaincfltdrivergtetcpostfixsql-relay-recipient-verificationcf

permit_mynetworksreject_unauth_destinationreject_unverified_recipient

smtpd_sender_login_maps = ltdrivergtetcpostfixsql-sender-login-mapcf

smtpd_sender_restrictions =reject_sender_login_mismatch

Stuff after

Replace ltdrivergt by the name of the database you use

Restart Postfix

Policy daemon

If you want to enable the built-in policy daemon add the following content to the etcpostfixmaincf file

smtpd_recipient_restrictions = check_policy_service inet1270019999

And reload postfix

Note The check_policy_service line must be placed before the permit_mynetworks one otherwise thedaemon wonrsquot be called

OpenDKIM

Modoboa can generate DKIM keys for the hosted domains but it wonrsquot sign or check messages To do that you needa dedicated software like OpenDKIM

Note The cron job in charge of creating DKIM keys must be run using the same user than OpenDKIM (ie opendkimin most cases)

Database

Since keys related information is stored in Modoboarsquos database you need to tell OpenDKIM how it can access it

First make sure to install the required additional packages on your system (libopendbx1- on debian baseddistributions or opendbx- on CentOS the complete name depends on your database engine)

Then insert the following SQL view into Modoboarsquos database

21 Installation 23

Modoboa Documentation Release 1100

PostgreSQL

CREATE OR REPLACE VIEW dkim AS (SELECT id name as domain_name dkim_private_key_path AS private_key_path

dkim_key_selector AS selectorFROM admin_domain WHERE enable_dkim

)

MySQLMariaDB

CREATE OR REPLACE VIEW dkim AS (SELECT id name as domain_name dkim_private_key_path AS private_key_path

dkim_key_selector AS selectorFROM admin_domain WHERE enable_dkim=1

)

Configuration

You should find OpenDKIMrsquos configuration file at etcopendkimconf

Add the following content to it

KeyTable dsnltdrivergtltusergtltpasswordgtltdb hostgtltdb namegttable=dkimrarr˓keycol=iddatacol=domain_nameselectorprivate_key_pathSigningTable dsnltdrivergtltusergtltpasswordgtltdb hostgtltdb namegttable=dkimrarr˓keycol=domain_namedatacol=idSocket inet12345localhost

Replace values between ltgt by yours Accepted values for driver are pgsql or mysql Make sure the user youspecify has read permission on the view created previously

If you run a debian based system make sure to adjust the following setting in the etcdefaultopendkim file

SOCKET=inet12345localhost

Eventually reload OpenDKIM

Postfix integration

Add the following lines to the etcpostfixmaincf file

smtpd_milters = inet12700112345non_smtpd_milters = inet12700112345milter_default_action = acceptmilter_content_timeout = 30s

and reload postfix

Extensions

Only few commands are needed to add a new extension to your setup

24 Chapter 2 Table of contents

Modoboa Documentation Release 1100

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install ltEXTENSIONgt==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Then restart your web server

22 Upgrade

221 Modoboa

Warning The new version you are going to install may need to modify your database Before you start makesure to backup everything

Most of the time upgrading your installation to a newer Modoboa version only requires a few actions In every caseyou will need to apply the general procedure first and then check if the version you are installing requires specificactions

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install modoboa==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Once done check if the version you are installing requires Specific instructions

Finally restart your web server

Sometimes you might need to upgrade postfix map files too To do so just run the generate_postfix_mapscommand on the same directory than the one used for installation (etcpostfix by default)

Make sure to use root privileges and run the following command

gt python managepy generate_postfix_maps --destdir ltdirectorygt

Then reload postfix

22 Upgrade 25

Modoboa Documentation Release 1100

222 Extensions

If a new version is available for an extension yoursquore using it is recommanded to install it Upgrading an extensions ispretty and the procedure is almost the same than the one used for Modoboa

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install ltEXTENSIONgt==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Finally restart your web server

It is a generic upgrade procedure which will be enough most of the time but it is generally a good idea to check theassociated documentation

223 Rebuild Virtual Environment

Sometimes when upgrading your Operating System (eg from Ubuntu 1704 to Ubuntu 1710) your virtual environmentrunning modoboa can get corrupted Your first response will be to panic but fear not The solution is in this document

First things first

Recover your database password

You will need to recover your database password (if using mysql or postgresql) You will find this in etcpostfixsql-aliasescf or any file with sql-cf in the etcpostfix directory

Make note of this as you will need it when reconfiguring modoboa

Reinstall Modoboa

Start out by backup up your modoboa settings file located in the modoboa instance directory (srvmodoboainstanceinstancesettingspy if you used the default installer configuration) This contains your currentconfiguration

Next you want to remove all current modoboa files

After doing this follow the manual installation instructions for Modoboa only as everything should be working prop-erly

After this completes simply restore your backed up settings file to srvinstanceinstancesettingspy(if you used installer default configuration) You will then need to reinstall your extensions

You can find which plugins you had in your settingspy file under the MODOBOA_APPS variable

Instructions to install extensions can also be found here

Once you have completed this step you will need to run the following commands

26 Chapter 2 Table of contents

Modoboa Documentation Release 1100

gt (env) $ cd ltinstance_dirgtgt (env) $ python managepy migrategt (env) $ python managepy collectstatic

You will then see a message similar to

You have requested to collect static files at the destinationlocation as specified in your settings

srvmodoboainstancesitestatic

This will overwrite existing filesAre you sure you want to do this

Type yes to continue or no to cancel

You will want to answer yes here then simply restart the uwsgi process with service uwsgi restart andyou should be up and running again

Simply log into your modoboa web panel and verify that your extensions and webmail box is working

224 Information

Rebuild instructions from httpshelppythonanywherecompagesRebuildingVirtualenvs

225 Specific instructions

1160

A new policy daemon has been added

Make sure to have a Redis instance running on your server

Add modoboapolicyd to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboapolicyd

)

Add the following settings to your settingspy file

REDIS_HOST = ltIP or hostname heregtREDIS_PORT = 6379REDIS_QUOTA_DB = 0REDIS_URL = redisformat(REDIS_HOST REDIS_PORT REDIS_QUOTA_DB)

Once done you can start the policy daemon using the following commands

22 Upgrade 27

Modoboa Documentation Release 1100

gt python managepy policy_daemon

Donrsquot forget to configure _policyd_config if you want to use this feature

The modoboa-stats plugin has been merged into the core

Add modoboamaillog to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboapolicydmodoboamaillog

)

And remove any reference to modoboa_stats in this same variable

1150

This version drops Python 2 support so donrsquot forget to update all the extensions you use

Warning If you upgrade an existing python 2 installation you will need to create a new Python 3 virtualenvironment You can remove the existing virtual environment and replace it by the new one so you wonrsquot have tomodify your configuration files

Add the following new setting

DISABLE_DASHBOARD_EXTERNAL_QUERIES = False

Reload uwsgigunicornapache depending on your setup

Finally Make sure to use root privileges and run the following command

gt python managepy generate_postfix_maps --destdir ltdirectorygt

Then reload postfix

1140

This release introduces an optional LDAP synchronization process If you want to use it please follow the dedicatedprocedure

1131

Upgrade postfix maps files as follows

28 Chapter 2 Table of contents

Modoboa Documentation Release 1100

gt python managepy generate_postfix_maps --destdir ltpathgt --force-overwrite

1130

Add modoboadnstools to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstools

)

Add the following new settings

CSRF_COOKIE_SECURE = TrueSESSION_COOKIE_SECURE = True

modoboa-postfix-autoreply 150

Edit the etcpostfixmaincf file and remove the sql-autoreplies-transportcf map from thetransport_maps if present Remove the corresponding proxy_read_maps entry if relevant

Reload postfix

1100

Warning Upgrade installed extensions BEFORE running check or migrate commands

Upgrade all your installed plugins to the following versions

Warning If you use the amavis plugin make sure to include its configuration as follows into settingspy

from modoboa_amavis import settings as modoboa_amavis_settingsmodoboa_amavis_settingsapply(globals())

22 Upgrade 29

Modoboa Documentation Release 1100

Name Versionmodoboa-amavis 120modoboa-contacts 050modoboa-dmarc 110modoboa-imap-migration 120modoboa-pdfcredentials 130modoboa-postfix-autoreply 140modoboa-radicale 120modoboa-sievefilters 140modoboa-stats 140modoboa-webmail 140

Edit the settingspy file and apply the following modifications

Add modoboatransport to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparameters

)

Replace the following line

MIDDLEWARE_CLASSES = (

by

MIDDLEWARE = (

Update postfix map files as follows

gt rm -f ltpathgtmodoboa-postfix-mapschkgt python managepy generate_postfix_maps --force --destdir ltpathgt

Then modify postfixrsquos configuration as follows

smtpd_sender_login_maps =ltdrivergtltpathgtsql-sender-login-mapcf

transport_maps =ltdrivergtltpathgtsql-transportcfltdrivergtltpathgtsql-spliteddomains-transportcf other map files

Replace ltdrivergt and ltpathgt by your values

If transport_maps contains sql-relaydomains-transportcf remove it

30 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning If you make use of postfixrsquos proxymap server you must also update the proxy_read_maps setting

Reload postfix

Add the following cron job in order to generate DKIM keys

Generate DKIM keys (they will belong to the user running this job)

root $PYTHON $INSTANCEmanagepy modorarr˓manage_dkim_keys

190

If you want to manage inactive accounts look at Cleaning inactive accounts

183

Edit the settingspy file and replace the following line

BASE_DIR = ospathdirname(ospathdirname(__file__))

by

BASE_DIR = ospathrealpath(ospathdirname(ospathdirname(__file__)))

180

Modoboa now relies on Djangorsquos builtin password validation system to validate user passwords instead ofdjango-passwords

Remove django-passwords from your system

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt pip uninstall django-passwords

Edit the settingspy file and remove the following content

django-passwords

PASSWORD_MIN_LENGTH = 8

PASSWORD_COMPLEXITY = UPPER 1LOWER 1DIGITS 1

Add the following lines

Password validation rulesAUTH_PASSWORD_VALIDATORS = [

NAME djangocontribauthpassword_validation

rarr˓UserAttributeSimilarityValidator (continues on next page)

22 Upgrade 31

Modoboa Documentation Release 1100

(continued from previous page)

NAME djangocontribauthpassword_validationMinimumLengthValidator

NAME djangocontribauthpassword_validationCommonPasswordValidator

NAME djangocontribauthpassword_validationNumericPasswordValidator

NAME modoboacorepassword_validationComplexityValidatorOPTIONS

upper 1lower 1digits 1specials 0

]

172

API documentation has evolved (because of the upgrade to Django Rest Framework 36) and CKeditor is now embed-ded by default (thanks to the django-ckeditor package) Some configuration changes are required

Edit your settingspy file and apply the following modifications

bull Update the INSTALLED_APPS variable as follows

INSTALLED_APPS = (djangocontribauthdjangocontribcontenttypesdjangocontribsessionsdjangocontribmessagesdjangocontribsitesdjangocontribstaticfilesreversionckeditorckeditor_uploaderrest_frameworkrest_frameworkauthtoken

)

bull Update the REST_FRAMEWORK variable as follows

REST_FRAMEWORK = DEFAULT_AUTHENTICATION_CLASSES (

rest_frameworkauthenticationTokenAuthenticationrest_frameworkauthenticationSessionAuthentication

)

bull Remove the SWAGGER_SETTINGS variable

bull Add the following content

32 Chapter 2 Table of contents

Modoboa Documentation Release 1100

CKeditor

CKEDITOR_UPLOAD_PATH = uploads

CKEDITOR_IMAGE_BACKEND = pillow

CKEDITOR_RESTRICT_BY_USER = True

CKEDITOR_BROWSE_SHOW_DIRS = True

CKEDITOR_ALLOW_NONIMAGE_FILES = False

CKEDITOR_CONFIGS = default

allowedContent Truetoolbar Modoboawidth Nonetoolbar_Modoboa [

[Bold Italic Underline][JustifyLeft JustifyCenter JustifyRight JustifyBlock][BidiLtr BidiRtl Language][NumberedList BulletedList - Outdent Indent][Undo Redo][Link Unlink Anchor - Smiley][TextColor BGColor - Source][Font FontSize][Image ][SpellChecker]

]

Donrsquot forget to run the following command

gt python managepy collectstatic

171

If you used 170 for a fresh installation please run the following commands

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy load_initial_data

170

This version requires Django gt= 110 so you need to make some modifications It also brings internal API changeswhich are not backward compatible so installed extensions must be upgraded too

First of all deactivate all installed extensions (edit the settingspy file and comment the corresponding lines inMODOBOA_APPS)

Edit the urlspy file of your local instance and replace its content by the following one

22 Upgrade 33

Modoboa Documentation Release 1100

from djangoconfurls import include url

urlpatterns = [url(r include(modoboaurls))

]

Edit the settingspy and apply the following changes

bull Add modoboaparameters to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboarelaydomainsmodoboalimitsmodoboaparameters Modoboa extensions here

)

bull Add modoboacoremiddlewareLocalConfigMiddleware to MIDDLEWARE_CLASSES

MIDDLEWARE_CLASSES = (djangocontribsessionsmiddlewareSessionMiddlewaredjangomiddlewarecommonCommonMiddlewaredjangomiddlewarecsrfCsrfViewMiddlewaredjangocontribauthmiddlewareAuthenticationMiddlewaredjangocontribmessagesmiddlewareMessageMiddlewaredjangomiddlewarelocaleLocaleMiddlewaredjangomiddlewareclickjackingXFrameOptionsMiddlewaremodoboacoremiddlewareLocalConfigMiddlewaremodoboalibmiddlewareAjaxLoginRedirectmodoboalibmiddlewareCommonExceptionCatchermodoboalibmiddlewareRequestCatcherMiddleware

)

bull Modoboa used to provide a custom authentication backend (modoboalibauthbackendsSimpleBackend) but it has been removed Replace it as follows

AUTHENTICATION_BACKENDS = ( Other backends beforedjangocontribauthbackendsModelBackend

)

bull Remove TEMPLATE_CONTEXT_PROCESSORS and replace it by

TEMPLATES = [

BACKEND djangotemplatebackendsdjangoDjangoTemplatesDIRS []APP_DIRS TrueOPTIONS

context_processors [djangotemplatecontext_processorsdebugdjangotemplatecontext_processorsrequestdjangocontribauthcontext_processorsauth

(continues on next page)

34 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

djangotemplatecontext_processorsi18ndjangotemplatecontext_processorsmediadjangotemplatecontext_processorsstaticdjangotemplatecontext_processorstzdjangocontribmessagescontext_processorsmessagesmodoboacorecontext_processorstop_notifications

]debug False

]

Run the following commands (load virtualenv if you use one)

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstatic

Finally upgrade your extensions and reactivate them

Name Versionmodoboa-amavis 110modoboa-dmarc 100modoboa-imap-migration 110modoboa-pdfcredentials 110modoboa-postfix-autoreply 120modoboa-radicale 110modoboa-sievefilters 110modoboa-stats 110modoboa-webmail 110

Command line shortcuts

$ pip install modoboa-amavis==110$ pip install modoboa-dmarc==100$ pip install modoboa-imap-migration==110$ pip install modoboa-pdfcredentials==110$ pip install modoboa-postfix-autoreply==120$ pip install modoboa-radicale==110$ pip install modoboa-sievefilters==110$ pip install modoboa-stats==110$ pip install modoboa-webmail==110

And please make sure you use the latest version of the django-versionfield2 package

$ pip install -U django-versionfield2

Notes about quota changes and resellers

Reseller users now have a quota option in Resources tab This is the quota that a reseller can share between all itsdomains

22 Upgrade 35

Modoboa Documentation Release 1100

There are two quotas for a domain in the new version

1 Quota amp

2 Default mailbox quota

[1] Quota quota shared between mailboxes This quota is shared between all the mailboxes of this domain This valuecannot exceed resellerrsquos quota and hence cannot be 0(unlimited) if reseller has finite quota

[2] Default mailbox quota default quota applied to mailboxes This quota is the default quota applied to new mail-boxes This value cannot exceed Quota[1] and hence cannot be 0(unlimited) if Quota[1] is finite

161

First of all update postfix map files as follows

gt python managepy generate_postfix_maps --destdir ltpathgt --force-overwrite

Then modify postfixrsquos configuration as follows

smtpd_sender_login_maps =ltdrivergtltpathgtsql-sender-login-mailboxescfltdrivergtltpathgtsql-sender-login-aliasescfltdrivergtltpathgtsql-sender-login-mailboxes-extracf

Replace ltdrivergt and ltpathgt by your values

Finally reload postfix

This release also deprecates some internal functions As a result several extensions has been updated to maintain thecompatibility If you enabled the notification service yoursquoll find the list of available updates directly in your Modoboaconsole

For the others here is the list

Name Versionmodoboa-amavis 1010modoboa-postfix-autoreply 117modoboa-radicale 105modoboa-stats 109

Command line shortcut

$ pip install modoboa-amavis==1010$ pip install modoboa-postfix-autoreply==117$ pip install modoboa-radicale==105$ pip install modoboa-stats==109

160

Warning You have to upgrade extensions due to coreUser model attribute change (usergroup to userrole) Oth-erwise you will have an internal error after upgrade In particular modoboa-amavisd modoboa-stats modoboa-postfix-autoreply are concerned

36 Chapter 2 Table of contents

Modoboa Documentation Release 1100

An interesting feature brougth by this version is the capability to make different checks about MX records Forexample Modoboa can query main DNSBL providers for every defined domain With this you will quickly know ifone the domains you manage is listed or not To activate it add the following line to your crontab

30 ltoptional_virtualenv_pathgtpython ltmodoboa_instance_dirgtmanagepy modorarr˓check_mx

The communication with Modoboa public API has been reworked Instead of sending direct synchronous queries (forexample to check new versions) a cron job has been added To activate it add the following line to your crontab

0 ltoptional_virtualenv_pathgtpython ltmodoboa_instance_dirgtmanagepyrarr˓communicate_with_public_api

Please also note that public API now uses TLS so you must update your configuration as follows

MODOBOA_API_URL = httpsapimodoboaorg1

Finally it is now possible to declare additional sender addresses on a per-account basis You need to update your postfixconfiguration in order to use this functionality Just edit the maincf file and change the following parameter

smtpd_sender_login_maps =ltdrivergtetcpostfixsql-sender-login-mailboxescfltdrivergtetcpostfixsql-sender-login-aliasescfltdrivergtetcpostfixsql-sender-login-mailboxes-extracf

150

The API has been greatly improved and a documentation is now available To enable it addrest_framework_swagger to the INSTALLED_APPS variable in settingspy as follows

INSTALLED_APPS = (djangocontribauthdjangocontribcontenttypesdjangocontribsessionsdjangocontribmessagesdjangocontribsitesdjangocontribstaticfilesreversionrest_frameworkauthtokenrest_framework_swagger

)

Then add the following content into settingspy just after the REST_FRAMEWORK variable

SWAGGER_SETTINGS = is_authenticated Falseapi_version 10exclude_namespaces []info

contact contactmodoboacomdescription (Modoboa API requires a valid token)title Modoboa API

Yoursquore done The documentation is now available at the following address

22 Upgrade 37

Modoboa Documentation Release 1100

httpltyour instance addressgtdocsapi

Finally if you find a TEMPLATE_CONTEXT_PROCESSORS variable in your settingspy file make sure it lookslike this

TEMPLATE_CONTEXT_PROCESSORS = global_settingsTEMPLATE_CONTEXT_PROCESSORS + [modoboacorecontext_processorstop_notifications

]

140

Warning Please make sure to use Modoboa 135 with an up-to-date database before an upgrade to 140

Warning Do not follow the regular upgrade procedure for this version

Some extension have been moved back into the main repository The main reason for that is that using Modoboawithout them doesnrsquot make sense

First of all you must rename the following applications listed inside the MODOBOA_APPS variable

Old name New namemodoboa_admin modoboaadminmodoboa_admin_limits modoboalimitsmodoboa_admin_relaydomains modoboarelaydomains

Then apply the following steps

1 Uninstall old extensions

$ pip uninstall modoboa-admin modoboa-admin-limits modoboa-admin-relaydomains

2 Install all extension updates using pip (check the Modoboa gt Information page)

3 Manually migrate database

$ cd ltinstance_dirgt$ python managepy migrate auth$ python managepy migrate admin 0001 --fake$ python managepy migrate admin$ python managepy migrate limits 0001 --fake$ python managepy migrate relaydomains 0001 --fake$ python managepy migrate

4 Finally update static files

$ python managepy collectstatic

This version also introduces a REST API To enable it

1 Add rest_frameworkauthtoken to the INSTALLED_APPS variable

2 Add the following configuration inside settingspy

38 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Rest framework settings

REST_FRAMEWORK = DEFAULT_AUTHENTICATION_CLASSES (

rest_frameworkauthenticationTokenAuthentication)DEFAULT_PERMISSION_CLASSES (

rest_frameworkpermissionsIsAuthenticated)

3 Run the following command

$ python managepy migrate

135

To enhance security Modoboa now checks the strength of user passwords lthttpsgithubcomdstufftdjango-passwordsgt_

To use this feature add the following configuration into the settingspy file

django-passwords

PASSWORD_MIN_LENGTH = 8

PASSWORD_COMPLEXITY = UPPER 1LOWER 1DIGITS 1

132

Modoboa now uses the atomic requests mode to preserve database consistency (reference)

To enable it update the DATABASES variable in settingspy as follows

DATABASES = default

stuff beforeATOMIC_REQUESTS True

amavis

stuff beforeATOMIC_REQUESTS True

130

This release does not bring awesome new features but it is a necessary bridge to the future of Modoboa All extensionsnow have their own git repository and the deploy process has been updated to reflect this change

22 Upgrade 39

Modoboa Documentation Release 1100

Another important update is the use of Django 17 Besides its new features the migration system has been reworkedand is now more robust than before

Before we begin with the procedure here is a table showing old extension names and their new name

Old name New package name New module namemodoboaextensionsadmin modoboa-admin modoboa_adminmodoboaextensionslimits modoboa-admin-limits modoboa_admin_limitsmodoboaextensionspostfix_autoreply modoboa-postfix-autoreply modoboa_postfix_autoreplymodoboaextensionspostfix_relay_domains modoboa-admin-relaydomains modoboa_admin_relaydomainsmodoboaextensionsradicale modoboa-radicale modoboa_radicalemodoboaextensionssievefilters modoboa-sievefilters modoboa_sievefiltersmodoboaextensionsstats modoboa-stats modoboa_statsmodoboaextensionswebmail modoboa-webmail modoboa_webmail

Here are the required steps

1 Install the extensions using pip (look at the second column in the table above)

$ pip install ltthe extensions you wantgt

2 Remove south from INSTALLED_APPS

3 Rename old extension names inside MODOBOA_APPS (look at the third column in the table above)

4 Remove modoboalibmiddlewareExtControlMiddleware from MIDDLEWARE_CLASSES

5 Change DATABASE_ROUTERS to

DATABASE_ROUTERS = [modoboa_amavisdbrouterAmavisRouter]

6 Run the following commands

$ cd ltmodoboa_instance_dirgt$ python managepy migrate

7 Reply yes to the question

8 Run the following commands

$ python managepy load_initial_data$ python managepy collectstatic

9 The cleanup job has been renamed in Django so you have to modify your crontab entry

- 0 0 ltmodoboa_sitegtmanagepy cleanup+ 0 0 ltmodoboa_sitegtmanagepy clearsessions

120

A new notification service let administrators know about new Modoboa versions To activate it you need to updatethe TEMPLATE_CONTEXT_PROCESSORS variable like this

from djangoconf import global_settings

TEMPLATE_CONTEXT_PROCESSORS = global_settingsTEMPLATE_CONTEXT_PROCESSORS + (

(continues on next page)

40 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

modoboacorecontext_processorstop_notifications)

and to define the new MODOBOA_API_URL variable

MODOBOA_API_URL = httpapimodoboaorg1

The location of external static files has changed To use them add a new path to the STATICFILES_DIRS

Additional locations of static filesSTATICFILES_DIRS = (

Put strings here like homehtmlstatic or Cwwwdjangostatic Always use forward slashes even on Windows Dont forget to use absolute paths not relative pathsltpathtomodoboainstalldirgtbower_components

)

Run the following commands to define the hostname of your instance

$ cd ltmodoboa_instance_dirgt$ python managepy set_default_site lthostnamegt

If you plan to use the Radicale extension

1 Add modoboaextensionsradicale to the MODOBOA_APPS variable

2 Run the following commands

$ cd ltmodoboa_instance_dirgt$ python managepy syncdb

Warning You also have to note that the sitestatic directory has moved from ltpath to your sitesdirgt to ltmodoboas root urlgt (itrsquos probably the parent directory) You have to adapt your web serverconfiguration to reflect this change

23 Configuration

231 Online parameters

Modoboa provides online panels to modify internal parameters There are two available levels

bull Application level global parameters define how the application behaves Available at Modoboa gt Parameters

bull User level per user customization Available at User gt Settings gt Preferences

Regardless level parameters are displayed using tabs each tab corresponding to one application

General parameters

The admin application exposes several parameters they are presented below

23 Configuration 41

Modoboa Documentation Release 1100

Name Tab Description Default valueAuthentication type General The backend used for au-

thenticationLocal

Default password scheme General Scheme used to cryptmailbox passwords

crypt

Rounds General Number of rounds (onlyused by sha256cryptand sha512crypt) Mustbe between 1000 and999999999 inclusive

70000

Secret key General A key used to encryptusersrsquo password in ses-sions

random value

Sender address General Email address used tosend notifications

Enable communication General Enable communicationwith Modoboa public API

yes

Check new versions General Automatically checks if anewer version is available

yes

Send statistics General Send statistics to Mod-oboa public API (countersand used extensions)

yes

Top notifications check in-terval

General Interval between two topnotification checks (inseconds)

30

Maximum log record age General The maximum age in daysof a log record

365

Items per page General Number of displayeditems per page

30

Default top redirection General The default redirectionused when no applicationis specified

userprefs

Enable MX checks Admin Check that every domainhas a valid MX record

yes

Valid MXs Admin A list of IP or networkaddress every MX shouldmatch A warning will besent if a record does notrespect this it

Enable DNSBL checks Admin Check every domainagainst major DNSBLproviders

yes

DKIM keys storage direc-tory

AdminPath to a directory where DKIM

generated keys willbe stored

Default DKIM key length Admin The default size (in bits)for new keys

2048

Handle mailboxes onfilesystem

Admin Rename or remove mail-boxes on the filesystemwhen they get renamed orremoved within Modoboa

no

Mailboxes owner Admin The UNIX account whoowns mailboxes on thefilesystem

vmail

Default domain quota Admin Default quota (in MB) ap-plied to freshly createddomains with no valuespecified A value of 0means no quota

0

Automatic accountremoval

Admin When a mailbox is re-moved also remove theassociated account

no

Automatic do-mainmailbox creation

Admin Create a domain and amailbox when an accountis automatically created

yes

42 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Note If you are not familiar with virtual domain hosting you should take a look at postfixrsquos documentation ThisHow to also contains useful information

Note A random secret key will be generated each time the Parameters page is refreshed and until you save parametersat least once

Note Specific LDAP parameters are also available see LDAP authentication

232 Media files

Modoboa uses a specific directory to upload files (ie when the webmail is in use) or to create ones (ex graphical statis-tics) This directory is named media and is located inside modoboarsquos installation directory (called modoboa_sitein this documentation)

To work properly the system user which runs modoboa (www-data apache whatever) must have write access tothis directory

233 Customization

Custom logo

You have the possibility to use a custom logo instead of the default one on the login page

To do so open the settingspy file and add a MODOBOA_CUSTOM_LOGO variable This variable must containthe relative URL of your logo under MEDIA_URL For example

MODOBOA_CUSTOM_LOGO = ospathjoin(MEDIA_URL custom_logopng)

Then copy your logo file into the directory indicated by MEDIA_ROOT

234 Host configuration

Note This section is only relevant when Modoboa handles mailboxes renaming and removal from the filesystem

To manipulate mailboxes on the filesystem you must allow the user who runs Modoboa to execute commands as theuser who owns mailboxes

To do so edit the etcsudoers file and add the following inside

ltuser_that_runs_modoboagt ALL=(ltmailboxes ownergt) NOPASSWD ALL

Replace values between ltgt by the ones you use

23 Configuration 43

Modoboa Documentation Release 1100

235 Time zone and language

Modoboa is available in many languages

To specify the default language to use edit the settingspy file and modify the LANGUAGE_CODE variable

LANGUAGE_CODE = fr or en for english etc

Note Each user has the possibility to define the language he prefers

In the same configuration file specify the timezone to use by modifying the TIME_ZONE variable For example

TIME_ZONE = EuropeParis

236 Sessions management

Modoboa uses Djangorsquos session framework to store per-user information

Few parameters need to be set in the settingspy configuration file to make Modoboa behave as expected

SESSION_EXPIRE_AT_BROWSER_CLOSE = False Default value

This parameter is optional but you must ensure it is set to False (the default value)

The default configuration file provided by the modoboa-adminpy command is properly configured

237 Logging authentication

To trace login attempts to the web interface Modoboa uses python SysLogHandler so you can see them in your syslogauthentication log file (varlogauthlog in most cases)

Depending on your configuration you may have to edit the settingspy file and add lsquoaddressrsquo lsquodevlogrsquo to thelogging section

syslog-auth class logginghandlersSysLogHandlerfacility SysLogHandlerLOG_AUTHaddress devlogformatter syslog

238 External authentication

LDAP

Modoboa supports external LDAP authentication using the following extra components

bull Python LDAP client

bull Django LDAP authentication backend

If you want to use this feature you must first install those components

44 Chapter 2 Table of contents

Modoboa Documentation Release 1100

$ pip install python-ldap django-auth-ldap

Then all you have to do is to modify the settingspy file Add a new authentication backend to the AUTHENTI-CATION_BACKENDS variable like this

AUTHENTICATION_BACKENDS = (modoboalibauthbackendsLDAPBackend modoboalibauthbackendsLDAPSecondaryBackend Useful for a fallback

rarr˓mechanismdjangocontribauthbackendsModelBackend

)

Finally go to Modoboa gt Parameters gt General and set Authentication type to LDAP

From there new parameters will appear to let you configure the way Modoboa should connect to your LDAP serverThey are described just below

Name Description De-faultvalue

Server address The IP address of the DNS name of the LDAP server local-host

Server port The TCP port number used by the LDAP server 389Use a secureconnection

Use an SSLTLS connection to access the LDAP server no

Authenticationmethod

Choose the authentication method to use Directbind

User DN tem-plate (directbind mode)

The template used to construct a userrsquos DN It should contain one placeholder (ie(user)s)

Bind BN The distinguished name to use when binding to the LDAP server Leave empty for ananonymous bind

Bind password The password to use when binding to the LDAP server (with lsquoBind DNrsquo)Search base The distinguished name of the search baseSearch filter An optional filter string (eg lsquo(objectClass=person)rsquo) In order to be valid it must be

enclosed in parentheses(mail=(user)s)

Passwordattribute

The attribute used to store user passwords user-Pass-word

Active Direc-tory

Tell if the LDAP server is an Active Directory one no

Administratorgroups

Members of those LDAP Posix groups will be created ad domain administrators Uselsquorsquo characters to separate groups

Group type The type of group used by your LDAP directory Posix-Group

Groups searchbase

The distinguished name of the search base used to find groups

Do-mainmailboxcreation

Automatically create a domain and a mailbox when a new user is created just after thefirst successful authentication You will generally want to disable this feature whenthe relay domains extension is in use

yes

If you need additional parameters you will find a detailed documentation here

Once the authentication is properly configured the users defined in your LDAP directory will be able to connect to

23 Configuration 45

Modoboa Documentation Release 1100

Modoboa the associated domain and mailboxes will be automatically created if needed

The first time a user connects to Modoboa a local account is created if the LDAP username is a valid email addressBy default this account belongs to the SimpleUsers group and it has a mailbox

To automatically create domain administrators you can use the Administrator groups setting If a LDAP user belongsto one the listed groups its local account will belong to the DomainAdmins group In this case the username is notnecessarily an email address

Users will also be able to update their LDAP password directly from Modoboa

Note Modoboa doesnrsquot provide any synchronization mechanism once a user is registered into the database Anymodification done from the directory to a user account will not be reported to Modoboa (an email address change forexample) Currently the only solution is to manually delete the Modoboa record it will be recreated on the next userlogin

SMTP

It is possible to use an existing SMTP server as an authentication source To enable this feature edit the settingspy file and change the following setting

AUTHENTICATION_BACKENDS = (modoboalibauthbackendsSMTPBackenddjangocontribauthbackendsModelBackend

)

SMTP server location can be customized using the following settings

AUTH_SMTP_SERVER_ADDRESS = localhostAUTH_SMTP_SERVER_PORT = 25AUTH_SMTP_SECURED_MODE = None ssl or starttls are accepted

239 LDAP synchronization

Modoboa can synchronize accounts with an LDAP directory (tested with OpenLDAP) but this feature is not enabledby default To activate it add modoboaldapsync to MODOBOA_APPS in the settingspy file

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboaldapsync

)

and enable it from the admin panel

46 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning Make sure to install additional requirements otherwise it wonrsquot work

The following parameters are available and must be filled

Name Description Defaultvalue

Enable LDAP synchro-nization

Control LDAP synchronization state no

Bind DN The DN of a user with write permission to createupdate accountsBind password The associated passwordAccount DN template The template used to build account DNs (must contain a (user)s

placeholder

2310 Database maintenance

Cleaning the logs table

Modoboa logs administrator specific actions into the database A clean-up script is provided to automatically removeoldest records The maximum log record age can be configured through the online panel

To use it you can setup a cron job to run every night

0 0 ltmodoboa_sitegtmanagepy cleanlogs Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy cleanlogs

Cleaning the session table

Django does not provide automatic purging Therefore itrsquos your job to purge expired sessions on a regular basis

Django provides a sample clean-up script django-adminpy clearsessions That script deletes any sessionin the session table whose expire_date is in the past

For example you could setup a cron job to run this script every night

0 0 ltmodoboa_sitegtmanagepy clearsessions Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy clearsessions

Cleaning inactive accounts

Thanks to Last-login tracking it is now possible to monitor inactive accounts An account is considered inactive if nologin has been recorded for the last 30 days (this value can be changed through the admin panel)

A management command is available to disable or delete inactive accounts For example you could setup a cron jobto run it every night

23 Configuration 47

Modoboa Documentation Release 1100

0 0 ltmodoboa_sitegtmanagepy clean_inactive_accounts Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy clean_inactive_rarr˓accounts

The default behaviour is to disable accounts You can delete them using the --delete option

24 Moving to Modoboa

You have an existing platform and yoursquod like to move to Modoboa the following tools could help you

241 From postfixadmin

A dedicated command allows you to convert an existing postfixadmin database to a Modoboa one Consult the docu-mentation to know more about the process

242 Using CSV files

Modoboa allows you to import any object (domain domain alias mailbox and alias) using a simple CSV file encodedusing UTF8 Each line corresponds to a single object and must respect one of the following format

domain ltname stringgt ltquota integergt ltdefault mailbox quota integergt ltenabledrarr˓booleangtdomainalias ltname stringgt lttargeted domain stringgt ltenabled booleangtrelaydomain ltname stringgt lttarget host stringgt lttarget port integergt ltservicerarr˓stringgt ltenabled booleangt ltverify recipients booleangtaccount ltloginname stringgt ltpassword stringgt ltfirst name stringgt ltlast namerarr˓stringgt ltenabled booleangt ltgroup stringgt ltaddress stringgt ltquota integergt [rarr˓ltdomain stringgt ]alias ltaddress stringgt ltenabled booleangt ltrecipient stringgt

Boolean fields accept the following values true 1 yes y (case insensitive) Any other value will be evaluated asfalse

Warning The order does matter Objects are created sequencially so a domain must be created before itsmailboxes and aliases and a mailbox must created before its alias(es)

To actually import such a file

gt sudo -u ltmodoboa_usergt -igt source ltvirtualenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy modo import ltyour filegt

Available options can be listed using the following command

gt python managepy modo import -h

48 Chapter 2 Table of contents

Modoboa Documentation Release 1100

25 REST API

To ease the integration with external sources (software or other) Modoboa provides a REST API

Every installed instance comes with a ready-to-use API and a documentation You will find them using the followingurl patterns

bull API httplthostnamegtapiv1

bull Documentation httplthostnamegtdocsapi

An example of this documentation is available on the official demo

Using this API requires an authentication and for now only a token based authentication is supported To get a validtoken log-in to your instance with a super administrator go to Settings gt API and activate the API access Press theUpdate button and wait until the page is reloaded the token will be displayed

To make valid API calls every requests you send must embed this token within an Authorization HTTP header likethis

Authorization Token ltYOUR_TOKENgt

and the content type of those requests must be applicationjson

26 How to contribute

Contributions are always welcome If you want to submit a patch please respect the following rules

bull Open a pull request on the appropriate repository

bull Respect PEP8

bull Document your patch and respect PEP 257

bull Add unit tests and make sure the global coverage does not decrease

If all those steps are validated your contribution will generally be integrated

261 Table of contents

25 REST API 49

Modoboa Documentation Release 1100

Useful tips

You would like to work on Modoboa but you donrsquot know where to start Yoursquore at the right place Browse this pageto learn useful tips

Docker

A docker image is available for developers To use it you must install docker and docker-compose first

Then just run the following command

$ docker-compose up

It will start the docker environment and make a Modoboa instance available at httplocalhost8000

If you donrsquot want to use docker or need a more complex development setup go to the next section

Prepare a virtual environment

A virtual environment is a good way to setup a development environment on your machine

To do so run the following commands

$ python3 -m venv ltpathgt$ source ltpathgtbinactivate$ git clone httpsgithubcommodoboamodoboagit$ cd modoboa$ python setuppy develop$ pip install -r dev-requirementstxt

The develop command creates a symbolic link to your local copy so any modification you make will be automati-cally available in your environment no need to copy them

Deploy an instance for development

Warning Make sure to create a database before running this step The format of the database url is also describedin this page

Now that you have a running environment yoursquore ready to deploy a test instance

$ cd ltpathgt$ modoboa-adminpy deploy --dburl defaultltdatabase urlgt --domain localhost --develrarr˓instance$ python managepy runserver

Yoursquore ready to go You should be able to access Modoboa at httplocalhost8000 usingadminpassword as credentials

Manage static files

Modoboa uses bower (thanks to django-bower) to manage its CSS and javascript dependencies

50 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Those dependencies are listed in a file called dev_settingspy located inside the ltpath_to_local_copygtmodoboacore directory

If you want to add a new dependency just complete the BOWER_INSTALLED_APPS parameter and run the followingcommand

$ python managepy bower install

It will download and store the required files into the ltpath_to_local_copygtmodoboabower_components directory

Test your modifications

If you deployed a specific instance for your development needs you can run the tests suite as follows

gt python managepy test modoboacore modoboalib modoboaadmin modoboalimits modoboararr˓relaydomains

Otherwise you can run the tests suite from the repository using tox

Start a basic Modoboa instance

From the repository run the following command to launch a simple instance with a few fixtures

gt tox -e serve

You can use adminpassword to log in

Build the documentation

If you need to modify the documenation and want to see the result you can build it as follows

gt tox -e docgt firefox toxdoctmphtmlindexhtml

FAQ

bower command is missing in managepy

bower command is missing in managepy if you donrsquot use the --devel option of the modoboa-adminpydeploy command

To fix it regenerate your instance or update your settingspy file manually Look at devmode in httpsgithubcomtonioomodoboablobmastermodoboacorecommandstemplatessettingspytpl

Create a new plugin

Introduction

Modoboa offers a plugin API to expand its capabilities The current implementation provides the following possibili-ties

26 How to contribute 51

Modoboa Documentation Release 1100

bull Expand navigation by adding entry points to your plugin inside the GUI

bull Access and modify administrative objects (domains mailboxes etc)

bull Register callback actions for specific events

Plugins are nothing more than Django applications with an extra piece of code that integrates them into Modoboa Themodo_extensionpy file will contain a complete description of the plugin

bull Admin and user parameters

bull Custom menu entries

The communication between both applications is provided by Django signals

The following subsections describe the plugin architecture and explain how you can create your own

The required glue

To create a new plugin just start a new django application like this (into Modoboarsquos directory)

$ python managepy startapp

Then you need to register this application using the provided API Just copypaste the following example into themodo_extensionpy file of the future extension

from modoboacoreextensions import ModoExtension exts_pool

class MyExtension(ModoExtension)My custom Modoboa extension

name = myextlabel = My Extensionversion = 01description = A descriptionurl = myext_root_location optional name is used if not defined

def load(self)This method is called when Modoboa loads available and activated plugins

Declare parameters and register events herepass

def load_initial_data(self)Optional provide initial data for your extension herepass

exts_poolregister_extension(MyExtension)

Once done simply add your extensionrsquos module name to the MODOBOA_APPS variable located inside settingspy Finally run the following commands

$ python managepy migrate$ python managepy load_initial_data$ python managepy collectstatic

52 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Parameters

A plugin can declare its own parameters There are two levels available

bull lsquoGlobalrsquo parameters used to configure the plugin editable inside the Admin gt Settings gt Parameters page

bull lsquoUserrsquo parameters per-user parameters (or preferences) editable inside the Options gt Preferences page

Playing with parameters

Parameters are defined using Django forms and Modoboa adds two special forms you can inherit depending on thelevel of parameter(s) you want to add

bull modoboaparametersformsAdminParametersForm for general parameters

bull modoboaparametersformsUserParametersForm for user parameters

To register new parameters add the following line into the load method of your plugin class

from modoboaparameters import tools as param_toolsparam_toolsregistryadd(

LEVEL YourForm ugettext_lazy(Title))

Replace LEVEL by global or user

Custom role permissions

Modoboa uses Djangorsquos internal permission system Administrative roles are nothing more than groups (Groupinstances)

An extension can add new permissions to a group by listening to the extra_role_permissions signal Here isan example

from djangodispatch import receiverfrom modoboacore import signals as core_signals

PERMISSIONS = Resellers [

(relaydomains relaydomain add_relaydomain)(relaydomains relaydomain change_relaydomain)(relaydomains relaydomain delete_relaydomain)(relaydomains service add_service)(relaydomains service change_service)(relaydomains service delete_service)

]

receiver(core_signalsextra_role_permissions)def extra_role_permissions(sender role kwargs)

Add permissions to the Resellers groupreturn constantsPERMISSIONSget(role [])

Extending admin forms

The forms used to edit objects (account domain etc) through the admin panel are composed of tabs You can extendthem (ie add new tabs) in a pretty easy way thanks to custom signals

26 How to contribute 53

Modoboa Documentation Release 1100

Account

To add a new tab to the account edition form define new listeners (handlers) for the following signals

bull modoboaadminsignalsextra_account_forms

bull modoboaadminsignalsget_account_form_instances

bull modoboaadminsignalscheck_extra_account_form (optional)

Example

from djangodispatch import receiverfrom modoboaadmin import signals as admin_signals

receiver(admin_signalsextra_account_forms)def extra_account_form(sender user account kwargs)

return [id tabid title Title cls MyFormClass

]

receiver(admin_signalsget_account_form_instances)def fill_my_tab(sender user account kwargs)

return id my_instance

Domain

To add a new tab to the domain edition form define new listeners (handlers) for the following signals

bull modoboaadminsignalsextra_domain_forms

bull modoboaadminsignalsget_domain_form_instances

Example

from djangodispatch import receiverfrom modoboaadmin import signals as admin_signals

receiver(admin_signalsextra_domain_forms)def extra_account_form(sender user domain kwargs)

return [id tabid title Title cls MyFormClass

]

receiver(admin_signalsget_domain_form_instances)def fill_my_tab(sender user domain kwargs)

return id my_instance

27 Contributors

bull Antidot

bull Bearstech

bull CAP-REL

54 Chapter 2 Table of contents

Modoboa Documentation Release 1100

bull Dalnix

27 Contributors 55

  • Overview
  • Table of contents
Page 21: Modoboa Documentation

Modoboa Documentation Release 1100

line

include_try dovecot-modoboaconfext

Then set modoboa parameter Enable Dovecot LDAP sync to Yes Then set the Dovecot LDAP config file following theprevious step (etcdovecotdovecot-modoboaconfext in the example)

The last step is to add the command update_dovecot_conf to the cron job of modoboa Then each time your modoboaLDAP configuration is updated your dovecot LDAP configuration will also be

LMTP

Local Mail Transport Protocol is used to let Postfix deliver messages to Dovecot

First make sure the protocol is activated by looking at the protocols setting (generally inside dovecotconf)It should be similar to the following example

protocols = imap pop3 lmtp

Then open the confd10-masterconf look for lmtp service definition and add the following content inside

service lmtp stuff beforeunix_listener varspoolpostfixprivatedovecot-lmtp mode = 0600user = postfixgroup = postfix

stuff after

We assume here that Postfix is chrooted within varspoolpostfix

Finally open the confd20-lmtpconf and modify it as follows

protocol lmtp postmaster_address = postmasterltdomaingtmail_plugins = $mail_plugins quota sieve

Replace ltdomaingt by the appropriate value

Note If you donrsquot plan to apply quota or to use filters just adapt the content of the mail_plugins setting

Quota

Modoboa lets adminstrators define per-domain andor per-account limits (quota) It also lists the current quota usageof each account Those features require Dovecot to be configured in a specific way

Inside confd10-mailconf add the quota plugin to the default activated ones

mail_plugins = quota

Inside confd10-masterconf update the dict service to set proper permissions

18 Chapter 2 Table of contents

Modoboa Documentation Release 1100

service dict If dict proxy is used mail processes should have access to its socket For example mode=0660 group=vmail and global mail_access_groups=vmailunix_listener dict mode = 0600user = ltuser owning mailboxesgtgroup =

Inside confd20-imapconf activate the imap_quota plugin

protocol imap

mail_plugins = $mail_plugins imap_quota

Inside dovecotconf activate the quota SQL dictionary backend

dict quota = ltdrivergtetcdovecotdovecot-dict-sqlconfext

Inside confd90-quotaconf activate the quota dictionary backend

plugin quota = dictUser quotaproxyquota

It will tell Dovecot to keep quota usage in the SQL dictionary

Finally edit the dovecot-dict-sqlconfext file and put the following content inside

connect = host=ltdb hostgt dbname=ltdb namegt user=ltdb usergt password=ltpasswordgt SQLite users connect = pathtothedatabasedb

map pattern = privquotastoragetable = admin_quotausername_field = usernamevalue_field = bytes

map

pattern = privquotamessagestable = admin_quotausername_field = usernamevalue_field = messages

PostgreSQL users

21 Installation 19

Modoboa Documentation Release 1100

Database schema update

The admin_quota table is created by Django but unfortunately it doesnrsquot support DEFAULT constraints (it onlysimulates them when the ORM is used) As PostgreSQL is a bit strict about constraint violations you must executethe following query manually

db=gt ALTER TABLE admin_quota ALTER COLUMN bytes SET DEFAULT 0db=gt ALTER TABLE admin_quota ALTER COLUMN messages SET DEFAULT 0

Trigger

As indicated on Dovecotrsquos wiki you need a trigger to properly update the quota

A working copy of this trigger is available on Github

Download this file and copy it on the server running postgres Then execute the following commands

$ su - postgres$ psql [modoboa database] lt pathtomodoboa_postgres_triggersql$ exit

Replace [modoboa database] by the appropriate value

Forcing recalculation

For existing installations Dovecot (gt 2) offers a command to recalculate the current quota usages For example if youwant to update all usages run the following command

$ doveadm quota recalc -A

Be carefull it can take a while to execute

ManageSieveSieve

Modoboa lets users define filtering rules from the web interface To do so it requires ManageSieve to be activated onyour server

Inside confd20-managesieveconf make sure the following lines are uncommented

protocols = $protocols sieve

service managesieve-login

service managesieve

protocol sieve

20 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Messages filtering using Sieve is done by the LDA

Inside confd15-ldaconf activate the sieve plugin like this

protocol lda Space separated list of plugins to load (default is global mail_plugins)mail_plugins = $mail_plugins sieve

Finally configure the sieve plugin by editing the confd90-sieveconf file Put the follwing caontent inside

plugin Location of the active script When ManageSieve is used this is actually a symlink pointing to the active script in the sieve storage directorysieve = ~dovecotsieve

The path to the directory where the personal Sieve scripts are stored For ManageSieve this is where the uploaded scripts are storedsieve_dir = ~sieve

Restart Dovecot

Now you can go to the Postfix section to finish the installation

Last-login tracking

To update the last_login attribute of an account after a succesful IMAP or POP3 login you can configure apost-login script

Open confd10-masterconf add the following configuration (imap and pop3 services are already definedyou just need to update them)

service imap executable = imap postlogin

service pop3 executable = pop3 postlogin

service postlogin executable = script-login usrlocalbinpostloginshuser = modoboaunix_listener postlogin

Then you must create a script named usrlocalbinpostloginsh According to your database enginethe content will differ

PostgreSQL

21 Installation 21

Modoboa Documentation Release 1100

binsh

psql -c UPDATE core_user SET last_login=now() WHERE username=$USER gt devnull

exec $

MySQL

binsh

DBNAME=XXXDBUSER=XXXDBPASSWORD=XXX

echo UPDATE core_user SET last_login=now() WHERE username=$USER | mysql -urarr˓$DBUSER -p$DBPASSWORD $DBNAME

exec $

Postfix

This section gives an example about building a simple virtual hosting configuration with Postfix Refer to the officialdocumentation for more explanation

Map files

You first need to create configuration files (or map files) that will be used by Postfix to lookup into Modoboa tables

To automaticaly generate the requested map files and store them in a directory run the following command

gt cd ltmodoboa_instance_pathgtgt python managepy generate_postfix_maps --destdir ltdirectorygt

ltdirectorygt is the directory where the files will be stored Answer the few questions and yoursquore done

Configuration

Use the following configuration in the etcpostfixmaincf file (this is just one possible configuration)

Stuff beforevirtual_transport = lmtpunixprivatedovecot-lmtp

virtual_mailbox_domains = ltdrivergtetcpostfixsql-domainscfvirtual_alias_domains = ltdrivergtetcpostfixsql-domain-aliasescfvirtual_alias_maps = ltdrivergtetcpostfixsql-aliasescf

relay_domains = ltdrivergtetcpostfixsql-relaydomainscftransport_maps =

ltdrivergtetcpostfixsql-transportcfltdrivergtetcpostfixsql-spliteddomains-transportcf

(continues on next page)

22 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

smtpd_recipient_restrictions = check_recipient_access

ltdrivergtetcpostfixsql-maintaincfltdrivergtetcpostfixsql-relay-recipient-verificationcf

permit_mynetworksreject_unauth_destinationreject_unverified_recipient

smtpd_sender_login_maps = ltdrivergtetcpostfixsql-sender-login-mapcf

smtpd_sender_restrictions =reject_sender_login_mismatch

Stuff after

Replace ltdrivergt by the name of the database you use

Restart Postfix

Policy daemon

If you want to enable the built-in policy daemon add the following content to the etcpostfixmaincf file

smtpd_recipient_restrictions = check_policy_service inet1270019999

And reload postfix

Note The check_policy_service line must be placed before the permit_mynetworks one otherwise thedaemon wonrsquot be called

OpenDKIM

Modoboa can generate DKIM keys for the hosted domains but it wonrsquot sign or check messages To do that you needa dedicated software like OpenDKIM

Note The cron job in charge of creating DKIM keys must be run using the same user than OpenDKIM (ie opendkimin most cases)

Database

Since keys related information is stored in Modoboarsquos database you need to tell OpenDKIM how it can access it

First make sure to install the required additional packages on your system (libopendbx1- on debian baseddistributions or opendbx- on CentOS the complete name depends on your database engine)

Then insert the following SQL view into Modoboarsquos database

21 Installation 23

Modoboa Documentation Release 1100

PostgreSQL

CREATE OR REPLACE VIEW dkim AS (SELECT id name as domain_name dkim_private_key_path AS private_key_path

dkim_key_selector AS selectorFROM admin_domain WHERE enable_dkim

)

MySQLMariaDB

CREATE OR REPLACE VIEW dkim AS (SELECT id name as domain_name dkim_private_key_path AS private_key_path

dkim_key_selector AS selectorFROM admin_domain WHERE enable_dkim=1

)

Configuration

You should find OpenDKIMrsquos configuration file at etcopendkimconf

Add the following content to it

KeyTable dsnltdrivergtltusergtltpasswordgtltdb hostgtltdb namegttable=dkimrarr˓keycol=iddatacol=domain_nameselectorprivate_key_pathSigningTable dsnltdrivergtltusergtltpasswordgtltdb hostgtltdb namegttable=dkimrarr˓keycol=domain_namedatacol=idSocket inet12345localhost

Replace values between ltgt by yours Accepted values for driver are pgsql or mysql Make sure the user youspecify has read permission on the view created previously

If you run a debian based system make sure to adjust the following setting in the etcdefaultopendkim file

SOCKET=inet12345localhost

Eventually reload OpenDKIM

Postfix integration

Add the following lines to the etcpostfixmaincf file

smtpd_milters = inet12700112345non_smtpd_milters = inet12700112345milter_default_action = acceptmilter_content_timeout = 30s

and reload postfix

Extensions

Only few commands are needed to add a new extension to your setup

24 Chapter 2 Table of contents

Modoboa Documentation Release 1100

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install ltEXTENSIONgt==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Then restart your web server

22 Upgrade

221 Modoboa

Warning The new version you are going to install may need to modify your database Before you start makesure to backup everything

Most of the time upgrading your installation to a newer Modoboa version only requires a few actions In every caseyou will need to apply the general procedure first and then check if the version you are installing requires specificactions

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install modoboa==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Once done check if the version you are installing requires Specific instructions

Finally restart your web server

Sometimes you might need to upgrade postfix map files too To do so just run the generate_postfix_mapscommand on the same directory than the one used for installation (etcpostfix by default)

Make sure to use root privileges and run the following command

gt python managepy generate_postfix_maps --destdir ltdirectorygt

Then reload postfix

22 Upgrade 25

Modoboa Documentation Release 1100

222 Extensions

If a new version is available for an extension yoursquore using it is recommanded to install it Upgrading an extensions ispretty and the procedure is almost the same than the one used for Modoboa

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install ltEXTENSIONgt==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Finally restart your web server

It is a generic upgrade procedure which will be enough most of the time but it is generally a good idea to check theassociated documentation

223 Rebuild Virtual Environment

Sometimes when upgrading your Operating System (eg from Ubuntu 1704 to Ubuntu 1710) your virtual environmentrunning modoboa can get corrupted Your first response will be to panic but fear not The solution is in this document

First things first

Recover your database password

You will need to recover your database password (if using mysql or postgresql) You will find this in etcpostfixsql-aliasescf or any file with sql-cf in the etcpostfix directory

Make note of this as you will need it when reconfiguring modoboa

Reinstall Modoboa

Start out by backup up your modoboa settings file located in the modoboa instance directory (srvmodoboainstanceinstancesettingspy if you used the default installer configuration) This contains your currentconfiguration

Next you want to remove all current modoboa files

After doing this follow the manual installation instructions for Modoboa only as everything should be working prop-erly

After this completes simply restore your backed up settings file to srvinstanceinstancesettingspy(if you used installer default configuration) You will then need to reinstall your extensions

You can find which plugins you had in your settingspy file under the MODOBOA_APPS variable

Instructions to install extensions can also be found here

Once you have completed this step you will need to run the following commands

26 Chapter 2 Table of contents

Modoboa Documentation Release 1100

gt (env) $ cd ltinstance_dirgtgt (env) $ python managepy migrategt (env) $ python managepy collectstatic

You will then see a message similar to

You have requested to collect static files at the destinationlocation as specified in your settings

srvmodoboainstancesitestatic

This will overwrite existing filesAre you sure you want to do this

Type yes to continue or no to cancel

You will want to answer yes here then simply restart the uwsgi process with service uwsgi restart andyou should be up and running again

Simply log into your modoboa web panel and verify that your extensions and webmail box is working

224 Information

Rebuild instructions from httpshelppythonanywherecompagesRebuildingVirtualenvs

225 Specific instructions

1160

A new policy daemon has been added

Make sure to have a Redis instance running on your server

Add modoboapolicyd to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboapolicyd

)

Add the following settings to your settingspy file

REDIS_HOST = ltIP or hostname heregtREDIS_PORT = 6379REDIS_QUOTA_DB = 0REDIS_URL = redisformat(REDIS_HOST REDIS_PORT REDIS_QUOTA_DB)

Once done you can start the policy daemon using the following commands

22 Upgrade 27

Modoboa Documentation Release 1100

gt python managepy policy_daemon

Donrsquot forget to configure _policyd_config if you want to use this feature

The modoboa-stats plugin has been merged into the core

Add modoboamaillog to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboapolicydmodoboamaillog

)

And remove any reference to modoboa_stats in this same variable

1150

This version drops Python 2 support so donrsquot forget to update all the extensions you use

Warning If you upgrade an existing python 2 installation you will need to create a new Python 3 virtualenvironment You can remove the existing virtual environment and replace it by the new one so you wonrsquot have tomodify your configuration files

Add the following new setting

DISABLE_DASHBOARD_EXTERNAL_QUERIES = False

Reload uwsgigunicornapache depending on your setup

Finally Make sure to use root privileges and run the following command

gt python managepy generate_postfix_maps --destdir ltdirectorygt

Then reload postfix

1140

This release introduces an optional LDAP synchronization process If you want to use it please follow the dedicatedprocedure

1131

Upgrade postfix maps files as follows

28 Chapter 2 Table of contents

Modoboa Documentation Release 1100

gt python managepy generate_postfix_maps --destdir ltpathgt --force-overwrite

1130

Add modoboadnstools to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstools

)

Add the following new settings

CSRF_COOKIE_SECURE = TrueSESSION_COOKIE_SECURE = True

modoboa-postfix-autoreply 150

Edit the etcpostfixmaincf file and remove the sql-autoreplies-transportcf map from thetransport_maps if present Remove the corresponding proxy_read_maps entry if relevant

Reload postfix

1100

Warning Upgrade installed extensions BEFORE running check or migrate commands

Upgrade all your installed plugins to the following versions

Warning If you use the amavis plugin make sure to include its configuration as follows into settingspy

from modoboa_amavis import settings as modoboa_amavis_settingsmodoboa_amavis_settingsapply(globals())

22 Upgrade 29

Modoboa Documentation Release 1100

Name Versionmodoboa-amavis 120modoboa-contacts 050modoboa-dmarc 110modoboa-imap-migration 120modoboa-pdfcredentials 130modoboa-postfix-autoreply 140modoboa-radicale 120modoboa-sievefilters 140modoboa-stats 140modoboa-webmail 140

Edit the settingspy file and apply the following modifications

Add modoboatransport to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparameters

)

Replace the following line

MIDDLEWARE_CLASSES = (

by

MIDDLEWARE = (

Update postfix map files as follows

gt rm -f ltpathgtmodoboa-postfix-mapschkgt python managepy generate_postfix_maps --force --destdir ltpathgt

Then modify postfixrsquos configuration as follows

smtpd_sender_login_maps =ltdrivergtltpathgtsql-sender-login-mapcf

transport_maps =ltdrivergtltpathgtsql-transportcfltdrivergtltpathgtsql-spliteddomains-transportcf other map files

Replace ltdrivergt and ltpathgt by your values

If transport_maps contains sql-relaydomains-transportcf remove it

30 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning If you make use of postfixrsquos proxymap server you must also update the proxy_read_maps setting

Reload postfix

Add the following cron job in order to generate DKIM keys

Generate DKIM keys (they will belong to the user running this job)

root $PYTHON $INSTANCEmanagepy modorarr˓manage_dkim_keys

190

If you want to manage inactive accounts look at Cleaning inactive accounts

183

Edit the settingspy file and replace the following line

BASE_DIR = ospathdirname(ospathdirname(__file__))

by

BASE_DIR = ospathrealpath(ospathdirname(ospathdirname(__file__)))

180

Modoboa now relies on Djangorsquos builtin password validation system to validate user passwords instead ofdjango-passwords

Remove django-passwords from your system

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt pip uninstall django-passwords

Edit the settingspy file and remove the following content

django-passwords

PASSWORD_MIN_LENGTH = 8

PASSWORD_COMPLEXITY = UPPER 1LOWER 1DIGITS 1

Add the following lines

Password validation rulesAUTH_PASSWORD_VALIDATORS = [

NAME djangocontribauthpassword_validation

rarr˓UserAttributeSimilarityValidator (continues on next page)

22 Upgrade 31

Modoboa Documentation Release 1100

(continued from previous page)

NAME djangocontribauthpassword_validationMinimumLengthValidator

NAME djangocontribauthpassword_validationCommonPasswordValidator

NAME djangocontribauthpassword_validationNumericPasswordValidator

NAME modoboacorepassword_validationComplexityValidatorOPTIONS

upper 1lower 1digits 1specials 0

]

172

API documentation has evolved (because of the upgrade to Django Rest Framework 36) and CKeditor is now embed-ded by default (thanks to the django-ckeditor package) Some configuration changes are required

Edit your settingspy file and apply the following modifications

bull Update the INSTALLED_APPS variable as follows

INSTALLED_APPS = (djangocontribauthdjangocontribcontenttypesdjangocontribsessionsdjangocontribmessagesdjangocontribsitesdjangocontribstaticfilesreversionckeditorckeditor_uploaderrest_frameworkrest_frameworkauthtoken

)

bull Update the REST_FRAMEWORK variable as follows

REST_FRAMEWORK = DEFAULT_AUTHENTICATION_CLASSES (

rest_frameworkauthenticationTokenAuthenticationrest_frameworkauthenticationSessionAuthentication

)

bull Remove the SWAGGER_SETTINGS variable

bull Add the following content

32 Chapter 2 Table of contents

Modoboa Documentation Release 1100

CKeditor

CKEDITOR_UPLOAD_PATH = uploads

CKEDITOR_IMAGE_BACKEND = pillow

CKEDITOR_RESTRICT_BY_USER = True

CKEDITOR_BROWSE_SHOW_DIRS = True

CKEDITOR_ALLOW_NONIMAGE_FILES = False

CKEDITOR_CONFIGS = default

allowedContent Truetoolbar Modoboawidth Nonetoolbar_Modoboa [

[Bold Italic Underline][JustifyLeft JustifyCenter JustifyRight JustifyBlock][BidiLtr BidiRtl Language][NumberedList BulletedList - Outdent Indent][Undo Redo][Link Unlink Anchor - Smiley][TextColor BGColor - Source][Font FontSize][Image ][SpellChecker]

]

Donrsquot forget to run the following command

gt python managepy collectstatic

171

If you used 170 for a fresh installation please run the following commands

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy load_initial_data

170

This version requires Django gt= 110 so you need to make some modifications It also brings internal API changeswhich are not backward compatible so installed extensions must be upgraded too

First of all deactivate all installed extensions (edit the settingspy file and comment the corresponding lines inMODOBOA_APPS)

Edit the urlspy file of your local instance and replace its content by the following one

22 Upgrade 33

Modoboa Documentation Release 1100

from djangoconfurls import include url

urlpatterns = [url(r include(modoboaurls))

]

Edit the settingspy and apply the following changes

bull Add modoboaparameters to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboarelaydomainsmodoboalimitsmodoboaparameters Modoboa extensions here

)

bull Add modoboacoremiddlewareLocalConfigMiddleware to MIDDLEWARE_CLASSES

MIDDLEWARE_CLASSES = (djangocontribsessionsmiddlewareSessionMiddlewaredjangomiddlewarecommonCommonMiddlewaredjangomiddlewarecsrfCsrfViewMiddlewaredjangocontribauthmiddlewareAuthenticationMiddlewaredjangocontribmessagesmiddlewareMessageMiddlewaredjangomiddlewarelocaleLocaleMiddlewaredjangomiddlewareclickjackingXFrameOptionsMiddlewaremodoboacoremiddlewareLocalConfigMiddlewaremodoboalibmiddlewareAjaxLoginRedirectmodoboalibmiddlewareCommonExceptionCatchermodoboalibmiddlewareRequestCatcherMiddleware

)

bull Modoboa used to provide a custom authentication backend (modoboalibauthbackendsSimpleBackend) but it has been removed Replace it as follows

AUTHENTICATION_BACKENDS = ( Other backends beforedjangocontribauthbackendsModelBackend

)

bull Remove TEMPLATE_CONTEXT_PROCESSORS and replace it by

TEMPLATES = [

BACKEND djangotemplatebackendsdjangoDjangoTemplatesDIRS []APP_DIRS TrueOPTIONS

context_processors [djangotemplatecontext_processorsdebugdjangotemplatecontext_processorsrequestdjangocontribauthcontext_processorsauth

(continues on next page)

34 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

djangotemplatecontext_processorsi18ndjangotemplatecontext_processorsmediadjangotemplatecontext_processorsstaticdjangotemplatecontext_processorstzdjangocontribmessagescontext_processorsmessagesmodoboacorecontext_processorstop_notifications

]debug False

]

Run the following commands (load virtualenv if you use one)

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstatic

Finally upgrade your extensions and reactivate them

Name Versionmodoboa-amavis 110modoboa-dmarc 100modoboa-imap-migration 110modoboa-pdfcredentials 110modoboa-postfix-autoreply 120modoboa-radicale 110modoboa-sievefilters 110modoboa-stats 110modoboa-webmail 110

Command line shortcuts

$ pip install modoboa-amavis==110$ pip install modoboa-dmarc==100$ pip install modoboa-imap-migration==110$ pip install modoboa-pdfcredentials==110$ pip install modoboa-postfix-autoreply==120$ pip install modoboa-radicale==110$ pip install modoboa-sievefilters==110$ pip install modoboa-stats==110$ pip install modoboa-webmail==110

And please make sure you use the latest version of the django-versionfield2 package

$ pip install -U django-versionfield2

Notes about quota changes and resellers

Reseller users now have a quota option in Resources tab This is the quota that a reseller can share between all itsdomains

22 Upgrade 35

Modoboa Documentation Release 1100

There are two quotas for a domain in the new version

1 Quota amp

2 Default mailbox quota

[1] Quota quota shared between mailboxes This quota is shared between all the mailboxes of this domain This valuecannot exceed resellerrsquos quota and hence cannot be 0(unlimited) if reseller has finite quota

[2] Default mailbox quota default quota applied to mailboxes This quota is the default quota applied to new mail-boxes This value cannot exceed Quota[1] and hence cannot be 0(unlimited) if Quota[1] is finite

161

First of all update postfix map files as follows

gt python managepy generate_postfix_maps --destdir ltpathgt --force-overwrite

Then modify postfixrsquos configuration as follows

smtpd_sender_login_maps =ltdrivergtltpathgtsql-sender-login-mailboxescfltdrivergtltpathgtsql-sender-login-aliasescfltdrivergtltpathgtsql-sender-login-mailboxes-extracf

Replace ltdrivergt and ltpathgt by your values

Finally reload postfix

This release also deprecates some internal functions As a result several extensions has been updated to maintain thecompatibility If you enabled the notification service yoursquoll find the list of available updates directly in your Modoboaconsole

For the others here is the list

Name Versionmodoboa-amavis 1010modoboa-postfix-autoreply 117modoboa-radicale 105modoboa-stats 109

Command line shortcut

$ pip install modoboa-amavis==1010$ pip install modoboa-postfix-autoreply==117$ pip install modoboa-radicale==105$ pip install modoboa-stats==109

160

Warning You have to upgrade extensions due to coreUser model attribute change (usergroup to userrole) Oth-erwise you will have an internal error after upgrade In particular modoboa-amavisd modoboa-stats modoboa-postfix-autoreply are concerned

36 Chapter 2 Table of contents

Modoboa Documentation Release 1100

An interesting feature brougth by this version is the capability to make different checks about MX records Forexample Modoboa can query main DNSBL providers for every defined domain With this you will quickly know ifone the domains you manage is listed or not To activate it add the following line to your crontab

30 ltoptional_virtualenv_pathgtpython ltmodoboa_instance_dirgtmanagepy modorarr˓check_mx

The communication with Modoboa public API has been reworked Instead of sending direct synchronous queries (forexample to check new versions) a cron job has been added To activate it add the following line to your crontab

0 ltoptional_virtualenv_pathgtpython ltmodoboa_instance_dirgtmanagepyrarr˓communicate_with_public_api

Please also note that public API now uses TLS so you must update your configuration as follows

MODOBOA_API_URL = httpsapimodoboaorg1

Finally it is now possible to declare additional sender addresses on a per-account basis You need to update your postfixconfiguration in order to use this functionality Just edit the maincf file and change the following parameter

smtpd_sender_login_maps =ltdrivergtetcpostfixsql-sender-login-mailboxescfltdrivergtetcpostfixsql-sender-login-aliasescfltdrivergtetcpostfixsql-sender-login-mailboxes-extracf

150

The API has been greatly improved and a documentation is now available To enable it addrest_framework_swagger to the INSTALLED_APPS variable in settingspy as follows

INSTALLED_APPS = (djangocontribauthdjangocontribcontenttypesdjangocontribsessionsdjangocontribmessagesdjangocontribsitesdjangocontribstaticfilesreversionrest_frameworkauthtokenrest_framework_swagger

)

Then add the following content into settingspy just after the REST_FRAMEWORK variable

SWAGGER_SETTINGS = is_authenticated Falseapi_version 10exclude_namespaces []info

contact contactmodoboacomdescription (Modoboa API requires a valid token)title Modoboa API

Yoursquore done The documentation is now available at the following address

22 Upgrade 37

Modoboa Documentation Release 1100

httpltyour instance addressgtdocsapi

Finally if you find a TEMPLATE_CONTEXT_PROCESSORS variable in your settingspy file make sure it lookslike this

TEMPLATE_CONTEXT_PROCESSORS = global_settingsTEMPLATE_CONTEXT_PROCESSORS + [modoboacorecontext_processorstop_notifications

]

140

Warning Please make sure to use Modoboa 135 with an up-to-date database before an upgrade to 140

Warning Do not follow the regular upgrade procedure for this version

Some extension have been moved back into the main repository The main reason for that is that using Modoboawithout them doesnrsquot make sense

First of all you must rename the following applications listed inside the MODOBOA_APPS variable

Old name New namemodoboa_admin modoboaadminmodoboa_admin_limits modoboalimitsmodoboa_admin_relaydomains modoboarelaydomains

Then apply the following steps

1 Uninstall old extensions

$ pip uninstall modoboa-admin modoboa-admin-limits modoboa-admin-relaydomains

2 Install all extension updates using pip (check the Modoboa gt Information page)

3 Manually migrate database

$ cd ltinstance_dirgt$ python managepy migrate auth$ python managepy migrate admin 0001 --fake$ python managepy migrate admin$ python managepy migrate limits 0001 --fake$ python managepy migrate relaydomains 0001 --fake$ python managepy migrate

4 Finally update static files

$ python managepy collectstatic

This version also introduces a REST API To enable it

1 Add rest_frameworkauthtoken to the INSTALLED_APPS variable

2 Add the following configuration inside settingspy

38 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Rest framework settings

REST_FRAMEWORK = DEFAULT_AUTHENTICATION_CLASSES (

rest_frameworkauthenticationTokenAuthentication)DEFAULT_PERMISSION_CLASSES (

rest_frameworkpermissionsIsAuthenticated)

3 Run the following command

$ python managepy migrate

135

To enhance security Modoboa now checks the strength of user passwords lthttpsgithubcomdstufftdjango-passwordsgt_

To use this feature add the following configuration into the settingspy file

django-passwords

PASSWORD_MIN_LENGTH = 8

PASSWORD_COMPLEXITY = UPPER 1LOWER 1DIGITS 1

132

Modoboa now uses the atomic requests mode to preserve database consistency (reference)

To enable it update the DATABASES variable in settingspy as follows

DATABASES = default

stuff beforeATOMIC_REQUESTS True

amavis

stuff beforeATOMIC_REQUESTS True

130

This release does not bring awesome new features but it is a necessary bridge to the future of Modoboa All extensionsnow have their own git repository and the deploy process has been updated to reflect this change

22 Upgrade 39

Modoboa Documentation Release 1100

Another important update is the use of Django 17 Besides its new features the migration system has been reworkedand is now more robust than before

Before we begin with the procedure here is a table showing old extension names and their new name

Old name New package name New module namemodoboaextensionsadmin modoboa-admin modoboa_adminmodoboaextensionslimits modoboa-admin-limits modoboa_admin_limitsmodoboaextensionspostfix_autoreply modoboa-postfix-autoreply modoboa_postfix_autoreplymodoboaextensionspostfix_relay_domains modoboa-admin-relaydomains modoboa_admin_relaydomainsmodoboaextensionsradicale modoboa-radicale modoboa_radicalemodoboaextensionssievefilters modoboa-sievefilters modoboa_sievefiltersmodoboaextensionsstats modoboa-stats modoboa_statsmodoboaextensionswebmail modoboa-webmail modoboa_webmail

Here are the required steps

1 Install the extensions using pip (look at the second column in the table above)

$ pip install ltthe extensions you wantgt

2 Remove south from INSTALLED_APPS

3 Rename old extension names inside MODOBOA_APPS (look at the third column in the table above)

4 Remove modoboalibmiddlewareExtControlMiddleware from MIDDLEWARE_CLASSES

5 Change DATABASE_ROUTERS to

DATABASE_ROUTERS = [modoboa_amavisdbrouterAmavisRouter]

6 Run the following commands

$ cd ltmodoboa_instance_dirgt$ python managepy migrate

7 Reply yes to the question

8 Run the following commands

$ python managepy load_initial_data$ python managepy collectstatic

9 The cleanup job has been renamed in Django so you have to modify your crontab entry

- 0 0 ltmodoboa_sitegtmanagepy cleanup+ 0 0 ltmodoboa_sitegtmanagepy clearsessions

120

A new notification service let administrators know about new Modoboa versions To activate it you need to updatethe TEMPLATE_CONTEXT_PROCESSORS variable like this

from djangoconf import global_settings

TEMPLATE_CONTEXT_PROCESSORS = global_settingsTEMPLATE_CONTEXT_PROCESSORS + (

(continues on next page)

40 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

modoboacorecontext_processorstop_notifications)

and to define the new MODOBOA_API_URL variable

MODOBOA_API_URL = httpapimodoboaorg1

The location of external static files has changed To use them add a new path to the STATICFILES_DIRS

Additional locations of static filesSTATICFILES_DIRS = (

Put strings here like homehtmlstatic or Cwwwdjangostatic Always use forward slashes even on Windows Dont forget to use absolute paths not relative pathsltpathtomodoboainstalldirgtbower_components

)

Run the following commands to define the hostname of your instance

$ cd ltmodoboa_instance_dirgt$ python managepy set_default_site lthostnamegt

If you plan to use the Radicale extension

1 Add modoboaextensionsradicale to the MODOBOA_APPS variable

2 Run the following commands

$ cd ltmodoboa_instance_dirgt$ python managepy syncdb

Warning You also have to note that the sitestatic directory has moved from ltpath to your sitesdirgt to ltmodoboas root urlgt (itrsquos probably the parent directory) You have to adapt your web serverconfiguration to reflect this change

23 Configuration

231 Online parameters

Modoboa provides online panels to modify internal parameters There are two available levels

bull Application level global parameters define how the application behaves Available at Modoboa gt Parameters

bull User level per user customization Available at User gt Settings gt Preferences

Regardless level parameters are displayed using tabs each tab corresponding to one application

General parameters

The admin application exposes several parameters they are presented below

23 Configuration 41

Modoboa Documentation Release 1100

Name Tab Description Default valueAuthentication type General The backend used for au-

thenticationLocal

Default password scheme General Scheme used to cryptmailbox passwords

crypt

Rounds General Number of rounds (onlyused by sha256cryptand sha512crypt) Mustbe between 1000 and999999999 inclusive

70000

Secret key General A key used to encryptusersrsquo password in ses-sions

random value

Sender address General Email address used tosend notifications

Enable communication General Enable communicationwith Modoboa public API

yes

Check new versions General Automatically checks if anewer version is available

yes

Send statistics General Send statistics to Mod-oboa public API (countersand used extensions)

yes

Top notifications check in-terval

General Interval between two topnotification checks (inseconds)

30

Maximum log record age General The maximum age in daysof a log record

365

Items per page General Number of displayeditems per page

30

Default top redirection General The default redirectionused when no applicationis specified

userprefs

Enable MX checks Admin Check that every domainhas a valid MX record

yes

Valid MXs Admin A list of IP or networkaddress every MX shouldmatch A warning will besent if a record does notrespect this it

Enable DNSBL checks Admin Check every domainagainst major DNSBLproviders

yes

DKIM keys storage direc-tory

AdminPath to a directory where DKIM

generated keys willbe stored

Default DKIM key length Admin The default size (in bits)for new keys

2048

Handle mailboxes onfilesystem

Admin Rename or remove mail-boxes on the filesystemwhen they get renamed orremoved within Modoboa

no

Mailboxes owner Admin The UNIX account whoowns mailboxes on thefilesystem

vmail

Default domain quota Admin Default quota (in MB) ap-plied to freshly createddomains with no valuespecified A value of 0means no quota

0

Automatic accountremoval

Admin When a mailbox is re-moved also remove theassociated account

no

Automatic do-mainmailbox creation

Admin Create a domain and amailbox when an accountis automatically created

yes

42 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Note If you are not familiar with virtual domain hosting you should take a look at postfixrsquos documentation ThisHow to also contains useful information

Note A random secret key will be generated each time the Parameters page is refreshed and until you save parametersat least once

Note Specific LDAP parameters are also available see LDAP authentication

232 Media files

Modoboa uses a specific directory to upload files (ie when the webmail is in use) or to create ones (ex graphical statis-tics) This directory is named media and is located inside modoboarsquos installation directory (called modoboa_sitein this documentation)

To work properly the system user which runs modoboa (www-data apache whatever) must have write access tothis directory

233 Customization

Custom logo

You have the possibility to use a custom logo instead of the default one on the login page

To do so open the settingspy file and add a MODOBOA_CUSTOM_LOGO variable This variable must containthe relative URL of your logo under MEDIA_URL For example

MODOBOA_CUSTOM_LOGO = ospathjoin(MEDIA_URL custom_logopng)

Then copy your logo file into the directory indicated by MEDIA_ROOT

234 Host configuration

Note This section is only relevant when Modoboa handles mailboxes renaming and removal from the filesystem

To manipulate mailboxes on the filesystem you must allow the user who runs Modoboa to execute commands as theuser who owns mailboxes

To do so edit the etcsudoers file and add the following inside

ltuser_that_runs_modoboagt ALL=(ltmailboxes ownergt) NOPASSWD ALL

Replace values between ltgt by the ones you use

23 Configuration 43

Modoboa Documentation Release 1100

235 Time zone and language

Modoboa is available in many languages

To specify the default language to use edit the settingspy file and modify the LANGUAGE_CODE variable

LANGUAGE_CODE = fr or en for english etc

Note Each user has the possibility to define the language he prefers

In the same configuration file specify the timezone to use by modifying the TIME_ZONE variable For example

TIME_ZONE = EuropeParis

236 Sessions management

Modoboa uses Djangorsquos session framework to store per-user information

Few parameters need to be set in the settingspy configuration file to make Modoboa behave as expected

SESSION_EXPIRE_AT_BROWSER_CLOSE = False Default value

This parameter is optional but you must ensure it is set to False (the default value)

The default configuration file provided by the modoboa-adminpy command is properly configured

237 Logging authentication

To trace login attempts to the web interface Modoboa uses python SysLogHandler so you can see them in your syslogauthentication log file (varlogauthlog in most cases)

Depending on your configuration you may have to edit the settingspy file and add lsquoaddressrsquo lsquodevlogrsquo to thelogging section

syslog-auth class logginghandlersSysLogHandlerfacility SysLogHandlerLOG_AUTHaddress devlogformatter syslog

238 External authentication

LDAP

Modoboa supports external LDAP authentication using the following extra components

bull Python LDAP client

bull Django LDAP authentication backend

If you want to use this feature you must first install those components

44 Chapter 2 Table of contents

Modoboa Documentation Release 1100

$ pip install python-ldap django-auth-ldap

Then all you have to do is to modify the settingspy file Add a new authentication backend to the AUTHENTI-CATION_BACKENDS variable like this

AUTHENTICATION_BACKENDS = (modoboalibauthbackendsLDAPBackend modoboalibauthbackendsLDAPSecondaryBackend Useful for a fallback

rarr˓mechanismdjangocontribauthbackendsModelBackend

)

Finally go to Modoboa gt Parameters gt General and set Authentication type to LDAP

From there new parameters will appear to let you configure the way Modoboa should connect to your LDAP serverThey are described just below

Name Description De-faultvalue

Server address The IP address of the DNS name of the LDAP server local-host

Server port The TCP port number used by the LDAP server 389Use a secureconnection

Use an SSLTLS connection to access the LDAP server no

Authenticationmethod

Choose the authentication method to use Directbind

User DN tem-plate (directbind mode)

The template used to construct a userrsquos DN It should contain one placeholder (ie(user)s)

Bind BN The distinguished name to use when binding to the LDAP server Leave empty for ananonymous bind

Bind password The password to use when binding to the LDAP server (with lsquoBind DNrsquo)Search base The distinguished name of the search baseSearch filter An optional filter string (eg lsquo(objectClass=person)rsquo) In order to be valid it must be

enclosed in parentheses(mail=(user)s)

Passwordattribute

The attribute used to store user passwords user-Pass-word

Active Direc-tory

Tell if the LDAP server is an Active Directory one no

Administratorgroups

Members of those LDAP Posix groups will be created ad domain administrators Uselsquorsquo characters to separate groups

Group type The type of group used by your LDAP directory Posix-Group

Groups searchbase

The distinguished name of the search base used to find groups

Do-mainmailboxcreation

Automatically create a domain and a mailbox when a new user is created just after thefirst successful authentication You will generally want to disable this feature whenthe relay domains extension is in use

yes

If you need additional parameters you will find a detailed documentation here

Once the authentication is properly configured the users defined in your LDAP directory will be able to connect to

23 Configuration 45

Modoboa Documentation Release 1100

Modoboa the associated domain and mailboxes will be automatically created if needed

The first time a user connects to Modoboa a local account is created if the LDAP username is a valid email addressBy default this account belongs to the SimpleUsers group and it has a mailbox

To automatically create domain administrators you can use the Administrator groups setting If a LDAP user belongsto one the listed groups its local account will belong to the DomainAdmins group In this case the username is notnecessarily an email address

Users will also be able to update their LDAP password directly from Modoboa

Note Modoboa doesnrsquot provide any synchronization mechanism once a user is registered into the database Anymodification done from the directory to a user account will not be reported to Modoboa (an email address change forexample) Currently the only solution is to manually delete the Modoboa record it will be recreated on the next userlogin

SMTP

It is possible to use an existing SMTP server as an authentication source To enable this feature edit the settingspy file and change the following setting

AUTHENTICATION_BACKENDS = (modoboalibauthbackendsSMTPBackenddjangocontribauthbackendsModelBackend

)

SMTP server location can be customized using the following settings

AUTH_SMTP_SERVER_ADDRESS = localhostAUTH_SMTP_SERVER_PORT = 25AUTH_SMTP_SECURED_MODE = None ssl or starttls are accepted

239 LDAP synchronization

Modoboa can synchronize accounts with an LDAP directory (tested with OpenLDAP) but this feature is not enabledby default To activate it add modoboaldapsync to MODOBOA_APPS in the settingspy file

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboaldapsync

)

and enable it from the admin panel

46 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning Make sure to install additional requirements otherwise it wonrsquot work

The following parameters are available and must be filled

Name Description Defaultvalue

Enable LDAP synchro-nization

Control LDAP synchronization state no

Bind DN The DN of a user with write permission to createupdate accountsBind password The associated passwordAccount DN template The template used to build account DNs (must contain a (user)s

placeholder

2310 Database maintenance

Cleaning the logs table

Modoboa logs administrator specific actions into the database A clean-up script is provided to automatically removeoldest records The maximum log record age can be configured through the online panel

To use it you can setup a cron job to run every night

0 0 ltmodoboa_sitegtmanagepy cleanlogs Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy cleanlogs

Cleaning the session table

Django does not provide automatic purging Therefore itrsquos your job to purge expired sessions on a regular basis

Django provides a sample clean-up script django-adminpy clearsessions That script deletes any sessionin the session table whose expire_date is in the past

For example you could setup a cron job to run this script every night

0 0 ltmodoboa_sitegtmanagepy clearsessions Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy clearsessions

Cleaning inactive accounts

Thanks to Last-login tracking it is now possible to monitor inactive accounts An account is considered inactive if nologin has been recorded for the last 30 days (this value can be changed through the admin panel)

A management command is available to disable or delete inactive accounts For example you could setup a cron jobto run it every night

23 Configuration 47

Modoboa Documentation Release 1100

0 0 ltmodoboa_sitegtmanagepy clean_inactive_accounts Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy clean_inactive_rarr˓accounts

The default behaviour is to disable accounts You can delete them using the --delete option

24 Moving to Modoboa

You have an existing platform and yoursquod like to move to Modoboa the following tools could help you

241 From postfixadmin

A dedicated command allows you to convert an existing postfixadmin database to a Modoboa one Consult the docu-mentation to know more about the process

242 Using CSV files

Modoboa allows you to import any object (domain domain alias mailbox and alias) using a simple CSV file encodedusing UTF8 Each line corresponds to a single object and must respect one of the following format

domain ltname stringgt ltquota integergt ltdefault mailbox quota integergt ltenabledrarr˓booleangtdomainalias ltname stringgt lttargeted domain stringgt ltenabled booleangtrelaydomain ltname stringgt lttarget host stringgt lttarget port integergt ltservicerarr˓stringgt ltenabled booleangt ltverify recipients booleangtaccount ltloginname stringgt ltpassword stringgt ltfirst name stringgt ltlast namerarr˓stringgt ltenabled booleangt ltgroup stringgt ltaddress stringgt ltquota integergt [rarr˓ltdomain stringgt ]alias ltaddress stringgt ltenabled booleangt ltrecipient stringgt

Boolean fields accept the following values true 1 yes y (case insensitive) Any other value will be evaluated asfalse

Warning The order does matter Objects are created sequencially so a domain must be created before itsmailboxes and aliases and a mailbox must created before its alias(es)

To actually import such a file

gt sudo -u ltmodoboa_usergt -igt source ltvirtualenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy modo import ltyour filegt

Available options can be listed using the following command

gt python managepy modo import -h

48 Chapter 2 Table of contents

Modoboa Documentation Release 1100

25 REST API

To ease the integration with external sources (software or other) Modoboa provides a REST API

Every installed instance comes with a ready-to-use API and a documentation You will find them using the followingurl patterns

bull API httplthostnamegtapiv1

bull Documentation httplthostnamegtdocsapi

An example of this documentation is available on the official demo

Using this API requires an authentication and for now only a token based authentication is supported To get a validtoken log-in to your instance with a super administrator go to Settings gt API and activate the API access Press theUpdate button and wait until the page is reloaded the token will be displayed

To make valid API calls every requests you send must embed this token within an Authorization HTTP header likethis

Authorization Token ltYOUR_TOKENgt

and the content type of those requests must be applicationjson

26 How to contribute

Contributions are always welcome If you want to submit a patch please respect the following rules

bull Open a pull request on the appropriate repository

bull Respect PEP8

bull Document your patch and respect PEP 257

bull Add unit tests and make sure the global coverage does not decrease

If all those steps are validated your contribution will generally be integrated

261 Table of contents

25 REST API 49

Modoboa Documentation Release 1100

Useful tips

You would like to work on Modoboa but you donrsquot know where to start Yoursquore at the right place Browse this pageto learn useful tips

Docker

A docker image is available for developers To use it you must install docker and docker-compose first

Then just run the following command

$ docker-compose up

It will start the docker environment and make a Modoboa instance available at httplocalhost8000

If you donrsquot want to use docker or need a more complex development setup go to the next section

Prepare a virtual environment

A virtual environment is a good way to setup a development environment on your machine

To do so run the following commands

$ python3 -m venv ltpathgt$ source ltpathgtbinactivate$ git clone httpsgithubcommodoboamodoboagit$ cd modoboa$ python setuppy develop$ pip install -r dev-requirementstxt

The develop command creates a symbolic link to your local copy so any modification you make will be automati-cally available in your environment no need to copy them

Deploy an instance for development

Warning Make sure to create a database before running this step The format of the database url is also describedin this page

Now that you have a running environment yoursquore ready to deploy a test instance

$ cd ltpathgt$ modoboa-adminpy deploy --dburl defaultltdatabase urlgt --domain localhost --develrarr˓instance$ python managepy runserver

Yoursquore ready to go You should be able to access Modoboa at httplocalhost8000 usingadminpassword as credentials

Manage static files

Modoboa uses bower (thanks to django-bower) to manage its CSS and javascript dependencies

50 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Those dependencies are listed in a file called dev_settingspy located inside the ltpath_to_local_copygtmodoboacore directory

If you want to add a new dependency just complete the BOWER_INSTALLED_APPS parameter and run the followingcommand

$ python managepy bower install

It will download and store the required files into the ltpath_to_local_copygtmodoboabower_components directory

Test your modifications

If you deployed a specific instance for your development needs you can run the tests suite as follows

gt python managepy test modoboacore modoboalib modoboaadmin modoboalimits modoboararr˓relaydomains

Otherwise you can run the tests suite from the repository using tox

Start a basic Modoboa instance

From the repository run the following command to launch a simple instance with a few fixtures

gt tox -e serve

You can use adminpassword to log in

Build the documentation

If you need to modify the documenation and want to see the result you can build it as follows

gt tox -e docgt firefox toxdoctmphtmlindexhtml

FAQ

bower command is missing in managepy

bower command is missing in managepy if you donrsquot use the --devel option of the modoboa-adminpydeploy command

To fix it regenerate your instance or update your settingspy file manually Look at devmode in httpsgithubcomtonioomodoboablobmastermodoboacorecommandstemplatessettingspytpl

Create a new plugin

Introduction

Modoboa offers a plugin API to expand its capabilities The current implementation provides the following possibili-ties

26 How to contribute 51

Modoboa Documentation Release 1100

bull Expand navigation by adding entry points to your plugin inside the GUI

bull Access and modify administrative objects (domains mailboxes etc)

bull Register callback actions for specific events

Plugins are nothing more than Django applications with an extra piece of code that integrates them into Modoboa Themodo_extensionpy file will contain a complete description of the plugin

bull Admin and user parameters

bull Custom menu entries

The communication between both applications is provided by Django signals

The following subsections describe the plugin architecture and explain how you can create your own

The required glue

To create a new plugin just start a new django application like this (into Modoboarsquos directory)

$ python managepy startapp

Then you need to register this application using the provided API Just copypaste the following example into themodo_extensionpy file of the future extension

from modoboacoreextensions import ModoExtension exts_pool

class MyExtension(ModoExtension)My custom Modoboa extension

name = myextlabel = My Extensionversion = 01description = A descriptionurl = myext_root_location optional name is used if not defined

def load(self)This method is called when Modoboa loads available and activated plugins

Declare parameters and register events herepass

def load_initial_data(self)Optional provide initial data for your extension herepass

exts_poolregister_extension(MyExtension)

Once done simply add your extensionrsquos module name to the MODOBOA_APPS variable located inside settingspy Finally run the following commands

$ python managepy migrate$ python managepy load_initial_data$ python managepy collectstatic

52 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Parameters

A plugin can declare its own parameters There are two levels available

bull lsquoGlobalrsquo parameters used to configure the plugin editable inside the Admin gt Settings gt Parameters page

bull lsquoUserrsquo parameters per-user parameters (or preferences) editable inside the Options gt Preferences page

Playing with parameters

Parameters are defined using Django forms and Modoboa adds two special forms you can inherit depending on thelevel of parameter(s) you want to add

bull modoboaparametersformsAdminParametersForm for general parameters

bull modoboaparametersformsUserParametersForm for user parameters

To register new parameters add the following line into the load method of your plugin class

from modoboaparameters import tools as param_toolsparam_toolsregistryadd(

LEVEL YourForm ugettext_lazy(Title))

Replace LEVEL by global or user

Custom role permissions

Modoboa uses Djangorsquos internal permission system Administrative roles are nothing more than groups (Groupinstances)

An extension can add new permissions to a group by listening to the extra_role_permissions signal Here isan example

from djangodispatch import receiverfrom modoboacore import signals as core_signals

PERMISSIONS = Resellers [

(relaydomains relaydomain add_relaydomain)(relaydomains relaydomain change_relaydomain)(relaydomains relaydomain delete_relaydomain)(relaydomains service add_service)(relaydomains service change_service)(relaydomains service delete_service)

]

receiver(core_signalsextra_role_permissions)def extra_role_permissions(sender role kwargs)

Add permissions to the Resellers groupreturn constantsPERMISSIONSget(role [])

Extending admin forms

The forms used to edit objects (account domain etc) through the admin panel are composed of tabs You can extendthem (ie add new tabs) in a pretty easy way thanks to custom signals

26 How to contribute 53

Modoboa Documentation Release 1100

Account

To add a new tab to the account edition form define new listeners (handlers) for the following signals

bull modoboaadminsignalsextra_account_forms

bull modoboaadminsignalsget_account_form_instances

bull modoboaadminsignalscheck_extra_account_form (optional)

Example

from djangodispatch import receiverfrom modoboaadmin import signals as admin_signals

receiver(admin_signalsextra_account_forms)def extra_account_form(sender user account kwargs)

return [id tabid title Title cls MyFormClass

]

receiver(admin_signalsget_account_form_instances)def fill_my_tab(sender user account kwargs)

return id my_instance

Domain

To add a new tab to the domain edition form define new listeners (handlers) for the following signals

bull modoboaadminsignalsextra_domain_forms

bull modoboaadminsignalsget_domain_form_instances

Example

from djangodispatch import receiverfrom modoboaadmin import signals as admin_signals

receiver(admin_signalsextra_domain_forms)def extra_account_form(sender user domain kwargs)

return [id tabid title Title cls MyFormClass

]

receiver(admin_signalsget_domain_form_instances)def fill_my_tab(sender user domain kwargs)

return id my_instance

27 Contributors

bull Antidot

bull Bearstech

bull CAP-REL

54 Chapter 2 Table of contents

Modoboa Documentation Release 1100

bull Dalnix

27 Contributors 55

  • Overview
  • Table of contents
Page 22: Modoboa Documentation

Modoboa Documentation Release 1100

service dict If dict proxy is used mail processes should have access to its socket For example mode=0660 group=vmail and global mail_access_groups=vmailunix_listener dict mode = 0600user = ltuser owning mailboxesgtgroup =

Inside confd20-imapconf activate the imap_quota plugin

protocol imap

mail_plugins = $mail_plugins imap_quota

Inside dovecotconf activate the quota SQL dictionary backend

dict quota = ltdrivergtetcdovecotdovecot-dict-sqlconfext

Inside confd90-quotaconf activate the quota dictionary backend

plugin quota = dictUser quotaproxyquota

It will tell Dovecot to keep quota usage in the SQL dictionary

Finally edit the dovecot-dict-sqlconfext file and put the following content inside

connect = host=ltdb hostgt dbname=ltdb namegt user=ltdb usergt password=ltpasswordgt SQLite users connect = pathtothedatabasedb

map pattern = privquotastoragetable = admin_quotausername_field = usernamevalue_field = bytes

map

pattern = privquotamessagestable = admin_quotausername_field = usernamevalue_field = messages

PostgreSQL users

21 Installation 19

Modoboa Documentation Release 1100

Database schema update

The admin_quota table is created by Django but unfortunately it doesnrsquot support DEFAULT constraints (it onlysimulates them when the ORM is used) As PostgreSQL is a bit strict about constraint violations you must executethe following query manually

db=gt ALTER TABLE admin_quota ALTER COLUMN bytes SET DEFAULT 0db=gt ALTER TABLE admin_quota ALTER COLUMN messages SET DEFAULT 0

Trigger

As indicated on Dovecotrsquos wiki you need a trigger to properly update the quota

A working copy of this trigger is available on Github

Download this file and copy it on the server running postgres Then execute the following commands

$ su - postgres$ psql [modoboa database] lt pathtomodoboa_postgres_triggersql$ exit

Replace [modoboa database] by the appropriate value

Forcing recalculation

For existing installations Dovecot (gt 2) offers a command to recalculate the current quota usages For example if youwant to update all usages run the following command

$ doveadm quota recalc -A

Be carefull it can take a while to execute

ManageSieveSieve

Modoboa lets users define filtering rules from the web interface To do so it requires ManageSieve to be activated onyour server

Inside confd20-managesieveconf make sure the following lines are uncommented

protocols = $protocols sieve

service managesieve-login

service managesieve

protocol sieve

20 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Messages filtering using Sieve is done by the LDA

Inside confd15-ldaconf activate the sieve plugin like this

protocol lda Space separated list of plugins to load (default is global mail_plugins)mail_plugins = $mail_plugins sieve

Finally configure the sieve plugin by editing the confd90-sieveconf file Put the follwing caontent inside

plugin Location of the active script When ManageSieve is used this is actually a symlink pointing to the active script in the sieve storage directorysieve = ~dovecotsieve

The path to the directory where the personal Sieve scripts are stored For ManageSieve this is where the uploaded scripts are storedsieve_dir = ~sieve

Restart Dovecot

Now you can go to the Postfix section to finish the installation

Last-login tracking

To update the last_login attribute of an account after a succesful IMAP or POP3 login you can configure apost-login script

Open confd10-masterconf add the following configuration (imap and pop3 services are already definedyou just need to update them)

service imap executable = imap postlogin

service pop3 executable = pop3 postlogin

service postlogin executable = script-login usrlocalbinpostloginshuser = modoboaunix_listener postlogin

Then you must create a script named usrlocalbinpostloginsh According to your database enginethe content will differ

PostgreSQL

21 Installation 21

Modoboa Documentation Release 1100

binsh

psql -c UPDATE core_user SET last_login=now() WHERE username=$USER gt devnull

exec $

MySQL

binsh

DBNAME=XXXDBUSER=XXXDBPASSWORD=XXX

echo UPDATE core_user SET last_login=now() WHERE username=$USER | mysql -urarr˓$DBUSER -p$DBPASSWORD $DBNAME

exec $

Postfix

This section gives an example about building a simple virtual hosting configuration with Postfix Refer to the officialdocumentation for more explanation

Map files

You first need to create configuration files (or map files) that will be used by Postfix to lookup into Modoboa tables

To automaticaly generate the requested map files and store them in a directory run the following command

gt cd ltmodoboa_instance_pathgtgt python managepy generate_postfix_maps --destdir ltdirectorygt

ltdirectorygt is the directory where the files will be stored Answer the few questions and yoursquore done

Configuration

Use the following configuration in the etcpostfixmaincf file (this is just one possible configuration)

Stuff beforevirtual_transport = lmtpunixprivatedovecot-lmtp

virtual_mailbox_domains = ltdrivergtetcpostfixsql-domainscfvirtual_alias_domains = ltdrivergtetcpostfixsql-domain-aliasescfvirtual_alias_maps = ltdrivergtetcpostfixsql-aliasescf

relay_domains = ltdrivergtetcpostfixsql-relaydomainscftransport_maps =

ltdrivergtetcpostfixsql-transportcfltdrivergtetcpostfixsql-spliteddomains-transportcf

(continues on next page)

22 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

smtpd_recipient_restrictions = check_recipient_access

ltdrivergtetcpostfixsql-maintaincfltdrivergtetcpostfixsql-relay-recipient-verificationcf

permit_mynetworksreject_unauth_destinationreject_unverified_recipient

smtpd_sender_login_maps = ltdrivergtetcpostfixsql-sender-login-mapcf

smtpd_sender_restrictions =reject_sender_login_mismatch

Stuff after

Replace ltdrivergt by the name of the database you use

Restart Postfix

Policy daemon

If you want to enable the built-in policy daemon add the following content to the etcpostfixmaincf file

smtpd_recipient_restrictions = check_policy_service inet1270019999

And reload postfix

Note The check_policy_service line must be placed before the permit_mynetworks one otherwise thedaemon wonrsquot be called

OpenDKIM

Modoboa can generate DKIM keys for the hosted domains but it wonrsquot sign or check messages To do that you needa dedicated software like OpenDKIM

Note The cron job in charge of creating DKIM keys must be run using the same user than OpenDKIM (ie opendkimin most cases)

Database

Since keys related information is stored in Modoboarsquos database you need to tell OpenDKIM how it can access it

First make sure to install the required additional packages on your system (libopendbx1- on debian baseddistributions or opendbx- on CentOS the complete name depends on your database engine)

Then insert the following SQL view into Modoboarsquos database

21 Installation 23

Modoboa Documentation Release 1100

PostgreSQL

CREATE OR REPLACE VIEW dkim AS (SELECT id name as domain_name dkim_private_key_path AS private_key_path

dkim_key_selector AS selectorFROM admin_domain WHERE enable_dkim

)

MySQLMariaDB

CREATE OR REPLACE VIEW dkim AS (SELECT id name as domain_name dkim_private_key_path AS private_key_path

dkim_key_selector AS selectorFROM admin_domain WHERE enable_dkim=1

)

Configuration

You should find OpenDKIMrsquos configuration file at etcopendkimconf

Add the following content to it

KeyTable dsnltdrivergtltusergtltpasswordgtltdb hostgtltdb namegttable=dkimrarr˓keycol=iddatacol=domain_nameselectorprivate_key_pathSigningTable dsnltdrivergtltusergtltpasswordgtltdb hostgtltdb namegttable=dkimrarr˓keycol=domain_namedatacol=idSocket inet12345localhost

Replace values between ltgt by yours Accepted values for driver are pgsql or mysql Make sure the user youspecify has read permission on the view created previously

If you run a debian based system make sure to adjust the following setting in the etcdefaultopendkim file

SOCKET=inet12345localhost

Eventually reload OpenDKIM

Postfix integration

Add the following lines to the etcpostfixmaincf file

smtpd_milters = inet12700112345non_smtpd_milters = inet12700112345milter_default_action = acceptmilter_content_timeout = 30s

and reload postfix

Extensions

Only few commands are needed to add a new extension to your setup

24 Chapter 2 Table of contents

Modoboa Documentation Release 1100

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install ltEXTENSIONgt==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Then restart your web server

22 Upgrade

221 Modoboa

Warning The new version you are going to install may need to modify your database Before you start makesure to backup everything

Most of the time upgrading your installation to a newer Modoboa version only requires a few actions In every caseyou will need to apply the general procedure first and then check if the version you are installing requires specificactions

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install modoboa==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Once done check if the version you are installing requires Specific instructions

Finally restart your web server

Sometimes you might need to upgrade postfix map files too To do so just run the generate_postfix_mapscommand on the same directory than the one used for installation (etcpostfix by default)

Make sure to use root privileges and run the following command

gt python managepy generate_postfix_maps --destdir ltdirectorygt

Then reload postfix

22 Upgrade 25

Modoboa Documentation Release 1100

222 Extensions

If a new version is available for an extension yoursquore using it is recommanded to install it Upgrading an extensions ispretty and the procedure is almost the same than the one used for Modoboa

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install ltEXTENSIONgt==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Finally restart your web server

It is a generic upgrade procedure which will be enough most of the time but it is generally a good idea to check theassociated documentation

223 Rebuild Virtual Environment

Sometimes when upgrading your Operating System (eg from Ubuntu 1704 to Ubuntu 1710) your virtual environmentrunning modoboa can get corrupted Your first response will be to panic but fear not The solution is in this document

First things first

Recover your database password

You will need to recover your database password (if using mysql or postgresql) You will find this in etcpostfixsql-aliasescf or any file with sql-cf in the etcpostfix directory

Make note of this as you will need it when reconfiguring modoboa

Reinstall Modoboa

Start out by backup up your modoboa settings file located in the modoboa instance directory (srvmodoboainstanceinstancesettingspy if you used the default installer configuration) This contains your currentconfiguration

Next you want to remove all current modoboa files

After doing this follow the manual installation instructions for Modoboa only as everything should be working prop-erly

After this completes simply restore your backed up settings file to srvinstanceinstancesettingspy(if you used installer default configuration) You will then need to reinstall your extensions

You can find which plugins you had in your settingspy file under the MODOBOA_APPS variable

Instructions to install extensions can also be found here

Once you have completed this step you will need to run the following commands

26 Chapter 2 Table of contents

Modoboa Documentation Release 1100

gt (env) $ cd ltinstance_dirgtgt (env) $ python managepy migrategt (env) $ python managepy collectstatic

You will then see a message similar to

You have requested to collect static files at the destinationlocation as specified in your settings

srvmodoboainstancesitestatic

This will overwrite existing filesAre you sure you want to do this

Type yes to continue or no to cancel

You will want to answer yes here then simply restart the uwsgi process with service uwsgi restart andyou should be up and running again

Simply log into your modoboa web panel and verify that your extensions and webmail box is working

224 Information

Rebuild instructions from httpshelppythonanywherecompagesRebuildingVirtualenvs

225 Specific instructions

1160

A new policy daemon has been added

Make sure to have a Redis instance running on your server

Add modoboapolicyd to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboapolicyd

)

Add the following settings to your settingspy file

REDIS_HOST = ltIP or hostname heregtREDIS_PORT = 6379REDIS_QUOTA_DB = 0REDIS_URL = redisformat(REDIS_HOST REDIS_PORT REDIS_QUOTA_DB)

Once done you can start the policy daemon using the following commands

22 Upgrade 27

Modoboa Documentation Release 1100

gt python managepy policy_daemon

Donrsquot forget to configure _policyd_config if you want to use this feature

The modoboa-stats plugin has been merged into the core

Add modoboamaillog to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboapolicydmodoboamaillog

)

And remove any reference to modoboa_stats in this same variable

1150

This version drops Python 2 support so donrsquot forget to update all the extensions you use

Warning If you upgrade an existing python 2 installation you will need to create a new Python 3 virtualenvironment You can remove the existing virtual environment and replace it by the new one so you wonrsquot have tomodify your configuration files

Add the following new setting

DISABLE_DASHBOARD_EXTERNAL_QUERIES = False

Reload uwsgigunicornapache depending on your setup

Finally Make sure to use root privileges and run the following command

gt python managepy generate_postfix_maps --destdir ltdirectorygt

Then reload postfix

1140

This release introduces an optional LDAP synchronization process If you want to use it please follow the dedicatedprocedure

1131

Upgrade postfix maps files as follows

28 Chapter 2 Table of contents

Modoboa Documentation Release 1100

gt python managepy generate_postfix_maps --destdir ltpathgt --force-overwrite

1130

Add modoboadnstools to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstools

)

Add the following new settings

CSRF_COOKIE_SECURE = TrueSESSION_COOKIE_SECURE = True

modoboa-postfix-autoreply 150

Edit the etcpostfixmaincf file and remove the sql-autoreplies-transportcf map from thetransport_maps if present Remove the corresponding proxy_read_maps entry if relevant

Reload postfix

1100

Warning Upgrade installed extensions BEFORE running check or migrate commands

Upgrade all your installed plugins to the following versions

Warning If you use the amavis plugin make sure to include its configuration as follows into settingspy

from modoboa_amavis import settings as modoboa_amavis_settingsmodoboa_amavis_settingsapply(globals())

22 Upgrade 29

Modoboa Documentation Release 1100

Name Versionmodoboa-amavis 120modoboa-contacts 050modoboa-dmarc 110modoboa-imap-migration 120modoboa-pdfcredentials 130modoboa-postfix-autoreply 140modoboa-radicale 120modoboa-sievefilters 140modoboa-stats 140modoboa-webmail 140

Edit the settingspy file and apply the following modifications

Add modoboatransport to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparameters

)

Replace the following line

MIDDLEWARE_CLASSES = (

by

MIDDLEWARE = (

Update postfix map files as follows

gt rm -f ltpathgtmodoboa-postfix-mapschkgt python managepy generate_postfix_maps --force --destdir ltpathgt

Then modify postfixrsquos configuration as follows

smtpd_sender_login_maps =ltdrivergtltpathgtsql-sender-login-mapcf

transport_maps =ltdrivergtltpathgtsql-transportcfltdrivergtltpathgtsql-spliteddomains-transportcf other map files

Replace ltdrivergt and ltpathgt by your values

If transport_maps contains sql-relaydomains-transportcf remove it

30 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning If you make use of postfixrsquos proxymap server you must also update the proxy_read_maps setting

Reload postfix

Add the following cron job in order to generate DKIM keys

Generate DKIM keys (they will belong to the user running this job)

root $PYTHON $INSTANCEmanagepy modorarr˓manage_dkim_keys

190

If you want to manage inactive accounts look at Cleaning inactive accounts

183

Edit the settingspy file and replace the following line

BASE_DIR = ospathdirname(ospathdirname(__file__))

by

BASE_DIR = ospathrealpath(ospathdirname(ospathdirname(__file__)))

180

Modoboa now relies on Djangorsquos builtin password validation system to validate user passwords instead ofdjango-passwords

Remove django-passwords from your system

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt pip uninstall django-passwords

Edit the settingspy file and remove the following content

django-passwords

PASSWORD_MIN_LENGTH = 8

PASSWORD_COMPLEXITY = UPPER 1LOWER 1DIGITS 1

Add the following lines

Password validation rulesAUTH_PASSWORD_VALIDATORS = [

NAME djangocontribauthpassword_validation

rarr˓UserAttributeSimilarityValidator (continues on next page)

22 Upgrade 31

Modoboa Documentation Release 1100

(continued from previous page)

NAME djangocontribauthpassword_validationMinimumLengthValidator

NAME djangocontribauthpassword_validationCommonPasswordValidator

NAME djangocontribauthpassword_validationNumericPasswordValidator

NAME modoboacorepassword_validationComplexityValidatorOPTIONS

upper 1lower 1digits 1specials 0

]

172

API documentation has evolved (because of the upgrade to Django Rest Framework 36) and CKeditor is now embed-ded by default (thanks to the django-ckeditor package) Some configuration changes are required

Edit your settingspy file and apply the following modifications

bull Update the INSTALLED_APPS variable as follows

INSTALLED_APPS = (djangocontribauthdjangocontribcontenttypesdjangocontribsessionsdjangocontribmessagesdjangocontribsitesdjangocontribstaticfilesreversionckeditorckeditor_uploaderrest_frameworkrest_frameworkauthtoken

)

bull Update the REST_FRAMEWORK variable as follows

REST_FRAMEWORK = DEFAULT_AUTHENTICATION_CLASSES (

rest_frameworkauthenticationTokenAuthenticationrest_frameworkauthenticationSessionAuthentication

)

bull Remove the SWAGGER_SETTINGS variable

bull Add the following content

32 Chapter 2 Table of contents

Modoboa Documentation Release 1100

CKeditor

CKEDITOR_UPLOAD_PATH = uploads

CKEDITOR_IMAGE_BACKEND = pillow

CKEDITOR_RESTRICT_BY_USER = True

CKEDITOR_BROWSE_SHOW_DIRS = True

CKEDITOR_ALLOW_NONIMAGE_FILES = False

CKEDITOR_CONFIGS = default

allowedContent Truetoolbar Modoboawidth Nonetoolbar_Modoboa [

[Bold Italic Underline][JustifyLeft JustifyCenter JustifyRight JustifyBlock][BidiLtr BidiRtl Language][NumberedList BulletedList - Outdent Indent][Undo Redo][Link Unlink Anchor - Smiley][TextColor BGColor - Source][Font FontSize][Image ][SpellChecker]

]

Donrsquot forget to run the following command

gt python managepy collectstatic

171

If you used 170 for a fresh installation please run the following commands

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy load_initial_data

170

This version requires Django gt= 110 so you need to make some modifications It also brings internal API changeswhich are not backward compatible so installed extensions must be upgraded too

First of all deactivate all installed extensions (edit the settingspy file and comment the corresponding lines inMODOBOA_APPS)

Edit the urlspy file of your local instance and replace its content by the following one

22 Upgrade 33

Modoboa Documentation Release 1100

from djangoconfurls import include url

urlpatterns = [url(r include(modoboaurls))

]

Edit the settingspy and apply the following changes

bull Add modoboaparameters to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboarelaydomainsmodoboalimitsmodoboaparameters Modoboa extensions here

)

bull Add modoboacoremiddlewareLocalConfigMiddleware to MIDDLEWARE_CLASSES

MIDDLEWARE_CLASSES = (djangocontribsessionsmiddlewareSessionMiddlewaredjangomiddlewarecommonCommonMiddlewaredjangomiddlewarecsrfCsrfViewMiddlewaredjangocontribauthmiddlewareAuthenticationMiddlewaredjangocontribmessagesmiddlewareMessageMiddlewaredjangomiddlewarelocaleLocaleMiddlewaredjangomiddlewareclickjackingXFrameOptionsMiddlewaremodoboacoremiddlewareLocalConfigMiddlewaremodoboalibmiddlewareAjaxLoginRedirectmodoboalibmiddlewareCommonExceptionCatchermodoboalibmiddlewareRequestCatcherMiddleware

)

bull Modoboa used to provide a custom authentication backend (modoboalibauthbackendsSimpleBackend) but it has been removed Replace it as follows

AUTHENTICATION_BACKENDS = ( Other backends beforedjangocontribauthbackendsModelBackend

)

bull Remove TEMPLATE_CONTEXT_PROCESSORS and replace it by

TEMPLATES = [

BACKEND djangotemplatebackendsdjangoDjangoTemplatesDIRS []APP_DIRS TrueOPTIONS

context_processors [djangotemplatecontext_processorsdebugdjangotemplatecontext_processorsrequestdjangocontribauthcontext_processorsauth

(continues on next page)

34 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

djangotemplatecontext_processorsi18ndjangotemplatecontext_processorsmediadjangotemplatecontext_processorsstaticdjangotemplatecontext_processorstzdjangocontribmessagescontext_processorsmessagesmodoboacorecontext_processorstop_notifications

]debug False

]

Run the following commands (load virtualenv if you use one)

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstatic

Finally upgrade your extensions and reactivate them

Name Versionmodoboa-amavis 110modoboa-dmarc 100modoboa-imap-migration 110modoboa-pdfcredentials 110modoboa-postfix-autoreply 120modoboa-radicale 110modoboa-sievefilters 110modoboa-stats 110modoboa-webmail 110

Command line shortcuts

$ pip install modoboa-amavis==110$ pip install modoboa-dmarc==100$ pip install modoboa-imap-migration==110$ pip install modoboa-pdfcredentials==110$ pip install modoboa-postfix-autoreply==120$ pip install modoboa-radicale==110$ pip install modoboa-sievefilters==110$ pip install modoboa-stats==110$ pip install modoboa-webmail==110

And please make sure you use the latest version of the django-versionfield2 package

$ pip install -U django-versionfield2

Notes about quota changes and resellers

Reseller users now have a quota option in Resources tab This is the quota that a reseller can share between all itsdomains

22 Upgrade 35

Modoboa Documentation Release 1100

There are two quotas for a domain in the new version

1 Quota amp

2 Default mailbox quota

[1] Quota quota shared between mailboxes This quota is shared between all the mailboxes of this domain This valuecannot exceed resellerrsquos quota and hence cannot be 0(unlimited) if reseller has finite quota

[2] Default mailbox quota default quota applied to mailboxes This quota is the default quota applied to new mail-boxes This value cannot exceed Quota[1] and hence cannot be 0(unlimited) if Quota[1] is finite

161

First of all update postfix map files as follows

gt python managepy generate_postfix_maps --destdir ltpathgt --force-overwrite

Then modify postfixrsquos configuration as follows

smtpd_sender_login_maps =ltdrivergtltpathgtsql-sender-login-mailboxescfltdrivergtltpathgtsql-sender-login-aliasescfltdrivergtltpathgtsql-sender-login-mailboxes-extracf

Replace ltdrivergt and ltpathgt by your values

Finally reload postfix

This release also deprecates some internal functions As a result several extensions has been updated to maintain thecompatibility If you enabled the notification service yoursquoll find the list of available updates directly in your Modoboaconsole

For the others here is the list

Name Versionmodoboa-amavis 1010modoboa-postfix-autoreply 117modoboa-radicale 105modoboa-stats 109

Command line shortcut

$ pip install modoboa-amavis==1010$ pip install modoboa-postfix-autoreply==117$ pip install modoboa-radicale==105$ pip install modoboa-stats==109

160

Warning You have to upgrade extensions due to coreUser model attribute change (usergroup to userrole) Oth-erwise you will have an internal error after upgrade In particular modoboa-amavisd modoboa-stats modoboa-postfix-autoreply are concerned

36 Chapter 2 Table of contents

Modoboa Documentation Release 1100

An interesting feature brougth by this version is the capability to make different checks about MX records Forexample Modoboa can query main DNSBL providers for every defined domain With this you will quickly know ifone the domains you manage is listed or not To activate it add the following line to your crontab

30 ltoptional_virtualenv_pathgtpython ltmodoboa_instance_dirgtmanagepy modorarr˓check_mx

The communication with Modoboa public API has been reworked Instead of sending direct synchronous queries (forexample to check new versions) a cron job has been added To activate it add the following line to your crontab

0 ltoptional_virtualenv_pathgtpython ltmodoboa_instance_dirgtmanagepyrarr˓communicate_with_public_api

Please also note that public API now uses TLS so you must update your configuration as follows

MODOBOA_API_URL = httpsapimodoboaorg1

Finally it is now possible to declare additional sender addresses on a per-account basis You need to update your postfixconfiguration in order to use this functionality Just edit the maincf file and change the following parameter

smtpd_sender_login_maps =ltdrivergtetcpostfixsql-sender-login-mailboxescfltdrivergtetcpostfixsql-sender-login-aliasescfltdrivergtetcpostfixsql-sender-login-mailboxes-extracf

150

The API has been greatly improved and a documentation is now available To enable it addrest_framework_swagger to the INSTALLED_APPS variable in settingspy as follows

INSTALLED_APPS = (djangocontribauthdjangocontribcontenttypesdjangocontribsessionsdjangocontribmessagesdjangocontribsitesdjangocontribstaticfilesreversionrest_frameworkauthtokenrest_framework_swagger

)

Then add the following content into settingspy just after the REST_FRAMEWORK variable

SWAGGER_SETTINGS = is_authenticated Falseapi_version 10exclude_namespaces []info

contact contactmodoboacomdescription (Modoboa API requires a valid token)title Modoboa API

Yoursquore done The documentation is now available at the following address

22 Upgrade 37

Modoboa Documentation Release 1100

httpltyour instance addressgtdocsapi

Finally if you find a TEMPLATE_CONTEXT_PROCESSORS variable in your settingspy file make sure it lookslike this

TEMPLATE_CONTEXT_PROCESSORS = global_settingsTEMPLATE_CONTEXT_PROCESSORS + [modoboacorecontext_processorstop_notifications

]

140

Warning Please make sure to use Modoboa 135 with an up-to-date database before an upgrade to 140

Warning Do not follow the regular upgrade procedure for this version

Some extension have been moved back into the main repository The main reason for that is that using Modoboawithout them doesnrsquot make sense

First of all you must rename the following applications listed inside the MODOBOA_APPS variable

Old name New namemodoboa_admin modoboaadminmodoboa_admin_limits modoboalimitsmodoboa_admin_relaydomains modoboarelaydomains

Then apply the following steps

1 Uninstall old extensions

$ pip uninstall modoboa-admin modoboa-admin-limits modoboa-admin-relaydomains

2 Install all extension updates using pip (check the Modoboa gt Information page)

3 Manually migrate database

$ cd ltinstance_dirgt$ python managepy migrate auth$ python managepy migrate admin 0001 --fake$ python managepy migrate admin$ python managepy migrate limits 0001 --fake$ python managepy migrate relaydomains 0001 --fake$ python managepy migrate

4 Finally update static files

$ python managepy collectstatic

This version also introduces a REST API To enable it

1 Add rest_frameworkauthtoken to the INSTALLED_APPS variable

2 Add the following configuration inside settingspy

38 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Rest framework settings

REST_FRAMEWORK = DEFAULT_AUTHENTICATION_CLASSES (

rest_frameworkauthenticationTokenAuthentication)DEFAULT_PERMISSION_CLASSES (

rest_frameworkpermissionsIsAuthenticated)

3 Run the following command

$ python managepy migrate

135

To enhance security Modoboa now checks the strength of user passwords lthttpsgithubcomdstufftdjango-passwordsgt_

To use this feature add the following configuration into the settingspy file

django-passwords

PASSWORD_MIN_LENGTH = 8

PASSWORD_COMPLEXITY = UPPER 1LOWER 1DIGITS 1

132

Modoboa now uses the atomic requests mode to preserve database consistency (reference)

To enable it update the DATABASES variable in settingspy as follows

DATABASES = default

stuff beforeATOMIC_REQUESTS True

amavis

stuff beforeATOMIC_REQUESTS True

130

This release does not bring awesome new features but it is a necessary bridge to the future of Modoboa All extensionsnow have their own git repository and the deploy process has been updated to reflect this change

22 Upgrade 39

Modoboa Documentation Release 1100

Another important update is the use of Django 17 Besides its new features the migration system has been reworkedand is now more robust than before

Before we begin with the procedure here is a table showing old extension names and their new name

Old name New package name New module namemodoboaextensionsadmin modoboa-admin modoboa_adminmodoboaextensionslimits modoboa-admin-limits modoboa_admin_limitsmodoboaextensionspostfix_autoreply modoboa-postfix-autoreply modoboa_postfix_autoreplymodoboaextensionspostfix_relay_domains modoboa-admin-relaydomains modoboa_admin_relaydomainsmodoboaextensionsradicale modoboa-radicale modoboa_radicalemodoboaextensionssievefilters modoboa-sievefilters modoboa_sievefiltersmodoboaextensionsstats modoboa-stats modoboa_statsmodoboaextensionswebmail modoboa-webmail modoboa_webmail

Here are the required steps

1 Install the extensions using pip (look at the second column in the table above)

$ pip install ltthe extensions you wantgt

2 Remove south from INSTALLED_APPS

3 Rename old extension names inside MODOBOA_APPS (look at the third column in the table above)

4 Remove modoboalibmiddlewareExtControlMiddleware from MIDDLEWARE_CLASSES

5 Change DATABASE_ROUTERS to

DATABASE_ROUTERS = [modoboa_amavisdbrouterAmavisRouter]

6 Run the following commands

$ cd ltmodoboa_instance_dirgt$ python managepy migrate

7 Reply yes to the question

8 Run the following commands

$ python managepy load_initial_data$ python managepy collectstatic

9 The cleanup job has been renamed in Django so you have to modify your crontab entry

- 0 0 ltmodoboa_sitegtmanagepy cleanup+ 0 0 ltmodoboa_sitegtmanagepy clearsessions

120

A new notification service let administrators know about new Modoboa versions To activate it you need to updatethe TEMPLATE_CONTEXT_PROCESSORS variable like this

from djangoconf import global_settings

TEMPLATE_CONTEXT_PROCESSORS = global_settingsTEMPLATE_CONTEXT_PROCESSORS + (

(continues on next page)

40 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

modoboacorecontext_processorstop_notifications)

and to define the new MODOBOA_API_URL variable

MODOBOA_API_URL = httpapimodoboaorg1

The location of external static files has changed To use them add a new path to the STATICFILES_DIRS

Additional locations of static filesSTATICFILES_DIRS = (

Put strings here like homehtmlstatic or Cwwwdjangostatic Always use forward slashes even on Windows Dont forget to use absolute paths not relative pathsltpathtomodoboainstalldirgtbower_components

)

Run the following commands to define the hostname of your instance

$ cd ltmodoboa_instance_dirgt$ python managepy set_default_site lthostnamegt

If you plan to use the Radicale extension

1 Add modoboaextensionsradicale to the MODOBOA_APPS variable

2 Run the following commands

$ cd ltmodoboa_instance_dirgt$ python managepy syncdb

Warning You also have to note that the sitestatic directory has moved from ltpath to your sitesdirgt to ltmodoboas root urlgt (itrsquos probably the parent directory) You have to adapt your web serverconfiguration to reflect this change

23 Configuration

231 Online parameters

Modoboa provides online panels to modify internal parameters There are two available levels

bull Application level global parameters define how the application behaves Available at Modoboa gt Parameters

bull User level per user customization Available at User gt Settings gt Preferences

Regardless level parameters are displayed using tabs each tab corresponding to one application

General parameters

The admin application exposes several parameters they are presented below

23 Configuration 41

Modoboa Documentation Release 1100

Name Tab Description Default valueAuthentication type General The backend used for au-

thenticationLocal

Default password scheme General Scheme used to cryptmailbox passwords

crypt

Rounds General Number of rounds (onlyused by sha256cryptand sha512crypt) Mustbe between 1000 and999999999 inclusive

70000

Secret key General A key used to encryptusersrsquo password in ses-sions

random value

Sender address General Email address used tosend notifications

Enable communication General Enable communicationwith Modoboa public API

yes

Check new versions General Automatically checks if anewer version is available

yes

Send statistics General Send statistics to Mod-oboa public API (countersand used extensions)

yes

Top notifications check in-terval

General Interval between two topnotification checks (inseconds)

30

Maximum log record age General The maximum age in daysof a log record

365

Items per page General Number of displayeditems per page

30

Default top redirection General The default redirectionused when no applicationis specified

userprefs

Enable MX checks Admin Check that every domainhas a valid MX record

yes

Valid MXs Admin A list of IP or networkaddress every MX shouldmatch A warning will besent if a record does notrespect this it

Enable DNSBL checks Admin Check every domainagainst major DNSBLproviders

yes

DKIM keys storage direc-tory

AdminPath to a directory where DKIM

generated keys willbe stored

Default DKIM key length Admin The default size (in bits)for new keys

2048

Handle mailboxes onfilesystem

Admin Rename or remove mail-boxes on the filesystemwhen they get renamed orremoved within Modoboa

no

Mailboxes owner Admin The UNIX account whoowns mailboxes on thefilesystem

vmail

Default domain quota Admin Default quota (in MB) ap-plied to freshly createddomains with no valuespecified A value of 0means no quota

0

Automatic accountremoval

Admin When a mailbox is re-moved also remove theassociated account

no

Automatic do-mainmailbox creation

Admin Create a domain and amailbox when an accountis automatically created

yes

42 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Note If you are not familiar with virtual domain hosting you should take a look at postfixrsquos documentation ThisHow to also contains useful information

Note A random secret key will be generated each time the Parameters page is refreshed and until you save parametersat least once

Note Specific LDAP parameters are also available see LDAP authentication

232 Media files

Modoboa uses a specific directory to upload files (ie when the webmail is in use) or to create ones (ex graphical statis-tics) This directory is named media and is located inside modoboarsquos installation directory (called modoboa_sitein this documentation)

To work properly the system user which runs modoboa (www-data apache whatever) must have write access tothis directory

233 Customization

Custom logo

You have the possibility to use a custom logo instead of the default one on the login page

To do so open the settingspy file and add a MODOBOA_CUSTOM_LOGO variable This variable must containthe relative URL of your logo under MEDIA_URL For example

MODOBOA_CUSTOM_LOGO = ospathjoin(MEDIA_URL custom_logopng)

Then copy your logo file into the directory indicated by MEDIA_ROOT

234 Host configuration

Note This section is only relevant when Modoboa handles mailboxes renaming and removal from the filesystem

To manipulate mailboxes on the filesystem you must allow the user who runs Modoboa to execute commands as theuser who owns mailboxes

To do so edit the etcsudoers file and add the following inside

ltuser_that_runs_modoboagt ALL=(ltmailboxes ownergt) NOPASSWD ALL

Replace values between ltgt by the ones you use

23 Configuration 43

Modoboa Documentation Release 1100

235 Time zone and language

Modoboa is available in many languages

To specify the default language to use edit the settingspy file and modify the LANGUAGE_CODE variable

LANGUAGE_CODE = fr or en for english etc

Note Each user has the possibility to define the language he prefers

In the same configuration file specify the timezone to use by modifying the TIME_ZONE variable For example

TIME_ZONE = EuropeParis

236 Sessions management

Modoboa uses Djangorsquos session framework to store per-user information

Few parameters need to be set in the settingspy configuration file to make Modoboa behave as expected

SESSION_EXPIRE_AT_BROWSER_CLOSE = False Default value

This parameter is optional but you must ensure it is set to False (the default value)

The default configuration file provided by the modoboa-adminpy command is properly configured

237 Logging authentication

To trace login attempts to the web interface Modoboa uses python SysLogHandler so you can see them in your syslogauthentication log file (varlogauthlog in most cases)

Depending on your configuration you may have to edit the settingspy file and add lsquoaddressrsquo lsquodevlogrsquo to thelogging section

syslog-auth class logginghandlersSysLogHandlerfacility SysLogHandlerLOG_AUTHaddress devlogformatter syslog

238 External authentication

LDAP

Modoboa supports external LDAP authentication using the following extra components

bull Python LDAP client

bull Django LDAP authentication backend

If you want to use this feature you must first install those components

44 Chapter 2 Table of contents

Modoboa Documentation Release 1100

$ pip install python-ldap django-auth-ldap

Then all you have to do is to modify the settingspy file Add a new authentication backend to the AUTHENTI-CATION_BACKENDS variable like this

AUTHENTICATION_BACKENDS = (modoboalibauthbackendsLDAPBackend modoboalibauthbackendsLDAPSecondaryBackend Useful for a fallback

rarr˓mechanismdjangocontribauthbackendsModelBackend

)

Finally go to Modoboa gt Parameters gt General and set Authentication type to LDAP

From there new parameters will appear to let you configure the way Modoboa should connect to your LDAP serverThey are described just below

Name Description De-faultvalue

Server address The IP address of the DNS name of the LDAP server local-host

Server port The TCP port number used by the LDAP server 389Use a secureconnection

Use an SSLTLS connection to access the LDAP server no

Authenticationmethod

Choose the authentication method to use Directbind

User DN tem-plate (directbind mode)

The template used to construct a userrsquos DN It should contain one placeholder (ie(user)s)

Bind BN The distinguished name to use when binding to the LDAP server Leave empty for ananonymous bind

Bind password The password to use when binding to the LDAP server (with lsquoBind DNrsquo)Search base The distinguished name of the search baseSearch filter An optional filter string (eg lsquo(objectClass=person)rsquo) In order to be valid it must be

enclosed in parentheses(mail=(user)s)

Passwordattribute

The attribute used to store user passwords user-Pass-word

Active Direc-tory

Tell if the LDAP server is an Active Directory one no

Administratorgroups

Members of those LDAP Posix groups will be created ad domain administrators Uselsquorsquo characters to separate groups

Group type The type of group used by your LDAP directory Posix-Group

Groups searchbase

The distinguished name of the search base used to find groups

Do-mainmailboxcreation

Automatically create a domain and a mailbox when a new user is created just after thefirst successful authentication You will generally want to disable this feature whenthe relay domains extension is in use

yes

If you need additional parameters you will find a detailed documentation here

Once the authentication is properly configured the users defined in your LDAP directory will be able to connect to

23 Configuration 45

Modoboa Documentation Release 1100

Modoboa the associated domain and mailboxes will be automatically created if needed

The first time a user connects to Modoboa a local account is created if the LDAP username is a valid email addressBy default this account belongs to the SimpleUsers group and it has a mailbox

To automatically create domain administrators you can use the Administrator groups setting If a LDAP user belongsto one the listed groups its local account will belong to the DomainAdmins group In this case the username is notnecessarily an email address

Users will also be able to update their LDAP password directly from Modoboa

Note Modoboa doesnrsquot provide any synchronization mechanism once a user is registered into the database Anymodification done from the directory to a user account will not be reported to Modoboa (an email address change forexample) Currently the only solution is to manually delete the Modoboa record it will be recreated on the next userlogin

SMTP

It is possible to use an existing SMTP server as an authentication source To enable this feature edit the settingspy file and change the following setting

AUTHENTICATION_BACKENDS = (modoboalibauthbackendsSMTPBackenddjangocontribauthbackendsModelBackend

)

SMTP server location can be customized using the following settings

AUTH_SMTP_SERVER_ADDRESS = localhostAUTH_SMTP_SERVER_PORT = 25AUTH_SMTP_SECURED_MODE = None ssl or starttls are accepted

239 LDAP synchronization

Modoboa can synchronize accounts with an LDAP directory (tested with OpenLDAP) but this feature is not enabledby default To activate it add modoboaldapsync to MODOBOA_APPS in the settingspy file

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboaldapsync

)

and enable it from the admin panel

46 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning Make sure to install additional requirements otherwise it wonrsquot work

The following parameters are available and must be filled

Name Description Defaultvalue

Enable LDAP synchro-nization

Control LDAP synchronization state no

Bind DN The DN of a user with write permission to createupdate accountsBind password The associated passwordAccount DN template The template used to build account DNs (must contain a (user)s

placeholder

2310 Database maintenance

Cleaning the logs table

Modoboa logs administrator specific actions into the database A clean-up script is provided to automatically removeoldest records The maximum log record age can be configured through the online panel

To use it you can setup a cron job to run every night

0 0 ltmodoboa_sitegtmanagepy cleanlogs Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy cleanlogs

Cleaning the session table

Django does not provide automatic purging Therefore itrsquos your job to purge expired sessions on a regular basis

Django provides a sample clean-up script django-adminpy clearsessions That script deletes any sessionin the session table whose expire_date is in the past

For example you could setup a cron job to run this script every night

0 0 ltmodoboa_sitegtmanagepy clearsessions Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy clearsessions

Cleaning inactive accounts

Thanks to Last-login tracking it is now possible to monitor inactive accounts An account is considered inactive if nologin has been recorded for the last 30 days (this value can be changed through the admin panel)

A management command is available to disable or delete inactive accounts For example you could setup a cron jobto run it every night

23 Configuration 47

Modoboa Documentation Release 1100

0 0 ltmodoboa_sitegtmanagepy clean_inactive_accounts Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy clean_inactive_rarr˓accounts

The default behaviour is to disable accounts You can delete them using the --delete option

24 Moving to Modoboa

You have an existing platform and yoursquod like to move to Modoboa the following tools could help you

241 From postfixadmin

A dedicated command allows you to convert an existing postfixadmin database to a Modoboa one Consult the docu-mentation to know more about the process

242 Using CSV files

Modoboa allows you to import any object (domain domain alias mailbox and alias) using a simple CSV file encodedusing UTF8 Each line corresponds to a single object and must respect one of the following format

domain ltname stringgt ltquota integergt ltdefault mailbox quota integergt ltenabledrarr˓booleangtdomainalias ltname stringgt lttargeted domain stringgt ltenabled booleangtrelaydomain ltname stringgt lttarget host stringgt lttarget port integergt ltservicerarr˓stringgt ltenabled booleangt ltverify recipients booleangtaccount ltloginname stringgt ltpassword stringgt ltfirst name stringgt ltlast namerarr˓stringgt ltenabled booleangt ltgroup stringgt ltaddress stringgt ltquota integergt [rarr˓ltdomain stringgt ]alias ltaddress stringgt ltenabled booleangt ltrecipient stringgt

Boolean fields accept the following values true 1 yes y (case insensitive) Any other value will be evaluated asfalse

Warning The order does matter Objects are created sequencially so a domain must be created before itsmailboxes and aliases and a mailbox must created before its alias(es)

To actually import such a file

gt sudo -u ltmodoboa_usergt -igt source ltvirtualenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy modo import ltyour filegt

Available options can be listed using the following command

gt python managepy modo import -h

48 Chapter 2 Table of contents

Modoboa Documentation Release 1100

25 REST API

To ease the integration with external sources (software or other) Modoboa provides a REST API

Every installed instance comes with a ready-to-use API and a documentation You will find them using the followingurl patterns

bull API httplthostnamegtapiv1

bull Documentation httplthostnamegtdocsapi

An example of this documentation is available on the official demo

Using this API requires an authentication and for now only a token based authentication is supported To get a validtoken log-in to your instance with a super administrator go to Settings gt API and activate the API access Press theUpdate button and wait until the page is reloaded the token will be displayed

To make valid API calls every requests you send must embed this token within an Authorization HTTP header likethis

Authorization Token ltYOUR_TOKENgt

and the content type of those requests must be applicationjson

26 How to contribute

Contributions are always welcome If you want to submit a patch please respect the following rules

bull Open a pull request on the appropriate repository

bull Respect PEP8

bull Document your patch and respect PEP 257

bull Add unit tests and make sure the global coverage does not decrease

If all those steps are validated your contribution will generally be integrated

261 Table of contents

25 REST API 49

Modoboa Documentation Release 1100

Useful tips

You would like to work on Modoboa but you donrsquot know where to start Yoursquore at the right place Browse this pageto learn useful tips

Docker

A docker image is available for developers To use it you must install docker and docker-compose first

Then just run the following command

$ docker-compose up

It will start the docker environment and make a Modoboa instance available at httplocalhost8000

If you donrsquot want to use docker or need a more complex development setup go to the next section

Prepare a virtual environment

A virtual environment is a good way to setup a development environment on your machine

To do so run the following commands

$ python3 -m venv ltpathgt$ source ltpathgtbinactivate$ git clone httpsgithubcommodoboamodoboagit$ cd modoboa$ python setuppy develop$ pip install -r dev-requirementstxt

The develop command creates a symbolic link to your local copy so any modification you make will be automati-cally available in your environment no need to copy them

Deploy an instance for development

Warning Make sure to create a database before running this step The format of the database url is also describedin this page

Now that you have a running environment yoursquore ready to deploy a test instance

$ cd ltpathgt$ modoboa-adminpy deploy --dburl defaultltdatabase urlgt --domain localhost --develrarr˓instance$ python managepy runserver

Yoursquore ready to go You should be able to access Modoboa at httplocalhost8000 usingadminpassword as credentials

Manage static files

Modoboa uses bower (thanks to django-bower) to manage its CSS and javascript dependencies

50 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Those dependencies are listed in a file called dev_settingspy located inside the ltpath_to_local_copygtmodoboacore directory

If you want to add a new dependency just complete the BOWER_INSTALLED_APPS parameter and run the followingcommand

$ python managepy bower install

It will download and store the required files into the ltpath_to_local_copygtmodoboabower_components directory

Test your modifications

If you deployed a specific instance for your development needs you can run the tests suite as follows

gt python managepy test modoboacore modoboalib modoboaadmin modoboalimits modoboararr˓relaydomains

Otherwise you can run the tests suite from the repository using tox

Start a basic Modoboa instance

From the repository run the following command to launch a simple instance with a few fixtures

gt tox -e serve

You can use adminpassword to log in

Build the documentation

If you need to modify the documenation and want to see the result you can build it as follows

gt tox -e docgt firefox toxdoctmphtmlindexhtml

FAQ

bower command is missing in managepy

bower command is missing in managepy if you donrsquot use the --devel option of the modoboa-adminpydeploy command

To fix it regenerate your instance or update your settingspy file manually Look at devmode in httpsgithubcomtonioomodoboablobmastermodoboacorecommandstemplatessettingspytpl

Create a new plugin

Introduction

Modoboa offers a plugin API to expand its capabilities The current implementation provides the following possibili-ties

26 How to contribute 51

Modoboa Documentation Release 1100

bull Expand navigation by adding entry points to your plugin inside the GUI

bull Access and modify administrative objects (domains mailboxes etc)

bull Register callback actions for specific events

Plugins are nothing more than Django applications with an extra piece of code that integrates them into Modoboa Themodo_extensionpy file will contain a complete description of the plugin

bull Admin and user parameters

bull Custom menu entries

The communication between both applications is provided by Django signals

The following subsections describe the plugin architecture and explain how you can create your own

The required glue

To create a new plugin just start a new django application like this (into Modoboarsquos directory)

$ python managepy startapp

Then you need to register this application using the provided API Just copypaste the following example into themodo_extensionpy file of the future extension

from modoboacoreextensions import ModoExtension exts_pool

class MyExtension(ModoExtension)My custom Modoboa extension

name = myextlabel = My Extensionversion = 01description = A descriptionurl = myext_root_location optional name is used if not defined

def load(self)This method is called when Modoboa loads available and activated plugins

Declare parameters and register events herepass

def load_initial_data(self)Optional provide initial data for your extension herepass

exts_poolregister_extension(MyExtension)

Once done simply add your extensionrsquos module name to the MODOBOA_APPS variable located inside settingspy Finally run the following commands

$ python managepy migrate$ python managepy load_initial_data$ python managepy collectstatic

52 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Parameters

A plugin can declare its own parameters There are two levels available

bull lsquoGlobalrsquo parameters used to configure the plugin editable inside the Admin gt Settings gt Parameters page

bull lsquoUserrsquo parameters per-user parameters (or preferences) editable inside the Options gt Preferences page

Playing with parameters

Parameters are defined using Django forms and Modoboa adds two special forms you can inherit depending on thelevel of parameter(s) you want to add

bull modoboaparametersformsAdminParametersForm for general parameters

bull modoboaparametersformsUserParametersForm for user parameters

To register new parameters add the following line into the load method of your plugin class

from modoboaparameters import tools as param_toolsparam_toolsregistryadd(

LEVEL YourForm ugettext_lazy(Title))

Replace LEVEL by global or user

Custom role permissions

Modoboa uses Djangorsquos internal permission system Administrative roles are nothing more than groups (Groupinstances)

An extension can add new permissions to a group by listening to the extra_role_permissions signal Here isan example

from djangodispatch import receiverfrom modoboacore import signals as core_signals

PERMISSIONS = Resellers [

(relaydomains relaydomain add_relaydomain)(relaydomains relaydomain change_relaydomain)(relaydomains relaydomain delete_relaydomain)(relaydomains service add_service)(relaydomains service change_service)(relaydomains service delete_service)

]

receiver(core_signalsextra_role_permissions)def extra_role_permissions(sender role kwargs)

Add permissions to the Resellers groupreturn constantsPERMISSIONSget(role [])

Extending admin forms

The forms used to edit objects (account domain etc) through the admin panel are composed of tabs You can extendthem (ie add new tabs) in a pretty easy way thanks to custom signals

26 How to contribute 53

Modoboa Documentation Release 1100

Account

To add a new tab to the account edition form define new listeners (handlers) for the following signals

bull modoboaadminsignalsextra_account_forms

bull modoboaadminsignalsget_account_form_instances

bull modoboaadminsignalscheck_extra_account_form (optional)

Example

from djangodispatch import receiverfrom modoboaadmin import signals as admin_signals

receiver(admin_signalsextra_account_forms)def extra_account_form(sender user account kwargs)

return [id tabid title Title cls MyFormClass

]

receiver(admin_signalsget_account_form_instances)def fill_my_tab(sender user account kwargs)

return id my_instance

Domain

To add a new tab to the domain edition form define new listeners (handlers) for the following signals

bull modoboaadminsignalsextra_domain_forms

bull modoboaadminsignalsget_domain_form_instances

Example

from djangodispatch import receiverfrom modoboaadmin import signals as admin_signals

receiver(admin_signalsextra_domain_forms)def extra_account_form(sender user domain kwargs)

return [id tabid title Title cls MyFormClass

]

receiver(admin_signalsget_domain_form_instances)def fill_my_tab(sender user domain kwargs)

return id my_instance

27 Contributors

bull Antidot

bull Bearstech

bull CAP-REL

54 Chapter 2 Table of contents

Modoboa Documentation Release 1100

bull Dalnix

27 Contributors 55

  • Overview
  • Table of contents
Page 23: Modoboa Documentation

Modoboa Documentation Release 1100

Database schema update

The admin_quota table is created by Django but unfortunately it doesnrsquot support DEFAULT constraints (it onlysimulates them when the ORM is used) As PostgreSQL is a bit strict about constraint violations you must executethe following query manually

db=gt ALTER TABLE admin_quota ALTER COLUMN bytes SET DEFAULT 0db=gt ALTER TABLE admin_quota ALTER COLUMN messages SET DEFAULT 0

Trigger

As indicated on Dovecotrsquos wiki you need a trigger to properly update the quota

A working copy of this trigger is available on Github

Download this file and copy it on the server running postgres Then execute the following commands

$ su - postgres$ psql [modoboa database] lt pathtomodoboa_postgres_triggersql$ exit

Replace [modoboa database] by the appropriate value

Forcing recalculation

For existing installations Dovecot (gt 2) offers a command to recalculate the current quota usages For example if youwant to update all usages run the following command

$ doveadm quota recalc -A

Be carefull it can take a while to execute

ManageSieveSieve

Modoboa lets users define filtering rules from the web interface To do so it requires ManageSieve to be activated onyour server

Inside confd20-managesieveconf make sure the following lines are uncommented

protocols = $protocols sieve

service managesieve-login

service managesieve

protocol sieve

20 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Messages filtering using Sieve is done by the LDA

Inside confd15-ldaconf activate the sieve plugin like this

protocol lda Space separated list of plugins to load (default is global mail_plugins)mail_plugins = $mail_plugins sieve

Finally configure the sieve plugin by editing the confd90-sieveconf file Put the follwing caontent inside

plugin Location of the active script When ManageSieve is used this is actually a symlink pointing to the active script in the sieve storage directorysieve = ~dovecotsieve

The path to the directory where the personal Sieve scripts are stored For ManageSieve this is where the uploaded scripts are storedsieve_dir = ~sieve

Restart Dovecot

Now you can go to the Postfix section to finish the installation

Last-login tracking

To update the last_login attribute of an account after a succesful IMAP or POP3 login you can configure apost-login script

Open confd10-masterconf add the following configuration (imap and pop3 services are already definedyou just need to update them)

service imap executable = imap postlogin

service pop3 executable = pop3 postlogin

service postlogin executable = script-login usrlocalbinpostloginshuser = modoboaunix_listener postlogin

Then you must create a script named usrlocalbinpostloginsh According to your database enginethe content will differ

PostgreSQL

21 Installation 21

Modoboa Documentation Release 1100

binsh

psql -c UPDATE core_user SET last_login=now() WHERE username=$USER gt devnull

exec $

MySQL

binsh

DBNAME=XXXDBUSER=XXXDBPASSWORD=XXX

echo UPDATE core_user SET last_login=now() WHERE username=$USER | mysql -urarr˓$DBUSER -p$DBPASSWORD $DBNAME

exec $

Postfix

This section gives an example about building a simple virtual hosting configuration with Postfix Refer to the officialdocumentation for more explanation

Map files

You first need to create configuration files (or map files) that will be used by Postfix to lookup into Modoboa tables

To automaticaly generate the requested map files and store them in a directory run the following command

gt cd ltmodoboa_instance_pathgtgt python managepy generate_postfix_maps --destdir ltdirectorygt

ltdirectorygt is the directory where the files will be stored Answer the few questions and yoursquore done

Configuration

Use the following configuration in the etcpostfixmaincf file (this is just one possible configuration)

Stuff beforevirtual_transport = lmtpunixprivatedovecot-lmtp

virtual_mailbox_domains = ltdrivergtetcpostfixsql-domainscfvirtual_alias_domains = ltdrivergtetcpostfixsql-domain-aliasescfvirtual_alias_maps = ltdrivergtetcpostfixsql-aliasescf

relay_domains = ltdrivergtetcpostfixsql-relaydomainscftransport_maps =

ltdrivergtetcpostfixsql-transportcfltdrivergtetcpostfixsql-spliteddomains-transportcf

(continues on next page)

22 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

smtpd_recipient_restrictions = check_recipient_access

ltdrivergtetcpostfixsql-maintaincfltdrivergtetcpostfixsql-relay-recipient-verificationcf

permit_mynetworksreject_unauth_destinationreject_unverified_recipient

smtpd_sender_login_maps = ltdrivergtetcpostfixsql-sender-login-mapcf

smtpd_sender_restrictions =reject_sender_login_mismatch

Stuff after

Replace ltdrivergt by the name of the database you use

Restart Postfix

Policy daemon

If you want to enable the built-in policy daemon add the following content to the etcpostfixmaincf file

smtpd_recipient_restrictions = check_policy_service inet1270019999

And reload postfix

Note The check_policy_service line must be placed before the permit_mynetworks one otherwise thedaemon wonrsquot be called

OpenDKIM

Modoboa can generate DKIM keys for the hosted domains but it wonrsquot sign or check messages To do that you needa dedicated software like OpenDKIM

Note The cron job in charge of creating DKIM keys must be run using the same user than OpenDKIM (ie opendkimin most cases)

Database

Since keys related information is stored in Modoboarsquos database you need to tell OpenDKIM how it can access it

First make sure to install the required additional packages on your system (libopendbx1- on debian baseddistributions or opendbx- on CentOS the complete name depends on your database engine)

Then insert the following SQL view into Modoboarsquos database

21 Installation 23

Modoboa Documentation Release 1100

PostgreSQL

CREATE OR REPLACE VIEW dkim AS (SELECT id name as domain_name dkim_private_key_path AS private_key_path

dkim_key_selector AS selectorFROM admin_domain WHERE enable_dkim

)

MySQLMariaDB

CREATE OR REPLACE VIEW dkim AS (SELECT id name as domain_name dkim_private_key_path AS private_key_path

dkim_key_selector AS selectorFROM admin_domain WHERE enable_dkim=1

)

Configuration

You should find OpenDKIMrsquos configuration file at etcopendkimconf

Add the following content to it

KeyTable dsnltdrivergtltusergtltpasswordgtltdb hostgtltdb namegttable=dkimrarr˓keycol=iddatacol=domain_nameselectorprivate_key_pathSigningTable dsnltdrivergtltusergtltpasswordgtltdb hostgtltdb namegttable=dkimrarr˓keycol=domain_namedatacol=idSocket inet12345localhost

Replace values between ltgt by yours Accepted values for driver are pgsql or mysql Make sure the user youspecify has read permission on the view created previously

If you run a debian based system make sure to adjust the following setting in the etcdefaultopendkim file

SOCKET=inet12345localhost

Eventually reload OpenDKIM

Postfix integration

Add the following lines to the etcpostfixmaincf file

smtpd_milters = inet12700112345non_smtpd_milters = inet12700112345milter_default_action = acceptmilter_content_timeout = 30s

and reload postfix

Extensions

Only few commands are needed to add a new extension to your setup

24 Chapter 2 Table of contents

Modoboa Documentation Release 1100

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install ltEXTENSIONgt==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Then restart your web server

22 Upgrade

221 Modoboa

Warning The new version you are going to install may need to modify your database Before you start makesure to backup everything

Most of the time upgrading your installation to a newer Modoboa version only requires a few actions In every caseyou will need to apply the general procedure first and then check if the version you are installing requires specificactions

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install modoboa==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Once done check if the version you are installing requires Specific instructions

Finally restart your web server

Sometimes you might need to upgrade postfix map files too To do so just run the generate_postfix_mapscommand on the same directory than the one used for installation (etcpostfix by default)

Make sure to use root privileges and run the following command

gt python managepy generate_postfix_maps --destdir ltdirectorygt

Then reload postfix

22 Upgrade 25

Modoboa Documentation Release 1100

222 Extensions

If a new version is available for an extension yoursquore using it is recommanded to install it Upgrading an extensions ispretty and the procedure is almost the same than the one used for Modoboa

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install ltEXTENSIONgt==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Finally restart your web server

It is a generic upgrade procedure which will be enough most of the time but it is generally a good idea to check theassociated documentation

223 Rebuild Virtual Environment

Sometimes when upgrading your Operating System (eg from Ubuntu 1704 to Ubuntu 1710) your virtual environmentrunning modoboa can get corrupted Your first response will be to panic but fear not The solution is in this document

First things first

Recover your database password

You will need to recover your database password (if using mysql or postgresql) You will find this in etcpostfixsql-aliasescf or any file with sql-cf in the etcpostfix directory

Make note of this as you will need it when reconfiguring modoboa

Reinstall Modoboa

Start out by backup up your modoboa settings file located in the modoboa instance directory (srvmodoboainstanceinstancesettingspy if you used the default installer configuration) This contains your currentconfiguration

Next you want to remove all current modoboa files

After doing this follow the manual installation instructions for Modoboa only as everything should be working prop-erly

After this completes simply restore your backed up settings file to srvinstanceinstancesettingspy(if you used installer default configuration) You will then need to reinstall your extensions

You can find which plugins you had in your settingspy file under the MODOBOA_APPS variable

Instructions to install extensions can also be found here

Once you have completed this step you will need to run the following commands

26 Chapter 2 Table of contents

Modoboa Documentation Release 1100

gt (env) $ cd ltinstance_dirgtgt (env) $ python managepy migrategt (env) $ python managepy collectstatic

You will then see a message similar to

You have requested to collect static files at the destinationlocation as specified in your settings

srvmodoboainstancesitestatic

This will overwrite existing filesAre you sure you want to do this

Type yes to continue or no to cancel

You will want to answer yes here then simply restart the uwsgi process with service uwsgi restart andyou should be up and running again

Simply log into your modoboa web panel and verify that your extensions and webmail box is working

224 Information

Rebuild instructions from httpshelppythonanywherecompagesRebuildingVirtualenvs

225 Specific instructions

1160

A new policy daemon has been added

Make sure to have a Redis instance running on your server

Add modoboapolicyd to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboapolicyd

)

Add the following settings to your settingspy file

REDIS_HOST = ltIP or hostname heregtREDIS_PORT = 6379REDIS_QUOTA_DB = 0REDIS_URL = redisformat(REDIS_HOST REDIS_PORT REDIS_QUOTA_DB)

Once done you can start the policy daemon using the following commands

22 Upgrade 27

Modoboa Documentation Release 1100

gt python managepy policy_daemon

Donrsquot forget to configure _policyd_config if you want to use this feature

The modoboa-stats plugin has been merged into the core

Add modoboamaillog to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboapolicydmodoboamaillog

)

And remove any reference to modoboa_stats in this same variable

1150

This version drops Python 2 support so donrsquot forget to update all the extensions you use

Warning If you upgrade an existing python 2 installation you will need to create a new Python 3 virtualenvironment You can remove the existing virtual environment and replace it by the new one so you wonrsquot have tomodify your configuration files

Add the following new setting

DISABLE_DASHBOARD_EXTERNAL_QUERIES = False

Reload uwsgigunicornapache depending on your setup

Finally Make sure to use root privileges and run the following command

gt python managepy generate_postfix_maps --destdir ltdirectorygt

Then reload postfix

1140

This release introduces an optional LDAP synchronization process If you want to use it please follow the dedicatedprocedure

1131

Upgrade postfix maps files as follows

28 Chapter 2 Table of contents

Modoboa Documentation Release 1100

gt python managepy generate_postfix_maps --destdir ltpathgt --force-overwrite

1130

Add modoboadnstools to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstools

)

Add the following new settings

CSRF_COOKIE_SECURE = TrueSESSION_COOKIE_SECURE = True

modoboa-postfix-autoreply 150

Edit the etcpostfixmaincf file and remove the sql-autoreplies-transportcf map from thetransport_maps if present Remove the corresponding proxy_read_maps entry if relevant

Reload postfix

1100

Warning Upgrade installed extensions BEFORE running check or migrate commands

Upgrade all your installed plugins to the following versions

Warning If you use the amavis plugin make sure to include its configuration as follows into settingspy

from modoboa_amavis import settings as modoboa_amavis_settingsmodoboa_amavis_settingsapply(globals())

22 Upgrade 29

Modoboa Documentation Release 1100

Name Versionmodoboa-amavis 120modoboa-contacts 050modoboa-dmarc 110modoboa-imap-migration 120modoboa-pdfcredentials 130modoboa-postfix-autoreply 140modoboa-radicale 120modoboa-sievefilters 140modoboa-stats 140modoboa-webmail 140

Edit the settingspy file and apply the following modifications

Add modoboatransport to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparameters

)

Replace the following line

MIDDLEWARE_CLASSES = (

by

MIDDLEWARE = (

Update postfix map files as follows

gt rm -f ltpathgtmodoboa-postfix-mapschkgt python managepy generate_postfix_maps --force --destdir ltpathgt

Then modify postfixrsquos configuration as follows

smtpd_sender_login_maps =ltdrivergtltpathgtsql-sender-login-mapcf

transport_maps =ltdrivergtltpathgtsql-transportcfltdrivergtltpathgtsql-spliteddomains-transportcf other map files

Replace ltdrivergt and ltpathgt by your values

If transport_maps contains sql-relaydomains-transportcf remove it

30 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning If you make use of postfixrsquos proxymap server you must also update the proxy_read_maps setting

Reload postfix

Add the following cron job in order to generate DKIM keys

Generate DKIM keys (they will belong to the user running this job)

root $PYTHON $INSTANCEmanagepy modorarr˓manage_dkim_keys

190

If you want to manage inactive accounts look at Cleaning inactive accounts

183

Edit the settingspy file and replace the following line

BASE_DIR = ospathdirname(ospathdirname(__file__))

by

BASE_DIR = ospathrealpath(ospathdirname(ospathdirname(__file__)))

180

Modoboa now relies on Djangorsquos builtin password validation system to validate user passwords instead ofdjango-passwords

Remove django-passwords from your system

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt pip uninstall django-passwords

Edit the settingspy file and remove the following content

django-passwords

PASSWORD_MIN_LENGTH = 8

PASSWORD_COMPLEXITY = UPPER 1LOWER 1DIGITS 1

Add the following lines

Password validation rulesAUTH_PASSWORD_VALIDATORS = [

NAME djangocontribauthpassword_validation

rarr˓UserAttributeSimilarityValidator (continues on next page)

22 Upgrade 31

Modoboa Documentation Release 1100

(continued from previous page)

NAME djangocontribauthpassword_validationMinimumLengthValidator

NAME djangocontribauthpassword_validationCommonPasswordValidator

NAME djangocontribauthpassword_validationNumericPasswordValidator

NAME modoboacorepassword_validationComplexityValidatorOPTIONS

upper 1lower 1digits 1specials 0

]

172

API documentation has evolved (because of the upgrade to Django Rest Framework 36) and CKeditor is now embed-ded by default (thanks to the django-ckeditor package) Some configuration changes are required

Edit your settingspy file and apply the following modifications

bull Update the INSTALLED_APPS variable as follows

INSTALLED_APPS = (djangocontribauthdjangocontribcontenttypesdjangocontribsessionsdjangocontribmessagesdjangocontribsitesdjangocontribstaticfilesreversionckeditorckeditor_uploaderrest_frameworkrest_frameworkauthtoken

)

bull Update the REST_FRAMEWORK variable as follows

REST_FRAMEWORK = DEFAULT_AUTHENTICATION_CLASSES (

rest_frameworkauthenticationTokenAuthenticationrest_frameworkauthenticationSessionAuthentication

)

bull Remove the SWAGGER_SETTINGS variable

bull Add the following content

32 Chapter 2 Table of contents

Modoboa Documentation Release 1100

CKeditor

CKEDITOR_UPLOAD_PATH = uploads

CKEDITOR_IMAGE_BACKEND = pillow

CKEDITOR_RESTRICT_BY_USER = True

CKEDITOR_BROWSE_SHOW_DIRS = True

CKEDITOR_ALLOW_NONIMAGE_FILES = False

CKEDITOR_CONFIGS = default

allowedContent Truetoolbar Modoboawidth Nonetoolbar_Modoboa [

[Bold Italic Underline][JustifyLeft JustifyCenter JustifyRight JustifyBlock][BidiLtr BidiRtl Language][NumberedList BulletedList - Outdent Indent][Undo Redo][Link Unlink Anchor - Smiley][TextColor BGColor - Source][Font FontSize][Image ][SpellChecker]

]

Donrsquot forget to run the following command

gt python managepy collectstatic

171

If you used 170 for a fresh installation please run the following commands

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy load_initial_data

170

This version requires Django gt= 110 so you need to make some modifications It also brings internal API changeswhich are not backward compatible so installed extensions must be upgraded too

First of all deactivate all installed extensions (edit the settingspy file and comment the corresponding lines inMODOBOA_APPS)

Edit the urlspy file of your local instance and replace its content by the following one

22 Upgrade 33

Modoboa Documentation Release 1100

from djangoconfurls import include url

urlpatterns = [url(r include(modoboaurls))

]

Edit the settingspy and apply the following changes

bull Add modoboaparameters to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboarelaydomainsmodoboalimitsmodoboaparameters Modoboa extensions here

)

bull Add modoboacoremiddlewareLocalConfigMiddleware to MIDDLEWARE_CLASSES

MIDDLEWARE_CLASSES = (djangocontribsessionsmiddlewareSessionMiddlewaredjangomiddlewarecommonCommonMiddlewaredjangomiddlewarecsrfCsrfViewMiddlewaredjangocontribauthmiddlewareAuthenticationMiddlewaredjangocontribmessagesmiddlewareMessageMiddlewaredjangomiddlewarelocaleLocaleMiddlewaredjangomiddlewareclickjackingXFrameOptionsMiddlewaremodoboacoremiddlewareLocalConfigMiddlewaremodoboalibmiddlewareAjaxLoginRedirectmodoboalibmiddlewareCommonExceptionCatchermodoboalibmiddlewareRequestCatcherMiddleware

)

bull Modoboa used to provide a custom authentication backend (modoboalibauthbackendsSimpleBackend) but it has been removed Replace it as follows

AUTHENTICATION_BACKENDS = ( Other backends beforedjangocontribauthbackendsModelBackend

)

bull Remove TEMPLATE_CONTEXT_PROCESSORS and replace it by

TEMPLATES = [

BACKEND djangotemplatebackendsdjangoDjangoTemplatesDIRS []APP_DIRS TrueOPTIONS

context_processors [djangotemplatecontext_processorsdebugdjangotemplatecontext_processorsrequestdjangocontribauthcontext_processorsauth

(continues on next page)

34 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

djangotemplatecontext_processorsi18ndjangotemplatecontext_processorsmediadjangotemplatecontext_processorsstaticdjangotemplatecontext_processorstzdjangocontribmessagescontext_processorsmessagesmodoboacorecontext_processorstop_notifications

]debug False

]

Run the following commands (load virtualenv if you use one)

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstatic

Finally upgrade your extensions and reactivate them

Name Versionmodoboa-amavis 110modoboa-dmarc 100modoboa-imap-migration 110modoboa-pdfcredentials 110modoboa-postfix-autoreply 120modoboa-radicale 110modoboa-sievefilters 110modoboa-stats 110modoboa-webmail 110

Command line shortcuts

$ pip install modoboa-amavis==110$ pip install modoboa-dmarc==100$ pip install modoboa-imap-migration==110$ pip install modoboa-pdfcredentials==110$ pip install modoboa-postfix-autoreply==120$ pip install modoboa-radicale==110$ pip install modoboa-sievefilters==110$ pip install modoboa-stats==110$ pip install modoboa-webmail==110

And please make sure you use the latest version of the django-versionfield2 package

$ pip install -U django-versionfield2

Notes about quota changes and resellers

Reseller users now have a quota option in Resources tab This is the quota that a reseller can share between all itsdomains

22 Upgrade 35

Modoboa Documentation Release 1100

There are two quotas for a domain in the new version

1 Quota amp

2 Default mailbox quota

[1] Quota quota shared between mailboxes This quota is shared between all the mailboxes of this domain This valuecannot exceed resellerrsquos quota and hence cannot be 0(unlimited) if reseller has finite quota

[2] Default mailbox quota default quota applied to mailboxes This quota is the default quota applied to new mail-boxes This value cannot exceed Quota[1] and hence cannot be 0(unlimited) if Quota[1] is finite

161

First of all update postfix map files as follows

gt python managepy generate_postfix_maps --destdir ltpathgt --force-overwrite

Then modify postfixrsquos configuration as follows

smtpd_sender_login_maps =ltdrivergtltpathgtsql-sender-login-mailboxescfltdrivergtltpathgtsql-sender-login-aliasescfltdrivergtltpathgtsql-sender-login-mailboxes-extracf

Replace ltdrivergt and ltpathgt by your values

Finally reload postfix

This release also deprecates some internal functions As a result several extensions has been updated to maintain thecompatibility If you enabled the notification service yoursquoll find the list of available updates directly in your Modoboaconsole

For the others here is the list

Name Versionmodoboa-amavis 1010modoboa-postfix-autoreply 117modoboa-radicale 105modoboa-stats 109

Command line shortcut

$ pip install modoboa-amavis==1010$ pip install modoboa-postfix-autoreply==117$ pip install modoboa-radicale==105$ pip install modoboa-stats==109

160

Warning You have to upgrade extensions due to coreUser model attribute change (usergroup to userrole) Oth-erwise you will have an internal error after upgrade In particular modoboa-amavisd modoboa-stats modoboa-postfix-autoreply are concerned

36 Chapter 2 Table of contents

Modoboa Documentation Release 1100

An interesting feature brougth by this version is the capability to make different checks about MX records Forexample Modoboa can query main DNSBL providers for every defined domain With this you will quickly know ifone the domains you manage is listed or not To activate it add the following line to your crontab

30 ltoptional_virtualenv_pathgtpython ltmodoboa_instance_dirgtmanagepy modorarr˓check_mx

The communication with Modoboa public API has been reworked Instead of sending direct synchronous queries (forexample to check new versions) a cron job has been added To activate it add the following line to your crontab

0 ltoptional_virtualenv_pathgtpython ltmodoboa_instance_dirgtmanagepyrarr˓communicate_with_public_api

Please also note that public API now uses TLS so you must update your configuration as follows

MODOBOA_API_URL = httpsapimodoboaorg1

Finally it is now possible to declare additional sender addresses on a per-account basis You need to update your postfixconfiguration in order to use this functionality Just edit the maincf file and change the following parameter

smtpd_sender_login_maps =ltdrivergtetcpostfixsql-sender-login-mailboxescfltdrivergtetcpostfixsql-sender-login-aliasescfltdrivergtetcpostfixsql-sender-login-mailboxes-extracf

150

The API has been greatly improved and a documentation is now available To enable it addrest_framework_swagger to the INSTALLED_APPS variable in settingspy as follows

INSTALLED_APPS = (djangocontribauthdjangocontribcontenttypesdjangocontribsessionsdjangocontribmessagesdjangocontribsitesdjangocontribstaticfilesreversionrest_frameworkauthtokenrest_framework_swagger

)

Then add the following content into settingspy just after the REST_FRAMEWORK variable

SWAGGER_SETTINGS = is_authenticated Falseapi_version 10exclude_namespaces []info

contact contactmodoboacomdescription (Modoboa API requires a valid token)title Modoboa API

Yoursquore done The documentation is now available at the following address

22 Upgrade 37

Modoboa Documentation Release 1100

httpltyour instance addressgtdocsapi

Finally if you find a TEMPLATE_CONTEXT_PROCESSORS variable in your settingspy file make sure it lookslike this

TEMPLATE_CONTEXT_PROCESSORS = global_settingsTEMPLATE_CONTEXT_PROCESSORS + [modoboacorecontext_processorstop_notifications

]

140

Warning Please make sure to use Modoboa 135 with an up-to-date database before an upgrade to 140

Warning Do not follow the regular upgrade procedure for this version

Some extension have been moved back into the main repository The main reason for that is that using Modoboawithout them doesnrsquot make sense

First of all you must rename the following applications listed inside the MODOBOA_APPS variable

Old name New namemodoboa_admin modoboaadminmodoboa_admin_limits modoboalimitsmodoboa_admin_relaydomains modoboarelaydomains

Then apply the following steps

1 Uninstall old extensions

$ pip uninstall modoboa-admin modoboa-admin-limits modoboa-admin-relaydomains

2 Install all extension updates using pip (check the Modoboa gt Information page)

3 Manually migrate database

$ cd ltinstance_dirgt$ python managepy migrate auth$ python managepy migrate admin 0001 --fake$ python managepy migrate admin$ python managepy migrate limits 0001 --fake$ python managepy migrate relaydomains 0001 --fake$ python managepy migrate

4 Finally update static files

$ python managepy collectstatic

This version also introduces a REST API To enable it

1 Add rest_frameworkauthtoken to the INSTALLED_APPS variable

2 Add the following configuration inside settingspy

38 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Rest framework settings

REST_FRAMEWORK = DEFAULT_AUTHENTICATION_CLASSES (

rest_frameworkauthenticationTokenAuthentication)DEFAULT_PERMISSION_CLASSES (

rest_frameworkpermissionsIsAuthenticated)

3 Run the following command

$ python managepy migrate

135

To enhance security Modoboa now checks the strength of user passwords lthttpsgithubcomdstufftdjango-passwordsgt_

To use this feature add the following configuration into the settingspy file

django-passwords

PASSWORD_MIN_LENGTH = 8

PASSWORD_COMPLEXITY = UPPER 1LOWER 1DIGITS 1

132

Modoboa now uses the atomic requests mode to preserve database consistency (reference)

To enable it update the DATABASES variable in settingspy as follows

DATABASES = default

stuff beforeATOMIC_REQUESTS True

amavis

stuff beforeATOMIC_REQUESTS True

130

This release does not bring awesome new features but it is a necessary bridge to the future of Modoboa All extensionsnow have their own git repository and the deploy process has been updated to reflect this change

22 Upgrade 39

Modoboa Documentation Release 1100

Another important update is the use of Django 17 Besides its new features the migration system has been reworkedand is now more robust than before

Before we begin with the procedure here is a table showing old extension names and their new name

Old name New package name New module namemodoboaextensionsadmin modoboa-admin modoboa_adminmodoboaextensionslimits modoboa-admin-limits modoboa_admin_limitsmodoboaextensionspostfix_autoreply modoboa-postfix-autoreply modoboa_postfix_autoreplymodoboaextensionspostfix_relay_domains modoboa-admin-relaydomains modoboa_admin_relaydomainsmodoboaextensionsradicale modoboa-radicale modoboa_radicalemodoboaextensionssievefilters modoboa-sievefilters modoboa_sievefiltersmodoboaextensionsstats modoboa-stats modoboa_statsmodoboaextensionswebmail modoboa-webmail modoboa_webmail

Here are the required steps

1 Install the extensions using pip (look at the second column in the table above)

$ pip install ltthe extensions you wantgt

2 Remove south from INSTALLED_APPS

3 Rename old extension names inside MODOBOA_APPS (look at the third column in the table above)

4 Remove modoboalibmiddlewareExtControlMiddleware from MIDDLEWARE_CLASSES

5 Change DATABASE_ROUTERS to

DATABASE_ROUTERS = [modoboa_amavisdbrouterAmavisRouter]

6 Run the following commands

$ cd ltmodoboa_instance_dirgt$ python managepy migrate

7 Reply yes to the question

8 Run the following commands

$ python managepy load_initial_data$ python managepy collectstatic

9 The cleanup job has been renamed in Django so you have to modify your crontab entry

- 0 0 ltmodoboa_sitegtmanagepy cleanup+ 0 0 ltmodoboa_sitegtmanagepy clearsessions

120

A new notification service let administrators know about new Modoboa versions To activate it you need to updatethe TEMPLATE_CONTEXT_PROCESSORS variable like this

from djangoconf import global_settings

TEMPLATE_CONTEXT_PROCESSORS = global_settingsTEMPLATE_CONTEXT_PROCESSORS + (

(continues on next page)

40 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

modoboacorecontext_processorstop_notifications)

and to define the new MODOBOA_API_URL variable

MODOBOA_API_URL = httpapimodoboaorg1

The location of external static files has changed To use them add a new path to the STATICFILES_DIRS

Additional locations of static filesSTATICFILES_DIRS = (

Put strings here like homehtmlstatic or Cwwwdjangostatic Always use forward slashes even on Windows Dont forget to use absolute paths not relative pathsltpathtomodoboainstalldirgtbower_components

)

Run the following commands to define the hostname of your instance

$ cd ltmodoboa_instance_dirgt$ python managepy set_default_site lthostnamegt

If you plan to use the Radicale extension

1 Add modoboaextensionsradicale to the MODOBOA_APPS variable

2 Run the following commands

$ cd ltmodoboa_instance_dirgt$ python managepy syncdb

Warning You also have to note that the sitestatic directory has moved from ltpath to your sitesdirgt to ltmodoboas root urlgt (itrsquos probably the parent directory) You have to adapt your web serverconfiguration to reflect this change

23 Configuration

231 Online parameters

Modoboa provides online panels to modify internal parameters There are two available levels

bull Application level global parameters define how the application behaves Available at Modoboa gt Parameters

bull User level per user customization Available at User gt Settings gt Preferences

Regardless level parameters are displayed using tabs each tab corresponding to one application

General parameters

The admin application exposes several parameters they are presented below

23 Configuration 41

Modoboa Documentation Release 1100

Name Tab Description Default valueAuthentication type General The backend used for au-

thenticationLocal

Default password scheme General Scheme used to cryptmailbox passwords

crypt

Rounds General Number of rounds (onlyused by sha256cryptand sha512crypt) Mustbe between 1000 and999999999 inclusive

70000

Secret key General A key used to encryptusersrsquo password in ses-sions

random value

Sender address General Email address used tosend notifications

Enable communication General Enable communicationwith Modoboa public API

yes

Check new versions General Automatically checks if anewer version is available

yes

Send statistics General Send statistics to Mod-oboa public API (countersand used extensions)

yes

Top notifications check in-terval

General Interval between two topnotification checks (inseconds)

30

Maximum log record age General The maximum age in daysof a log record

365

Items per page General Number of displayeditems per page

30

Default top redirection General The default redirectionused when no applicationis specified

userprefs

Enable MX checks Admin Check that every domainhas a valid MX record

yes

Valid MXs Admin A list of IP or networkaddress every MX shouldmatch A warning will besent if a record does notrespect this it

Enable DNSBL checks Admin Check every domainagainst major DNSBLproviders

yes

DKIM keys storage direc-tory

AdminPath to a directory where DKIM

generated keys willbe stored

Default DKIM key length Admin The default size (in bits)for new keys

2048

Handle mailboxes onfilesystem

Admin Rename or remove mail-boxes on the filesystemwhen they get renamed orremoved within Modoboa

no

Mailboxes owner Admin The UNIX account whoowns mailboxes on thefilesystem

vmail

Default domain quota Admin Default quota (in MB) ap-plied to freshly createddomains with no valuespecified A value of 0means no quota

0

Automatic accountremoval

Admin When a mailbox is re-moved also remove theassociated account

no

Automatic do-mainmailbox creation

Admin Create a domain and amailbox when an accountis automatically created

yes

42 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Note If you are not familiar with virtual domain hosting you should take a look at postfixrsquos documentation ThisHow to also contains useful information

Note A random secret key will be generated each time the Parameters page is refreshed and until you save parametersat least once

Note Specific LDAP parameters are also available see LDAP authentication

232 Media files

Modoboa uses a specific directory to upload files (ie when the webmail is in use) or to create ones (ex graphical statis-tics) This directory is named media and is located inside modoboarsquos installation directory (called modoboa_sitein this documentation)

To work properly the system user which runs modoboa (www-data apache whatever) must have write access tothis directory

233 Customization

Custom logo

You have the possibility to use a custom logo instead of the default one on the login page

To do so open the settingspy file and add a MODOBOA_CUSTOM_LOGO variable This variable must containthe relative URL of your logo under MEDIA_URL For example

MODOBOA_CUSTOM_LOGO = ospathjoin(MEDIA_URL custom_logopng)

Then copy your logo file into the directory indicated by MEDIA_ROOT

234 Host configuration

Note This section is only relevant when Modoboa handles mailboxes renaming and removal from the filesystem

To manipulate mailboxes on the filesystem you must allow the user who runs Modoboa to execute commands as theuser who owns mailboxes

To do so edit the etcsudoers file and add the following inside

ltuser_that_runs_modoboagt ALL=(ltmailboxes ownergt) NOPASSWD ALL

Replace values between ltgt by the ones you use

23 Configuration 43

Modoboa Documentation Release 1100

235 Time zone and language

Modoboa is available in many languages

To specify the default language to use edit the settingspy file and modify the LANGUAGE_CODE variable

LANGUAGE_CODE = fr or en for english etc

Note Each user has the possibility to define the language he prefers

In the same configuration file specify the timezone to use by modifying the TIME_ZONE variable For example

TIME_ZONE = EuropeParis

236 Sessions management

Modoboa uses Djangorsquos session framework to store per-user information

Few parameters need to be set in the settingspy configuration file to make Modoboa behave as expected

SESSION_EXPIRE_AT_BROWSER_CLOSE = False Default value

This parameter is optional but you must ensure it is set to False (the default value)

The default configuration file provided by the modoboa-adminpy command is properly configured

237 Logging authentication

To trace login attempts to the web interface Modoboa uses python SysLogHandler so you can see them in your syslogauthentication log file (varlogauthlog in most cases)

Depending on your configuration you may have to edit the settingspy file and add lsquoaddressrsquo lsquodevlogrsquo to thelogging section

syslog-auth class logginghandlersSysLogHandlerfacility SysLogHandlerLOG_AUTHaddress devlogformatter syslog

238 External authentication

LDAP

Modoboa supports external LDAP authentication using the following extra components

bull Python LDAP client

bull Django LDAP authentication backend

If you want to use this feature you must first install those components

44 Chapter 2 Table of contents

Modoboa Documentation Release 1100

$ pip install python-ldap django-auth-ldap

Then all you have to do is to modify the settingspy file Add a new authentication backend to the AUTHENTI-CATION_BACKENDS variable like this

AUTHENTICATION_BACKENDS = (modoboalibauthbackendsLDAPBackend modoboalibauthbackendsLDAPSecondaryBackend Useful for a fallback

rarr˓mechanismdjangocontribauthbackendsModelBackend

)

Finally go to Modoboa gt Parameters gt General and set Authentication type to LDAP

From there new parameters will appear to let you configure the way Modoboa should connect to your LDAP serverThey are described just below

Name Description De-faultvalue

Server address The IP address of the DNS name of the LDAP server local-host

Server port The TCP port number used by the LDAP server 389Use a secureconnection

Use an SSLTLS connection to access the LDAP server no

Authenticationmethod

Choose the authentication method to use Directbind

User DN tem-plate (directbind mode)

The template used to construct a userrsquos DN It should contain one placeholder (ie(user)s)

Bind BN The distinguished name to use when binding to the LDAP server Leave empty for ananonymous bind

Bind password The password to use when binding to the LDAP server (with lsquoBind DNrsquo)Search base The distinguished name of the search baseSearch filter An optional filter string (eg lsquo(objectClass=person)rsquo) In order to be valid it must be

enclosed in parentheses(mail=(user)s)

Passwordattribute

The attribute used to store user passwords user-Pass-word

Active Direc-tory

Tell if the LDAP server is an Active Directory one no

Administratorgroups

Members of those LDAP Posix groups will be created ad domain administrators Uselsquorsquo characters to separate groups

Group type The type of group used by your LDAP directory Posix-Group

Groups searchbase

The distinguished name of the search base used to find groups

Do-mainmailboxcreation

Automatically create a domain and a mailbox when a new user is created just after thefirst successful authentication You will generally want to disable this feature whenthe relay domains extension is in use

yes

If you need additional parameters you will find a detailed documentation here

Once the authentication is properly configured the users defined in your LDAP directory will be able to connect to

23 Configuration 45

Modoboa Documentation Release 1100

Modoboa the associated domain and mailboxes will be automatically created if needed

The first time a user connects to Modoboa a local account is created if the LDAP username is a valid email addressBy default this account belongs to the SimpleUsers group and it has a mailbox

To automatically create domain administrators you can use the Administrator groups setting If a LDAP user belongsto one the listed groups its local account will belong to the DomainAdmins group In this case the username is notnecessarily an email address

Users will also be able to update their LDAP password directly from Modoboa

Note Modoboa doesnrsquot provide any synchronization mechanism once a user is registered into the database Anymodification done from the directory to a user account will not be reported to Modoboa (an email address change forexample) Currently the only solution is to manually delete the Modoboa record it will be recreated on the next userlogin

SMTP

It is possible to use an existing SMTP server as an authentication source To enable this feature edit the settingspy file and change the following setting

AUTHENTICATION_BACKENDS = (modoboalibauthbackendsSMTPBackenddjangocontribauthbackendsModelBackend

)

SMTP server location can be customized using the following settings

AUTH_SMTP_SERVER_ADDRESS = localhostAUTH_SMTP_SERVER_PORT = 25AUTH_SMTP_SECURED_MODE = None ssl or starttls are accepted

239 LDAP synchronization

Modoboa can synchronize accounts with an LDAP directory (tested with OpenLDAP) but this feature is not enabledby default To activate it add modoboaldapsync to MODOBOA_APPS in the settingspy file

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboaldapsync

)

and enable it from the admin panel

46 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning Make sure to install additional requirements otherwise it wonrsquot work

The following parameters are available and must be filled

Name Description Defaultvalue

Enable LDAP synchro-nization

Control LDAP synchronization state no

Bind DN The DN of a user with write permission to createupdate accountsBind password The associated passwordAccount DN template The template used to build account DNs (must contain a (user)s

placeholder

2310 Database maintenance

Cleaning the logs table

Modoboa logs administrator specific actions into the database A clean-up script is provided to automatically removeoldest records The maximum log record age can be configured through the online panel

To use it you can setup a cron job to run every night

0 0 ltmodoboa_sitegtmanagepy cleanlogs Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy cleanlogs

Cleaning the session table

Django does not provide automatic purging Therefore itrsquos your job to purge expired sessions on a regular basis

Django provides a sample clean-up script django-adminpy clearsessions That script deletes any sessionin the session table whose expire_date is in the past

For example you could setup a cron job to run this script every night

0 0 ltmodoboa_sitegtmanagepy clearsessions Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy clearsessions

Cleaning inactive accounts

Thanks to Last-login tracking it is now possible to monitor inactive accounts An account is considered inactive if nologin has been recorded for the last 30 days (this value can be changed through the admin panel)

A management command is available to disable or delete inactive accounts For example you could setup a cron jobto run it every night

23 Configuration 47

Modoboa Documentation Release 1100

0 0 ltmodoboa_sitegtmanagepy clean_inactive_accounts Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy clean_inactive_rarr˓accounts

The default behaviour is to disable accounts You can delete them using the --delete option

24 Moving to Modoboa

You have an existing platform and yoursquod like to move to Modoboa the following tools could help you

241 From postfixadmin

A dedicated command allows you to convert an existing postfixadmin database to a Modoboa one Consult the docu-mentation to know more about the process

242 Using CSV files

Modoboa allows you to import any object (domain domain alias mailbox and alias) using a simple CSV file encodedusing UTF8 Each line corresponds to a single object and must respect one of the following format

domain ltname stringgt ltquota integergt ltdefault mailbox quota integergt ltenabledrarr˓booleangtdomainalias ltname stringgt lttargeted domain stringgt ltenabled booleangtrelaydomain ltname stringgt lttarget host stringgt lttarget port integergt ltservicerarr˓stringgt ltenabled booleangt ltverify recipients booleangtaccount ltloginname stringgt ltpassword stringgt ltfirst name stringgt ltlast namerarr˓stringgt ltenabled booleangt ltgroup stringgt ltaddress stringgt ltquota integergt [rarr˓ltdomain stringgt ]alias ltaddress stringgt ltenabled booleangt ltrecipient stringgt

Boolean fields accept the following values true 1 yes y (case insensitive) Any other value will be evaluated asfalse

Warning The order does matter Objects are created sequencially so a domain must be created before itsmailboxes and aliases and a mailbox must created before its alias(es)

To actually import such a file

gt sudo -u ltmodoboa_usergt -igt source ltvirtualenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy modo import ltyour filegt

Available options can be listed using the following command

gt python managepy modo import -h

48 Chapter 2 Table of contents

Modoboa Documentation Release 1100

25 REST API

To ease the integration with external sources (software or other) Modoboa provides a REST API

Every installed instance comes with a ready-to-use API and a documentation You will find them using the followingurl patterns

bull API httplthostnamegtapiv1

bull Documentation httplthostnamegtdocsapi

An example of this documentation is available on the official demo

Using this API requires an authentication and for now only a token based authentication is supported To get a validtoken log-in to your instance with a super administrator go to Settings gt API and activate the API access Press theUpdate button and wait until the page is reloaded the token will be displayed

To make valid API calls every requests you send must embed this token within an Authorization HTTP header likethis

Authorization Token ltYOUR_TOKENgt

and the content type of those requests must be applicationjson

26 How to contribute

Contributions are always welcome If you want to submit a patch please respect the following rules

bull Open a pull request on the appropriate repository

bull Respect PEP8

bull Document your patch and respect PEP 257

bull Add unit tests and make sure the global coverage does not decrease

If all those steps are validated your contribution will generally be integrated

261 Table of contents

25 REST API 49

Modoboa Documentation Release 1100

Useful tips

You would like to work on Modoboa but you donrsquot know where to start Yoursquore at the right place Browse this pageto learn useful tips

Docker

A docker image is available for developers To use it you must install docker and docker-compose first

Then just run the following command

$ docker-compose up

It will start the docker environment and make a Modoboa instance available at httplocalhost8000

If you donrsquot want to use docker or need a more complex development setup go to the next section

Prepare a virtual environment

A virtual environment is a good way to setup a development environment on your machine

To do so run the following commands

$ python3 -m venv ltpathgt$ source ltpathgtbinactivate$ git clone httpsgithubcommodoboamodoboagit$ cd modoboa$ python setuppy develop$ pip install -r dev-requirementstxt

The develop command creates a symbolic link to your local copy so any modification you make will be automati-cally available in your environment no need to copy them

Deploy an instance for development

Warning Make sure to create a database before running this step The format of the database url is also describedin this page

Now that you have a running environment yoursquore ready to deploy a test instance

$ cd ltpathgt$ modoboa-adminpy deploy --dburl defaultltdatabase urlgt --domain localhost --develrarr˓instance$ python managepy runserver

Yoursquore ready to go You should be able to access Modoboa at httplocalhost8000 usingadminpassword as credentials

Manage static files

Modoboa uses bower (thanks to django-bower) to manage its CSS and javascript dependencies

50 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Those dependencies are listed in a file called dev_settingspy located inside the ltpath_to_local_copygtmodoboacore directory

If you want to add a new dependency just complete the BOWER_INSTALLED_APPS parameter and run the followingcommand

$ python managepy bower install

It will download and store the required files into the ltpath_to_local_copygtmodoboabower_components directory

Test your modifications

If you deployed a specific instance for your development needs you can run the tests suite as follows

gt python managepy test modoboacore modoboalib modoboaadmin modoboalimits modoboararr˓relaydomains

Otherwise you can run the tests suite from the repository using tox

Start a basic Modoboa instance

From the repository run the following command to launch a simple instance with a few fixtures

gt tox -e serve

You can use adminpassword to log in

Build the documentation

If you need to modify the documenation and want to see the result you can build it as follows

gt tox -e docgt firefox toxdoctmphtmlindexhtml

FAQ

bower command is missing in managepy

bower command is missing in managepy if you donrsquot use the --devel option of the modoboa-adminpydeploy command

To fix it regenerate your instance or update your settingspy file manually Look at devmode in httpsgithubcomtonioomodoboablobmastermodoboacorecommandstemplatessettingspytpl

Create a new plugin

Introduction

Modoboa offers a plugin API to expand its capabilities The current implementation provides the following possibili-ties

26 How to contribute 51

Modoboa Documentation Release 1100

bull Expand navigation by adding entry points to your plugin inside the GUI

bull Access and modify administrative objects (domains mailboxes etc)

bull Register callback actions for specific events

Plugins are nothing more than Django applications with an extra piece of code that integrates them into Modoboa Themodo_extensionpy file will contain a complete description of the plugin

bull Admin and user parameters

bull Custom menu entries

The communication between both applications is provided by Django signals

The following subsections describe the plugin architecture and explain how you can create your own

The required glue

To create a new plugin just start a new django application like this (into Modoboarsquos directory)

$ python managepy startapp

Then you need to register this application using the provided API Just copypaste the following example into themodo_extensionpy file of the future extension

from modoboacoreextensions import ModoExtension exts_pool

class MyExtension(ModoExtension)My custom Modoboa extension

name = myextlabel = My Extensionversion = 01description = A descriptionurl = myext_root_location optional name is used if not defined

def load(self)This method is called when Modoboa loads available and activated plugins

Declare parameters and register events herepass

def load_initial_data(self)Optional provide initial data for your extension herepass

exts_poolregister_extension(MyExtension)

Once done simply add your extensionrsquos module name to the MODOBOA_APPS variable located inside settingspy Finally run the following commands

$ python managepy migrate$ python managepy load_initial_data$ python managepy collectstatic

52 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Parameters

A plugin can declare its own parameters There are two levels available

bull lsquoGlobalrsquo parameters used to configure the plugin editable inside the Admin gt Settings gt Parameters page

bull lsquoUserrsquo parameters per-user parameters (or preferences) editable inside the Options gt Preferences page

Playing with parameters

Parameters are defined using Django forms and Modoboa adds two special forms you can inherit depending on thelevel of parameter(s) you want to add

bull modoboaparametersformsAdminParametersForm for general parameters

bull modoboaparametersformsUserParametersForm for user parameters

To register new parameters add the following line into the load method of your plugin class

from modoboaparameters import tools as param_toolsparam_toolsregistryadd(

LEVEL YourForm ugettext_lazy(Title))

Replace LEVEL by global or user

Custom role permissions

Modoboa uses Djangorsquos internal permission system Administrative roles are nothing more than groups (Groupinstances)

An extension can add new permissions to a group by listening to the extra_role_permissions signal Here isan example

from djangodispatch import receiverfrom modoboacore import signals as core_signals

PERMISSIONS = Resellers [

(relaydomains relaydomain add_relaydomain)(relaydomains relaydomain change_relaydomain)(relaydomains relaydomain delete_relaydomain)(relaydomains service add_service)(relaydomains service change_service)(relaydomains service delete_service)

]

receiver(core_signalsextra_role_permissions)def extra_role_permissions(sender role kwargs)

Add permissions to the Resellers groupreturn constantsPERMISSIONSget(role [])

Extending admin forms

The forms used to edit objects (account domain etc) through the admin panel are composed of tabs You can extendthem (ie add new tabs) in a pretty easy way thanks to custom signals

26 How to contribute 53

Modoboa Documentation Release 1100

Account

To add a new tab to the account edition form define new listeners (handlers) for the following signals

bull modoboaadminsignalsextra_account_forms

bull modoboaadminsignalsget_account_form_instances

bull modoboaadminsignalscheck_extra_account_form (optional)

Example

from djangodispatch import receiverfrom modoboaadmin import signals as admin_signals

receiver(admin_signalsextra_account_forms)def extra_account_form(sender user account kwargs)

return [id tabid title Title cls MyFormClass

]

receiver(admin_signalsget_account_form_instances)def fill_my_tab(sender user account kwargs)

return id my_instance

Domain

To add a new tab to the domain edition form define new listeners (handlers) for the following signals

bull modoboaadminsignalsextra_domain_forms

bull modoboaadminsignalsget_domain_form_instances

Example

from djangodispatch import receiverfrom modoboaadmin import signals as admin_signals

receiver(admin_signalsextra_domain_forms)def extra_account_form(sender user domain kwargs)

return [id tabid title Title cls MyFormClass

]

receiver(admin_signalsget_domain_form_instances)def fill_my_tab(sender user domain kwargs)

return id my_instance

27 Contributors

bull Antidot

bull Bearstech

bull CAP-REL

54 Chapter 2 Table of contents

Modoboa Documentation Release 1100

bull Dalnix

27 Contributors 55

  • Overview
  • Table of contents
Page 24: Modoboa Documentation

Modoboa Documentation Release 1100

Messages filtering using Sieve is done by the LDA

Inside confd15-ldaconf activate the sieve plugin like this

protocol lda Space separated list of plugins to load (default is global mail_plugins)mail_plugins = $mail_plugins sieve

Finally configure the sieve plugin by editing the confd90-sieveconf file Put the follwing caontent inside

plugin Location of the active script When ManageSieve is used this is actually a symlink pointing to the active script in the sieve storage directorysieve = ~dovecotsieve

The path to the directory where the personal Sieve scripts are stored For ManageSieve this is where the uploaded scripts are storedsieve_dir = ~sieve

Restart Dovecot

Now you can go to the Postfix section to finish the installation

Last-login tracking

To update the last_login attribute of an account after a succesful IMAP or POP3 login you can configure apost-login script

Open confd10-masterconf add the following configuration (imap and pop3 services are already definedyou just need to update them)

service imap executable = imap postlogin

service pop3 executable = pop3 postlogin

service postlogin executable = script-login usrlocalbinpostloginshuser = modoboaunix_listener postlogin

Then you must create a script named usrlocalbinpostloginsh According to your database enginethe content will differ

PostgreSQL

21 Installation 21

Modoboa Documentation Release 1100

binsh

psql -c UPDATE core_user SET last_login=now() WHERE username=$USER gt devnull

exec $

MySQL

binsh

DBNAME=XXXDBUSER=XXXDBPASSWORD=XXX

echo UPDATE core_user SET last_login=now() WHERE username=$USER | mysql -urarr˓$DBUSER -p$DBPASSWORD $DBNAME

exec $

Postfix

This section gives an example about building a simple virtual hosting configuration with Postfix Refer to the officialdocumentation for more explanation

Map files

You first need to create configuration files (or map files) that will be used by Postfix to lookup into Modoboa tables

To automaticaly generate the requested map files and store them in a directory run the following command

gt cd ltmodoboa_instance_pathgtgt python managepy generate_postfix_maps --destdir ltdirectorygt

ltdirectorygt is the directory where the files will be stored Answer the few questions and yoursquore done

Configuration

Use the following configuration in the etcpostfixmaincf file (this is just one possible configuration)

Stuff beforevirtual_transport = lmtpunixprivatedovecot-lmtp

virtual_mailbox_domains = ltdrivergtetcpostfixsql-domainscfvirtual_alias_domains = ltdrivergtetcpostfixsql-domain-aliasescfvirtual_alias_maps = ltdrivergtetcpostfixsql-aliasescf

relay_domains = ltdrivergtetcpostfixsql-relaydomainscftransport_maps =

ltdrivergtetcpostfixsql-transportcfltdrivergtetcpostfixsql-spliteddomains-transportcf

(continues on next page)

22 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

smtpd_recipient_restrictions = check_recipient_access

ltdrivergtetcpostfixsql-maintaincfltdrivergtetcpostfixsql-relay-recipient-verificationcf

permit_mynetworksreject_unauth_destinationreject_unverified_recipient

smtpd_sender_login_maps = ltdrivergtetcpostfixsql-sender-login-mapcf

smtpd_sender_restrictions =reject_sender_login_mismatch

Stuff after

Replace ltdrivergt by the name of the database you use

Restart Postfix

Policy daemon

If you want to enable the built-in policy daemon add the following content to the etcpostfixmaincf file

smtpd_recipient_restrictions = check_policy_service inet1270019999

And reload postfix

Note The check_policy_service line must be placed before the permit_mynetworks one otherwise thedaemon wonrsquot be called

OpenDKIM

Modoboa can generate DKIM keys for the hosted domains but it wonrsquot sign or check messages To do that you needa dedicated software like OpenDKIM

Note The cron job in charge of creating DKIM keys must be run using the same user than OpenDKIM (ie opendkimin most cases)

Database

Since keys related information is stored in Modoboarsquos database you need to tell OpenDKIM how it can access it

First make sure to install the required additional packages on your system (libopendbx1- on debian baseddistributions or opendbx- on CentOS the complete name depends on your database engine)

Then insert the following SQL view into Modoboarsquos database

21 Installation 23

Modoboa Documentation Release 1100

PostgreSQL

CREATE OR REPLACE VIEW dkim AS (SELECT id name as domain_name dkim_private_key_path AS private_key_path

dkim_key_selector AS selectorFROM admin_domain WHERE enable_dkim

)

MySQLMariaDB

CREATE OR REPLACE VIEW dkim AS (SELECT id name as domain_name dkim_private_key_path AS private_key_path

dkim_key_selector AS selectorFROM admin_domain WHERE enable_dkim=1

)

Configuration

You should find OpenDKIMrsquos configuration file at etcopendkimconf

Add the following content to it

KeyTable dsnltdrivergtltusergtltpasswordgtltdb hostgtltdb namegttable=dkimrarr˓keycol=iddatacol=domain_nameselectorprivate_key_pathSigningTable dsnltdrivergtltusergtltpasswordgtltdb hostgtltdb namegttable=dkimrarr˓keycol=domain_namedatacol=idSocket inet12345localhost

Replace values between ltgt by yours Accepted values for driver are pgsql or mysql Make sure the user youspecify has read permission on the view created previously

If you run a debian based system make sure to adjust the following setting in the etcdefaultopendkim file

SOCKET=inet12345localhost

Eventually reload OpenDKIM

Postfix integration

Add the following lines to the etcpostfixmaincf file

smtpd_milters = inet12700112345non_smtpd_milters = inet12700112345milter_default_action = acceptmilter_content_timeout = 30s

and reload postfix

Extensions

Only few commands are needed to add a new extension to your setup

24 Chapter 2 Table of contents

Modoboa Documentation Release 1100

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install ltEXTENSIONgt==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Then restart your web server

22 Upgrade

221 Modoboa

Warning The new version you are going to install may need to modify your database Before you start makesure to backup everything

Most of the time upgrading your installation to a newer Modoboa version only requires a few actions In every caseyou will need to apply the general procedure first and then check if the version you are installing requires specificactions

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install modoboa==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Once done check if the version you are installing requires Specific instructions

Finally restart your web server

Sometimes you might need to upgrade postfix map files too To do so just run the generate_postfix_mapscommand on the same directory than the one used for installation (etcpostfix by default)

Make sure to use root privileges and run the following command

gt python managepy generate_postfix_maps --destdir ltdirectorygt

Then reload postfix

22 Upgrade 25

Modoboa Documentation Release 1100

222 Extensions

If a new version is available for an extension yoursquore using it is recommanded to install it Upgrading an extensions ispretty and the procedure is almost the same than the one used for Modoboa

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install ltEXTENSIONgt==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Finally restart your web server

It is a generic upgrade procedure which will be enough most of the time but it is generally a good idea to check theassociated documentation

223 Rebuild Virtual Environment

Sometimes when upgrading your Operating System (eg from Ubuntu 1704 to Ubuntu 1710) your virtual environmentrunning modoboa can get corrupted Your first response will be to panic but fear not The solution is in this document

First things first

Recover your database password

You will need to recover your database password (if using mysql or postgresql) You will find this in etcpostfixsql-aliasescf or any file with sql-cf in the etcpostfix directory

Make note of this as you will need it when reconfiguring modoboa

Reinstall Modoboa

Start out by backup up your modoboa settings file located in the modoboa instance directory (srvmodoboainstanceinstancesettingspy if you used the default installer configuration) This contains your currentconfiguration

Next you want to remove all current modoboa files

After doing this follow the manual installation instructions for Modoboa only as everything should be working prop-erly

After this completes simply restore your backed up settings file to srvinstanceinstancesettingspy(if you used installer default configuration) You will then need to reinstall your extensions

You can find which plugins you had in your settingspy file under the MODOBOA_APPS variable

Instructions to install extensions can also be found here

Once you have completed this step you will need to run the following commands

26 Chapter 2 Table of contents

Modoboa Documentation Release 1100

gt (env) $ cd ltinstance_dirgtgt (env) $ python managepy migrategt (env) $ python managepy collectstatic

You will then see a message similar to

You have requested to collect static files at the destinationlocation as specified in your settings

srvmodoboainstancesitestatic

This will overwrite existing filesAre you sure you want to do this

Type yes to continue or no to cancel

You will want to answer yes here then simply restart the uwsgi process with service uwsgi restart andyou should be up and running again

Simply log into your modoboa web panel and verify that your extensions and webmail box is working

224 Information

Rebuild instructions from httpshelppythonanywherecompagesRebuildingVirtualenvs

225 Specific instructions

1160

A new policy daemon has been added

Make sure to have a Redis instance running on your server

Add modoboapolicyd to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboapolicyd

)

Add the following settings to your settingspy file

REDIS_HOST = ltIP or hostname heregtREDIS_PORT = 6379REDIS_QUOTA_DB = 0REDIS_URL = redisformat(REDIS_HOST REDIS_PORT REDIS_QUOTA_DB)

Once done you can start the policy daemon using the following commands

22 Upgrade 27

Modoboa Documentation Release 1100

gt python managepy policy_daemon

Donrsquot forget to configure _policyd_config if you want to use this feature

The modoboa-stats plugin has been merged into the core

Add modoboamaillog to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboapolicydmodoboamaillog

)

And remove any reference to modoboa_stats in this same variable

1150

This version drops Python 2 support so donrsquot forget to update all the extensions you use

Warning If you upgrade an existing python 2 installation you will need to create a new Python 3 virtualenvironment You can remove the existing virtual environment and replace it by the new one so you wonrsquot have tomodify your configuration files

Add the following new setting

DISABLE_DASHBOARD_EXTERNAL_QUERIES = False

Reload uwsgigunicornapache depending on your setup

Finally Make sure to use root privileges and run the following command

gt python managepy generate_postfix_maps --destdir ltdirectorygt

Then reload postfix

1140

This release introduces an optional LDAP synchronization process If you want to use it please follow the dedicatedprocedure

1131

Upgrade postfix maps files as follows

28 Chapter 2 Table of contents

Modoboa Documentation Release 1100

gt python managepy generate_postfix_maps --destdir ltpathgt --force-overwrite

1130

Add modoboadnstools to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstools

)

Add the following new settings

CSRF_COOKIE_SECURE = TrueSESSION_COOKIE_SECURE = True

modoboa-postfix-autoreply 150

Edit the etcpostfixmaincf file and remove the sql-autoreplies-transportcf map from thetransport_maps if present Remove the corresponding proxy_read_maps entry if relevant

Reload postfix

1100

Warning Upgrade installed extensions BEFORE running check or migrate commands

Upgrade all your installed plugins to the following versions

Warning If you use the amavis plugin make sure to include its configuration as follows into settingspy

from modoboa_amavis import settings as modoboa_amavis_settingsmodoboa_amavis_settingsapply(globals())

22 Upgrade 29

Modoboa Documentation Release 1100

Name Versionmodoboa-amavis 120modoboa-contacts 050modoboa-dmarc 110modoboa-imap-migration 120modoboa-pdfcredentials 130modoboa-postfix-autoreply 140modoboa-radicale 120modoboa-sievefilters 140modoboa-stats 140modoboa-webmail 140

Edit the settingspy file and apply the following modifications

Add modoboatransport to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparameters

)

Replace the following line

MIDDLEWARE_CLASSES = (

by

MIDDLEWARE = (

Update postfix map files as follows

gt rm -f ltpathgtmodoboa-postfix-mapschkgt python managepy generate_postfix_maps --force --destdir ltpathgt

Then modify postfixrsquos configuration as follows

smtpd_sender_login_maps =ltdrivergtltpathgtsql-sender-login-mapcf

transport_maps =ltdrivergtltpathgtsql-transportcfltdrivergtltpathgtsql-spliteddomains-transportcf other map files

Replace ltdrivergt and ltpathgt by your values

If transport_maps contains sql-relaydomains-transportcf remove it

30 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning If you make use of postfixrsquos proxymap server you must also update the proxy_read_maps setting

Reload postfix

Add the following cron job in order to generate DKIM keys

Generate DKIM keys (they will belong to the user running this job)

root $PYTHON $INSTANCEmanagepy modorarr˓manage_dkim_keys

190

If you want to manage inactive accounts look at Cleaning inactive accounts

183

Edit the settingspy file and replace the following line

BASE_DIR = ospathdirname(ospathdirname(__file__))

by

BASE_DIR = ospathrealpath(ospathdirname(ospathdirname(__file__)))

180

Modoboa now relies on Djangorsquos builtin password validation system to validate user passwords instead ofdjango-passwords

Remove django-passwords from your system

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt pip uninstall django-passwords

Edit the settingspy file and remove the following content

django-passwords

PASSWORD_MIN_LENGTH = 8

PASSWORD_COMPLEXITY = UPPER 1LOWER 1DIGITS 1

Add the following lines

Password validation rulesAUTH_PASSWORD_VALIDATORS = [

NAME djangocontribauthpassword_validation

rarr˓UserAttributeSimilarityValidator (continues on next page)

22 Upgrade 31

Modoboa Documentation Release 1100

(continued from previous page)

NAME djangocontribauthpassword_validationMinimumLengthValidator

NAME djangocontribauthpassword_validationCommonPasswordValidator

NAME djangocontribauthpassword_validationNumericPasswordValidator

NAME modoboacorepassword_validationComplexityValidatorOPTIONS

upper 1lower 1digits 1specials 0

]

172

API documentation has evolved (because of the upgrade to Django Rest Framework 36) and CKeditor is now embed-ded by default (thanks to the django-ckeditor package) Some configuration changes are required

Edit your settingspy file and apply the following modifications

bull Update the INSTALLED_APPS variable as follows

INSTALLED_APPS = (djangocontribauthdjangocontribcontenttypesdjangocontribsessionsdjangocontribmessagesdjangocontribsitesdjangocontribstaticfilesreversionckeditorckeditor_uploaderrest_frameworkrest_frameworkauthtoken

)

bull Update the REST_FRAMEWORK variable as follows

REST_FRAMEWORK = DEFAULT_AUTHENTICATION_CLASSES (

rest_frameworkauthenticationTokenAuthenticationrest_frameworkauthenticationSessionAuthentication

)

bull Remove the SWAGGER_SETTINGS variable

bull Add the following content

32 Chapter 2 Table of contents

Modoboa Documentation Release 1100

CKeditor

CKEDITOR_UPLOAD_PATH = uploads

CKEDITOR_IMAGE_BACKEND = pillow

CKEDITOR_RESTRICT_BY_USER = True

CKEDITOR_BROWSE_SHOW_DIRS = True

CKEDITOR_ALLOW_NONIMAGE_FILES = False

CKEDITOR_CONFIGS = default

allowedContent Truetoolbar Modoboawidth Nonetoolbar_Modoboa [

[Bold Italic Underline][JustifyLeft JustifyCenter JustifyRight JustifyBlock][BidiLtr BidiRtl Language][NumberedList BulletedList - Outdent Indent][Undo Redo][Link Unlink Anchor - Smiley][TextColor BGColor - Source][Font FontSize][Image ][SpellChecker]

]

Donrsquot forget to run the following command

gt python managepy collectstatic

171

If you used 170 for a fresh installation please run the following commands

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy load_initial_data

170

This version requires Django gt= 110 so you need to make some modifications It also brings internal API changeswhich are not backward compatible so installed extensions must be upgraded too

First of all deactivate all installed extensions (edit the settingspy file and comment the corresponding lines inMODOBOA_APPS)

Edit the urlspy file of your local instance and replace its content by the following one

22 Upgrade 33

Modoboa Documentation Release 1100

from djangoconfurls import include url

urlpatterns = [url(r include(modoboaurls))

]

Edit the settingspy and apply the following changes

bull Add modoboaparameters to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboarelaydomainsmodoboalimitsmodoboaparameters Modoboa extensions here

)

bull Add modoboacoremiddlewareLocalConfigMiddleware to MIDDLEWARE_CLASSES

MIDDLEWARE_CLASSES = (djangocontribsessionsmiddlewareSessionMiddlewaredjangomiddlewarecommonCommonMiddlewaredjangomiddlewarecsrfCsrfViewMiddlewaredjangocontribauthmiddlewareAuthenticationMiddlewaredjangocontribmessagesmiddlewareMessageMiddlewaredjangomiddlewarelocaleLocaleMiddlewaredjangomiddlewareclickjackingXFrameOptionsMiddlewaremodoboacoremiddlewareLocalConfigMiddlewaremodoboalibmiddlewareAjaxLoginRedirectmodoboalibmiddlewareCommonExceptionCatchermodoboalibmiddlewareRequestCatcherMiddleware

)

bull Modoboa used to provide a custom authentication backend (modoboalibauthbackendsSimpleBackend) but it has been removed Replace it as follows

AUTHENTICATION_BACKENDS = ( Other backends beforedjangocontribauthbackendsModelBackend

)

bull Remove TEMPLATE_CONTEXT_PROCESSORS and replace it by

TEMPLATES = [

BACKEND djangotemplatebackendsdjangoDjangoTemplatesDIRS []APP_DIRS TrueOPTIONS

context_processors [djangotemplatecontext_processorsdebugdjangotemplatecontext_processorsrequestdjangocontribauthcontext_processorsauth

(continues on next page)

34 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

djangotemplatecontext_processorsi18ndjangotemplatecontext_processorsmediadjangotemplatecontext_processorsstaticdjangotemplatecontext_processorstzdjangocontribmessagescontext_processorsmessagesmodoboacorecontext_processorstop_notifications

]debug False

]

Run the following commands (load virtualenv if you use one)

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstatic

Finally upgrade your extensions and reactivate them

Name Versionmodoboa-amavis 110modoboa-dmarc 100modoboa-imap-migration 110modoboa-pdfcredentials 110modoboa-postfix-autoreply 120modoboa-radicale 110modoboa-sievefilters 110modoboa-stats 110modoboa-webmail 110

Command line shortcuts

$ pip install modoboa-amavis==110$ pip install modoboa-dmarc==100$ pip install modoboa-imap-migration==110$ pip install modoboa-pdfcredentials==110$ pip install modoboa-postfix-autoreply==120$ pip install modoboa-radicale==110$ pip install modoboa-sievefilters==110$ pip install modoboa-stats==110$ pip install modoboa-webmail==110

And please make sure you use the latest version of the django-versionfield2 package

$ pip install -U django-versionfield2

Notes about quota changes and resellers

Reseller users now have a quota option in Resources tab This is the quota that a reseller can share between all itsdomains

22 Upgrade 35

Modoboa Documentation Release 1100

There are two quotas for a domain in the new version

1 Quota amp

2 Default mailbox quota

[1] Quota quota shared between mailboxes This quota is shared between all the mailboxes of this domain This valuecannot exceed resellerrsquos quota and hence cannot be 0(unlimited) if reseller has finite quota

[2] Default mailbox quota default quota applied to mailboxes This quota is the default quota applied to new mail-boxes This value cannot exceed Quota[1] and hence cannot be 0(unlimited) if Quota[1] is finite

161

First of all update postfix map files as follows

gt python managepy generate_postfix_maps --destdir ltpathgt --force-overwrite

Then modify postfixrsquos configuration as follows

smtpd_sender_login_maps =ltdrivergtltpathgtsql-sender-login-mailboxescfltdrivergtltpathgtsql-sender-login-aliasescfltdrivergtltpathgtsql-sender-login-mailboxes-extracf

Replace ltdrivergt and ltpathgt by your values

Finally reload postfix

This release also deprecates some internal functions As a result several extensions has been updated to maintain thecompatibility If you enabled the notification service yoursquoll find the list of available updates directly in your Modoboaconsole

For the others here is the list

Name Versionmodoboa-amavis 1010modoboa-postfix-autoreply 117modoboa-radicale 105modoboa-stats 109

Command line shortcut

$ pip install modoboa-amavis==1010$ pip install modoboa-postfix-autoreply==117$ pip install modoboa-radicale==105$ pip install modoboa-stats==109

160

Warning You have to upgrade extensions due to coreUser model attribute change (usergroup to userrole) Oth-erwise you will have an internal error after upgrade In particular modoboa-amavisd modoboa-stats modoboa-postfix-autoreply are concerned

36 Chapter 2 Table of contents

Modoboa Documentation Release 1100

An interesting feature brougth by this version is the capability to make different checks about MX records Forexample Modoboa can query main DNSBL providers for every defined domain With this you will quickly know ifone the domains you manage is listed or not To activate it add the following line to your crontab

30 ltoptional_virtualenv_pathgtpython ltmodoboa_instance_dirgtmanagepy modorarr˓check_mx

The communication with Modoboa public API has been reworked Instead of sending direct synchronous queries (forexample to check new versions) a cron job has been added To activate it add the following line to your crontab

0 ltoptional_virtualenv_pathgtpython ltmodoboa_instance_dirgtmanagepyrarr˓communicate_with_public_api

Please also note that public API now uses TLS so you must update your configuration as follows

MODOBOA_API_URL = httpsapimodoboaorg1

Finally it is now possible to declare additional sender addresses on a per-account basis You need to update your postfixconfiguration in order to use this functionality Just edit the maincf file and change the following parameter

smtpd_sender_login_maps =ltdrivergtetcpostfixsql-sender-login-mailboxescfltdrivergtetcpostfixsql-sender-login-aliasescfltdrivergtetcpostfixsql-sender-login-mailboxes-extracf

150

The API has been greatly improved and a documentation is now available To enable it addrest_framework_swagger to the INSTALLED_APPS variable in settingspy as follows

INSTALLED_APPS = (djangocontribauthdjangocontribcontenttypesdjangocontribsessionsdjangocontribmessagesdjangocontribsitesdjangocontribstaticfilesreversionrest_frameworkauthtokenrest_framework_swagger

)

Then add the following content into settingspy just after the REST_FRAMEWORK variable

SWAGGER_SETTINGS = is_authenticated Falseapi_version 10exclude_namespaces []info

contact contactmodoboacomdescription (Modoboa API requires a valid token)title Modoboa API

Yoursquore done The documentation is now available at the following address

22 Upgrade 37

Modoboa Documentation Release 1100

httpltyour instance addressgtdocsapi

Finally if you find a TEMPLATE_CONTEXT_PROCESSORS variable in your settingspy file make sure it lookslike this

TEMPLATE_CONTEXT_PROCESSORS = global_settingsTEMPLATE_CONTEXT_PROCESSORS + [modoboacorecontext_processorstop_notifications

]

140

Warning Please make sure to use Modoboa 135 with an up-to-date database before an upgrade to 140

Warning Do not follow the regular upgrade procedure for this version

Some extension have been moved back into the main repository The main reason for that is that using Modoboawithout them doesnrsquot make sense

First of all you must rename the following applications listed inside the MODOBOA_APPS variable

Old name New namemodoboa_admin modoboaadminmodoboa_admin_limits modoboalimitsmodoboa_admin_relaydomains modoboarelaydomains

Then apply the following steps

1 Uninstall old extensions

$ pip uninstall modoboa-admin modoboa-admin-limits modoboa-admin-relaydomains

2 Install all extension updates using pip (check the Modoboa gt Information page)

3 Manually migrate database

$ cd ltinstance_dirgt$ python managepy migrate auth$ python managepy migrate admin 0001 --fake$ python managepy migrate admin$ python managepy migrate limits 0001 --fake$ python managepy migrate relaydomains 0001 --fake$ python managepy migrate

4 Finally update static files

$ python managepy collectstatic

This version also introduces a REST API To enable it

1 Add rest_frameworkauthtoken to the INSTALLED_APPS variable

2 Add the following configuration inside settingspy

38 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Rest framework settings

REST_FRAMEWORK = DEFAULT_AUTHENTICATION_CLASSES (

rest_frameworkauthenticationTokenAuthentication)DEFAULT_PERMISSION_CLASSES (

rest_frameworkpermissionsIsAuthenticated)

3 Run the following command

$ python managepy migrate

135

To enhance security Modoboa now checks the strength of user passwords lthttpsgithubcomdstufftdjango-passwordsgt_

To use this feature add the following configuration into the settingspy file

django-passwords

PASSWORD_MIN_LENGTH = 8

PASSWORD_COMPLEXITY = UPPER 1LOWER 1DIGITS 1

132

Modoboa now uses the atomic requests mode to preserve database consistency (reference)

To enable it update the DATABASES variable in settingspy as follows

DATABASES = default

stuff beforeATOMIC_REQUESTS True

amavis

stuff beforeATOMIC_REQUESTS True

130

This release does not bring awesome new features but it is a necessary bridge to the future of Modoboa All extensionsnow have their own git repository and the deploy process has been updated to reflect this change

22 Upgrade 39

Modoboa Documentation Release 1100

Another important update is the use of Django 17 Besides its new features the migration system has been reworkedand is now more robust than before

Before we begin with the procedure here is a table showing old extension names and their new name

Old name New package name New module namemodoboaextensionsadmin modoboa-admin modoboa_adminmodoboaextensionslimits modoboa-admin-limits modoboa_admin_limitsmodoboaextensionspostfix_autoreply modoboa-postfix-autoreply modoboa_postfix_autoreplymodoboaextensionspostfix_relay_domains modoboa-admin-relaydomains modoboa_admin_relaydomainsmodoboaextensionsradicale modoboa-radicale modoboa_radicalemodoboaextensionssievefilters modoboa-sievefilters modoboa_sievefiltersmodoboaextensionsstats modoboa-stats modoboa_statsmodoboaextensionswebmail modoboa-webmail modoboa_webmail

Here are the required steps

1 Install the extensions using pip (look at the second column in the table above)

$ pip install ltthe extensions you wantgt

2 Remove south from INSTALLED_APPS

3 Rename old extension names inside MODOBOA_APPS (look at the third column in the table above)

4 Remove modoboalibmiddlewareExtControlMiddleware from MIDDLEWARE_CLASSES

5 Change DATABASE_ROUTERS to

DATABASE_ROUTERS = [modoboa_amavisdbrouterAmavisRouter]

6 Run the following commands

$ cd ltmodoboa_instance_dirgt$ python managepy migrate

7 Reply yes to the question

8 Run the following commands

$ python managepy load_initial_data$ python managepy collectstatic

9 The cleanup job has been renamed in Django so you have to modify your crontab entry

- 0 0 ltmodoboa_sitegtmanagepy cleanup+ 0 0 ltmodoboa_sitegtmanagepy clearsessions

120

A new notification service let administrators know about new Modoboa versions To activate it you need to updatethe TEMPLATE_CONTEXT_PROCESSORS variable like this

from djangoconf import global_settings

TEMPLATE_CONTEXT_PROCESSORS = global_settingsTEMPLATE_CONTEXT_PROCESSORS + (

(continues on next page)

40 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

modoboacorecontext_processorstop_notifications)

and to define the new MODOBOA_API_URL variable

MODOBOA_API_URL = httpapimodoboaorg1

The location of external static files has changed To use them add a new path to the STATICFILES_DIRS

Additional locations of static filesSTATICFILES_DIRS = (

Put strings here like homehtmlstatic or Cwwwdjangostatic Always use forward slashes even on Windows Dont forget to use absolute paths not relative pathsltpathtomodoboainstalldirgtbower_components

)

Run the following commands to define the hostname of your instance

$ cd ltmodoboa_instance_dirgt$ python managepy set_default_site lthostnamegt

If you plan to use the Radicale extension

1 Add modoboaextensionsradicale to the MODOBOA_APPS variable

2 Run the following commands

$ cd ltmodoboa_instance_dirgt$ python managepy syncdb

Warning You also have to note that the sitestatic directory has moved from ltpath to your sitesdirgt to ltmodoboas root urlgt (itrsquos probably the parent directory) You have to adapt your web serverconfiguration to reflect this change

23 Configuration

231 Online parameters

Modoboa provides online panels to modify internal parameters There are two available levels

bull Application level global parameters define how the application behaves Available at Modoboa gt Parameters

bull User level per user customization Available at User gt Settings gt Preferences

Regardless level parameters are displayed using tabs each tab corresponding to one application

General parameters

The admin application exposes several parameters they are presented below

23 Configuration 41

Modoboa Documentation Release 1100

Name Tab Description Default valueAuthentication type General The backend used for au-

thenticationLocal

Default password scheme General Scheme used to cryptmailbox passwords

crypt

Rounds General Number of rounds (onlyused by sha256cryptand sha512crypt) Mustbe between 1000 and999999999 inclusive

70000

Secret key General A key used to encryptusersrsquo password in ses-sions

random value

Sender address General Email address used tosend notifications

Enable communication General Enable communicationwith Modoboa public API

yes

Check new versions General Automatically checks if anewer version is available

yes

Send statistics General Send statistics to Mod-oboa public API (countersand used extensions)

yes

Top notifications check in-terval

General Interval between two topnotification checks (inseconds)

30

Maximum log record age General The maximum age in daysof a log record

365

Items per page General Number of displayeditems per page

30

Default top redirection General The default redirectionused when no applicationis specified

userprefs

Enable MX checks Admin Check that every domainhas a valid MX record

yes

Valid MXs Admin A list of IP or networkaddress every MX shouldmatch A warning will besent if a record does notrespect this it

Enable DNSBL checks Admin Check every domainagainst major DNSBLproviders

yes

DKIM keys storage direc-tory

AdminPath to a directory where DKIM

generated keys willbe stored

Default DKIM key length Admin The default size (in bits)for new keys

2048

Handle mailboxes onfilesystem

Admin Rename or remove mail-boxes on the filesystemwhen they get renamed orremoved within Modoboa

no

Mailboxes owner Admin The UNIX account whoowns mailboxes on thefilesystem

vmail

Default domain quota Admin Default quota (in MB) ap-plied to freshly createddomains with no valuespecified A value of 0means no quota

0

Automatic accountremoval

Admin When a mailbox is re-moved also remove theassociated account

no

Automatic do-mainmailbox creation

Admin Create a domain and amailbox when an accountis automatically created

yes

42 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Note If you are not familiar with virtual domain hosting you should take a look at postfixrsquos documentation ThisHow to also contains useful information

Note A random secret key will be generated each time the Parameters page is refreshed and until you save parametersat least once

Note Specific LDAP parameters are also available see LDAP authentication

232 Media files

Modoboa uses a specific directory to upload files (ie when the webmail is in use) or to create ones (ex graphical statis-tics) This directory is named media and is located inside modoboarsquos installation directory (called modoboa_sitein this documentation)

To work properly the system user which runs modoboa (www-data apache whatever) must have write access tothis directory

233 Customization

Custom logo

You have the possibility to use a custom logo instead of the default one on the login page

To do so open the settingspy file and add a MODOBOA_CUSTOM_LOGO variable This variable must containthe relative URL of your logo under MEDIA_URL For example

MODOBOA_CUSTOM_LOGO = ospathjoin(MEDIA_URL custom_logopng)

Then copy your logo file into the directory indicated by MEDIA_ROOT

234 Host configuration

Note This section is only relevant when Modoboa handles mailboxes renaming and removal from the filesystem

To manipulate mailboxes on the filesystem you must allow the user who runs Modoboa to execute commands as theuser who owns mailboxes

To do so edit the etcsudoers file and add the following inside

ltuser_that_runs_modoboagt ALL=(ltmailboxes ownergt) NOPASSWD ALL

Replace values between ltgt by the ones you use

23 Configuration 43

Modoboa Documentation Release 1100

235 Time zone and language

Modoboa is available in many languages

To specify the default language to use edit the settingspy file and modify the LANGUAGE_CODE variable

LANGUAGE_CODE = fr or en for english etc

Note Each user has the possibility to define the language he prefers

In the same configuration file specify the timezone to use by modifying the TIME_ZONE variable For example

TIME_ZONE = EuropeParis

236 Sessions management

Modoboa uses Djangorsquos session framework to store per-user information

Few parameters need to be set in the settingspy configuration file to make Modoboa behave as expected

SESSION_EXPIRE_AT_BROWSER_CLOSE = False Default value

This parameter is optional but you must ensure it is set to False (the default value)

The default configuration file provided by the modoboa-adminpy command is properly configured

237 Logging authentication

To trace login attempts to the web interface Modoboa uses python SysLogHandler so you can see them in your syslogauthentication log file (varlogauthlog in most cases)

Depending on your configuration you may have to edit the settingspy file and add lsquoaddressrsquo lsquodevlogrsquo to thelogging section

syslog-auth class logginghandlersSysLogHandlerfacility SysLogHandlerLOG_AUTHaddress devlogformatter syslog

238 External authentication

LDAP

Modoboa supports external LDAP authentication using the following extra components

bull Python LDAP client

bull Django LDAP authentication backend

If you want to use this feature you must first install those components

44 Chapter 2 Table of contents

Modoboa Documentation Release 1100

$ pip install python-ldap django-auth-ldap

Then all you have to do is to modify the settingspy file Add a new authentication backend to the AUTHENTI-CATION_BACKENDS variable like this

AUTHENTICATION_BACKENDS = (modoboalibauthbackendsLDAPBackend modoboalibauthbackendsLDAPSecondaryBackend Useful for a fallback

rarr˓mechanismdjangocontribauthbackendsModelBackend

)

Finally go to Modoboa gt Parameters gt General and set Authentication type to LDAP

From there new parameters will appear to let you configure the way Modoboa should connect to your LDAP serverThey are described just below

Name Description De-faultvalue

Server address The IP address of the DNS name of the LDAP server local-host

Server port The TCP port number used by the LDAP server 389Use a secureconnection

Use an SSLTLS connection to access the LDAP server no

Authenticationmethod

Choose the authentication method to use Directbind

User DN tem-plate (directbind mode)

The template used to construct a userrsquos DN It should contain one placeholder (ie(user)s)

Bind BN The distinguished name to use when binding to the LDAP server Leave empty for ananonymous bind

Bind password The password to use when binding to the LDAP server (with lsquoBind DNrsquo)Search base The distinguished name of the search baseSearch filter An optional filter string (eg lsquo(objectClass=person)rsquo) In order to be valid it must be

enclosed in parentheses(mail=(user)s)

Passwordattribute

The attribute used to store user passwords user-Pass-word

Active Direc-tory

Tell if the LDAP server is an Active Directory one no

Administratorgroups

Members of those LDAP Posix groups will be created ad domain administrators Uselsquorsquo characters to separate groups

Group type The type of group used by your LDAP directory Posix-Group

Groups searchbase

The distinguished name of the search base used to find groups

Do-mainmailboxcreation

Automatically create a domain and a mailbox when a new user is created just after thefirst successful authentication You will generally want to disable this feature whenthe relay domains extension is in use

yes

If you need additional parameters you will find a detailed documentation here

Once the authentication is properly configured the users defined in your LDAP directory will be able to connect to

23 Configuration 45

Modoboa Documentation Release 1100

Modoboa the associated domain and mailboxes will be automatically created if needed

The first time a user connects to Modoboa a local account is created if the LDAP username is a valid email addressBy default this account belongs to the SimpleUsers group and it has a mailbox

To automatically create domain administrators you can use the Administrator groups setting If a LDAP user belongsto one the listed groups its local account will belong to the DomainAdmins group In this case the username is notnecessarily an email address

Users will also be able to update their LDAP password directly from Modoboa

Note Modoboa doesnrsquot provide any synchronization mechanism once a user is registered into the database Anymodification done from the directory to a user account will not be reported to Modoboa (an email address change forexample) Currently the only solution is to manually delete the Modoboa record it will be recreated on the next userlogin

SMTP

It is possible to use an existing SMTP server as an authentication source To enable this feature edit the settingspy file and change the following setting

AUTHENTICATION_BACKENDS = (modoboalibauthbackendsSMTPBackenddjangocontribauthbackendsModelBackend

)

SMTP server location can be customized using the following settings

AUTH_SMTP_SERVER_ADDRESS = localhostAUTH_SMTP_SERVER_PORT = 25AUTH_SMTP_SECURED_MODE = None ssl or starttls are accepted

239 LDAP synchronization

Modoboa can synchronize accounts with an LDAP directory (tested with OpenLDAP) but this feature is not enabledby default To activate it add modoboaldapsync to MODOBOA_APPS in the settingspy file

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboaldapsync

)

and enable it from the admin panel

46 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning Make sure to install additional requirements otherwise it wonrsquot work

The following parameters are available and must be filled

Name Description Defaultvalue

Enable LDAP synchro-nization

Control LDAP synchronization state no

Bind DN The DN of a user with write permission to createupdate accountsBind password The associated passwordAccount DN template The template used to build account DNs (must contain a (user)s

placeholder

2310 Database maintenance

Cleaning the logs table

Modoboa logs administrator specific actions into the database A clean-up script is provided to automatically removeoldest records The maximum log record age can be configured through the online panel

To use it you can setup a cron job to run every night

0 0 ltmodoboa_sitegtmanagepy cleanlogs Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy cleanlogs

Cleaning the session table

Django does not provide automatic purging Therefore itrsquos your job to purge expired sessions on a regular basis

Django provides a sample clean-up script django-adminpy clearsessions That script deletes any sessionin the session table whose expire_date is in the past

For example you could setup a cron job to run this script every night

0 0 ltmodoboa_sitegtmanagepy clearsessions Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy clearsessions

Cleaning inactive accounts

Thanks to Last-login tracking it is now possible to monitor inactive accounts An account is considered inactive if nologin has been recorded for the last 30 days (this value can be changed through the admin panel)

A management command is available to disable or delete inactive accounts For example you could setup a cron jobto run it every night

23 Configuration 47

Modoboa Documentation Release 1100

0 0 ltmodoboa_sitegtmanagepy clean_inactive_accounts Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy clean_inactive_rarr˓accounts

The default behaviour is to disable accounts You can delete them using the --delete option

24 Moving to Modoboa

You have an existing platform and yoursquod like to move to Modoboa the following tools could help you

241 From postfixadmin

A dedicated command allows you to convert an existing postfixadmin database to a Modoboa one Consult the docu-mentation to know more about the process

242 Using CSV files

Modoboa allows you to import any object (domain domain alias mailbox and alias) using a simple CSV file encodedusing UTF8 Each line corresponds to a single object and must respect one of the following format

domain ltname stringgt ltquota integergt ltdefault mailbox quota integergt ltenabledrarr˓booleangtdomainalias ltname stringgt lttargeted domain stringgt ltenabled booleangtrelaydomain ltname stringgt lttarget host stringgt lttarget port integergt ltservicerarr˓stringgt ltenabled booleangt ltverify recipients booleangtaccount ltloginname stringgt ltpassword stringgt ltfirst name stringgt ltlast namerarr˓stringgt ltenabled booleangt ltgroup stringgt ltaddress stringgt ltquota integergt [rarr˓ltdomain stringgt ]alias ltaddress stringgt ltenabled booleangt ltrecipient stringgt

Boolean fields accept the following values true 1 yes y (case insensitive) Any other value will be evaluated asfalse

Warning The order does matter Objects are created sequencially so a domain must be created before itsmailboxes and aliases and a mailbox must created before its alias(es)

To actually import such a file

gt sudo -u ltmodoboa_usergt -igt source ltvirtualenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy modo import ltyour filegt

Available options can be listed using the following command

gt python managepy modo import -h

48 Chapter 2 Table of contents

Modoboa Documentation Release 1100

25 REST API

To ease the integration with external sources (software or other) Modoboa provides a REST API

Every installed instance comes with a ready-to-use API and a documentation You will find them using the followingurl patterns

bull API httplthostnamegtapiv1

bull Documentation httplthostnamegtdocsapi

An example of this documentation is available on the official demo

Using this API requires an authentication and for now only a token based authentication is supported To get a validtoken log-in to your instance with a super administrator go to Settings gt API and activate the API access Press theUpdate button and wait until the page is reloaded the token will be displayed

To make valid API calls every requests you send must embed this token within an Authorization HTTP header likethis

Authorization Token ltYOUR_TOKENgt

and the content type of those requests must be applicationjson

26 How to contribute

Contributions are always welcome If you want to submit a patch please respect the following rules

bull Open a pull request on the appropriate repository

bull Respect PEP8

bull Document your patch and respect PEP 257

bull Add unit tests and make sure the global coverage does not decrease

If all those steps are validated your contribution will generally be integrated

261 Table of contents

25 REST API 49

Modoboa Documentation Release 1100

Useful tips

You would like to work on Modoboa but you donrsquot know where to start Yoursquore at the right place Browse this pageto learn useful tips

Docker

A docker image is available for developers To use it you must install docker and docker-compose first

Then just run the following command

$ docker-compose up

It will start the docker environment and make a Modoboa instance available at httplocalhost8000

If you donrsquot want to use docker or need a more complex development setup go to the next section

Prepare a virtual environment

A virtual environment is a good way to setup a development environment on your machine

To do so run the following commands

$ python3 -m venv ltpathgt$ source ltpathgtbinactivate$ git clone httpsgithubcommodoboamodoboagit$ cd modoboa$ python setuppy develop$ pip install -r dev-requirementstxt

The develop command creates a symbolic link to your local copy so any modification you make will be automati-cally available in your environment no need to copy them

Deploy an instance for development

Warning Make sure to create a database before running this step The format of the database url is also describedin this page

Now that you have a running environment yoursquore ready to deploy a test instance

$ cd ltpathgt$ modoboa-adminpy deploy --dburl defaultltdatabase urlgt --domain localhost --develrarr˓instance$ python managepy runserver

Yoursquore ready to go You should be able to access Modoboa at httplocalhost8000 usingadminpassword as credentials

Manage static files

Modoboa uses bower (thanks to django-bower) to manage its CSS and javascript dependencies

50 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Those dependencies are listed in a file called dev_settingspy located inside the ltpath_to_local_copygtmodoboacore directory

If you want to add a new dependency just complete the BOWER_INSTALLED_APPS parameter and run the followingcommand

$ python managepy bower install

It will download and store the required files into the ltpath_to_local_copygtmodoboabower_components directory

Test your modifications

If you deployed a specific instance for your development needs you can run the tests suite as follows

gt python managepy test modoboacore modoboalib modoboaadmin modoboalimits modoboararr˓relaydomains

Otherwise you can run the tests suite from the repository using tox

Start a basic Modoboa instance

From the repository run the following command to launch a simple instance with a few fixtures

gt tox -e serve

You can use adminpassword to log in

Build the documentation

If you need to modify the documenation and want to see the result you can build it as follows

gt tox -e docgt firefox toxdoctmphtmlindexhtml

FAQ

bower command is missing in managepy

bower command is missing in managepy if you donrsquot use the --devel option of the modoboa-adminpydeploy command

To fix it regenerate your instance or update your settingspy file manually Look at devmode in httpsgithubcomtonioomodoboablobmastermodoboacorecommandstemplatessettingspytpl

Create a new plugin

Introduction

Modoboa offers a plugin API to expand its capabilities The current implementation provides the following possibili-ties

26 How to contribute 51

Modoboa Documentation Release 1100

bull Expand navigation by adding entry points to your plugin inside the GUI

bull Access and modify administrative objects (domains mailboxes etc)

bull Register callback actions for specific events

Plugins are nothing more than Django applications with an extra piece of code that integrates them into Modoboa Themodo_extensionpy file will contain a complete description of the plugin

bull Admin and user parameters

bull Custom menu entries

The communication between both applications is provided by Django signals

The following subsections describe the plugin architecture and explain how you can create your own

The required glue

To create a new plugin just start a new django application like this (into Modoboarsquos directory)

$ python managepy startapp

Then you need to register this application using the provided API Just copypaste the following example into themodo_extensionpy file of the future extension

from modoboacoreextensions import ModoExtension exts_pool

class MyExtension(ModoExtension)My custom Modoboa extension

name = myextlabel = My Extensionversion = 01description = A descriptionurl = myext_root_location optional name is used if not defined

def load(self)This method is called when Modoboa loads available and activated plugins

Declare parameters and register events herepass

def load_initial_data(self)Optional provide initial data for your extension herepass

exts_poolregister_extension(MyExtension)

Once done simply add your extensionrsquos module name to the MODOBOA_APPS variable located inside settingspy Finally run the following commands

$ python managepy migrate$ python managepy load_initial_data$ python managepy collectstatic

52 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Parameters

A plugin can declare its own parameters There are two levels available

bull lsquoGlobalrsquo parameters used to configure the plugin editable inside the Admin gt Settings gt Parameters page

bull lsquoUserrsquo parameters per-user parameters (or preferences) editable inside the Options gt Preferences page

Playing with parameters

Parameters are defined using Django forms and Modoboa adds two special forms you can inherit depending on thelevel of parameter(s) you want to add

bull modoboaparametersformsAdminParametersForm for general parameters

bull modoboaparametersformsUserParametersForm for user parameters

To register new parameters add the following line into the load method of your plugin class

from modoboaparameters import tools as param_toolsparam_toolsregistryadd(

LEVEL YourForm ugettext_lazy(Title))

Replace LEVEL by global or user

Custom role permissions

Modoboa uses Djangorsquos internal permission system Administrative roles are nothing more than groups (Groupinstances)

An extension can add new permissions to a group by listening to the extra_role_permissions signal Here isan example

from djangodispatch import receiverfrom modoboacore import signals as core_signals

PERMISSIONS = Resellers [

(relaydomains relaydomain add_relaydomain)(relaydomains relaydomain change_relaydomain)(relaydomains relaydomain delete_relaydomain)(relaydomains service add_service)(relaydomains service change_service)(relaydomains service delete_service)

]

receiver(core_signalsextra_role_permissions)def extra_role_permissions(sender role kwargs)

Add permissions to the Resellers groupreturn constantsPERMISSIONSget(role [])

Extending admin forms

The forms used to edit objects (account domain etc) through the admin panel are composed of tabs You can extendthem (ie add new tabs) in a pretty easy way thanks to custom signals

26 How to contribute 53

Modoboa Documentation Release 1100

Account

To add a new tab to the account edition form define new listeners (handlers) for the following signals

bull modoboaadminsignalsextra_account_forms

bull modoboaadminsignalsget_account_form_instances

bull modoboaadminsignalscheck_extra_account_form (optional)

Example

from djangodispatch import receiverfrom modoboaadmin import signals as admin_signals

receiver(admin_signalsextra_account_forms)def extra_account_form(sender user account kwargs)

return [id tabid title Title cls MyFormClass

]

receiver(admin_signalsget_account_form_instances)def fill_my_tab(sender user account kwargs)

return id my_instance

Domain

To add a new tab to the domain edition form define new listeners (handlers) for the following signals

bull modoboaadminsignalsextra_domain_forms

bull modoboaadminsignalsget_domain_form_instances

Example

from djangodispatch import receiverfrom modoboaadmin import signals as admin_signals

receiver(admin_signalsextra_domain_forms)def extra_account_form(sender user domain kwargs)

return [id tabid title Title cls MyFormClass

]

receiver(admin_signalsget_domain_form_instances)def fill_my_tab(sender user domain kwargs)

return id my_instance

27 Contributors

bull Antidot

bull Bearstech

bull CAP-REL

54 Chapter 2 Table of contents

Modoboa Documentation Release 1100

bull Dalnix

27 Contributors 55

  • Overview
  • Table of contents
Page 25: Modoboa Documentation

Modoboa Documentation Release 1100

binsh

psql -c UPDATE core_user SET last_login=now() WHERE username=$USER gt devnull

exec $

MySQL

binsh

DBNAME=XXXDBUSER=XXXDBPASSWORD=XXX

echo UPDATE core_user SET last_login=now() WHERE username=$USER | mysql -urarr˓$DBUSER -p$DBPASSWORD $DBNAME

exec $

Postfix

This section gives an example about building a simple virtual hosting configuration with Postfix Refer to the officialdocumentation for more explanation

Map files

You first need to create configuration files (or map files) that will be used by Postfix to lookup into Modoboa tables

To automaticaly generate the requested map files and store them in a directory run the following command

gt cd ltmodoboa_instance_pathgtgt python managepy generate_postfix_maps --destdir ltdirectorygt

ltdirectorygt is the directory where the files will be stored Answer the few questions and yoursquore done

Configuration

Use the following configuration in the etcpostfixmaincf file (this is just one possible configuration)

Stuff beforevirtual_transport = lmtpunixprivatedovecot-lmtp

virtual_mailbox_domains = ltdrivergtetcpostfixsql-domainscfvirtual_alias_domains = ltdrivergtetcpostfixsql-domain-aliasescfvirtual_alias_maps = ltdrivergtetcpostfixsql-aliasescf

relay_domains = ltdrivergtetcpostfixsql-relaydomainscftransport_maps =

ltdrivergtetcpostfixsql-transportcfltdrivergtetcpostfixsql-spliteddomains-transportcf

(continues on next page)

22 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

smtpd_recipient_restrictions = check_recipient_access

ltdrivergtetcpostfixsql-maintaincfltdrivergtetcpostfixsql-relay-recipient-verificationcf

permit_mynetworksreject_unauth_destinationreject_unverified_recipient

smtpd_sender_login_maps = ltdrivergtetcpostfixsql-sender-login-mapcf

smtpd_sender_restrictions =reject_sender_login_mismatch

Stuff after

Replace ltdrivergt by the name of the database you use

Restart Postfix

Policy daemon

If you want to enable the built-in policy daemon add the following content to the etcpostfixmaincf file

smtpd_recipient_restrictions = check_policy_service inet1270019999

And reload postfix

Note The check_policy_service line must be placed before the permit_mynetworks one otherwise thedaemon wonrsquot be called

OpenDKIM

Modoboa can generate DKIM keys for the hosted domains but it wonrsquot sign or check messages To do that you needa dedicated software like OpenDKIM

Note The cron job in charge of creating DKIM keys must be run using the same user than OpenDKIM (ie opendkimin most cases)

Database

Since keys related information is stored in Modoboarsquos database you need to tell OpenDKIM how it can access it

First make sure to install the required additional packages on your system (libopendbx1- on debian baseddistributions or opendbx- on CentOS the complete name depends on your database engine)

Then insert the following SQL view into Modoboarsquos database

21 Installation 23

Modoboa Documentation Release 1100

PostgreSQL

CREATE OR REPLACE VIEW dkim AS (SELECT id name as domain_name dkim_private_key_path AS private_key_path

dkim_key_selector AS selectorFROM admin_domain WHERE enable_dkim

)

MySQLMariaDB

CREATE OR REPLACE VIEW dkim AS (SELECT id name as domain_name dkim_private_key_path AS private_key_path

dkim_key_selector AS selectorFROM admin_domain WHERE enable_dkim=1

)

Configuration

You should find OpenDKIMrsquos configuration file at etcopendkimconf

Add the following content to it

KeyTable dsnltdrivergtltusergtltpasswordgtltdb hostgtltdb namegttable=dkimrarr˓keycol=iddatacol=domain_nameselectorprivate_key_pathSigningTable dsnltdrivergtltusergtltpasswordgtltdb hostgtltdb namegttable=dkimrarr˓keycol=domain_namedatacol=idSocket inet12345localhost

Replace values between ltgt by yours Accepted values for driver are pgsql or mysql Make sure the user youspecify has read permission on the view created previously

If you run a debian based system make sure to adjust the following setting in the etcdefaultopendkim file

SOCKET=inet12345localhost

Eventually reload OpenDKIM

Postfix integration

Add the following lines to the etcpostfixmaincf file

smtpd_milters = inet12700112345non_smtpd_milters = inet12700112345milter_default_action = acceptmilter_content_timeout = 30s

and reload postfix

Extensions

Only few commands are needed to add a new extension to your setup

24 Chapter 2 Table of contents

Modoboa Documentation Release 1100

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install ltEXTENSIONgt==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Then restart your web server

22 Upgrade

221 Modoboa

Warning The new version you are going to install may need to modify your database Before you start makesure to backup everything

Most of the time upgrading your installation to a newer Modoboa version only requires a few actions In every caseyou will need to apply the general procedure first and then check if the version you are installing requires specificactions

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install modoboa==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Once done check if the version you are installing requires Specific instructions

Finally restart your web server

Sometimes you might need to upgrade postfix map files too To do so just run the generate_postfix_mapscommand on the same directory than the one used for installation (etcpostfix by default)

Make sure to use root privileges and run the following command

gt python managepy generate_postfix_maps --destdir ltdirectorygt

Then reload postfix

22 Upgrade 25

Modoboa Documentation Release 1100

222 Extensions

If a new version is available for an extension yoursquore using it is recommanded to install it Upgrading an extensions ispretty and the procedure is almost the same than the one used for Modoboa

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install ltEXTENSIONgt==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Finally restart your web server

It is a generic upgrade procedure which will be enough most of the time but it is generally a good idea to check theassociated documentation

223 Rebuild Virtual Environment

Sometimes when upgrading your Operating System (eg from Ubuntu 1704 to Ubuntu 1710) your virtual environmentrunning modoboa can get corrupted Your first response will be to panic but fear not The solution is in this document

First things first

Recover your database password

You will need to recover your database password (if using mysql or postgresql) You will find this in etcpostfixsql-aliasescf or any file with sql-cf in the etcpostfix directory

Make note of this as you will need it when reconfiguring modoboa

Reinstall Modoboa

Start out by backup up your modoboa settings file located in the modoboa instance directory (srvmodoboainstanceinstancesettingspy if you used the default installer configuration) This contains your currentconfiguration

Next you want to remove all current modoboa files

After doing this follow the manual installation instructions for Modoboa only as everything should be working prop-erly

After this completes simply restore your backed up settings file to srvinstanceinstancesettingspy(if you used installer default configuration) You will then need to reinstall your extensions

You can find which plugins you had in your settingspy file under the MODOBOA_APPS variable

Instructions to install extensions can also be found here

Once you have completed this step you will need to run the following commands

26 Chapter 2 Table of contents

Modoboa Documentation Release 1100

gt (env) $ cd ltinstance_dirgtgt (env) $ python managepy migrategt (env) $ python managepy collectstatic

You will then see a message similar to

You have requested to collect static files at the destinationlocation as specified in your settings

srvmodoboainstancesitestatic

This will overwrite existing filesAre you sure you want to do this

Type yes to continue or no to cancel

You will want to answer yes here then simply restart the uwsgi process with service uwsgi restart andyou should be up and running again

Simply log into your modoboa web panel and verify that your extensions and webmail box is working

224 Information

Rebuild instructions from httpshelppythonanywherecompagesRebuildingVirtualenvs

225 Specific instructions

1160

A new policy daemon has been added

Make sure to have a Redis instance running on your server

Add modoboapolicyd to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboapolicyd

)

Add the following settings to your settingspy file

REDIS_HOST = ltIP or hostname heregtREDIS_PORT = 6379REDIS_QUOTA_DB = 0REDIS_URL = redisformat(REDIS_HOST REDIS_PORT REDIS_QUOTA_DB)

Once done you can start the policy daemon using the following commands

22 Upgrade 27

Modoboa Documentation Release 1100

gt python managepy policy_daemon

Donrsquot forget to configure _policyd_config if you want to use this feature

The modoboa-stats plugin has been merged into the core

Add modoboamaillog to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboapolicydmodoboamaillog

)

And remove any reference to modoboa_stats in this same variable

1150

This version drops Python 2 support so donrsquot forget to update all the extensions you use

Warning If you upgrade an existing python 2 installation you will need to create a new Python 3 virtualenvironment You can remove the existing virtual environment and replace it by the new one so you wonrsquot have tomodify your configuration files

Add the following new setting

DISABLE_DASHBOARD_EXTERNAL_QUERIES = False

Reload uwsgigunicornapache depending on your setup

Finally Make sure to use root privileges and run the following command

gt python managepy generate_postfix_maps --destdir ltdirectorygt

Then reload postfix

1140

This release introduces an optional LDAP synchronization process If you want to use it please follow the dedicatedprocedure

1131

Upgrade postfix maps files as follows

28 Chapter 2 Table of contents

Modoboa Documentation Release 1100

gt python managepy generate_postfix_maps --destdir ltpathgt --force-overwrite

1130

Add modoboadnstools to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstools

)

Add the following new settings

CSRF_COOKIE_SECURE = TrueSESSION_COOKIE_SECURE = True

modoboa-postfix-autoreply 150

Edit the etcpostfixmaincf file and remove the sql-autoreplies-transportcf map from thetransport_maps if present Remove the corresponding proxy_read_maps entry if relevant

Reload postfix

1100

Warning Upgrade installed extensions BEFORE running check or migrate commands

Upgrade all your installed plugins to the following versions

Warning If you use the amavis plugin make sure to include its configuration as follows into settingspy

from modoboa_amavis import settings as modoboa_amavis_settingsmodoboa_amavis_settingsapply(globals())

22 Upgrade 29

Modoboa Documentation Release 1100

Name Versionmodoboa-amavis 120modoboa-contacts 050modoboa-dmarc 110modoboa-imap-migration 120modoboa-pdfcredentials 130modoboa-postfix-autoreply 140modoboa-radicale 120modoboa-sievefilters 140modoboa-stats 140modoboa-webmail 140

Edit the settingspy file and apply the following modifications

Add modoboatransport to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparameters

)

Replace the following line

MIDDLEWARE_CLASSES = (

by

MIDDLEWARE = (

Update postfix map files as follows

gt rm -f ltpathgtmodoboa-postfix-mapschkgt python managepy generate_postfix_maps --force --destdir ltpathgt

Then modify postfixrsquos configuration as follows

smtpd_sender_login_maps =ltdrivergtltpathgtsql-sender-login-mapcf

transport_maps =ltdrivergtltpathgtsql-transportcfltdrivergtltpathgtsql-spliteddomains-transportcf other map files

Replace ltdrivergt and ltpathgt by your values

If transport_maps contains sql-relaydomains-transportcf remove it

30 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning If you make use of postfixrsquos proxymap server you must also update the proxy_read_maps setting

Reload postfix

Add the following cron job in order to generate DKIM keys

Generate DKIM keys (they will belong to the user running this job)

root $PYTHON $INSTANCEmanagepy modorarr˓manage_dkim_keys

190

If you want to manage inactive accounts look at Cleaning inactive accounts

183

Edit the settingspy file and replace the following line

BASE_DIR = ospathdirname(ospathdirname(__file__))

by

BASE_DIR = ospathrealpath(ospathdirname(ospathdirname(__file__)))

180

Modoboa now relies on Djangorsquos builtin password validation system to validate user passwords instead ofdjango-passwords

Remove django-passwords from your system

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt pip uninstall django-passwords

Edit the settingspy file and remove the following content

django-passwords

PASSWORD_MIN_LENGTH = 8

PASSWORD_COMPLEXITY = UPPER 1LOWER 1DIGITS 1

Add the following lines

Password validation rulesAUTH_PASSWORD_VALIDATORS = [

NAME djangocontribauthpassword_validation

rarr˓UserAttributeSimilarityValidator (continues on next page)

22 Upgrade 31

Modoboa Documentation Release 1100

(continued from previous page)

NAME djangocontribauthpassword_validationMinimumLengthValidator

NAME djangocontribauthpassword_validationCommonPasswordValidator

NAME djangocontribauthpassword_validationNumericPasswordValidator

NAME modoboacorepassword_validationComplexityValidatorOPTIONS

upper 1lower 1digits 1specials 0

]

172

API documentation has evolved (because of the upgrade to Django Rest Framework 36) and CKeditor is now embed-ded by default (thanks to the django-ckeditor package) Some configuration changes are required

Edit your settingspy file and apply the following modifications

bull Update the INSTALLED_APPS variable as follows

INSTALLED_APPS = (djangocontribauthdjangocontribcontenttypesdjangocontribsessionsdjangocontribmessagesdjangocontribsitesdjangocontribstaticfilesreversionckeditorckeditor_uploaderrest_frameworkrest_frameworkauthtoken

)

bull Update the REST_FRAMEWORK variable as follows

REST_FRAMEWORK = DEFAULT_AUTHENTICATION_CLASSES (

rest_frameworkauthenticationTokenAuthenticationrest_frameworkauthenticationSessionAuthentication

)

bull Remove the SWAGGER_SETTINGS variable

bull Add the following content

32 Chapter 2 Table of contents

Modoboa Documentation Release 1100

CKeditor

CKEDITOR_UPLOAD_PATH = uploads

CKEDITOR_IMAGE_BACKEND = pillow

CKEDITOR_RESTRICT_BY_USER = True

CKEDITOR_BROWSE_SHOW_DIRS = True

CKEDITOR_ALLOW_NONIMAGE_FILES = False

CKEDITOR_CONFIGS = default

allowedContent Truetoolbar Modoboawidth Nonetoolbar_Modoboa [

[Bold Italic Underline][JustifyLeft JustifyCenter JustifyRight JustifyBlock][BidiLtr BidiRtl Language][NumberedList BulletedList - Outdent Indent][Undo Redo][Link Unlink Anchor - Smiley][TextColor BGColor - Source][Font FontSize][Image ][SpellChecker]

]

Donrsquot forget to run the following command

gt python managepy collectstatic

171

If you used 170 for a fresh installation please run the following commands

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy load_initial_data

170

This version requires Django gt= 110 so you need to make some modifications It also brings internal API changeswhich are not backward compatible so installed extensions must be upgraded too

First of all deactivate all installed extensions (edit the settingspy file and comment the corresponding lines inMODOBOA_APPS)

Edit the urlspy file of your local instance and replace its content by the following one

22 Upgrade 33

Modoboa Documentation Release 1100

from djangoconfurls import include url

urlpatterns = [url(r include(modoboaurls))

]

Edit the settingspy and apply the following changes

bull Add modoboaparameters to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboarelaydomainsmodoboalimitsmodoboaparameters Modoboa extensions here

)

bull Add modoboacoremiddlewareLocalConfigMiddleware to MIDDLEWARE_CLASSES

MIDDLEWARE_CLASSES = (djangocontribsessionsmiddlewareSessionMiddlewaredjangomiddlewarecommonCommonMiddlewaredjangomiddlewarecsrfCsrfViewMiddlewaredjangocontribauthmiddlewareAuthenticationMiddlewaredjangocontribmessagesmiddlewareMessageMiddlewaredjangomiddlewarelocaleLocaleMiddlewaredjangomiddlewareclickjackingXFrameOptionsMiddlewaremodoboacoremiddlewareLocalConfigMiddlewaremodoboalibmiddlewareAjaxLoginRedirectmodoboalibmiddlewareCommonExceptionCatchermodoboalibmiddlewareRequestCatcherMiddleware

)

bull Modoboa used to provide a custom authentication backend (modoboalibauthbackendsSimpleBackend) but it has been removed Replace it as follows

AUTHENTICATION_BACKENDS = ( Other backends beforedjangocontribauthbackendsModelBackend

)

bull Remove TEMPLATE_CONTEXT_PROCESSORS and replace it by

TEMPLATES = [

BACKEND djangotemplatebackendsdjangoDjangoTemplatesDIRS []APP_DIRS TrueOPTIONS

context_processors [djangotemplatecontext_processorsdebugdjangotemplatecontext_processorsrequestdjangocontribauthcontext_processorsauth

(continues on next page)

34 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

djangotemplatecontext_processorsi18ndjangotemplatecontext_processorsmediadjangotemplatecontext_processorsstaticdjangotemplatecontext_processorstzdjangocontribmessagescontext_processorsmessagesmodoboacorecontext_processorstop_notifications

]debug False

]

Run the following commands (load virtualenv if you use one)

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstatic

Finally upgrade your extensions and reactivate them

Name Versionmodoboa-amavis 110modoboa-dmarc 100modoboa-imap-migration 110modoboa-pdfcredentials 110modoboa-postfix-autoreply 120modoboa-radicale 110modoboa-sievefilters 110modoboa-stats 110modoboa-webmail 110

Command line shortcuts

$ pip install modoboa-amavis==110$ pip install modoboa-dmarc==100$ pip install modoboa-imap-migration==110$ pip install modoboa-pdfcredentials==110$ pip install modoboa-postfix-autoreply==120$ pip install modoboa-radicale==110$ pip install modoboa-sievefilters==110$ pip install modoboa-stats==110$ pip install modoboa-webmail==110

And please make sure you use the latest version of the django-versionfield2 package

$ pip install -U django-versionfield2

Notes about quota changes and resellers

Reseller users now have a quota option in Resources tab This is the quota that a reseller can share between all itsdomains

22 Upgrade 35

Modoboa Documentation Release 1100

There are two quotas for a domain in the new version

1 Quota amp

2 Default mailbox quota

[1] Quota quota shared between mailboxes This quota is shared between all the mailboxes of this domain This valuecannot exceed resellerrsquos quota and hence cannot be 0(unlimited) if reseller has finite quota

[2] Default mailbox quota default quota applied to mailboxes This quota is the default quota applied to new mail-boxes This value cannot exceed Quota[1] and hence cannot be 0(unlimited) if Quota[1] is finite

161

First of all update postfix map files as follows

gt python managepy generate_postfix_maps --destdir ltpathgt --force-overwrite

Then modify postfixrsquos configuration as follows

smtpd_sender_login_maps =ltdrivergtltpathgtsql-sender-login-mailboxescfltdrivergtltpathgtsql-sender-login-aliasescfltdrivergtltpathgtsql-sender-login-mailboxes-extracf

Replace ltdrivergt and ltpathgt by your values

Finally reload postfix

This release also deprecates some internal functions As a result several extensions has been updated to maintain thecompatibility If you enabled the notification service yoursquoll find the list of available updates directly in your Modoboaconsole

For the others here is the list

Name Versionmodoboa-amavis 1010modoboa-postfix-autoreply 117modoboa-radicale 105modoboa-stats 109

Command line shortcut

$ pip install modoboa-amavis==1010$ pip install modoboa-postfix-autoreply==117$ pip install modoboa-radicale==105$ pip install modoboa-stats==109

160

Warning You have to upgrade extensions due to coreUser model attribute change (usergroup to userrole) Oth-erwise you will have an internal error after upgrade In particular modoboa-amavisd modoboa-stats modoboa-postfix-autoreply are concerned

36 Chapter 2 Table of contents

Modoboa Documentation Release 1100

An interesting feature brougth by this version is the capability to make different checks about MX records Forexample Modoboa can query main DNSBL providers for every defined domain With this you will quickly know ifone the domains you manage is listed or not To activate it add the following line to your crontab

30 ltoptional_virtualenv_pathgtpython ltmodoboa_instance_dirgtmanagepy modorarr˓check_mx

The communication with Modoboa public API has been reworked Instead of sending direct synchronous queries (forexample to check new versions) a cron job has been added To activate it add the following line to your crontab

0 ltoptional_virtualenv_pathgtpython ltmodoboa_instance_dirgtmanagepyrarr˓communicate_with_public_api

Please also note that public API now uses TLS so you must update your configuration as follows

MODOBOA_API_URL = httpsapimodoboaorg1

Finally it is now possible to declare additional sender addresses on a per-account basis You need to update your postfixconfiguration in order to use this functionality Just edit the maincf file and change the following parameter

smtpd_sender_login_maps =ltdrivergtetcpostfixsql-sender-login-mailboxescfltdrivergtetcpostfixsql-sender-login-aliasescfltdrivergtetcpostfixsql-sender-login-mailboxes-extracf

150

The API has been greatly improved and a documentation is now available To enable it addrest_framework_swagger to the INSTALLED_APPS variable in settingspy as follows

INSTALLED_APPS = (djangocontribauthdjangocontribcontenttypesdjangocontribsessionsdjangocontribmessagesdjangocontribsitesdjangocontribstaticfilesreversionrest_frameworkauthtokenrest_framework_swagger

)

Then add the following content into settingspy just after the REST_FRAMEWORK variable

SWAGGER_SETTINGS = is_authenticated Falseapi_version 10exclude_namespaces []info

contact contactmodoboacomdescription (Modoboa API requires a valid token)title Modoboa API

Yoursquore done The documentation is now available at the following address

22 Upgrade 37

Modoboa Documentation Release 1100

httpltyour instance addressgtdocsapi

Finally if you find a TEMPLATE_CONTEXT_PROCESSORS variable in your settingspy file make sure it lookslike this

TEMPLATE_CONTEXT_PROCESSORS = global_settingsTEMPLATE_CONTEXT_PROCESSORS + [modoboacorecontext_processorstop_notifications

]

140

Warning Please make sure to use Modoboa 135 with an up-to-date database before an upgrade to 140

Warning Do not follow the regular upgrade procedure for this version

Some extension have been moved back into the main repository The main reason for that is that using Modoboawithout them doesnrsquot make sense

First of all you must rename the following applications listed inside the MODOBOA_APPS variable

Old name New namemodoboa_admin modoboaadminmodoboa_admin_limits modoboalimitsmodoboa_admin_relaydomains modoboarelaydomains

Then apply the following steps

1 Uninstall old extensions

$ pip uninstall modoboa-admin modoboa-admin-limits modoboa-admin-relaydomains

2 Install all extension updates using pip (check the Modoboa gt Information page)

3 Manually migrate database

$ cd ltinstance_dirgt$ python managepy migrate auth$ python managepy migrate admin 0001 --fake$ python managepy migrate admin$ python managepy migrate limits 0001 --fake$ python managepy migrate relaydomains 0001 --fake$ python managepy migrate

4 Finally update static files

$ python managepy collectstatic

This version also introduces a REST API To enable it

1 Add rest_frameworkauthtoken to the INSTALLED_APPS variable

2 Add the following configuration inside settingspy

38 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Rest framework settings

REST_FRAMEWORK = DEFAULT_AUTHENTICATION_CLASSES (

rest_frameworkauthenticationTokenAuthentication)DEFAULT_PERMISSION_CLASSES (

rest_frameworkpermissionsIsAuthenticated)

3 Run the following command

$ python managepy migrate

135

To enhance security Modoboa now checks the strength of user passwords lthttpsgithubcomdstufftdjango-passwordsgt_

To use this feature add the following configuration into the settingspy file

django-passwords

PASSWORD_MIN_LENGTH = 8

PASSWORD_COMPLEXITY = UPPER 1LOWER 1DIGITS 1

132

Modoboa now uses the atomic requests mode to preserve database consistency (reference)

To enable it update the DATABASES variable in settingspy as follows

DATABASES = default

stuff beforeATOMIC_REQUESTS True

amavis

stuff beforeATOMIC_REQUESTS True

130

This release does not bring awesome new features but it is a necessary bridge to the future of Modoboa All extensionsnow have their own git repository and the deploy process has been updated to reflect this change

22 Upgrade 39

Modoboa Documentation Release 1100

Another important update is the use of Django 17 Besides its new features the migration system has been reworkedand is now more robust than before

Before we begin with the procedure here is a table showing old extension names and their new name

Old name New package name New module namemodoboaextensionsadmin modoboa-admin modoboa_adminmodoboaextensionslimits modoboa-admin-limits modoboa_admin_limitsmodoboaextensionspostfix_autoreply modoboa-postfix-autoreply modoboa_postfix_autoreplymodoboaextensionspostfix_relay_domains modoboa-admin-relaydomains modoboa_admin_relaydomainsmodoboaextensionsradicale modoboa-radicale modoboa_radicalemodoboaextensionssievefilters modoboa-sievefilters modoboa_sievefiltersmodoboaextensionsstats modoboa-stats modoboa_statsmodoboaextensionswebmail modoboa-webmail modoboa_webmail

Here are the required steps

1 Install the extensions using pip (look at the second column in the table above)

$ pip install ltthe extensions you wantgt

2 Remove south from INSTALLED_APPS

3 Rename old extension names inside MODOBOA_APPS (look at the third column in the table above)

4 Remove modoboalibmiddlewareExtControlMiddleware from MIDDLEWARE_CLASSES

5 Change DATABASE_ROUTERS to

DATABASE_ROUTERS = [modoboa_amavisdbrouterAmavisRouter]

6 Run the following commands

$ cd ltmodoboa_instance_dirgt$ python managepy migrate

7 Reply yes to the question

8 Run the following commands

$ python managepy load_initial_data$ python managepy collectstatic

9 The cleanup job has been renamed in Django so you have to modify your crontab entry

- 0 0 ltmodoboa_sitegtmanagepy cleanup+ 0 0 ltmodoboa_sitegtmanagepy clearsessions

120

A new notification service let administrators know about new Modoboa versions To activate it you need to updatethe TEMPLATE_CONTEXT_PROCESSORS variable like this

from djangoconf import global_settings

TEMPLATE_CONTEXT_PROCESSORS = global_settingsTEMPLATE_CONTEXT_PROCESSORS + (

(continues on next page)

40 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

modoboacorecontext_processorstop_notifications)

and to define the new MODOBOA_API_URL variable

MODOBOA_API_URL = httpapimodoboaorg1

The location of external static files has changed To use them add a new path to the STATICFILES_DIRS

Additional locations of static filesSTATICFILES_DIRS = (

Put strings here like homehtmlstatic or Cwwwdjangostatic Always use forward slashes even on Windows Dont forget to use absolute paths not relative pathsltpathtomodoboainstalldirgtbower_components

)

Run the following commands to define the hostname of your instance

$ cd ltmodoboa_instance_dirgt$ python managepy set_default_site lthostnamegt

If you plan to use the Radicale extension

1 Add modoboaextensionsradicale to the MODOBOA_APPS variable

2 Run the following commands

$ cd ltmodoboa_instance_dirgt$ python managepy syncdb

Warning You also have to note that the sitestatic directory has moved from ltpath to your sitesdirgt to ltmodoboas root urlgt (itrsquos probably the parent directory) You have to adapt your web serverconfiguration to reflect this change

23 Configuration

231 Online parameters

Modoboa provides online panels to modify internal parameters There are two available levels

bull Application level global parameters define how the application behaves Available at Modoboa gt Parameters

bull User level per user customization Available at User gt Settings gt Preferences

Regardless level parameters are displayed using tabs each tab corresponding to one application

General parameters

The admin application exposes several parameters they are presented below

23 Configuration 41

Modoboa Documentation Release 1100

Name Tab Description Default valueAuthentication type General The backend used for au-

thenticationLocal

Default password scheme General Scheme used to cryptmailbox passwords

crypt

Rounds General Number of rounds (onlyused by sha256cryptand sha512crypt) Mustbe between 1000 and999999999 inclusive

70000

Secret key General A key used to encryptusersrsquo password in ses-sions

random value

Sender address General Email address used tosend notifications

Enable communication General Enable communicationwith Modoboa public API

yes

Check new versions General Automatically checks if anewer version is available

yes

Send statistics General Send statistics to Mod-oboa public API (countersand used extensions)

yes

Top notifications check in-terval

General Interval between two topnotification checks (inseconds)

30

Maximum log record age General The maximum age in daysof a log record

365

Items per page General Number of displayeditems per page

30

Default top redirection General The default redirectionused when no applicationis specified

userprefs

Enable MX checks Admin Check that every domainhas a valid MX record

yes

Valid MXs Admin A list of IP or networkaddress every MX shouldmatch A warning will besent if a record does notrespect this it

Enable DNSBL checks Admin Check every domainagainst major DNSBLproviders

yes

DKIM keys storage direc-tory

AdminPath to a directory where DKIM

generated keys willbe stored

Default DKIM key length Admin The default size (in bits)for new keys

2048

Handle mailboxes onfilesystem

Admin Rename or remove mail-boxes on the filesystemwhen they get renamed orremoved within Modoboa

no

Mailboxes owner Admin The UNIX account whoowns mailboxes on thefilesystem

vmail

Default domain quota Admin Default quota (in MB) ap-plied to freshly createddomains with no valuespecified A value of 0means no quota

0

Automatic accountremoval

Admin When a mailbox is re-moved also remove theassociated account

no

Automatic do-mainmailbox creation

Admin Create a domain and amailbox when an accountis automatically created

yes

42 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Note If you are not familiar with virtual domain hosting you should take a look at postfixrsquos documentation ThisHow to also contains useful information

Note A random secret key will be generated each time the Parameters page is refreshed and until you save parametersat least once

Note Specific LDAP parameters are also available see LDAP authentication

232 Media files

Modoboa uses a specific directory to upload files (ie when the webmail is in use) or to create ones (ex graphical statis-tics) This directory is named media and is located inside modoboarsquos installation directory (called modoboa_sitein this documentation)

To work properly the system user which runs modoboa (www-data apache whatever) must have write access tothis directory

233 Customization

Custom logo

You have the possibility to use a custom logo instead of the default one on the login page

To do so open the settingspy file and add a MODOBOA_CUSTOM_LOGO variable This variable must containthe relative URL of your logo under MEDIA_URL For example

MODOBOA_CUSTOM_LOGO = ospathjoin(MEDIA_URL custom_logopng)

Then copy your logo file into the directory indicated by MEDIA_ROOT

234 Host configuration

Note This section is only relevant when Modoboa handles mailboxes renaming and removal from the filesystem

To manipulate mailboxes on the filesystem you must allow the user who runs Modoboa to execute commands as theuser who owns mailboxes

To do so edit the etcsudoers file and add the following inside

ltuser_that_runs_modoboagt ALL=(ltmailboxes ownergt) NOPASSWD ALL

Replace values between ltgt by the ones you use

23 Configuration 43

Modoboa Documentation Release 1100

235 Time zone and language

Modoboa is available in many languages

To specify the default language to use edit the settingspy file and modify the LANGUAGE_CODE variable

LANGUAGE_CODE = fr or en for english etc

Note Each user has the possibility to define the language he prefers

In the same configuration file specify the timezone to use by modifying the TIME_ZONE variable For example

TIME_ZONE = EuropeParis

236 Sessions management

Modoboa uses Djangorsquos session framework to store per-user information

Few parameters need to be set in the settingspy configuration file to make Modoboa behave as expected

SESSION_EXPIRE_AT_BROWSER_CLOSE = False Default value

This parameter is optional but you must ensure it is set to False (the default value)

The default configuration file provided by the modoboa-adminpy command is properly configured

237 Logging authentication

To trace login attempts to the web interface Modoboa uses python SysLogHandler so you can see them in your syslogauthentication log file (varlogauthlog in most cases)

Depending on your configuration you may have to edit the settingspy file and add lsquoaddressrsquo lsquodevlogrsquo to thelogging section

syslog-auth class logginghandlersSysLogHandlerfacility SysLogHandlerLOG_AUTHaddress devlogformatter syslog

238 External authentication

LDAP

Modoboa supports external LDAP authentication using the following extra components

bull Python LDAP client

bull Django LDAP authentication backend

If you want to use this feature you must first install those components

44 Chapter 2 Table of contents

Modoboa Documentation Release 1100

$ pip install python-ldap django-auth-ldap

Then all you have to do is to modify the settingspy file Add a new authentication backend to the AUTHENTI-CATION_BACKENDS variable like this

AUTHENTICATION_BACKENDS = (modoboalibauthbackendsLDAPBackend modoboalibauthbackendsLDAPSecondaryBackend Useful for a fallback

rarr˓mechanismdjangocontribauthbackendsModelBackend

)

Finally go to Modoboa gt Parameters gt General and set Authentication type to LDAP

From there new parameters will appear to let you configure the way Modoboa should connect to your LDAP serverThey are described just below

Name Description De-faultvalue

Server address The IP address of the DNS name of the LDAP server local-host

Server port The TCP port number used by the LDAP server 389Use a secureconnection

Use an SSLTLS connection to access the LDAP server no

Authenticationmethod

Choose the authentication method to use Directbind

User DN tem-plate (directbind mode)

The template used to construct a userrsquos DN It should contain one placeholder (ie(user)s)

Bind BN The distinguished name to use when binding to the LDAP server Leave empty for ananonymous bind

Bind password The password to use when binding to the LDAP server (with lsquoBind DNrsquo)Search base The distinguished name of the search baseSearch filter An optional filter string (eg lsquo(objectClass=person)rsquo) In order to be valid it must be

enclosed in parentheses(mail=(user)s)

Passwordattribute

The attribute used to store user passwords user-Pass-word

Active Direc-tory

Tell if the LDAP server is an Active Directory one no

Administratorgroups

Members of those LDAP Posix groups will be created ad domain administrators Uselsquorsquo characters to separate groups

Group type The type of group used by your LDAP directory Posix-Group

Groups searchbase

The distinguished name of the search base used to find groups

Do-mainmailboxcreation

Automatically create a domain and a mailbox when a new user is created just after thefirst successful authentication You will generally want to disable this feature whenthe relay domains extension is in use

yes

If you need additional parameters you will find a detailed documentation here

Once the authentication is properly configured the users defined in your LDAP directory will be able to connect to

23 Configuration 45

Modoboa Documentation Release 1100

Modoboa the associated domain and mailboxes will be automatically created if needed

The first time a user connects to Modoboa a local account is created if the LDAP username is a valid email addressBy default this account belongs to the SimpleUsers group and it has a mailbox

To automatically create domain administrators you can use the Administrator groups setting If a LDAP user belongsto one the listed groups its local account will belong to the DomainAdmins group In this case the username is notnecessarily an email address

Users will also be able to update their LDAP password directly from Modoboa

Note Modoboa doesnrsquot provide any synchronization mechanism once a user is registered into the database Anymodification done from the directory to a user account will not be reported to Modoboa (an email address change forexample) Currently the only solution is to manually delete the Modoboa record it will be recreated on the next userlogin

SMTP

It is possible to use an existing SMTP server as an authentication source To enable this feature edit the settingspy file and change the following setting

AUTHENTICATION_BACKENDS = (modoboalibauthbackendsSMTPBackenddjangocontribauthbackendsModelBackend

)

SMTP server location can be customized using the following settings

AUTH_SMTP_SERVER_ADDRESS = localhostAUTH_SMTP_SERVER_PORT = 25AUTH_SMTP_SECURED_MODE = None ssl or starttls are accepted

239 LDAP synchronization

Modoboa can synchronize accounts with an LDAP directory (tested with OpenLDAP) but this feature is not enabledby default To activate it add modoboaldapsync to MODOBOA_APPS in the settingspy file

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboaldapsync

)

and enable it from the admin panel

46 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning Make sure to install additional requirements otherwise it wonrsquot work

The following parameters are available and must be filled

Name Description Defaultvalue

Enable LDAP synchro-nization

Control LDAP synchronization state no

Bind DN The DN of a user with write permission to createupdate accountsBind password The associated passwordAccount DN template The template used to build account DNs (must contain a (user)s

placeholder

2310 Database maintenance

Cleaning the logs table

Modoboa logs administrator specific actions into the database A clean-up script is provided to automatically removeoldest records The maximum log record age can be configured through the online panel

To use it you can setup a cron job to run every night

0 0 ltmodoboa_sitegtmanagepy cleanlogs Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy cleanlogs

Cleaning the session table

Django does not provide automatic purging Therefore itrsquos your job to purge expired sessions on a regular basis

Django provides a sample clean-up script django-adminpy clearsessions That script deletes any sessionin the session table whose expire_date is in the past

For example you could setup a cron job to run this script every night

0 0 ltmodoboa_sitegtmanagepy clearsessions Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy clearsessions

Cleaning inactive accounts

Thanks to Last-login tracking it is now possible to monitor inactive accounts An account is considered inactive if nologin has been recorded for the last 30 days (this value can be changed through the admin panel)

A management command is available to disable or delete inactive accounts For example you could setup a cron jobto run it every night

23 Configuration 47

Modoboa Documentation Release 1100

0 0 ltmodoboa_sitegtmanagepy clean_inactive_accounts Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy clean_inactive_rarr˓accounts

The default behaviour is to disable accounts You can delete them using the --delete option

24 Moving to Modoboa

You have an existing platform and yoursquod like to move to Modoboa the following tools could help you

241 From postfixadmin

A dedicated command allows you to convert an existing postfixadmin database to a Modoboa one Consult the docu-mentation to know more about the process

242 Using CSV files

Modoboa allows you to import any object (domain domain alias mailbox and alias) using a simple CSV file encodedusing UTF8 Each line corresponds to a single object and must respect one of the following format

domain ltname stringgt ltquota integergt ltdefault mailbox quota integergt ltenabledrarr˓booleangtdomainalias ltname stringgt lttargeted domain stringgt ltenabled booleangtrelaydomain ltname stringgt lttarget host stringgt lttarget port integergt ltservicerarr˓stringgt ltenabled booleangt ltverify recipients booleangtaccount ltloginname stringgt ltpassword stringgt ltfirst name stringgt ltlast namerarr˓stringgt ltenabled booleangt ltgroup stringgt ltaddress stringgt ltquota integergt [rarr˓ltdomain stringgt ]alias ltaddress stringgt ltenabled booleangt ltrecipient stringgt

Boolean fields accept the following values true 1 yes y (case insensitive) Any other value will be evaluated asfalse

Warning The order does matter Objects are created sequencially so a domain must be created before itsmailboxes and aliases and a mailbox must created before its alias(es)

To actually import such a file

gt sudo -u ltmodoboa_usergt -igt source ltvirtualenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy modo import ltyour filegt

Available options can be listed using the following command

gt python managepy modo import -h

48 Chapter 2 Table of contents

Modoboa Documentation Release 1100

25 REST API

To ease the integration with external sources (software or other) Modoboa provides a REST API

Every installed instance comes with a ready-to-use API and a documentation You will find them using the followingurl patterns

bull API httplthostnamegtapiv1

bull Documentation httplthostnamegtdocsapi

An example of this documentation is available on the official demo

Using this API requires an authentication and for now only a token based authentication is supported To get a validtoken log-in to your instance with a super administrator go to Settings gt API and activate the API access Press theUpdate button and wait until the page is reloaded the token will be displayed

To make valid API calls every requests you send must embed this token within an Authorization HTTP header likethis

Authorization Token ltYOUR_TOKENgt

and the content type of those requests must be applicationjson

26 How to contribute

Contributions are always welcome If you want to submit a patch please respect the following rules

bull Open a pull request on the appropriate repository

bull Respect PEP8

bull Document your patch and respect PEP 257

bull Add unit tests and make sure the global coverage does not decrease

If all those steps are validated your contribution will generally be integrated

261 Table of contents

25 REST API 49

Modoboa Documentation Release 1100

Useful tips

You would like to work on Modoboa but you donrsquot know where to start Yoursquore at the right place Browse this pageto learn useful tips

Docker

A docker image is available for developers To use it you must install docker and docker-compose first

Then just run the following command

$ docker-compose up

It will start the docker environment and make a Modoboa instance available at httplocalhost8000

If you donrsquot want to use docker or need a more complex development setup go to the next section

Prepare a virtual environment

A virtual environment is a good way to setup a development environment on your machine

To do so run the following commands

$ python3 -m venv ltpathgt$ source ltpathgtbinactivate$ git clone httpsgithubcommodoboamodoboagit$ cd modoboa$ python setuppy develop$ pip install -r dev-requirementstxt

The develop command creates a symbolic link to your local copy so any modification you make will be automati-cally available in your environment no need to copy them

Deploy an instance for development

Warning Make sure to create a database before running this step The format of the database url is also describedin this page

Now that you have a running environment yoursquore ready to deploy a test instance

$ cd ltpathgt$ modoboa-adminpy deploy --dburl defaultltdatabase urlgt --domain localhost --develrarr˓instance$ python managepy runserver

Yoursquore ready to go You should be able to access Modoboa at httplocalhost8000 usingadminpassword as credentials

Manage static files

Modoboa uses bower (thanks to django-bower) to manage its CSS and javascript dependencies

50 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Those dependencies are listed in a file called dev_settingspy located inside the ltpath_to_local_copygtmodoboacore directory

If you want to add a new dependency just complete the BOWER_INSTALLED_APPS parameter and run the followingcommand

$ python managepy bower install

It will download and store the required files into the ltpath_to_local_copygtmodoboabower_components directory

Test your modifications

If you deployed a specific instance for your development needs you can run the tests suite as follows

gt python managepy test modoboacore modoboalib modoboaadmin modoboalimits modoboararr˓relaydomains

Otherwise you can run the tests suite from the repository using tox

Start a basic Modoboa instance

From the repository run the following command to launch a simple instance with a few fixtures

gt tox -e serve

You can use adminpassword to log in

Build the documentation

If you need to modify the documenation and want to see the result you can build it as follows

gt tox -e docgt firefox toxdoctmphtmlindexhtml

FAQ

bower command is missing in managepy

bower command is missing in managepy if you donrsquot use the --devel option of the modoboa-adminpydeploy command

To fix it regenerate your instance or update your settingspy file manually Look at devmode in httpsgithubcomtonioomodoboablobmastermodoboacorecommandstemplatessettingspytpl

Create a new plugin

Introduction

Modoboa offers a plugin API to expand its capabilities The current implementation provides the following possibili-ties

26 How to contribute 51

Modoboa Documentation Release 1100

bull Expand navigation by adding entry points to your plugin inside the GUI

bull Access and modify administrative objects (domains mailboxes etc)

bull Register callback actions for specific events

Plugins are nothing more than Django applications with an extra piece of code that integrates them into Modoboa Themodo_extensionpy file will contain a complete description of the plugin

bull Admin and user parameters

bull Custom menu entries

The communication between both applications is provided by Django signals

The following subsections describe the plugin architecture and explain how you can create your own

The required glue

To create a new plugin just start a new django application like this (into Modoboarsquos directory)

$ python managepy startapp

Then you need to register this application using the provided API Just copypaste the following example into themodo_extensionpy file of the future extension

from modoboacoreextensions import ModoExtension exts_pool

class MyExtension(ModoExtension)My custom Modoboa extension

name = myextlabel = My Extensionversion = 01description = A descriptionurl = myext_root_location optional name is used if not defined

def load(self)This method is called when Modoboa loads available and activated plugins

Declare parameters and register events herepass

def load_initial_data(self)Optional provide initial data for your extension herepass

exts_poolregister_extension(MyExtension)

Once done simply add your extensionrsquos module name to the MODOBOA_APPS variable located inside settingspy Finally run the following commands

$ python managepy migrate$ python managepy load_initial_data$ python managepy collectstatic

52 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Parameters

A plugin can declare its own parameters There are two levels available

bull lsquoGlobalrsquo parameters used to configure the plugin editable inside the Admin gt Settings gt Parameters page

bull lsquoUserrsquo parameters per-user parameters (or preferences) editable inside the Options gt Preferences page

Playing with parameters

Parameters are defined using Django forms and Modoboa adds two special forms you can inherit depending on thelevel of parameter(s) you want to add

bull modoboaparametersformsAdminParametersForm for general parameters

bull modoboaparametersformsUserParametersForm for user parameters

To register new parameters add the following line into the load method of your plugin class

from modoboaparameters import tools as param_toolsparam_toolsregistryadd(

LEVEL YourForm ugettext_lazy(Title))

Replace LEVEL by global or user

Custom role permissions

Modoboa uses Djangorsquos internal permission system Administrative roles are nothing more than groups (Groupinstances)

An extension can add new permissions to a group by listening to the extra_role_permissions signal Here isan example

from djangodispatch import receiverfrom modoboacore import signals as core_signals

PERMISSIONS = Resellers [

(relaydomains relaydomain add_relaydomain)(relaydomains relaydomain change_relaydomain)(relaydomains relaydomain delete_relaydomain)(relaydomains service add_service)(relaydomains service change_service)(relaydomains service delete_service)

]

receiver(core_signalsextra_role_permissions)def extra_role_permissions(sender role kwargs)

Add permissions to the Resellers groupreturn constantsPERMISSIONSget(role [])

Extending admin forms

The forms used to edit objects (account domain etc) through the admin panel are composed of tabs You can extendthem (ie add new tabs) in a pretty easy way thanks to custom signals

26 How to contribute 53

Modoboa Documentation Release 1100

Account

To add a new tab to the account edition form define new listeners (handlers) for the following signals

bull modoboaadminsignalsextra_account_forms

bull modoboaadminsignalsget_account_form_instances

bull modoboaadminsignalscheck_extra_account_form (optional)

Example

from djangodispatch import receiverfrom modoboaadmin import signals as admin_signals

receiver(admin_signalsextra_account_forms)def extra_account_form(sender user account kwargs)

return [id tabid title Title cls MyFormClass

]

receiver(admin_signalsget_account_form_instances)def fill_my_tab(sender user account kwargs)

return id my_instance

Domain

To add a new tab to the domain edition form define new listeners (handlers) for the following signals

bull modoboaadminsignalsextra_domain_forms

bull modoboaadminsignalsget_domain_form_instances

Example

from djangodispatch import receiverfrom modoboaadmin import signals as admin_signals

receiver(admin_signalsextra_domain_forms)def extra_account_form(sender user domain kwargs)

return [id tabid title Title cls MyFormClass

]

receiver(admin_signalsget_domain_form_instances)def fill_my_tab(sender user domain kwargs)

return id my_instance

27 Contributors

bull Antidot

bull Bearstech

bull CAP-REL

54 Chapter 2 Table of contents

Modoboa Documentation Release 1100

bull Dalnix

27 Contributors 55

  • Overview
  • Table of contents
Page 26: Modoboa Documentation

Modoboa Documentation Release 1100

(continued from previous page)

smtpd_recipient_restrictions = check_recipient_access

ltdrivergtetcpostfixsql-maintaincfltdrivergtetcpostfixsql-relay-recipient-verificationcf

permit_mynetworksreject_unauth_destinationreject_unverified_recipient

smtpd_sender_login_maps = ltdrivergtetcpostfixsql-sender-login-mapcf

smtpd_sender_restrictions =reject_sender_login_mismatch

Stuff after

Replace ltdrivergt by the name of the database you use

Restart Postfix

Policy daemon

If you want to enable the built-in policy daemon add the following content to the etcpostfixmaincf file

smtpd_recipient_restrictions = check_policy_service inet1270019999

And reload postfix

Note The check_policy_service line must be placed before the permit_mynetworks one otherwise thedaemon wonrsquot be called

OpenDKIM

Modoboa can generate DKIM keys for the hosted domains but it wonrsquot sign or check messages To do that you needa dedicated software like OpenDKIM

Note The cron job in charge of creating DKIM keys must be run using the same user than OpenDKIM (ie opendkimin most cases)

Database

Since keys related information is stored in Modoboarsquos database you need to tell OpenDKIM how it can access it

First make sure to install the required additional packages on your system (libopendbx1- on debian baseddistributions or opendbx- on CentOS the complete name depends on your database engine)

Then insert the following SQL view into Modoboarsquos database

21 Installation 23

Modoboa Documentation Release 1100

PostgreSQL

CREATE OR REPLACE VIEW dkim AS (SELECT id name as domain_name dkim_private_key_path AS private_key_path

dkim_key_selector AS selectorFROM admin_domain WHERE enable_dkim

)

MySQLMariaDB

CREATE OR REPLACE VIEW dkim AS (SELECT id name as domain_name dkim_private_key_path AS private_key_path

dkim_key_selector AS selectorFROM admin_domain WHERE enable_dkim=1

)

Configuration

You should find OpenDKIMrsquos configuration file at etcopendkimconf

Add the following content to it

KeyTable dsnltdrivergtltusergtltpasswordgtltdb hostgtltdb namegttable=dkimrarr˓keycol=iddatacol=domain_nameselectorprivate_key_pathSigningTable dsnltdrivergtltusergtltpasswordgtltdb hostgtltdb namegttable=dkimrarr˓keycol=domain_namedatacol=idSocket inet12345localhost

Replace values between ltgt by yours Accepted values for driver are pgsql or mysql Make sure the user youspecify has read permission on the view created previously

If you run a debian based system make sure to adjust the following setting in the etcdefaultopendkim file

SOCKET=inet12345localhost

Eventually reload OpenDKIM

Postfix integration

Add the following lines to the etcpostfixmaincf file

smtpd_milters = inet12700112345non_smtpd_milters = inet12700112345milter_default_action = acceptmilter_content_timeout = 30s

and reload postfix

Extensions

Only few commands are needed to add a new extension to your setup

24 Chapter 2 Table of contents

Modoboa Documentation Release 1100

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install ltEXTENSIONgt==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Then restart your web server

22 Upgrade

221 Modoboa

Warning The new version you are going to install may need to modify your database Before you start makesure to backup everything

Most of the time upgrading your installation to a newer Modoboa version only requires a few actions In every caseyou will need to apply the general procedure first and then check if the version you are installing requires specificactions

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install modoboa==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Once done check if the version you are installing requires Specific instructions

Finally restart your web server

Sometimes you might need to upgrade postfix map files too To do so just run the generate_postfix_mapscommand on the same directory than the one used for installation (etcpostfix by default)

Make sure to use root privileges and run the following command

gt python managepy generate_postfix_maps --destdir ltdirectorygt

Then reload postfix

22 Upgrade 25

Modoboa Documentation Release 1100

222 Extensions

If a new version is available for an extension yoursquore using it is recommanded to install it Upgrading an extensions ispretty and the procedure is almost the same than the one used for Modoboa

In case you use a dedicated user andor a virtualenv do not forget to use them

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivate

Then run the following commands

gt pip install ltEXTENSIONgt==ltVERSIONgtgt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstaticgt python managepy check --deploy

Finally restart your web server

It is a generic upgrade procedure which will be enough most of the time but it is generally a good idea to check theassociated documentation

223 Rebuild Virtual Environment

Sometimes when upgrading your Operating System (eg from Ubuntu 1704 to Ubuntu 1710) your virtual environmentrunning modoboa can get corrupted Your first response will be to panic but fear not The solution is in this document

First things first

Recover your database password

You will need to recover your database password (if using mysql or postgresql) You will find this in etcpostfixsql-aliasescf or any file with sql-cf in the etcpostfix directory

Make note of this as you will need it when reconfiguring modoboa

Reinstall Modoboa

Start out by backup up your modoboa settings file located in the modoboa instance directory (srvmodoboainstanceinstancesettingspy if you used the default installer configuration) This contains your currentconfiguration

Next you want to remove all current modoboa files

After doing this follow the manual installation instructions for Modoboa only as everything should be working prop-erly

After this completes simply restore your backed up settings file to srvinstanceinstancesettingspy(if you used installer default configuration) You will then need to reinstall your extensions

You can find which plugins you had in your settingspy file under the MODOBOA_APPS variable

Instructions to install extensions can also be found here

Once you have completed this step you will need to run the following commands

26 Chapter 2 Table of contents

Modoboa Documentation Release 1100

gt (env) $ cd ltinstance_dirgtgt (env) $ python managepy migrategt (env) $ python managepy collectstatic

You will then see a message similar to

You have requested to collect static files at the destinationlocation as specified in your settings

srvmodoboainstancesitestatic

This will overwrite existing filesAre you sure you want to do this

Type yes to continue or no to cancel

You will want to answer yes here then simply restart the uwsgi process with service uwsgi restart andyou should be up and running again

Simply log into your modoboa web panel and verify that your extensions and webmail box is working

224 Information

Rebuild instructions from httpshelppythonanywherecompagesRebuildingVirtualenvs

225 Specific instructions

1160

A new policy daemon has been added

Make sure to have a Redis instance running on your server

Add modoboapolicyd to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboapolicyd

)

Add the following settings to your settingspy file

REDIS_HOST = ltIP or hostname heregtREDIS_PORT = 6379REDIS_QUOTA_DB = 0REDIS_URL = redisformat(REDIS_HOST REDIS_PORT REDIS_QUOTA_DB)

Once done you can start the policy daemon using the following commands

22 Upgrade 27

Modoboa Documentation Release 1100

gt python managepy policy_daemon

Donrsquot forget to configure _policyd_config if you want to use this feature

The modoboa-stats plugin has been merged into the core

Add modoboamaillog to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboapolicydmodoboamaillog

)

And remove any reference to modoboa_stats in this same variable

1150

This version drops Python 2 support so donrsquot forget to update all the extensions you use

Warning If you upgrade an existing python 2 installation you will need to create a new Python 3 virtualenvironment You can remove the existing virtual environment and replace it by the new one so you wonrsquot have tomodify your configuration files

Add the following new setting

DISABLE_DASHBOARD_EXTERNAL_QUERIES = False

Reload uwsgigunicornapache depending on your setup

Finally Make sure to use root privileges and run the following command

gt python managepy generate_postfix_maps --destdir ltdirectorygt

Then reload postfix

1140

This release introduces an optional LDAP synchronization process If you want to use it please follow the dedicatedprocedure

1131

Upgrade postfix maps files as follows

28 Chapter 2 Table of contents

Modoboa Documentation Release 1100

gt python managepy generate_postfix_maps --destdir ltpathgt --force-overwrite

1130

Add modoboadnstools to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstools

)

Add the following new settings

CSRF_COOKIE_SECURE = TrueSESSION_COOKIE_SECURE = True

modoboa-postfix-autoreply 150

Edit the etcpostfixmaincf file and remove the sql-autoreplies-transportcf map from thetransport_maps if present Remove the corresponding proxy_read_maps entry if relevant

Reload postfix

1100

Warning Upgrade installed extensions BEFORE running check or migrate commands

Upgrade all your installed plugins to the following versions

Warning If you use the amavis plugin make sure to include its configuration as follows into settingspy

from modoboa_amavis import settings as modoboa_amavis_settingsmodoboa_amavis_settingsapply(globals())

22 Upgrade 29

Modoboa Documentation Release 1100

Name Versionmodoboa-amavis 120modoboa-contacts 050modoboa-dmarc 110modoboa-imap-migration 120modoboa-pdfcredentials 130modoboa-postfix-autoreply 140modoboa-radicale 120modoboa-sievefilters 140modoboa-stats 140modoboa-webmail 140

Edit the settingspy file and apply the following modifications

Add modoboatransport to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparameters

)

Replace the following line

MIDDLEWARE_CLASSES = (

by

MIDDLEWARE = (

Update postfix map files as follows

gt rm -f ltpathgtmodoboa-postfix-mapschkgt python managepy generate_postfix_maps --force --destdir ltpathgt

Then modify postfixrsquos configuration as follows

smtpd_sender_login_maps =ltdrivergtltpathgtsql-sender-login-mapcf

transport_maps =ltdrivergtltpathgtsql-transportcfltdrivergtltpathgtsql-spliteddomains-transportcf other map files

Replace ltdrivergt and ltpathgt by your values

If transport_maps contains sql-relaydomains-transportcf remove it

30 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning If you make use of postfixrsquos proxymap server you must also update the proxy_read_maps setting

Reload postfix

Add the following cron job in order to generate DKIM keys

Generate DKIM keys (they will belong to the user running this job)

root $PYTHON $INSTANCEmanagepy modorarr˓manage_dkim_keys

190

If you want to manage inactive accounts look at Cleaning inactive accounts

183

Edit the settingspy file and replace the following line

BASE_DIR = ospathdirname(ospathdirname(__file__))

by

BASE_DIR = ospathrealpath(ospathdirname(ospathdirname(__file__)))

180

Modoboa now relies on Djangorsquos builtin password validation system to validate user passwords instead ofdjango-passwords

Remove django-passwords from your system

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt pip uninstall django-passwords

Edit the settingspy file and remove the following content

django-passwords

PASSWORD_MIN_LENGTH = 8

PASSWORD_COMPLEXITY = UPPER 1LOWER 1DIGITS 1

Add the following lines

Password validation rulesAUTH_PASSWORD_VALIDATORS = [

NAME djangocontribauthpassword_validation

rarr˓UserAttributeSimilarityValidator (continues on next page)

22 Upgrade 31

Modoboa Documentation Release 1100

(continued from previous page)

NAME djangocontribauthpassword_validationMinimumLengthValidator

NAME djangocontribauthpassword_validationCommonPasswordValidator

NAME djangocontribauthpassword_validationNumericPasswordValidator

NAME modoboacorepassword_validationComplexityValidatorOPTIONS

upper 1lower 1digits 1specials 0

]

172

API documentation has evolved (because of the upgrade to Django Rest Framework 36) and CKeditor is now embed-ded by default (thanks to the django-ckeditor package) Some configuration changes are required

Edit your settingspy file and apply the following modifications

bull Update the INSTALLED_APPS variable as follows

INSTALLED_APPS = (djangocontribauthdjangocontribcontenttypesdjangocontribsessionsdjangocontribmessagesdjangocontribsitesdjangocontribstaticfilesreversionckeditorckeditor_uploaderrest_frameworkrest_frameworkauthtoken

)

bull Update the REST_FRAMEWORK variable as follows

REST_FRAMEWORK = DEFAULT_AUTHENTICATION_CLASSES (

rest_frameworkauthenticationTokenAuthenticationrest_frameworkauthenticationSessionAuthentication

)

bull Remove the SWAGGER_SETTINGS variable

bull Add the following content

32 Chapter 2 Table of contents

Modoboa Documentation Release 1100

CKeditor

CKEDITOR_UPLOAD_PATH = uploads

CKEDITOR_IMAGE_BACKEND = pillow

CKEDITOR_RESTRICT_BY_USER = True

CKEDITOR_BROWSE_SHOW_DIRS = True

CKEDITOR_ALLOW_NONIMAGE_FILES = False

CKEDITOR_CONFIGS = default

allowedContent Truetoolbar Modoboawidth Nonetoolbar_Modoboa [

[Bold Italic Underline][JustifyLeft JustifyCenter JustifyRight JustifyBlock][BidiLtr BidiRtl Language][NumberedList BulletedList - Outdent Indent][Undo Redo][Link Unlink Anchor - Smiley][TextColor BGColor - Source][Font FontSize][Image ][SpellChecker]

]

Donrsquot forget to run the following command

gt python managepy collectstatic

171

If you used 170 for a fresh installation please run the following commands

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy load_initial_data

170

This version requires Django gt= 110 so you need to make some modifications It also brings internal API changeswhich are not backward compatible so installed extensions must be upgraded too

First of all deactivate all installed extensions (edit the settingspy file and comment the corresponding lines inMODOBOA_APPS)

Edit the urlspy file of your local instance and replace its content by the following one

22 Upgrade 33

Modoboa Documentation Release 1100

from djangoconfurls import include url

urlpatterns = [url(r include(modoboaurls))

]

Edit the settingspy and apply the following changes

bull Add modoboaparameters to MODOBOA_APPS

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboarelaydomainsmodoboalimitsmodoboaparameters Modoboa extensions here

)

bull Add modoboacoremiddlewareLocalConfigMiddleware to MIDDLEWARE_CLASSES

MIDDLEWARE_CLASSES = (djangocontribsessionsmiddlewareSessionMiddlewaredjangomiddlewarecommonCommonMiddlewaredjangomiddlewarecsrfCsrfViewMiddlewaredjangocontribauthmiddlewareAuthenticationMiddlewaredjangocontribmessagesmiddlewareMessageMiddlewaredjangomiddlewarelocaleLocaleMiddlewaredjangomiddlewareclickjackingXFrameOptionsMiddlewaremodoboacoremiddlewareLocalConfigMiddlewaremodoboalibmiddlewareAjaxLoginRedirectmodoboalibmiddlewareCommonExceptionCatchermodoboalibmiddlewareRequestCatcherMiddleware

)

bull Modoboa used to provide a custom authentication backend (modoboalibauthbackendsSimpleBackend) but it has been removed Replace it as follows

AUTHENTICATION_BACKENDS = ( Other backends beforedjangocontribauthbackendsModelBackend

)

bull Remove TEMPLATE_CONTEXT_PROCESSORS and replace it by

TEMPLATES = [

BACKEND djangotemplatebackendsdjangoDjangoTemplatesDIRS []APP_DIRS TrueOPTIONS

context_processors [djangotemplatecontext_processorsdebugdjangotemplatecontext_processorsrequestdjangocontribauthcontext_processorsauth

(continues on next page)

34 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

djangotemplatecontext_processorsi18ndjangotemplatecontext_processorsmediadjangotemplatecontext_processorsstaticdjangotemplatecontext_processorstzdjangocontribmessagescontext_processorsmessagesmodoboacorecontext_processorstop_notifications

]debug False

]

Run the following commands (load virtualenv if you use one)

gt sudo -u ltmodoboa_usergt -igt source ltvirtuenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy migrategt python managepy collectstatic

Finally upgrade your extensions and reactivate them

Name Versionmodoboa-amavis 110modoboa-dmarc 100modoboa-imap-migration 110modoboa-pdfcredentials 110modoboa-postfix-autoreply 120modoboa-radicale 110modoboa-sievefilters 110modoboa-stats 110modoboa-webmail 110

Command line shortcuts

$ pip install modoboa-amavis==110$ pip install modoboa-dmarc==100$ pip install modoboa-imap-migration==110$ pip install modoboa-pdfcredentials==110$ pip install modoboa-postfix-autoreply==120$ pip install modoboa-radicale==110$ pip install modoboa-sievefilters==110$ pip install modoboa-stats==110$ pip install modoboa-webmail==110

And please make sure you use the latest version of the django-versionfield2 package

$ pip install -U django-versionfield2

Notes about quota changes and resellers

Reseller users now have a quota option in Resources tab This is the quota that a reseller can share between all itsdomains

22 Upgrade 35

Modoboa Documentation Release 1100

There are two quotas for a domain in the new version

1 Quota amp

2 Default mailbox quota

[1] Quota quota shared between mailboxes This quota is shared between all the mailboxes of this domain This valuecannot exceed resellerrsquos quota and hence cannot be 0(unlimited) if reseller has finite quota

[2] Default mailbox quota default quota applied to mailboxes This quota is the default quota applied to new mail-boxes This value cannot exceed Quota[1] and hence cannot be 0(unlimited) if Quota[1] is finite

161

First of all update postfix map files as follows

gt python managepy generate_postfix_maps --destdir ltpathgt --force-overwrite

Then modify postfixrsquos configuration as follows

smtpd_sender_login_maps =ltdrivergtltpathgtsql-sender-login-mailboxescfltdrivergtltpathgtsql-sender-login-aliasescfltdrivergtltpathgtsql-sender-login-mailboxes-extracf

Replace ltdrivergt and ltpathgt by your values

Finally reload postfix

This release also deprecates some internal functions As a result several extensions has been updated to maintain thecompatibility If you enabled the notification service yoursquoll find the list of available updates directly in your Modoboaconsole

For the others here is the list

Name Versionmodoboa-amavis 1010modoboa-postfix-autoreply 117modoboa-radicale 105modoboa-stats 109

Command line shortcut

$ pip install modoboa-amavis==1010$ pip install modoboa-postfix-autoreply==117$ pip install modoboa-radicale==105$ pip install modoboa-stats==109

160

Warning You have to upgrade extensions due to coreUser model attribute change (usergroup to userrole) Oth-erwise you will have an internal error after upgrade In particular modoboa-amavisd modoboa-stats modoboa-postfix-autoreply are concerned

36 Chapter 2 Table of contents

Modoboa Documentation Release 1100

An interesting feature brougth by this version is the capability to make different checks about MX records Forexample Modoboa can query main DNSBL providers for every defined domain With this you will quickly know ifone the domains you manage is listed or not To activate it add the following line to your crontab

30 ltoptional_virtualenv_pathgtpython ltmodoboa_instance_dirgtmanagepy modorarr˓check_mx

The communication with Modoboa public API has been reworked Instead of sending direct synchronous queries (forexample to check new versions) a cron job has been added To activate it add the following line to your crontab

0 ltoptional_virtualenv_pathgtpython ltmodoboa_instance_dirgtmanagepyrarr˓communicate_with_public_api

Please also note that public API now uses TLS so you must update your configuration as follows

MODOBOA_API_URL = httpsapimodoboaorg1

Finally it is now possible to declare additional sender addresses on a per-account basis You need to update your postfixconfiguration in order to use this functionality Just edit the maincf file and change the following parameter

smtpd_sender_login_maps =ltdrivergtetcpostfixsql-sender-login-mailboxescfltdrivergtetcpostfixsql-sender-login-aliasescfltdrivergtetcpostfixsql-sender-login-mailboxes-extracf

150

The API has been greatly improved and a documentation is now available To enable it addrest_framework_swagger to the INSTALLED_APPS variable in settingspy as follows

INSTALLED_APPS = (djangocontribauthdjangocontribcontenttypesdjangocontribsessionsdjangocontribmessagesdjangocontribsitesdjangocontribstaticfilesreversionrest_frameworkauthtokenrest_framework_swagger

)

Then add the following content into settingspy just after the REST_FRAMEWORK variable

SWAGGER_SETTINGS = is_authenticated Falseapi_version 10exclude_namespaces []info

contact contactmodoboacomdescription (Modoboa API requires a valid token)title Modoboa API

Yoursquore done The documentation is now available at the following address

22 Upgrade 37

Modoboa Documentation Release 1100

httpltyour instance addressgtdocsapi

Finally if you find a TEMPLATE_CONTEXT_PROCESSORS variable in your settingspy file make sure it lookslike this

TEMPLATE_CONTEXT_PROCESSORS = global_settingsTEMPLATE_CONTEXT_PROCESSORS + [modoboacorecontext_processorstop_notifications

]

140

Warning Please make sure to use Modoboa 135 with an up-to-date database before an upgrade to 140

Warning Do not follow the regular upgrade procedure for this version

Some extension have been moved back into the main repository The main reason for that is that using Modoboawithout them doesnrsquot make sense

First of all you must rename the following applications listed inside the MODOBOA_APPS variable

Old name New namemodoboa_admin modoboaadminmodoboa_admin_limits modoboalimitsmodoboa_admin_relaydomains modoboarelaydomains

Then apply the following steps

1 Uninstall old extensions

$ pip uninstall modoboa-admin modoboa-admin-limits modoboa-admin-relaydomains

2 Install all extension updates using pip (check the Modoboa gt Information page)

3 Manually migrate database

$ cd ltinstance_dirgt$ python managepy migrate auth$ python managepy migrate admin 0001 --fake$ python managepy migrate admin$ python managepy migrate limits 0001 --fake$ python managepy migrate relaydomains 0001 --fake$ python managepy migrate

4 Finally update static files

$ python managepy collectstatic

This version also introduces a REST API To enable it

1 Add rest_frameworkauthtoken to the INSTALLED_APPS variable

2 Add the following configuration inside settingspy

38 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Rest framework settings

REST_FRAMEWORK = DEFAULT_AUTHENTICATION_CLASSES (

rest_frameworkauthenticationTokenAuthentication)DEFAULT_PERMISSION_CLASSES (

rest_frameworkpermissionsIsAuthenticated)

3 Run the following command

$ python managepy migrate

135

To enhance security Modoboa now checks the strength of user passwords lthttpsgithubcomdstufftdjango-passwordsgt_

To use this feature add the following configuration into the settingspy file

django-passwords

PASSWORD_MIN_LENGTH = 8

PASSWORD_COMPLEXITY = UPPER 1LOWER 1DIGITS 1

132

Modoboa now uses the atomic requests mode to preserve database consistency (reference)

To enable it update the DATABASES variable in settingspy as follows

DATABASES = default

stuff beforeATOMIC_REQUESTS True

amavis

stuff beforeATOMIC_REQUESTS True

130

This release does not bring awesome new features but it is a necessary bridge to the future of Modoboa All extensionsnow have their own git repository and the deploy process has been updated to reflect this change

22 Upgrade 39

Modoboa Documentation Release 1100

Another important update is the use of Django 17 Besides its new features the migration system has been reworkedand is now more robust than before

Before we begin with the procedure here is a table showing old extension names and their new name

Old name New package name New module namemodoboaextensionsadmin modoboa-admin modoboa_adminmodoboaextensionslimits modoboa-admin-limits modoboa_admin_limitsmodoboaextensionspostfix_autoreply modoboa-postfix-autoreply modoboa_postfix_autoreplymodoboaextensionspostfix_relay_domains modoboa-admin-relaydomains modoboa_admin_relaydomainsmodoboaextensionsradicale modoboa-radicale modoboa_radicalemodoboaextensionssievefilters modoboa-sievefilters modoboa_sievefiltersmodoboaextensionsstats modoboa-stats modoboa_statsmodoboaextensionswebmail modoboa-webmail modoboa_webmail

Here are the required steps

1 Install the extensions using pip (look at the second column in the table above)

$ pip install ltthe extensions you wantgt

2 Remove south from INSTALLED_APPS

3 Rename old extension names inside MODOBOA_APPS (look at the third column in the table above)

4 Remove modoboalibmiddlewareExtControlMiddleware from MIDDLEWARE_CLASSES

5 Change DATABASE_ROUTERS to

DATABASE_ROUTERS = [modoboa_amavisdbrouterAmavisRouter]

6 Run the following commands

$ cd ltmodoboa_instance_dirgt$ python managepy migrate

7 Reply yes to the question

8 Run the following commands

$ python managepy load_initial_data$ python managepy collectstatic

9 The cleanup job has been renamed in Django so you have to modify your crontab entry

- 0 0 ltmodoboa_sitegtmanagepy cleanup+ 0 0 ltmodoboa_sitegtmanagepy clearsessions

120

A new notification service let administrators know about new Modoboa versions To activate it you need to updatethe TEMPLATE_CONTEXT_PROCESSORS variable like this

from djangoconf import global_settings

TEMPLATE_CONTEXT_PROCESSORS = global_settingsTEMPLATE_CONTEXT_PROCESSORS + (

(continues on next page)

40 Chapter 2 Table of contents

Modoboa Documentation Release 1100

(continued from previous page)

modoboacorecontext_processorstop_notifications)

and to define the new MODOBOA_API_URL variable

MODOBOA_API_URL = httpapimodoboaorg1

The location of external static files has changed To use them add a new path to the STATICFILES_DIRS

Additional locations of static filesSTATICFILES_DIRS = (

Put strings here like homehtmlstatic or Cwwwdjangostatic Always use forward slashes even on Windows Dont forget to use absolute paths not relative pathsltpathtomodoboainstalldirgtbower_components

)

Run the following commands to define the hostname of your instance

$ cd ltmodoboa_instance_dirgt$ python managepy set_default_site lthostnamegt

If you plan to use the Radicale extension

1 Add modoboaextensionsradicale to the MODOBOA_APPS variable

2 Run the following commands

$ cd ltmodoboa_instance_dirgt$ python managepy syncdb

Warning You also have to note that the sitestatic directory has moved from ltpath to your sitesdirgt to ltmodoboas root urlgt (itrsquos probably the parent directory) You have to adapt your web serverconfiguration to reflect this change

23 Configuration

231 Online parameters

Modoboa provides online panels to modify internal parameters There are two available levels

bull Application level global parameters define how the application behaves Available at Modoboa gt Parameters

bull User level per user customization Available at User gt Settings gt Preferences

Regardless level parameters are displayed using tabs each tab corresponding to one application

General parameters

The admin application exposes several parameters they are presented below

23 Configuration 41

Modoboa Documentation Release 1100

Name Tab Description Default valueAuthentication type General The backend used for au-

thenticationLocal

Default password scheme General Scheme used to cryptmailbox passwords

crypt

Rounds General Number of rounds (onlyused by sha256cryptand sha512crypt) Mustbe between 1000 and999999999 inclusive

70000

Secret key General A key used to encryptusersrsquo password in ses-sions

random value

Sender address General Email address used tosend notifications

Enable communication General Enable communicationwith Modoboa public API

yes

Check new versions General Automatically checks if anewer version is available

yes

Send statistics General Send statistics to Mod-oboa public API (countersand used extensions)

yes

Top notifications check in-terval

General Interval between two topnotification checks (inseconds)

30

Maximum log record age General The maximum age in daysof a log record

365

Items per page General Number of displayeditems per page

30

Default top redirection General The default redirectionused when no applicationis specified

userprefs

Enable MX checks Admin Check that every domainhas a valid MX record

yes

Valid MXs Admin A list of IP or networkaddress every MX shouldmatch A warning will besent if a record does notrespect this it

Enable DNSBL checks Admin Check every domainagainst major DNSBLproviders

yes

DKIM keys storage direc-tory

AdminPath to a directory where DKIM

generated keys willbe stored

Default DKIM key length Admin The default size (in bits)for new keys

2048

Handle mailboxes onfilesystem

Admin Rename or remove mail-boxes on the filesystemwhen they get renamed orremoved within Modoboa

no

Mailboxes owner Admin The UNIX account whoowns mailboxes on thefilesystem

vmail

Default domain quota Admin Default quota (in MB) ap-plied to freshly createddomains with no valuespecified A value of 0means no quota

0

Automatic accountremoval

Admin When a mailbox is re-moved also remove theassociated account

no

Automatic do-mainmailbox creation

Admin Create a domain and amailbox when an accountis automatically created

yes

42 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Note If you are not familiar with virtual domain hosting you should take a look at postfixrsquos documentation ThisHow to also contains useful information

Note A random secret key will be generated each time the Parameters page is refreshed and until you save parametersat least once

Note Specific LDAP parameters are also available see LDAP authentication

232 Media files

Modoboa uses a specific directory to upload files (ie when the webmail is in use) or to create ones (ex graphical statis-tics) This directory is named media and is located inside modoboarsquos installation directory (called modoboa_sitein this documentation)

To work properly the system user which runs modoboa (www-data apache whatever) must have write access tothis directory

233 Customization

Custom logo

You have the possibility to use a custom logo instead of the default one on the login page

To do so open the settingspy file and add a MODOBOA_CUSTOM_LOGO variable This variable must containthe relative URL of your logo under MEDIA_URL For example

MODOBOA_CUSTOM_LOGO = ospathjoin(MEDIA_URL custom_logopng)

Then copy your logo file into the directory indicated by MEDIA_ROOT

234 Host configuration

Note This section is only relevant when Modoboa handles mailboxes renaming and removal from the filesystem

To manipulate mailboxes on the filesystem you must allow the user who runs Modoboa to execute commands as theuser who owns mailboxes

To do so edit the etcsudoers file and add the following inside

ltuser_that_runs_modoboagt ALL=(ltmailboxes ownergt) NOPASSWD ALL

Replace values between ltgt by the ones you use

23 Configuration 43

Modoboa Documentation Release 1100

235 Time zone and language

Modoboa is available in many languages

To specify the default language to use edit the settingspy file and modify the LANGUAGE_CODE variable

LANGUAGE_CODE = fr or en for english etc

Note Each user has the possibility to define the language he prefers

In the same configuration file specify the timezone to use by modifying the TIME_ZONE variable For example

TIME_ZONE = EuropeParis

236 Sessions management

Modoboa uses Djangorsquos session framework to store per-user information

Few parameters need to be set in the settingspy configuration file to make Modoboa behave as expected

SESSION_EXPIRE_AT_BROWSER_CLOSE = False Default value

This parameter is optional but you must ensure it is set to False (the default value)

The default configuration file provided by the modoboa-adminpy command is properly configured

237 Logging authentication

To trace login attempts to the web interface Modoboa uses python SysLogHandler so you can see them in your syslogauthentication log file (varlogauthlog in most cases)

Depending on your configuration you may have to edit the settingspy file and add lsquoaddressrsquo lsquodevlogrsquo to thelogging section

syslog-auth class logginghandlersSysLogHandlerfacility SysLogHandlerLOG_AUTHaddress devlogformatter syslog

238 External authentication

LDAP

Modoboa supports external LDAP authentication using the following extra components

bull Python LDAP client

bull Django LDAP authentication backend

If you want to use this feature you must first install those components

44 Chapter 2 Table of contents

Modoboa Documentation Release 1100

$ pip install python-ldap django-auth-ldap

Then all you have to do is to modify the settingspy file Add a new authentication backend to the AUTHENTI-CATION_BACKENDS variable like this

AUTHENTICATION_BACKENDS = (modoboalibauthbackendsLDAPBackend modoboalibauthbackendsLDAPSecondaryBackend Useful for a fallback

rarr˓mechanismdjangocontribauthbackendsModelBackend

)

Finally go to Modoboa gt Parameters gt General and set Authentication type to LDAP

From there new parameters will appear to let you configure the way Modoboa should connect to your LDAP serverThey are described just below

Name Description De-faultvalue

Server address The IP address of the DNS name of the LDAP server local-host

Server port The TCP port number used by the LDAP server 389Use a secureconnection

Use an SSLTLS connection to access the LDAP server no

Authenticationmethod

Choose the authentication method to use Directbind

User DN tem-plate (directbind mode)

The template used to construct a userrsquos DN It should contain one placeholder (ie(user)s)

Bind BN The distinguished name to use when binding to the LDAP server Leave empty for ananonymous bind

Bind password The password to use when binding to the LDAP server (with lsquoBind DNrsquo)Search base The distinguished name of the search baseSearch filter An optional filter string (eg lsquo(objectClass=person)rsquo) In order to be valid it must be

enclosed in parentheses(mail=(user)s)

Passwordattribute

The attribute used to store user passwords user-Pass-word

Active Direc-tory

Tell if the LDAP server is an Active Directory one no

Administratorgroups

Members of those LDAP Posix groups will be created ad domain administrators Uselsquorsquo characters to separate groups

Group type The type of group used by your LDAP directory Posix-Group

Groups searchbase

The distinguished name of the search base used to find groups

Do-mainmailboxcreation

Automatically create a domain and a mailbox when a new user is created just after thefirst successful authentication You will generally want to disable this feature whenthe relay domains extension is in use

yes

If you need additional parameters you will find a detailed documentation here

Once the authentication is properly configured the users defined in your LDAP directory will be able to connect to

23 Configuration 45

Modoboa Documentation Release 1100

Modoboa the associated domain and mailboxes will be automatically created if needed

The first time a user connects to Modoboa a local account is created if the LDAP username is a valid email addressBy default this account belongs to the SimpleUsers group and it has a mailbox

To automatically create domain administrators you can use the Administrator groups setting If a LDAP user belongsto one the listed groups its local account will belong to the DomainAdmins group In this case the username is notnecessarily an email address

Users will also be able to update their LDAP password directly from Modoboa

Note Modoboa doesnrsquot provide any synchronization mechanism once a user is registered into the database Anymodification done from the directory to a user account will not be reported to Modoboa (an email address change forexample) Currently the only solution is to manually delete the Modoboa record it will be recreated on the next userlogin

SMTP

It is possible to use an existing SMTP server as an authentication source To enable this feature edit the settingspy file and change the following setting

AUTHENTICATION_BACKENDS = (modoboalibauthbackendsSMTPBackenddjangocontribauthbackendsModelBackend

)

SMTP server location can be customized using the following settings

AUTH_SMTP_SERVER_ADDRESS = localhostAUTH_SMTP_SERVER_PORT = 25AUTH_SMTP_SECURED_MODE = None ssl or starttls are accepted

239 LDAP synchronization

Modoboa can synchronize accounts with an LDAP directory (tested with OpenLDAP) but this feature is not enabledby default To activate it add modoboaldapsync to MODOBOA_APPS in the settingspy file

MODOBOA_APPS = (modoboamodoboacoremodoboalibmodoboaadminmodoboatransportmodoboarelaydomainsmodoboalimitsmodoboaparametersmodoboadnstoolsmodoboaldapsync

)

and enable it from the admin panel

46 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Warning Make sure to install additional requirements otherwise it wonrsquot work

The following parameters are available and must be filled

Name Description Defaultvalue

Enable LDAP synchro-nization

Control LDAP synchronization state no

Bind DN The DN of a user with write permission to createupdate accountsBind password The associated passwordAccount DN template The template used to build account DNs (must contain a (user)s

placeholder

2310 Database maintenance

Cleaning the logs table

Modoboa logs administrator specific actions into the database A clean-up script is provided to automatically removeoldest records The maximum log record age can be configured through the online panel

To use it you can setup a cron job to run every night

0 0 ltmodoboa_sitegtmanagepy cleanlogs Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy cleanlogs

Cleaning the session table

Django does not provide automatic purging Therefore itrsquos your job to purge expired sessions on a regular basis

Django provides a sample clean-up script django-adminpy clearsessions That script deletes any sessionin the session table whose expire_date is in the past

For example you could setup a cron job to run this script every night

0 0 ltmodoboa_sitegtmanagepy clearsessions Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy clearsessions

Cleaning inactive accounts

Thanks to Last-login tracking it is now possible to monitor inactive accounts An account is considered inactive if nologin has been recorded for the last 30 days (this value can be changed through the admin panel)

A management command is available to disable or delete inactive accounts For example you could setup a cron jobto run it every night

23 Configuration 47

Modoboa Documentation Release 1100

0 0 ltmodoboa_sitegtmanagepy clean_inactive_accounts Or like this if you use a virtual environment 0 0 ltvirtualenv pathbinpythongt ltmodoboa_sitegtmanagepy clean_inactive_rarr˓accounts

The default behaviour is to disable accounts You can delete them using the --delete option

24 Moving to Modoboa

You have an existing platform and yoursquod like to move to Modoboa the following tools could help you

241 From postfixadmin

A dedicated command allows you to convert an existing postfixadmin database to a Modoboa one Consult the docu-mentation to know more about the process

242 Using CSV files

Modoboa allows you to import any object (domain domain alias mailbox and alias) using a simple CSV file encodedusing UTF8 Each line corresponds to a single object and must respect one of the following format

domain ltname stringgt ltquota integergt ltdefault mailbox quota integergt ltenabledrarr˓booleangtdomainalias ltname stringgt lttargeted domain stringgt ltenabled booleangtrelaydomain ltname stringgt lttarget host stringgt lttarget port integergt ltservicerarr˓stringgt ltenabled booleangt ltverify recipients booleangtaccount ltloginname stringgt ltpassword stringgt ltfirst name stringgt ltlast namerarr˓stringgt ltenabled booleangt ltgroup stringgt ltaddress stringgt ltquota integergt [rarr˓ltdomain stringgt ]alias ltaddress stringgt ltenabled booleangt ltrecipient stringgt

Boolean fields accept the following values true 1 yes y (case insensitive) Any other value will be evaluated asfalse

Warning The order does matter Objects are created sequencially so a domain must be created before itsmailboxes and aliases and a mailbox must created before its alias(es)

To actually import such a file

gt sudo -u ltmodoboa_usergt -igt source ltvirtualenv_pathgtbinactivategt cd ltmodoboa_instance_dirgtgt python managepy modo import ltyour filegt

Available options can be listed using the following command

gt python managepy modo import -h

48 Chapter 2 Table of contents

Modoboa Documentation Release 1100

25 REST API

To ease the integration with external sources (software or other) Modoboa provides a REST API

Every installed instance comes with a ready-to-use API and a documentation You will find them using the followingurl patterns

bull API httplthostnamegtapiv1

bull Documentation httplthostnamegtdocsapi

An example of this documentation is available on the official demo

Using this API requires an authentication and for now only a token based authentication is supported To get a validtoken log-in to your instance with a super administrator go to Settings gt API and activate the API access Press theUpdate button and wait until the page is reloaded the token will be displayed

To make valid API calls every requests you send must embed this token within an Authorization HTTP header likethis

Authorization Token ltYOUR_TOKENgt

and the content type of those requests must be applicationjson

26 How to contribute

Contributions are always welcome If you want to submit a patch please respect the following rules

bull Open a pull request on the appropriate repository

bull Respect PEP8

bull Document your patch and respect PEP 257

bull Add unit tests and make sure the global coverage does not decrease

If all those steps are validated your contribution will generally be integrated

261 Table of contents

25 REST API 49

Modoboa Documentation Release 1100

Useful tips

You would like to work on Modoboa but you donrsquot know where to start Yoursquore at the right place Browse this pageto learn useful tips

Docker

A docker image is available for developers To use it you must install docker and docker-compose first

Then just run the following command

$ docker-compose up

It will start the docker environment and make a Modoboa instance available at httplocalhost8000

If you donrsquot want to use docker or need a more complex development setup go to the next section

Prepare a virtual environment

A virtual environment is a good way to setup a development environment on your machine

To do so run the following commands

$ python3 -m venv ltpathgt$ source ltpathgtbinactivate$ git clone httpsgithubcommodoboamodoboagit$ cd modoboa$ python setuppy develop$ pip install -r dev-requirementstxt

The develop command creates a symbolic link to your local copy so any modification you make will be automati-cally available in your environment no need to copy them

Deploy an instance for development

Warning Make sure to create a database before running this step The format of the database url is also describedin this page

Now that you have a running environment yoursquore ready to deploy a test instance

$ cd ltpathgt$ modoboa-adminpy deploy --dburl defaultltdatabase urlgt --domain localhost --develrarr˓instance$ python managepy runserver

Yoursquore ready to go You should be able to access Modoboa at httplocalhost8000 usingadminpassword as credentials

Manage static files

Modoboa uses bower (thanks to django-bower) to manage its CSS and javascript dependencies

50 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Those dependencies are listed in a file called dev_settingspy located inside the ltpath_to_local_copygtmodoboacore directory

If you want to add a new dependency just complete the BOWER_INSTALLED_APPS parameter and run the followingcommand

$ python managepy bower install

It will download and store the required files into the ltpath_to_local_copygtmodoboabower_components directory

Test your modifications

If you deployed a specific instance for your development needs you can run the tests suite as follows

gt python managepy test modoboacore modoboalib modoboaadmin modoboalimits modoboararr˓relaydomains

Otherwise you can run the tests suite from the repository using tox

Start a basic Modoboa instance

From the repository run the following command to launch a simple instance with a few fixtures

gt tox -e serve

You can use adminpassword to log in

Build the documentation

If you need to modify the documenation and want to see the result you can build it as follows

gt tox -e docgt firefox toxdoctmphtmlindexhtml

FAQ

bower command is missing in managepy

bower command is missing in managepy if you donrsquot use the --devel option of the modoboa-adminpydeploy command

To fix it regenerate your instance or update your settingspy file manually Look at devmode in httpsgithubcomtonioomodoboablobmastermodoboacorecommandstemplatessettingspytpl

Create a new plugin

Introduction

Modoboa offers a plugin API to expand its capabilities The current implementation provides the following possibili-ties

26 How to contribute 51

Modoboa Documentation Release 1100

bull Expand navigation by adding entry points to your plugin inside the GUI

bull Access and modify administrative objects (domains mailboxes etc)

bull Register callback actions for specific events

Plugins are nothing more than Django applications with an extra piece of code that integrates them into Modoboa Themodo_extensionpy file will contain a complete description of the plugin

bull Admin and user parameters

bull Custom menu entries

The communication between both applications is provided by Django signals

The following subsections describe the plugin architecture and explain how you can create your own

The required glue

To create a new plugin just start a new django application like this (into Modoboarsquos directory)

$ python managepy startapp

Then you need to register this application using the provided API Just copypaste the following example into themodo_extensionpy file of the future extension

from modoboacoreextensions import ModoExtension exts_pool

class MyExtension(ModoExtension)My custom Modoboa extension

name = myextlabel = My Extensionversion = 01description = A descriptionurl = myext_root_location optional name is used if not defined

def load(self)This method is called when Modoboa loads available and activated plugins

Declare parameters and register events herepass

def load_initial_data(self)Optional provide initial data for your extension herepass

exts_poolregister_extension(MyExtension)

Once done simply add your extensionrsquos module name to the MODOBOA_APPS variable located inside settingspy Finally run the following commands

$ python managepy migrate$ python managepy load_initial_data$ python managepy collectstatic

52 Chapter 2 Table of contents

Modoboa Documentation Release 1100

Parameters

A plugin can declare its own parameters There are two levels available

bull lsquoGlobalrsquo parameters used to configure the plugin editable inside the Admin gt Settings gt Parameters page

bull lsquoUserrsquo parameters per-user parameters (or preferences) editable inside the Options gt Preferences page

Playing with parameters

Parameters are defined using Django forms and Modoboa adds two special forms you can inherit depending on thelevel of parameter(s) you want to add

bull modoboaparametersformsAdminParametersForm for general parameters

bull modoboaparametersformsUserParametersForm for user parameters

To register new parameters add the following line into the load method of your plugin class

from modoboaparameters import tools as param_toolsparam_toolsregistryadd(

LEVEL YourForm ugettext_lazy(Title))

Replace LEVEL by global or user

Custom role permissions

Modoboa uses Djangorsquos internal permission system Administrative roles are nothing more than groups (Groupinstances)

An extension can add new permissions to a group by listening to the extra_role_permissions signal Here isan example

from djangodispatch import receiverfrom modoboacore import signals as core_signals

PERMISSIONS = Resellers [

(relaydomains relaydomain add_relaydomain)(relaydomains relaydomain change_relaydomain)(relaydomains relaydomain delete_relaydomain)(relaydomains service add_service)(relaydomains service change_service)(relaydomains service delete_service)

]

receiver(core_signalsextra_role_permissions)def extra_role_permissions(sender role kwargs)

Add permissions to the Resellers groupreturn constantsPERMISSIONSget(role [])

Extending admin forms

The forms used to edit objects (account domain etc) through the admin panel are composed of tabs You can extendthem (ie add new tabs) in a pretty easy way thanks to custom signals

26 How to contribute 53

Modoboa Documentation Release 1100

Account

To add a new tab to the account edition form define new listeners (handlers) for the following signals

bull modoboaadminsignalsextra_account_forms

bull modoboaadminsignalsget_account_form_instances

bull modoboaadminsignalscheck_extra_account_form (optional)

Example

from djangodispatch import receiverfrom modoboaadmin import signals as admin_signals

receiver(admin_signalsextra_account_forms)def extra_account_form(sender user account kwargs)

return [id tabid title Title cls MyFormClass

]

receiver(admin_signalsget_account_form_instances)def fill_my_tab(sender user account kwargs)

return id my_instance

Domain

To add a new tab to the domain edition form define new listeners (handlers) for the following signals

bull modoboaadminsignalsextra_domain_forms

bull modoboaadminsignalsget_domain_form_instances

Example

from djangodispatch import receiverfrom modoboaadmin import signals as admin_signals

receiver(admin_signalsextra_domain_forms)def extra_account_form(sender user domain kwargs)

return [id tabid title Title cls MyFormClass

]

receiver(admin_signalsget_domain_form_instances)def fill_my_tab(sender user domain kwargs)

return id my_instance

27 Contributors

bull Antidot

bull Bearstech

bull CAP-REL

54 Chapter 2 Table of contents

Modoboa Documentation Release 1100

bull Dalnix

27 Contributors 55

  • Overview
  • Table of contents
Page 27: Modoboa Documentation
Page 28: Modoboa Documentation
Page 29: Modoboa Documentation
Page 30: Modoboa Documentation
Page 31: Modoboa Documentation
Page 32: Modoboa Documentation
Page 33: Modoboa Documentation
Page 34: Modoboa Documentation
Page 35: Modoboa Documentation
Page 36: Modoboa Documentation
Page 37: Modoboa Documentation
Page 38: Modoboa Documentation
Page 39: Modoboa Documentation
Page 40: Modoboa Documentation
Page 41: Modoboa Documentation
Page 42: Modoboa Documentation
Page 43: Modoboa Documentation
Page 44: Modoboa Documentation
Page 45: Modoboa Documentation
Page 46: Modoboa Documentation
Page 47: Modoboa Documentation
Page 48: Modoboa Documentation
Page 49: Modoboa Documentation
Page 50: Modoboa Documentation
Page 51: Modoboa Documentation
Page 52: Modoboa Documentation
Page 53: Modoboa Documentation
Page 54: Modoboa Documentation
Page 55: Modoboa Documentation
Page 56: Modoboa Documentation
Page 57: Modoboa Documentation
Page 58: Modoboa Documentation