Upgrade modoboa 1.14 a 1.17 + roundcube webmail

En la de hoy nos encontramos con un servidor de correo instalado con modoboa versión 1.14 que queremos actualizar a una versión mas nueva, en este caso la 1.17. Aprovecharemos también para actualizar la versión de roundcube 1.4 RC1 a la versión 1.4.11.

Como todo tiene sus puñetitas en la informática, nos encontramos con que la migración de modoboa 1.14 a la 1.17 implica cambiar la versión de python2 a python3 y usar el instalador para hacer el upgrade es lio asegurado. Así que vamos a ver como hacer la migración pasito a pasito y de forma humanamente viable! :D

Para alegrarte un poco el día, comentar que es posible hacer tranquilamente la instalación del nuevo entorno con una IP distinta a la definitiva. Es decir, si voy a usar mail.lamardebits.org no es necesario que el entorno que estamos montando tenga la IP que apunta a mail.lamardebits.org. Así que es posible dejarlo todo listo sin tocar el entorno que está en producción. Cuando queramos hacer el cambio, simplemente será apagar la máquina con la versión vieja de modoboa, cambiar la IP en el entorno nuevo y levantarlo!

Así que empezamos y como de costumbre hago la instalación sobre una debian 10 virtualizada con LXC y con el nesting activado. Además le pongo ya el mountpoint sobre el cephfs a /srv/vmail

Una vez arrancada la maquina, lo básico y recomendable, configurar y actualizar el sistema

root@mail:~# dpkg-reconfigure locales && dpkg-reconfigure tzdata && apt update && apt -y upgrade && apt -y dist-upgrade && apt -y install vim net-tools dnsutils git rsync python3-crypto

Importante! Destaco que es importante instalar el paquete python3-crypto ya que la instalación de modoboa se “olvida” de instalarlo y luego nos vamos a encontrar que va a guardar las contraseñas de los usuarios en PLAIN a la base de datos, una cosa nada recomendable.

A continuación empezamos con la instalación de modoboa.

root@mail:~# cd /usr/src
root@mail:/usr/src# git clone https://github.com/modoboa/modoboa-installer
root@mail:/usr/src# cd modoboa-installer/
./run.py lamardebits.org

Justo cuando empiece la instalación, le decimos no y editamos el fichero installer.cfg para realizar cambios en la configuración. En mi caso, me interesa activar el pop3 para el dovecot

root@mail:/usr/src/modoboa-installer# vi installer.cfg 
[dovecot]
enabled = true
config_dir = /etc/dovecot
user = vmail
home_dir = /srv/vmail
mailboxes_owner = vmail
extra_protocols = pop3 
postmaster_address = postmaster@%(domain)s
radicale_auth_socket_path = /var/run/dovecot/auth-radicale

Y seguimos con la instalación

Al cabo de unos minutos tendremos el modoboa instalado y listo para empezar a toquetearlo.

De mientras va instalando, nos vamos al servidor de modoboa que tenemos en producción y exportamos los datos de los usuarios y de los dominios que importaremos en la nueva instalación de modoboa mediante la interfaz web.

Dominios:

Identidades:

Aprovechando que estamos en el servidor en producción, vamos a hacer un dump/export de la base de datos de roundcube. Esto es importante porque en esta base de datos se guardan los contactos que han creado los usuarios que usan el cliente de correo roundcube.

root@mail:~# su - postgres
postgres@mail:~$ pg_dump roundcube_db > 2021_05_10-roundcube_db-lamardebits.sql

Vamos a hacer también un backup de todo el contenido de roundcube que tenemos en /var/www

postgres@mail:~$ logout
root@mail:~# cd /var/www
root@mail:/var/www# tar cvzf 2021_05_10-var_www_roundcube.tar.gz roundcubemail-1.4-rc1

Ya que estamos los certificados de letsencrypt

root@mail:~# cd /etc/
root@mail:/etc# tar cvzf 2021_05_10-le-mail_lamardebits.tar.gz letsencrypt

Copiamos todos los datos en nuestra máquina y los subimos al servidor de modoboa nuevo

