Salta el contingut

Pràctica: Llistes de Distribució amb Mailman i Docker

Objectius

En aquesta pràctica aprendràs a:

  • ✅ Desplegar Mailman 3 amb Docker
  • ✅ Configurar llistes de distribució personalitzades
  • ✅ Crear diferents tipus de llistes (oberta, tancada, moderada)
  • ✅ Gestionar usuaris i subscripcions
  • ✅ Utilitzar la interfície web Postorius
  • ✅ Configurar arxius de missatges amb HyperKitty
  • ✅ Documentar la configuració i ús

Requisits

Programari necessari

  • Docker Desktop o Docker Engine
  • Docker Compose
  • Navegador web
  • Client de correu (Thunderbird, o accés webmail)

Coneixements previs

  • Conceptes de correu electrònic (SMTP, MTA)
  • Llistes de distribució
  • Docker i contenidors

Part 1: Preparació de l'Entorn

Pas 1.1: Crear estructura de directoris

Crea un directori de treball personalitzat amb el teu nom:

# Substitueix NOMCOGNOM pel teu nom i cognom
mkdir -p ~/mailman-NOMCOGNOM
cd ~/mailman-NOMCOGNOM

# Crear subdirectoris
mkdir -p core web database

Exemple per Francesc Barragan:

mkdir -p ~/mailman-fbarragan
cd ~/mailman-fbarragan
mkdir -p core web database

Pas 1.2: Descarregar configuració de referència

Mailman 3 té una arquitectura complexa amb múltiples components. Utilitzarem una configuració simplificada.


Part 2: Docker Compose

Pas 2.1: Crear docker-compose.yml

Crea docker-compose.yml amb personalització:

services:
  # Base de dades PostgreSQL - PERSONALITZAT
  mailman-db-NOMCOGNOM:
    image: postgres:13-alpine
    container_name: mailman-db-NOMCOGNOM

    environment:
      - POSTGRES_DB=mailmandb
      - POSTGRES_USER=mailman
      - POSTGRES_PASSWORD=NOMCOGNOM2026!

    volumes:
      - ./database:/var/lib/postgresql/data

    restart: unless-stopped

    networks:
      - mailman-network

  # Mailman Core - PERSONALITZAT
  mailman-core-NOMCOGNOM:
    image: maxking/mailman-core:latest
    container_name: mailman-core-NOMCOGNOM

    hostname: mailman-core-NOMCOGNOM

    environment:
      - DATABASE_URL=postgresql://mailman:MailmanPass_NOMCOGNOM_2024!@mailman-db-NOMCOGNOM/mailmandb
      - DATABASE_TYPE=postgres
      - DATABASE_CLASS=mailman.database.postgresql.PostgreSQLDatabase
      - HYPERKITTY_API_KEY=ApiKey_NOMCOGNOM_SecretKey
      - MTA=postfix
      # PERSONALITZA el domini
      - MM_HOSTNAME=lists.NOMCOGNOM.local

    volumes:
      - ./core:/opt/mailman

    depends_on:
      - mailman-db-NOMCOGNOM

    restart: unless-stopped

    networks:
      - mailman-network

  # Mailman Web (Postorius + HyperKitty) - PERSONALITZAT

  mailman-web-NOMCOGNOM:
    image: maxking/mailman-web:latest
    container_name: mailman-web-NOMCOGNOM

    hostname: mailman-web-NOMCOGNOM

    environment:
      - DATABASE_URL=postgresql://mailman:NOMCOGNOM_2026!@mailman-db-NOMCOGNOM/mailmandb
      - DATABASE_TYPE=postgres
      - HYPERKITTY_API_KEY=ApiKey_NOMCOGNOM_SecretKey
      # PERSONALITZA els dominis
      - MAILMAN_REST_URL=http://mailman-core-NOMCOGNOM:8001
      - MAILMAN_HOST_IP=mailman-core-NOMCOGNOM
      - MAILMAN_ADMIN_USER=admin-NOMCOGNOM
      - MAILMAN_ADMIN_EMAIL=NOMCOGNOM@sapalomera.cat
      - SERVE_FROM_DOMAIN=localhost
      - UWSGI_STATIC_MAP=/static=/opt/mailman-web-data/static

    ports:
      - "8000:8000"    # Interfície web
      - "8080:8080"    # uWSGI stats

    volumes:
      - ./web:/opt/mailman-web-data

    depends_on:
      - mailman-db-NOMCOGNOM
      - mailman-core-NOMCOGNOM

    restart: unless-stopped

    networks:
      - mailman-network

networks:
  mailman-network:
    driver: bridge

IMPORTANT: Substitueix NOMCOGNOM a:

  • Noms de serveis i contenidors
  • Contrasenyes
  • API Keys
  • Email d'administrador
  • Hostnames

