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.
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
Pingback: Roundcube: cambiar color skin elastic - Blackhold