laura@melatonina:~$ scp root@mail.lamardebits.org:/var/lib/postgresql/2021_05_10-roundcube_db-lamardebits.sql .
2021_05_10-roundcube_db-lamardebits.sql                                                 100% 1972KB   1.2MB/s   00:01    
laura@melatonina:~$ scp root@mail.lamardebits.org:/var/www/2021_05_10-var_www_roundcube.tar.gz .
2021_05_10-var_www_roundcube.tar.gz                                                     100% 7368KB   1.1MB/s   00:06    
laura@melatonina:~$ scp root@mail.lamardebits.org:/etc/2021_05_10-le-mail_lamardebits.tar.gz .
2021_05_10-le-mail_lamardebits.tar.gz                                                   100%  708KB 517.1KB/s   00:01 
laura@melatonina:~$ scp 2021_05_10-roundcube_db-lamardebits.sql root@172.31.0.143:/root/old_data/
2021_05_10-roundcube_db-lamardebits.sql                                                 100% 1972KB 799.6KB/s   00:02    
laura@melatonina:~$ scp 2021_05_10-var_www_roundcube.tar.gz root@172.31.0.143:/root/old_data/
2021_05_10-var_www_roundcube.tar.gz                                                     100% 7368KB   1.1MB/s   00:06 
laura@melatonina:~$ scp 2021_05_10-le-mail_lamardebits.tar.gz root@172.31.0.143:/root/old_data/
2021_05_10-le-mail_lamardebits.tar.gz                                                   100%  708KB 571.7KB/s   00:01 

Ahora, antes de seguir, vamos a esperar que termine la instalación de modoboa.

Una vez terminada la instalación de modoboa nos saldrá el mensaje

Congratulations! You can enjoy Modoboa at https://mail.lamardebits.org (admin:password)

Como el servidor ahora mismo lo tengo en otra IP, modifico el /etc/hosts de mi ordenador para que mail.lamardebits.org apunte a la IP temporal del nuevo servidor de correo

root@melatonina:~# vi /etc/hosts
109.69.10.227 mail.lamardebits.org

Y vamos a https://mail.lamardebits.org, introducimos el usuario admin y contraseña password.

Lo primero será cambiar la contraseña

y lo siguiente importar los datos que hemos exportado de la otra instalación de modoboa.

Para comprobar que se han importado correctamente los datos, hacemos logout de la interfaz y nos logueamos con un usuario

Si todo ha ido bien, ahora vamos a configurar la interfaz de modoboa en el puerto 8443 y el roundcube en el puerto 443, además aprovechamos para configurar los certificados de letsencrypt.

root@mail:~# apt -y install letsencrypt
root@mail:~# cd /etc
root@mail:/etc# mv letsencrypt{,.old}
root@mail:/etc# mv /root/old_data/2021_05_10-le-mail_lamardebits.tar.gz .
root@mail:/etc# tar xvzf 2021_05_10-le-mail_lamardebits.tar.gz 
root@mail:/etc# cd nginx/sites-available/
root@mail:/etc/nginx/sites-available# vi mail.lamardebits.org.conf 
# This file was automatically installed on 2021-05-10T23:31:42.559873
upstream modoboa {
    server unix:/run/uwsgi/app/modoboa_instance/socket fail_timeout=0;
}

#server {
#    listen 80;
#    listen [::]:80;
#    server_name mail.lamardebits.org;
#    rewrite ^ https://$server_name$request_uri? permanent;
#}

