Elegir un manejador de listas de correo
Las listas de correo son sin duda de los más viejos servicios colectivos en línea, del tiempo que se les decía "telemáticos" o teleiformáticos". L@s viej@s llegamos a conocer bichos como Majordomo
, o los listserv de Bitnet
.
Actualmente, sin duda el manejador de listas de correo más utilizado es mailman
. En la UdelaR, tenemos varias instancias de mailman, cómo la de la Facultad de Ciencias, que usamos para la lista de correo de este grupo. Si bien mailman está bien mantenido y no sufre de "abandonware", su interfaz hacia el usuario final es de concepción algo antigua, y no es muy amigable (al menos en su configuración por omisión).
Para softwarelibre.edu.uy, nos proponemos probar Sympa
, un sistema de concepción más reciente y prolija, que ofrece interesantes ventajas, como su RSS nativo, su interoperabilidad con LDAP y otras interfaces estándar.
Instalación de Sympa
¿Qué versión elegir?
La instalamos en russell.csic.edu.uy
, vserver /(linux-vserver) con una debian squeezee.
Via apt (o aptitude) vemos que la debian squeezee propone sympa 6.0.2
Siempre es mejor instalar la versión de un paquete que viene con la distribución elegida, y a través del sistema de empaquetado. Eso nos garantiza que pasó el control de calidad y que a futuro tendremos actualizaciones, y un proceso fácil de migración.
No obstante, en ciertos casos, como "la última capa" web, con tecnologías que no tienen demasiada dependencia directa con librerías incrustadas profundamente en el sistema (como PERL -que utiliza Sympa- o PHP) y/o cuando conocemos bien el paquete que instalamos, podemos hacer excepción y elegir instalar un paquete directamente como lo propone su comunidad, y hacerle confianza al proceso de calidad de ésta. Ésto nos permite tener las versiones más recientes del paquete.
Considerando que la comunidad de desarrollo de Sympa ha sido particularmente activa desde entonces,
que en las Release Notes
sugieren: WE STRONGLY SUGGEST YOU TO UPGRADE ANY PREVIOUS VERSION TO 6.1.1
y que, desde la 6.0.2 que integra la squeezee no hay nuevas exigencias de dependencias,
mejor instalar la última versión estable (6.1.6) desde el .tar.gz original.
Bajar la última versión de sympa
Vemos la última versión para descargar en el sitio oficial de sympa
y la bajamos.
A la hora de hacerlo para sl.edu.uy era la 6.1.6 (¡capicúa, para suerte!).
Desde entonces salió la 6.1.7
, y lo actualizamos. Mejor andá a ver las fuentes
.
Luego iniciamos el proceso de instalación de la documentación oficial
, pero antes aprovechamos que ya hay una versión de sympa bastante cercana que está en los repos:
Dependencias y requerimientos
Utilizaremos el aptitude y sacaremos provecho de la versión de sympa presente en los repositorios para instalar fácilmente todas las dependencias:
Procedimiento:
- como root, corremos aptitude
- Con "/" buscamos, ingresamos "sympa",
- entramos con "Enter" en la página de configuración de sympa
- Con las flechas bajamos para ver todas las dependencias, que podemos abrir con "Enter" (en rojo están las que faltan)
- Con "+" marcamos las dependencias para ser instaladas (van pasando a verde)
- Al final, lanzamos la instalación con "g", una primera vez para ver la lista, y una segunda para ejecutar la instalación
Para algunos paquetes, se proponen varias alternativas. Elegimos en particular postgresql como base de dato y postfix como manejador de correo (MTA).
La base de datos
¡Probemos instalarlo con postgres! Más libre, más comunitario, y conocido por su robusteza y calidad.
Para eso, en el paso precedente de las dependencias hay que ser atento en seleccionar la alternativa correcta, entre las dos que propone la dependencia correspondiente, postgresql o mysql-server.
Luego creamos el usuario para sympa, y la base sympa (esta documentación está buena
):
# su - postgres $ psql postgres=# CREATE USER sympa WITH PASSWORD 'NoSeLoDigasANadie'; postgres=# CREATE DATABASE sympa; postgres=# GRANT ALL PRIVILEGES ON DATABASE sympa TO sympa;
Luego, como dice la documentación de sympa
, para postgres el script de configuración (que vamos a correr más adelante) no configura la base de datos, y hay que hacerlo a mano. Luego de un poc de prueba/error vemos que postgres patea y para un script si ejecutamos un DROP TABLE <tabla>; con una <tabla> que no existe. Así que, a la propuesta de la doc de sympa, le comentamos todas las líneas DROP
Copiamos/pegamos el script que sigue en un shell postgres (o lo ejecutamos desde un archivo):
-- PostgreSQL Database creation script
-- esto ya esta
-- CREATE DATABASE sympa;
-- Connect to DB
\connect sympa
-- DROP TABLE user_table;
CREATE TABLE user_table (
email_user varchar (100) NOT NULL,
gecos_user varchar (150),
cookie_delay_user int4,
password_user varchar (40),
last_login_date_user int4,
last_login_host_user varchar (60),
wrong_login_count_user int4,
lang_user varchar (10),
attributes_user varchar (255),
data_user varchar (255),
CONSTRAINT ind_user PRIMARY KEY (email_user)
);
-- DROP TABLE subscriber_table;
CREATE TABLE subscriber_table (
list_subscriber varchar (50) NOT NULL,
user_subscriber varchar (100) NOT NULL,
custom_attribute_subscriber varchar (500),
robot_subscriber varchar (80) NOT NULL,
date_subscriber timestamp with time zone NOT NULL,
update_subscriber timestamp with time zone,
visibility_subscriber varchar (20),
reception_subscriber varchar (20),
topics_subscriber varchar (200),
bounce_subscriber varchar (35),
bounce_score_subscriber int4,
bounce_address_subscriber varchar (100),
comment_subscriber varchar (150),
subscribed_subscriber smallint,
included_subscriber smallint,
include_sources_subscriber varchar(50),
suspend_subscriber smallint,
suspend_start_date_subscriber int4,
suspend_end_date_subscriber int4,
CONSTRAINT ind_subscriber PRIMARY KEY (robot_subscriber,list_subscriber,user_subscriber)
);
CREATE INDEX subscriber_idx ON subscriber_table (robot_subscriber,list_subscriber,user_subscriber);
CREATE INDEX subscriber_idx2 ON subscriber_table (user_subscriber);
-- DROP TABLE admin_table;
CREATE TABLE admin_table (
list_admin varchar(50) NOT NULL,
user_admin varchar(100) NOT NULL,
robot_admin varchar(80) NOT NULL,
role_admin varchar(15) NOT NULL,
date_admin timestamp with time zone NOT NULL,
update_admin timestamp with time zone,
reception_admin varchar(20),
visibility_admin varchar(20),
comment_admin varchar(150),
subscribed_admin smallint,
included_admin smallint,
include_sources_admin varchar(50),
info_admin varchar(150),
profile_admin varchar(15),
CONSTRAINT ind_admin PRIMARY KEY (robot_admin, list_admin, role_admin, user_admin)
);
CREATE INDEX admin_idx ON admin_table(robot_admin, list_admin, role_admin, user_admin);
CREATE INDEX admin_idx2 ON admin_table(user_admin);
-- DROP TABLE exclusion_table;
CREATE TABLE exclusion_table (
list_exclusion varchar(50),
user_exclusion varchar(100),
date_exclusion int4,
CONSTRAINT ind_exclusion PRIMARY KEY (list_exclusion, user_exclusion)
);
CREATE INDEX exclusion_idx ON exclusion_table(list_exclusion, user_exclusion);
-- DROP TABLE netidmap_table;
CREATE TABLE netidmap_table (
netid_netidmap varchar (100) NOT NULL,
serviceid_netidmap varchar (100) NOT NULL,
robot_netidmap varchar (80) NOT NULL,
email_netidmap varchar (100),
CONSTRAINT ind_netidmap PRIMARY KEY (netid_netidmap, serviceid_netidmap, robot_netidmap)
);
CREATE INDEX netidmap_idx ON netidmap_table(netid_netidmap, serviceid_netidmap, robot_netidmap);
-- DROP TABLE logs_table;
CREATE TABLE logs_table (
id_logs bigint NOT NULL,
date_logs int4 NOT NULL,
robot_logs varchar (80),
list_logs varchar (50),
action_logs varchar (50) NOT NULL,
parameters_logs varchar (100),
target_email_logs varchar (100),
user_email_logs varchar (100),
msg_id_logs varchar (255),
status_logs varchar (10) NOT NULL,
error_type_logs varchar (150),
client_logs varchar (100),
daemon_logs varchar (10) NOT NULL,
CONSTRAINT ind_logs PRIMARY KEY (id_logs)
);
CREATE INDEX logs_idx ON logs_table(id_logs);
-- DROP TABLE session_table;
CREATE TABLE session_table (
id_session int8 NOT NULL,
start_date_session int4 NOT NULL,
date_session int4 NOT NULL,
remote_addr_session varchar(60),
robot_session varchar(80),
email_session varchar(100),
hit_session int4,
data_session varchar(255),
CONSTRAINT ind_session PRIMARY KEY (id_session)
);
CREATE INDEX session_idx ON session_table(id_session);
-- DROP TABLE one_time_ticket_table;
CREATE TABLE one_time_ticket_table (
ticket_one_time_ticket varchar(30),
robot_one_time_ticket varchar(80),
email_one_time_ticket varchar(100),
date_one_time_ticket bigint,
data_one_time_ticket varchar(200),
remote_addr_one_time_ticket varchar(60),
status_one_time_ticket varchar(60),
CONSTRAINT ind_one_time_ticket PRIMARY KEY (ticket_one_time_ticket)
);
CREATE INDEX one_time_ticket_idx ON one_time_ticket_table(ticket_one_time_ticket);
-- DROP TABLE bulkmailer_table;
CREATE TABLE bulkmailer_table(
messagekey_bulkmailer varchar(80),
packetid_bulkmailer varchar(33),
messageid_bulkmailer varchar(100),
receipients_bulkmailer text,
returnpath_bulkmailer varchar(100),
robot_bulkmailer varchar(80),
listname_bulkmailer varchar(50),
verp_bulkmailer smallint,
merge_bulkmailer smallint,
priority_message_bulkmailer int4,
priority_packet_bulkmailer int4,
reception_date_bulkmailer int4,
delivery_date_bulkmailer int4,
lock_bulkmailer varchar(30),
constraint ind_bulkmailer PRIMARY KEY (messagekey_bulkmailer, packetid_bulkmailer)
);
CREATE INDEX messagekey_bulkmailer_idx ON bulkmailer_table(messagekey_bulkmailer);
CREATE INDEX packetid_bulkmailer_idx ON bulkmailer_table(packetid_bulkmailer);
-- DROP TABLE bulkspool_table;
CREATE TABLE bulkspool_table (
messagekey_bulkspool varchar(33),
messageid_bulkspool varchar(100),
message_bulkspool text,
lock_bulkspool smallint,
dkim_privatekey_bulkspool varchar(100),
dkim_selector_bulkspool varchar(50),
dkim_d_bulkspool varchar(50),
dkim_i_bulkspool varchar(50),
dkim_header_list_bulkspool varchar(500),
constraint ind_bulkspool primary key (messagekey_bulkspool)
);
CREATE INDEX messagekey_bulkspool_idx ON bulkspool_table(messagekey_bulkspool);
-- DROP TABLE conf_table;
CREATE TABLE conf_table (
robot_conf varchar(80),
label_conf varchar(80),
value_conf varchar(300),
constraint ind_conf primary key (robot_conf,label_conf)
);
CREATE INDEX robot_conf_idx ON conf_table(robot_conf,label_conf);
Un acceso gráfico web a Postgres
Para tener un acceso gráfico web, instalamos phppgadmin para tener una interfaz gráfica. La instalación, que implica librerías php reemplaza el apache2-mpm-worker por apache2-mpm-prefork. Lo aceptamos.
En la wiki debian hay una explicación de la configuración de phppgadmin
.
Pero igual hay que meterle mano: Configuramos el phppgadmin para que esté accesible, pero sólo en https:
borramos la configuración por omisión de phppgadmin (que permite acceso, con un Alias, de cualquier VirtualHost), activamos el módulo ssl, instalamos un certificado autofirmado y creamos un VirtualHost en https idéntico al que viene con apache:
rm /etc/apache2/conf.d/phppgadmin.conf aptitude install ssl-cert a2enmod ssl cd /etc/apache2/sites-available cp default-ssl phppgadmin-ssl a2ensite phppgadmin-ssl
En la definición del nuevo VirtualHost, /etc/apache2/sites-available/phppgadmin-ssl llamamos la configuración del phppgadmin:
<IfModule mod_ssl.c>
<VirtualHost _default_:443>
ServerAdmin webmaster@russell.csic.edu.uy
# para tener phppgadmin sólo en HTTPS
Include /etc/phppgadmin/apache.conf
DocumentRoot /var/www
....
Y en ese archivo, /etc/phppgadmin/apache.conf, permitimos el acceso distante que está desactivado por omisión:
... order deny,allow # deny from all # allow from 127.0.0.0/255.0.0.0 ::1/128 allow from all ...
Activamos el nuevo VirtualHost y reiniciamos apache:
a2ensite phppgadmin-ssl service apache2 restart
Y ahora en un navegador, vemos nuestro acceso phppgadmin
.
(En realidad, más adelante, vamos a integrar esta configuración a un solo VirtualHost: el del manejador de listas. Multiples VirtualHost en https plantean problemas de certificados un poco trickies).
Para configurar los usuarios y bases del postgres en sí, esta documentación
me pareció la más clara.
Entramos desde el usario postgres, y creamos una base y un usuario para sympa, con una contraseña larga y generada aleatoriamente.
Módulos PERL
Acá está la lista de módulos PERL que requiere Sympa
.
Como documentado acá
, hay dos maneras de instalar los módulos PERL: preconfigurados como paquetes debian, o con el comando perl que los baja de CPAN.
El problema es que, instaldos de la primer manera, no son visibles desde el perl: Como documentado acá
, con instmodsh, y luego l vemos que sólo Perl está configurado.
Procedamos por tanteo, empezando por instalar todo lo está empaquetado en debian, y luego completando:
Instalamos (que de hecho no estaban en las dependencias de sympa...):
-+libdigest-md5-file-perl
Hagamos
para instalar los módulos que necesitamos, lanzamos:
# perl -MCPAN -e shell
Nos propone configurar lo más que puede automáticamente. (¿Será necesario YAML?)
Y luego ejecutamos (bajo el prompt cpan1> que nos da):
i /Base64/ install MIME::Base64 install CGI install Crypt::CipherSaber
Enfin... luego de algunas idas y vueltas aprendiendo, todo parece ok.
De todas maneras, una vez que estemos compilando y configurando, hay un script de verificación para instalar todos los módulos PERL que faltan (dice que son 60 o 65!). Hicimos bien de hacer lo posible, ya que ese script también nos dice:
########################################################################################## # This process will help you install all Perl (CPAN) modules required by Sympa software. # Sympa requires from 50 to 65 additional Perl modules to run properly. # The whole installation process should take around 15 minutes. # You'll first have to configure the CPAN shell itself and select your favourite CPAN server. # Note that you might prefer to install the required Perl modules using your favourite DEB/RPM mechanism. # Feel free to interrupt the process if needed ; you can restart it safely afterward. ##########################################################################################
Creación del usuario UNIX para sympa
Además de lo que dice la doc, le ponemos ciertas opciones para ser coherentes y seguros:
adduser --system --shell /bin/bash --group --disabled-password sympa
Compilación de sympa
Acá rapidito nos damos cuenta que necesitamos... un compilador. Y otras utilerías que identificamos luego de algunas idas y vueltas analizando el log de la configuración:
aptitude --with-recommends install gcc gettext make gawk
Ahí podemos compilar (los parámetros son los que requiere la debian: los deducimos luego de algunos errores):
./configure --with-initdir=/etc/init.d/ --with-lockdir=/var/lock/ make make install
Al contrario de lo que sugiere la doc con un '$', el make install hay que hacerlo como root.
El final de la instalación nos da los comandos siguientes:
/home/sympa/bin/sympa_wizard.pl --check
¡y teníamos casi todos los módulos Perl!
Configuración de sympa
Ejecutamos:
/home/sympa/bin/sympa_wizard.pl
Y le damos todos los parámetros que del servidor (ver /etc/sympa.conf y /etc/wwsympa.conf)
Configuración de WWSympa
Russell es un vserver dedicado a sympa, y por ende también su apache. La documentación nos propone
modificar el usuario de ejecución de apache. Modificamos /etc/apache2/envvars:
.... ## ver: https://www.sympa.org/manual_6.1/web-interface#alternatives_all_versions # /etc/init.d/apache2, /etc/logrotate.d/apache2, etc. # export APACHE_RUN_USER=www-data # export APACHE_RUN_GROUP=www-data export APACHE_RUN_USER=sympa export APACHE_RUN_GROUP=sympa ...
Nos faltó instalar:
aptitude install libapache2-mod-fastcgi
Y ahí podemos instalar ese módulo y otros y reiniciar:
a2enmod fastcgi a2enmod ssl service apache2 restart
En el DNS de softwarelibre.org.bo, ya tenemos configurado u A i un MX:
root@russell:# host listas.softwarelibre.edu.uy listas.softwarelibre.edu.uy has address 164.73.68.14 listas.softwarelibre.edu.uy mail is handled by 10 russell.csic.edu.uy.
Configurermos los VirtualHost de Apache. La interfaz web va a estar en https, pero correctamente re-dirigida desde http. En /etc/apache2/sites-available copiamos los modelos
cp default listas.softwarelibre.edu.uy cp default-ssl listas.softwarelibre.edu.uy-ssl
En el primero ponemos sólo una redirección:
<VirtualHost *:80>
ServerName listas.softwarelibre.edu.uy
ServerAdmin webmaster@softwarelibre.edu.uy
Redirect / https://listas.softwarelibre.edu.uy/
...
</VirtualHost>
En el segundo, la redirección de la raíz, y lo que indica la documentación de sympa:
<IfModule mod_ssl.c>
<VirtualHost _default_:443>
ServerName listas.softwarelibre.edu.uy
ServerAdmin webmaster@softwarelibre.edu.uy
RedirectMatch ^/$ http://listas.softwarelibre.edu.uy/sympa/
FastCgiServer /home/sympa/bin/wwsympa-wrapper.fcgi -processes 2
# para tener phppgadmin sólo en HTTPS
Include /etc/phppgadmin/apache.conf
<Location /sympa>
SetHandler fcgid-script
</Location>
Alias /static-sympa /home/sympa/static_content
Alias /wwsicons /home/sympa/static_content/icons
ScriptAlias /sympa /home/sympa/bin/wwsympa-wrapper.fcgi
Alias /wws /var/www/_sympa_/wwsympa.fcgi
...
</VirtualHost>
</IfModule>
Últimos ajustes...
Intentamos re-iniciar sympa... y fracasa
:
root@russell:/home/sympa# /etc/init.d/sympa restart Restarting Sympa subsystem: Stopping Sympa subsystem: Module bounced.pl not running Module archived.pl not running Stopping module bulk.pl: success Module sympa.pl not running Module task_manager.pl not running Starting Sympa subsystem: Starting module sympa.pl: output checkfiles_as_root : Missing files. Aborting. failure Starting module bulk.pl: success Starting module archived.pl: success Starting module bounced.pl: success Starting module task_manager.pl: success
Y urgando un poco, en los log /var/log/syslog/ encontramos:
Jul 24 00:32:04 russell sympa[14666]: err Conf::checkfiles_as_root() Failed to create aliases file /etc/mail/sympa_aliases Jul 24 00:32:04 russell sympa[14666]: output checkfiles_as_root : Missing files. Aborting.
Alcanza con crear la carpeta que necesita:
mkdir /etc/mail
Volvemos a reiniciar sympa, esta vez funciona, y ya con esto podmos ver: listas.softwarelibre.edu.uy
Para que Sympa arranque solo cuando reiniciamos el servidor:
update-rc.d sympa defaults
Configuración del manejador de correo (MTA)
Sólo nos queda configurar postfix para que reciba correo para el dominio y que tome en consideración los alias que genera el sympa.
En /etc/postfix/main.cf Agregamos:
....
myhostname = russell.csic.edu.uy
alias_maps = hash:/etc/aliases hash:/etc/mail/sympa_aliases
alias_database = hash:/etc/aliases hash:/etc/mail/sympa_aliases
myorigin = /etc/mailname
mydestination = listas.softwarelibre.edu.uy
softwarelibre.edu.uy
russell.csic.edu.uy, localhost.csic.edu.uy, localhost
relayhost =
....
Agregamos los dominios a mydestination para que acepte correo @listas.softwarelibre.edu.uy y @softwarelibre.edu.uy.
El alias_maps toma en cuenta los alias de sympa, que genrea su alias_manager
genera en /etc/mail/sympa_aliases.
Y el agregarlo también al alias_database asegura que el comando newaliases -que se puede correr manualmente, y que ejecuta el alias_manager de sympa cada vez que actualiza un nuevo alias- incluya la indexación en .db de ese archivo.
Algunos ajustes más para que no hayan problemas de derechos de acceso:
adduser postfix sympa cd /etc/mail chown root:root sympa_aliases newaliases chown sympa:sympa sympa_aliases* chmod g+w sympa_aliases* postfix reload
Creamos algunas listas de prueba, verificamos todo que -¡increíblemente!- funciona... Nos queda sólo personalizar el logo, el menu, finalizar bien la traducción de Sympa
, etc.