Part 3: Desplegament

Pas 3.1: Iniciar els serveis

# Aixecar els contenidors
docker-compose up -d

# Això pot trigar 1-2 minuts la primera vegada
# Mailman necessita crear la base de dades i estructures

# Verificar que tot està actiu
docker-compose ps

Hauries de veure 3 contenidors Up:

mailman-db-fbarragan       Up
mailman-core-fbarragan     Up
mailman-web-fbarragan      Up

Pas 3.2: Verificar logs

# Logs de tots els serveis
docker-compose logs

# Només Mailman Core
docker-compose logs mailman-core-NOMCOGNOM

# Seguir logs en temps real
docker-compose logs -f

Busca missatges com:

mailman-core: Starting Mailman's master runner
mailman-web: Django version X.Y.Z
mailman-web: uWSGI running

Captura de pantalla 1: Sortida de docker-compose ps mostrant els 3 contenidors actius.


Part 4: Accés a la Interfície Web

Pas 4.1: Crear superusuari

Abans d'accedir a la web, crea un compte d'administrador:

# PERSONALITZA el nom d'usuari i email
docker exec -it mailman-web-NOMCOGNOM \
  python manage.py createsuperuser

# Et demanarà:
Username: admin-NOMCOGNOM    (exemple: admin-fbarragan)
Email: NOMCOGNOM@sapalomera.cat
Password: ********
Password (again): ********

Exemple per Joan Garcia:

Username: admin-fbarragan
Email: fbarragan@sapalomera.cat
Password: AdminMailman2024!

Pas 4.2: Accedir a Postorius

Obre el navegador i accedeix a:

http://localhost:8000

Fes login amb les credencials creades.

Captura de pantalla 2: Pàgina principal de Postorius després del login, mostrant el nom d'usuari personalitzat.


Part 5: Creació de Llistes

Pas 5.1: Crear Llista Oberta

Des de Postorius:

  1. Clica "Lists""Create New List"
  2. Emplena els camps personalitzats:
  3. List Name: discussio-NOMCOGNOM (exemple: discussio-fbarragan)
  4. Mail Host: lists-NOMCOGNOM.local
  5. List Style: Choose a list style → "Discuss"
  6. Description: "Llista de discussió general de [Nom Complet]"
  7. Advertise this list: ✅ Sí
  8. Clica "Create List"

Configuració específica per llista oberta:

  1. Ves a Listsdiscussio-NOMCOGNOMSettingsMessage Acceptance
  2. Default action for postings:
  3. Member: Accept
  4. Non-member: Accept (això la fa oberta!)
  5. Save Changes

Tipus: Llista oberta (qualsevol pot enviar, inclús sense subscripció)

Captura de pantalla 3: Llista oberta creada i configurada.

Pas 5.2: Crear Llista Tancada

Crea una segona llista:

  1. List Name: equip-NOMCOGNOM (exemple: equip-fbarragan)
  2. Mail Host: lists-NOMCOGNOM.local
  3. Description: "Llista tancada de l'equip de [Nom Complet]"
  4. List Style: "Private"