server {
    listen 8443 ssl;
    listen [::]:8443 ssl;
    server_name mail.capa8.net;
    root /srv/modoboa/instance;

    #ssl_certificate /etc/ssl/certs/mail.capa8.net.cert;
    #ssl_certificate_key /etc/ssl/private/mail.capa8.net.key;
    #ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    #ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
    #ssl_prefer_server_ciphers on;
    #ssl_session_cache shared:SSL:10m;
    ssl_verify_depth 3;
    ssl_dhparam /etc/nginx/dhparam.pem;
    ssl_certificate /etc/letsencrypt/live/mail.lamardebits.org/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/mail.lamardebits.org/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_trusted_certificate /etc/letsencrypt/live/mail.lamardebits.org/chain.pem;
root@mail:/etc/nginx/sites-available# vi roundcube.conf
server {
        listen 80;
        server_name mail.lamardebits.org
                    mail.moviments.net;
        return 301 https://mail.lamardebits.org$request_uri;
        #root /var/www/html/;
}

server {
        listen 443 ssl;
        server_name mail.lamardebits.org;
        access_log /var/log/nginx/roundcube-mail.lamardebits.org.access.log;
        error_log  /var/log/nginx/roundcube-mail.lamardebits.org.error.log;

        root /var/www/roundcube/;
        index index.php;

        client_max_body_size 30M;

        location / {
                try_files $uri $uri/ /index.php?q=$uri&$args;
        }

        location ~ ^/(README.md|INSTALL|LICENSE|CHANGELOG|UPGRADING)$ {
                deny all;
        }

        location ~ ^/(config|temp|logs)/ {
                deny all;
        }

        location ~ /\. {
                deny all;
                access_log off;
                log_not_found off;
        }

        location ~ \.php$ {
                try_files $uri =404;
                fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include fastcgi_params;
        }

        ssl_certificate /etc/letsencrypt/live/mail.lamardebits.org/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/mail.lamardebits.org/privkey.pem;
        include /etc/letsencrypt/options-ssl-nginx.conf;
        ssl_trusted_certificate /etc/letsencrypt/live/mail.lamardebits.org/chain.pem;
        #ssl_certificate /etc/ssl/certs/mail.lamardebits.org.cert;
}
root@mail:/etc/nginx/sites-available# cd ../sites-enabled/
root@mail:/etc/nginx/sites-enabled# ln -s ../sites-available/roundcube.conf .
root@mail:/etc/nginx/sites-enabled# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
root@mail:/etc/nginx/sites-enabled# service nginx restart

Ahora probamos de acceder al modoboa por el puerto https 8443 y comprobamos que se ha cargado correctamente el certificado.

Seguimos con los certificados para postfix y dovecot

root@mail:~# vi /etc/postfix/main.cf
#smtpd_tls_key_file = /etc/ssl/private/mail.lamardebits.org.key
#smtpd_tls_cert_file = /etc/ssl/certs/mail.lamardebits.org.cert
smtpd_tls_key_file = /etc/letsencrypt/live/mail.lamardebits.org/privkey.pem
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.lamardebits.org/fullchain.pem
root@mail:~# vi /etc/dovecot/conf.d/10-ssl.conf
#ssl_cert = </etc/ssl/certs/mail.lamardebits.org.cert
#ssl_key = </etc/ssl/private/mail.lamardebits.org.key
ssl_cert = </etc/letsencrypt/live/mail.lamardebits.org/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.lamardebits.org/privkey.pem

Y reiniciamos ambos servicios (o reiniciamos el servidor directamente)

root@mail:~# service postfix restart && service dovecot restart

Pues ahora ya tenemos la parte de modoboa lista. Vamos a instalar roundcube

ROUNDCUBE

Primero de todo instalaremos las dependencias necesarias

root@mail:~# apt -y install php-gd php-imagick php-intl php-ldap php-xml php-zip php7.3 php7.3-cli php7.3-common php7.3-curl php7.3-fpm php7.3-gd php7.3-intl php7.3-json php7.3-ldap php7.3-mbstring php7.3-opcache php7.3-pgsql php7.3-pspell php7.3-readline php7.3-xml php7.3-zip curl

A continuación, iremos al directorio /var/www y nos descargaremos y descomprimiremos roundcube

root@mail:~# cd /var/www
root@mail:/var/www# wget -c https://github.com/roundcube/roundcubemail/releases/download/1.4.11/roundcubemail-1.4.11-complete.tar.gz
root@mail:/var/www# tar xvzf roundcubemail-1.4.11-complete.tar.gz
root@mail:/var/www# ln -s roundcubemail-1.4.11 roundcube

Ahora crearemos el fichero de configuración y definiremos algunos parametros a nuestro gusto.

root@mail:/var/www# cd roundcube/config/
root@mail:/var/www/roundcube/config# cp config.inc.php.sample config.inc.php
root@mail:/var/www/roundcube/config# vi config.inc.php
//$config['db_dsnw'] = 'mysql://roundcube:pass@localhost/roundcubemail';
$config['db_dsnw'] = 'pgsql://roundcube_user:*******@localhost/roundcube_db';

$config['smtp_port'] = 25;

$config['product_name'] = 'mail.lamardebits.org';

$config['skin'] = 'larry';

$config['enable_installer'] = true;

El skin dejo el larry para que los usuarios no se me asusten con el cambio de interfaz, el smtp_port lo dejo en 25 porque si lo dejo por defecto falla, el enable_installer lo activamos para hacer el upgrade de los datos de la base de datos de la versión anterior de roundcube a la nueva y la base de datos ahora la crearemos.

Ahora creamos la base de datos para roundcube

root@mail:~# su - postgres
postgres@mail:~$ createuser roundcube_user
postgres@mail:~$ createdb -O roundcube_user roundcube_db
postgres@mail:~$ psql roundcube_db 
psql (11.11 (Debian 11.11-0+deb10u1))
Type "help" for help.

roundcube_db=# alter user roundcube_user with encrypted password '*******';
ALTER ROLE
roundcube_db=# grant all privileges on database roundcube_db to roundcube_user;
GRANT
roundcube_db=# \q

E importamos los datos de la base de datos del roundcube antiguo

root@mail:~# cp old_data/2021_05_10-roundcube_db-lamardebits.sql /var/lib/postgresql/
root@mail:~# cd /var/lib/postgresql/
root@mail:/var/lib/postgresql# chown postgres:postgres *.sql
root@mail:/var/lib/postgresql# su - postgres
postgres@mail:~$ psql roundcube_db < 2021_05_10-roundcube_db-lamardebits.sql

Ahora vamos al instalador de roundcube y verificamos que todo esté bien

https://mail.lamardebits.org/installer

En mi caso se me queja de que la hora no está bien definida (date.timezone), así que la configuro

root@mail:~# vi /etc/php/7.3/fpm/php.ini
[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = Europe/Madrid

Y reinicio el php-fpm y compruebo que ya no se "queja".

root@mail:~# service php7.3-fpm restart

Le damos a next y veremos que necesita actualizar los esquemas de la base de datos (importante definir bien de qué versión venimos)

Ahora comentamos la línea del fichero de configuración de roundcube enable_installer y la instalación básica ya estaría lista! :)

root@mail:/var/www/roundcube/config# vi config.inc.php
//$config['enable_installer'] = true;

Configurar plugins de roundcube

En la página de documentación de plugins nos dice que ejecutemos esto:

root@mail:/var/www/roundcube# curl -s https://getcomposer.org/installer | php
root@mail:/var/www/roundcube# php composer.phar install

Hay un paso intermedio que nos dice que tenemos que crear el fichero composer.phar, pero el primer comando ya nos lo crea. El segundo comando se queja de que estamos como root, si nos da problemas hacemos un chown -R www-data:www-data * y listos.

Ahora activaremos algunos plugins interesantes. Voy a saco y os dejo mi array de plugins activados y después iré a algunos a detallar algunas configuraciones:

root@mail:/var/www/roundcube# vi config/config.inc.php
// List of active plugins (in plugins/ directory)
$config['plugins'] = array(
    'archive',
    'zipdownload',
    'password', // configurat - cal configurar
    'attachment_reminder',
    'autologon',
    'emoticons',
    //'enigma', // falta configurar
    'filesystem_attachments',
    'help',
    'hide_blockquote',
    //'http_authentication', // falta configurar
    'identicon',
    'identity_select',
    'jqueryui',
    'managesieve', // configurat - config per defecte
    'markasjunk', // configurat - config per defecte
    'new_user_dialog',
    //'new_user_identity', // si tens ldap
    'newmail_notifier', // configurat - config per defecte
    'show_additional_headers',
    //'subscriptions_option',
    'userinfo',
    'vcard_attachments',
    'virtuser_file',
    'virtuser_query',
);

// the default locale setting (leave empty for auto-detection)
// RFC1766 formatted language name like en_US, de_DE, de_CH, fr_FR, pt_BR
//$config['language'] = 'ca_ES';

// Set the spell checking engine. Possible values:
// - 'googie'  - the default (also used for connecting to Nox Spell Server, see 'spellcheck_uri' setting)
// - 'pspell'  - requires the PHP Pspell module and aspell installed
// - 'enchant' - requires the PHP Enchant module
// - 'atd'     - install your own After the Deadline server or check with the people at http://www.afterthedeadline.com before using their API
// Since Google shut down their public spell checking service, the default settings
// connect to http://spell.roundcube.net which is a hosted service provided by Roundcube.
// You can connect to any other googie-compliant service by setting 'spellcheck_uri' accordingly.
$config['spellcheck_engine'] = 'pspell';

//$config['enable_installer'] = true;
$config['skin_logo'] = array (
  '*' => 'petit.png',
  'login' => 'gran.png',
);

Plugin roundcube password

Empiezo con uno que me ha dado guerra de la buena un largo tiempo y estoy muy contenta de poder ofrecer la solución aquí en mi blog :)

Los plugins de roundcube una vez activados, algunos tienen en la carpeta de plugins i directorio del plugin un fichero de configuración adicional para el plugin. En el caso del plugin password por mas que activases el plugin en el fichero de configuración general de roundcube, no se dejaba cambiar el password por mucho que tratases de modificar parametros en el servidor de correo, la solución ha sido el ficherito de configuración del plugin de marras! aquí lo tienes y como lo he solucionado

root@mail:/var/www/roundcube# cd plugins/password/
root@mail:/var/www/roundcube/plugins/password# cp config.inc.php.dist config.inc.php
root@mail:/var/www/roundcube/plugins/password# vi config.inc.php
$config['password_driver'] = 'sql';

$config['password_db_dsn'] = 'pgsql://modoboa:*********@localhost/modoboa';

//$config['password_query'] = 'SELECT update_passwd(%c, %u)';
$config['password_query'] = "UPDATE core_user SET password=CONCAT('{SHA512-CRYPT}', %c) WHERE email=%u";

$config['password_crypt_hash'] = 'sha256';

Aunque el plugin trae integración con la API de modoboa, lo probé y no funcionaba, así que directamente he hecho la configuración de la conexión con la base de datos de modoboa directamente.

El password de la bbdd de modoboa lo encontrarás en /srv/modoboa/instance/instance/settings.py