Configuració per llista tancada:

  1. SettingsMessage Acceptance
  2. Member: Accept
  3. Non-member: Hold for moderation (requereix aprovar)
  4. SettingsSubscription Policy
  5. Subscription Policy: Moderate (requereix aprovació per subscriure's)
  6. SettingsArchiving
  7. Archive policy: private (arxius només visibles per membres)

Tipus: Llista tancada (només membres poden enviar i veure arxius)

Pas 5.3: Crear Llista Moderada

Tercera llista:

  1. List Name: anuncis-NOMCOGNOM (exemple: anuncis-fbarragan)
  2. Description: "Anuncis oficials de [Nom Complet] - Només lectura"
  3. List Style: "Announce only"

Configuració per llista només anuncis:

  1. SettingsMessage Acceptance
  2. Member: Hold for moderation (fins i tot membres necessiten aprovació!)
  3. Moderator: Només tu (admin)
  4. SettingsSubscription Policy
  5. Subscription Policy: Open (qualsevol es pot subscriure)
  6. Unsubscription Policy: Open

Tipus: Llista moderada / només anuncis (només admins publiquen)

Taula resum:

Llista Tipus Qui pot enviar Qui pot subscriure Arxius
discussio-NOMCOGNOM Oberta Qualsevol Lliure Públics
equip-NOMCOGNOM Tancada Només membres Amb aprovació Privats
anuncis-NOMCOGNOM Moderada Només admin Lliure Públics

Captura de pantalla 4: Llista de les 3 llistes creades a Postorius.


Part 6: Gestió d'Usuaris

Pas 6.1: Subscriure usuaris a llista oberta

A discussio-NOMCOGNOM:

  1. Mass OperationsMass Subscribe
  2. Afegeix 3 adreces de correu (poden ser fictícies per aquesta pràctica):
    alumne1-NOMCOGNOM@exemple.cat
    alumne2-NOMCOGNOM@exemple.cat
    alumne3-NOMCOGNOM@exemple.cat
    
    Exemple per Joan Garcia:
    alumne1-fbarragan@exemple.cat
    alumne2-fbarragan@exemple.cat
    alumne3-fbarragan@exemple.cat
    
  3. Subscribe

Nota: Com que estem en entorn de proves sense servidor SMTP real, els emails no s'enviaran. Això és acceptable per a aquesta pràctica.

Pas 6.2: Subscriure usuaris a llista tancada

A equip-NOMCOGNOM:

  1. Afegeix 2 membres:
    membre1-NOMCOGNOM@exemple.cat
    membre2-NOMCOGNOM@exemple.cat
    
  2. Subscribe

Pas 6.3: Subscriure usuaris a llista d'anuncis

A anuncis-NOMCOGNOM:

  1. Afegeix 4-5 subscriptors
  2. Els usuaris rebran anuncis però no poden enviar

Captura de pantalla 5: Llista de membres d'una de les llistes amb emails personalitzats.


Part 7: Arxius amb HyperKitty

Pas 7.1: Accedir als arxius

Desde Postorius, clica sobre una llista i després "Archives".

Això et portarà a HyperKitty, l'arxiu de missatges.

URL: http://localhost:8000/hyperkitty/list/discussio-NOMCOGNOM@lists-NOMCOGNOM.local/

Pas 7.2: Simular enviament de missatge

Com que no tenim servidor SMTP configurat, simula un missatge directament a la base de dades (només per veure els arxius):

Alternativament, pots visualitzar l'estructura d'arxius sense missatges reals.

Captura de pantalla 6: Pàgina d'arxius de HyperKitty (encara que estigui buida).


Part 8: Configuració Avançada

Pas 8.1: Configurar benvinguda personalitzada

Per a equip-NOMCOGNOM:

  1. SettingsAutomatic Responses
  2. Welcome message:
    Benvingut/da a la llista de l'equip de [Nom Complet]!
    
    Aquesta és una llista privada per a comunicació interna.
    
    Per enviar un missatge: equip-NOMCOGNOM@lists-NOMCOGNOM.local
    Per donar-te de baixa: equip-NOMCOGNOM-leave@lists-NOMCOGNOM.local
    
    Salutacions,
    [Nom Complet]
    Administrador/a
    
  3. Save

Pas 8.2: Configurar capçaleres de correu

  1. SettingsHeader Filters
  2. Afegeix capçalera personalitzada:
  3. Header: X-Mailman-Version
  4. Pattern: .* (accepta qualsevol)
  5. Action: Accept

Pas 8.3: Configurar retenció de missatges

  1. SettingsArchiving
  2. Archive policy: public o private segons el tipus de llista
  3. Archive rendering mode: text (més segur) o markdown

Part 9: Exportació i Backup

Pas 9.1: Exportar configuració de llista

# Llista configuracions de totes les llistes
docker exec mailman-core-NOMCOGNOM mailman lists

# Exportar configuració d'una llista específica
docker exec mailman-core-NOMCOGNOM \
  mailman conf -l discussio-NOMCOGNOM@lists-NOMCOGNOM.local \
  > config-discussio-NOMCOGNOM.txt

Captura de pantalla 7: Sortida de mailman lists mostrant les 3 llistes creades.

Pas 9.2: Backup de base de dades

# Backup de PostgreSQL
docker exec mailman-db-NOMCOGNOM \
  pg_dump -U mailman mailmandb \
  > backup-mailman-NOMCOGNOM-$(date +%Y%m%d).sql

Qüestions i Exercicis

Qüestió 1: Tipus de llistes

Completa la taula amb les característiques de cada tipus:

Característica Llista Oberta Llista Tancada Llista Moderada
Qui pot enviar?
Subscripció lliure?
Arxius públics?
Cas d'ús típic

Qüestió 2: Configuració

a) Quina diferència hi ha entre Hold for moderation i Reject per a non-members?

b) Per què és important desactivar els arxius públics en llistes privades?

c) Què és la política de digest i quan és útil?

Qüestió 3: Escalabilitat

Si la llista discussio-NOMCOGNOM té 500 subscriptors i reben una mitjana de 10 missatges/dia:

a) Quants emails s'envien diàriament?

b) Si cada email és ~50 KB, quant d'espai ocupen els arxius al mes?

c) Quins problemes podrien aparèixer amb 10.000 subscriptors?

Exercici 1: Llista amb digest

Configura la llista equip-NOMCOGNOM per oferir mode digest:

  1. SettingsDigest
  2. Digest size threshold: 30 KB
  3. Should Mailman send periodic digests: Yes
  4. Digest send frequency: Daily

Subscriu un usuari en mode digest: digest-NOMCOGNOM@exemple.cat

Exercici 2: Templates personalitzats

Personalitza el template de benvinguda amb HTML:

<html>
<body>
<h2>Benvingut/da a {{list_name}}!</h2>
<p>Administrador: <strong>{{owner}}</strong></p>
<p>Descripció: {{description}}</p>
</body>
</html>

Exercici 3: Script de gestió massiva

Crea un script bash que: - Llegeix un fitxer CSV amb emails - Subscriu tots els usuaris a discussio-NOMCOGNOM - Genera un informe dels subscrits amb èxit


Lliurament

Format de lliurament

Document PDF amb:

1. Portada

  • Nom complet, curs, data

2. Configuració

  • docker-compose.yml complet amb personalitzacions destacades
  • Captura de variables d'entorn personalitzades

3. Captures de pantalla (mínimes 7)

  1. docker-compose ps amb contenidors actius
  2. Postorius després del login (nom d'usuari visible)
  3. Llista oberta creada i configurada
  4. Llista de les 3 llistes amb noms personalitzats
  5. Membres d'una llista amb emails personalitzats
  6. Pàgina d'arxius HyperKitty
  7. Sortida de mailman lists

4. Taula de llistes creades

Nom llista Tipus Política enviament Política subscripció Arxius Membres
discussio-NOMCOGNOM Oberta ... ... ... 3
equip-NOMCOGNOM ... ... ... ... ...
anuncis-NOMCOGNOM ... ... ... ... ...

5. Respostes a qüestions

  • Qüestió 1: Taula completada
  • Qüestió 2: a, b, c amb respostes raonades
  • Qüestió 3: a, b, c amb càlculs

6. Exercicis opcionals

  • Documentació exercicis realitzats

7. Reflexió personal (250-300 paraules)

  • Utilitat de les llistes de distribució
  • Comparativa Mailman vs grups de Telegram/WhatsApp
  • Casos d'ús reals a l'institut/empresa
  • Dificultats trobades

Criteris d'Avaluació

Criteri Punts Pes
Personalització (noms llistes, emails, configuracions) 1,5 15%
Docker Compose funcional 1,5 15%
3 llistes creades amb tipus correctes 2,0 20%
Configuració específica per tipus 1,5 15%
Usuaris subscrits correctament 1,0 10%
Captures de pantalla completes 1,5 15%
Respostes a qüestions 1,0 10%
TOTAL 10,0 100%

Penalitzacions

Infracció Penalització
Còpia detectada -10 (qualificació 0)
NOMCOGNOM sense substituir -2,0 punts
Menys de 3 llistes creades -2,0 punts
Llistes sense configuració específica de tipus -1,5 punts
Contenidors no funcionals -2,5 punts
Captura obligatòria absent -0,25 punts cada una

Requisits mínims

  • 3 contenidors actius (db, core, web)
  • 2+ llistes creades amb noms personalitzats
  • Accés a Postorius funcional
  • Configuració bàsica de tipus de llista
  • Captures mínimes (5 de 7)

Recursos Addicionals

Documentació

Alternatives

  • Listmonk - Newsletter moderna
  • Sympa - Alternativa a Mailman
  • Discourse - Fòrum modern amb funcions de llista

Solució de Problemes

Els contenidors no s'inicien

# Verificar logs
docker-compose logs

# Reiniciar nets
docker-compose down
docker-compose up -d

No puc accedir a Postorius

Causa: Contenidor web no està llest.

Solució: Espera 1-2 minuts, després refresca. Verifica:

docker-compose logs mailman-web-NOMCOGNOM | grep "uWSGI"

Error al crear llista

Causa: Domini no configurat correctament.

Solució: Verifica que MM_HOSTNAME a docker-compose coincideix amb el Mail Host utilitzat.


Conclusió

Ara tens un sistema complet de llistes de distribució amb:

  • ✅ Mailman 3 desplegat amb Docker
  • ✅ 3 tipus de llistes configurades (oberta, tancada, moderada)
  • ✅ Gestió d'usuaris i subscripcions
  • ✅ Interfície web Postorius
  • ✅ Arxius amb HyperKitty

Aquesta configuració és aplicable a: - Comunicació interna d'empreses/institucions - Grups d'estudi i projectes col·laboratius - Newsletters i anuncis oficials - Comunitats i associacions

Enhorabona per dominar les llistes de distribució! 📧📋