root@mail:/var/www/roundcube/plugins/password# vi /srv/modoboa/instance/instance/settings.py

DATABASES = {

    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'modoboa',
        'USER': 'modoboa',
        'PASSWORD': '**************',
        'HOST': '127.0.0.1',
        'PORT': '',
        'ATOMIC_REQUESTS': True,

    },

    'amavis': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'amavis',
        'USER': 'amavis',
        'PASSWORD': '**************',
        'HOST': '127.0.0.1',
        'PORT': '',
        'ATOMIC_REQUESTS': True,

    },

}

Si os fijáis en la documentación, he usado %c como valor para la contraseña, dice que está deprecated, en su sitio debería usar %P pero no hace ni caso al parametro password_crypt_hash y lo pasa en PLAIN, a lo mejor es un bug.

Para comprobar que funciona, recomiendo simplemente probarlo.

configurar otros plugins
Los otros plugins que detrás pone "configurat - config per defecte", simplemente nos vamos al directorio del plugin y copiamos el fichero config.inc.php.dist a config.inc.php

plugin enigma

Este plugin lo dejo para mas tarde, la idea es que tienes que crear un directorio fuera del documentroot del roundcube donde almacenar todas las claves privadas para firmar los mails con GPG. (TODO)

Migración de los datos

Pues ahora ya sólo queda migrar los datos de correos electrónicos de los usuarios del servidor viejo al nuevo, para ello usaremos rsync y un buen rato depende de la cantidad de mails que tengas en el servidor viejo a pasar al nuevo.

Recuerdo que ahora ya en este paso, borres la línea de tu /etc/hosts que hace que mail.lamardebits.org apunte al servidor nuevo en lugar del viejo

### DESDE EL SERVIDOR VIEJO ###
root@mail:/srv/vmail# rsync -av --delete * root@172.31.0.143:/srv/vmail/

Mucho cuidado al ejecutar este comando que si no tienes backups de los datos la puedes liar muuuuuy gordaaaa!!!!

Recomiendo hacer un primer rsync para pasarlo todo (que se puede tirar un buen rato) y hacer otro justo antes de migrar definitivamente el servidor.

Te dejo un comando muy interesante para saber lo que ocupa un directorio

root@mail:/srv/vmail# du -h --max-depth=0

Y listos, si ya está todo, simplemente es apagar el servidor viejo, cambiar la IP al nuevo, levantar y ya tendría que estar todo funcionando correctamente:

- acceso de los usuarios a su buzón de correo electrónico
- datos de los correos electrónicos de los usuarios
- filtros de los correos electrónicos (sieve) ??? - se almacenan en el propio directorio del usuario, correcto? (comprobar)
- contactos de roundcube
- certificados de letsencrypt

Deixa un comentari

L'adreça electrònica no es publicarà. Els camps necessaris estan marcats amb *

Aquest lloc utilitza Akismet per reduir els comentaris brossa. Apreneu com es processen les dades dels comentaris.