Mailman 3 installieren: Unterschied zwischen den Versionen
Tim (Diskussion | Beiträge) |
Cds09 (Diskussion | Beiträge) |
||
(3 dazwischenliegende Versionen von einem anderen Benutzer werden nicht angezeigt) | |||
Zeile 367: | Zeile 367: | ||
<syntaxhighlight lang="bash">monit</syntaxhighlight> | <syntaxhighlight lang="bash">monit</syntaxhighlight> | ||
Für <code>mailman-web qcluster</code> kann alternativ ein minütlich laufender | Für <code>mailman-web qcluster</code> kann alternativ ein minütlich laufender Systemd Timer verwendet werden. | ||
== Logrotation == | == Logrotation == | ||
Zeile 445: | Zeile 445: | ||
Außerdem müssen die E-Mail Adressen für die Mailingliste angelegt werden, im HSAdmin. Zum Beispiel für die Liste meine-erste-liste: meine-erste-liste, meine-erste-liste-join, meine-erste-liste-leave, meine-erste-liste-owner, für die Domain lists.example.org. Die E-Mails sollen in das Postfach gehen, wo mailman installiert ist. | Außerdem müssen die E-Mail Adressen für die Mailingliste angelegt werden, im HSAdmin. Zum Beispiel für die Liste meine-erste-liste: meine-erste-liste, meine-erste-liste-join, meine-erste-liste-leave, meine-erste-liste-owner, für die Domain lists.example.org. Die E-Mails sollen in das Postfach gehen, wo mailman installiert ist. | ||
Alternativ kann eine Catch-All Adresse eingerichtet werden, damit alle E-Mails an die Subdomain in das Postfach vom mailman gehen. Der Catch-All ist laut Postfix Regeln eine Adresse mit einem leeren lokalen Teil (siehe auch der Screenshot in der [[Sympa_installieren#Neue_Liste_einrichten|entsprechenden Anleitung von Sympa]]). | |||
== Die Selbst-Registrierung von Benutzern verhindern == | |||
Per Default kann sich jede Person im Mailman3 ein Benutzerkonto anlegen. Wenn das nicht erwünscht ist, kann in der Datei <code>var/etc/settings.py</code> die folgende Zeile hinzugefügt werden: | |||
<syntaxhighlight lang="python"> | |||
ACCOUNT_ADAPTER = 'django_mailman3.views.user_adapter.DisableSignupAdapter' | |||
</syntaxhighlight> | |||
Es können in diesem Fall im Django Backend durch den Administrator Benutzerkonten angelegt werden, auf https://lists.example.org/admin/auth/user/ | |||
== Update == | == Update == |
Aktuelle Version vom 3. Dezember 2024, 13:18 Uhr
Die folgende Anleitung zur Installation von Mailman 3 auf Hostsharing geht davon aus, dass als Domäne lists.example.org und als Domänennutzer xyz00-lists verwendet wird. Es ist zu empfehlen, auszuführende Befehle und Konfigurationen vorab auf zu ersetzende Werte zu prüfen. Alle Befehle sind als Benutzer xyz00-lists zu starten. Damit mehrere aufeinander folgende Shell-Kommandos leichter kopiert werden können, wird nur vor das jeweils erste Kommando ein $ gesetzt. Zum Verständnis mancher der folgenden Anweisungen kann es hilfreich sein, die Mailman-Dokumentation gelesen und sich mit Pipenv beschäftigt zu haben.
Achtung: Mailman 3 benötigt zahlreiche Hintergrundprozesse, was beim Managed Webspace zusätzliche Kosten verursacht.
Datenbank
Zunächst muss eine PostgreSQL- oder MySQL-Datenbank angelegt werden. (Mailman läuft auch mit SQLite, ist aber für den Produktivbetrieb nicht empfohlen.) Je nach gewählter Datenbank unterscheiden sich manche Schritte geringfügig, was an den entsprechenden Stellen dokumentiert ist.
Mailman Core
Für die Installation von Mailman Core sind folgende Kommandos auszuführen:
pip3 install --user pipenv
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.profile
source ~/.profile
mkdir ~/mailman
cd ~/mailman
pipenv install mailman
pipenv install mailman_hyperkitty
pipenv install psycopg2-binary # Für PostgreSQL
pipenv install pymysql # Für MySQL
Hinweis: Das Kommando pipenv
muss immer im Verzeichnis ~/mailman
ausgeführt werden.
Anschließend wird das Verzeichnis für die Konfigurationsdatei angelegt:
mkdir -p ~/mailman/etc
Die Konfiguration wird in die Datei ~/mailman/core/etc/mailman.cfg
geschrieben:
[mailman]
site_owner: admin@example.org
default_language: de
[paths.here]
var_dir: $cwd/core
[database] # https://mailman.readthedocs.io/en/latest/src/mailman/docs/database.html
class: mailman.database.postgresql.PostgreSQLDatabase
url: postgresql://myuser:mypassword@mypghost/mailman
# Fallls MySQL verwendet:
#class: mailman.database.mysql.MySQLDatabase
#url: mysql+pymysql://myuser:mypassword@mymysqlhost/mailman?charset=utf8&use_unicode=1
# SQLite ist Standard, wenn nichts konfiguriert ist
[webservice] # REST Service von Mailman. Wird von [[#Web_Frontend|Web Frontend]] verwendet
port: 8001 # ändern, falls belegt
admin_user: restadmin
admin_pass: restpass
[mta]
smtp_host: xyz00.hostsharing.net
smtp_port: 4587
smtp_user: xyz00-lists
smtp_pass: secret
smtp_secure_mode: starttls
# https://mailman.readthedocs.io/en/latest/src/mailman/docs/mta.html
# NullMTA, da MTA nicht selbst konfiguriert werden kann
incoming: mailman.mta.null.NullMTA
lmtp_port: 8024 # ändern, falls belegt
[runner.nntp]
# Runner für [https://de.wikipedia.org/wiki/Network_News_Transfer_Protocol NNTP] Gateway ausschalten
start: no
[archiver.hyperkitty]
class: mailman_hyperkitty.Archiver
enable: yes
# $HOME muss durch den tatsächlichen Pfad zum Benutzerverzeichnis ersetzt werden
configuration: $HOME/mailman/core/etc/mailman-hyperkitty.cfg
Zugriffsrechte einschränken:
chmod 0600 ~/mailman/core/etc/mailman.cfg
Damit Hyperkitty als Web Frontend für das Archiv verwendet werden kann, ist in die Datei ~/mailman/core/etc/mailman-hyperkitty.cfg
Foglendes zu schreiben:
[general]
base_url: https://lists.example.org/hyperkitty/
# Muss identisch mit Key in Hyperkitty sein (s.u.)
api_key: SecretArchiverAPIKey
Zugriffsrechte einschränken:
chmod 0600 ~/mailman/core/etc/mailman-hyperkitty.cfg
Kommando mailman anlegen:
cat <<'EOD' >~/.local/bin/mailman
#!/bin/sh
export MAILMAN_CONFIG_FILE=$HOME/mailman/core/etc/mailman.cfg
cd ~/mailman
pipenv run mailman "$@"
EOD
chmod +x ~/.local/bin/mailman
Hinweis: Da in mailman
das Verzeichnis gewechselt wird, funktionieren relative Pfadangaben als Argument nicht bzw. nur, wenn man sich bereits in ~/mailman
befindet.
Nun kann mit mailman info
nochmal die aktuelle Konfiguration geprüft werden.
Danach kann Mailman gestartet werden:
mailman start
Web Frontend
In diesem Abschnitt wird die Installation des Web Frontends beschrieben.
Zunächst werden die Redirects aus der .htaccess
gelöscht:
echo "" > ~/doms/lists.example.org/htdocs-ssl/.htaccess
Anschließend werden die erforderlichen Python-Pakete installiert:
cd ~/mailman
pipenv install mailman-web
Um Plattenplatz freizugeben, kann optional der Pip Cache gelöscht werden:
pipenv --clear
Zur Konfiguration von Hyperkitty wird die IP-Adresse benötigt, von der die Anfragen von Mailman Core kommen. Diese kann wie folgt ermittelt werden:
cat <<EOD >~/doms/lists.example.org/htdocs-ssl/ip.php
<?php
echo \$_SERVER['REMOTE_ADDR'] . "\n";
EOD
curl <nowiki>https://lists.example.org/ip.php</nowiki>
rm ~/doms/lists.example.org/htdocs-ssl/ip.php
Die Konfiguration wird nun in Die Datei ~/mailman/web/settings.py
geschrieben:
# See https://mailman-web.readthedocs.io/en/latest/settings.html
from mailman_web.settings.base import *
from mailman_web.settings.mailman import *
BASE_DIR = os.path.join(os.environ['HOME'], 'mailman', 'web')
# Default path where static files will be placed.
# 'collectstatic' command will copy all the static files here.
# Alias this location from your webserver to `/static`
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
# Make sure that the directory is created or Django will fail on start.
LOGGING['handlers']['file']['filename'] = os.path.join(BASE_DIR, 'logs', 'mailmanweb.log')
# Change path of Whoosh index
HAYSTACK_CONNECTIONS['default']['PATH'] = os.path.join(BASE_DIR, 'whoosh_index')
# django-compressor
# https://pypi.python.org/pypi/django_compressor
COMPRESS_PRECOMPILERS = (
('text/x-scss', 'sass -t compressed {infile} {outfile}'),
('text/x-sass', 'sass -t compressed {infile} {outfile}'),
)
# https://django-q.readthedocs.io/en/latest/configure.html
# 1 worker is probably enough. (Default is 3.)
Q_CLUSTER['workers'] = 1
# Default list of admins who receive the emails from error logging.
# https://docs.djangoproject.com/en/dev/ref/settings/#admins
ADMINS = (
('Mailman Admin', 'admin@example.org'),
)
# Database setup.
# https://docs.djangoproject.com/en/dev/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2', # Für MySQL: django.db.backends.mysql
'HOST': 'localhost',
'NAME': 'database_name',
'USER': 'database_user',
'PASSWORD': 'database_password',
}
}
# Hosts/domain names that are valid for this site; required if DEBUG is False.
# https://docs.djangoproject.com/en/dev/ref/settings/#allowed-hosts
ALLOWED_HOSTS = [
'lists.example.org',
]
# A secret key for a particular Django installation. This is used to provide
# cryptographic signing, and should be set to a unique, unpredictable value.
# https://docs.djangoproject.com/en/dev/ref/settings/#secret-key
SECRET_KEY = 'change-this-on-your-production-server'
# Mailman Core default API Path
MAILMAN_REST_API_URL = 'http://localhost:8001'
# Mailman Core API user
MAILMAN_REST_API_USER = 'restadmin'
# Mailman Core API user's password.
MAILMAN_REST_API_PASS = 'restpass'
# Mailman Core Shared archiving key. This value is set in the
# mailman-hyperkitty's configuration file.
MAILMAN_ARCHIVER_KEY = 'SecretArchiverAPIKey'
# Host for Mailman Core, from where Hyperkitty will accept connections
# for archiving.
MAILMAN_ARCHIVER_FROM = ('<IP von Mailman Core>')
# Base URL where Django/Mailman-web would be listening for requests. Used by
# Mailman Core for fetching templates.
POSTORIUS_TEMPLATE_BASE_URL = 'https://lists.example.org'
# Sender in emails sent out by Postorius.
# https://docs.djangoproject.com/en/dev/ref/settings/#std:setting-DEFAULT_FROM_EMAIL
DEFAULT_FROM_EMAIL = 'postorius@lists.example.org'
# If you enable email reporting for error messages, this is where those emails
# will appear to be coming from. Make sure you set a valid domain name,
# otherwise the emails may get rejected.
# https://docs.djangoproject.com/en/dev/ref/settings/#std:setting-SERVER_EMAIL
SERVER_EMAIL = 'django@lists.example.org'
# Configuration used to send emails.
# https://docs.djangoproject.com/en/dev/ref/settings/#email-host
EMAIL_HOST = 'xyz00.hostsharing.net'
EMAIL_PORT = 4587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = 'xyz00-lists'
EMAIL_HOST_PASSWORD = 'secret'
EMAIL_TIMEOUT = 60
# A string representing the time zone for this installation.
# https://docs.djangoproject.com/en/dev/ref/settings/#std:setting-TIME_ZONE
TIME_ZONE = 'Europe/Berlin'
# A string representing the language code for this installation.
# https://docs.djangoproject.com/en/dev/ref/settings/#language-code
LANGUAGE_CODE = 'de-de'
# Disable support for gravatars in HyperKitty and Postorius.
# https://docs.mailman3.org/projects/hyperkitty/en/latest/install.html#customization
HYPERKITTY_ENABLE_GRAVATAR = False
# Hinweis: In der derzeit aktuellen Version (1.3.5) der Komponente
# django-mailman3 wird obige Variable nicht berücksichtigt. Deshalb kann die
# folgende Direktive nur mit dem Entwicklungsstand aus git einkommentiert werden.
# django_gravatar is not required, anymore.
#INSTALLED_APPS.remove('django_gravatar')
Zugriffsrechte einschränken:
chmod 600 ~/mailman/web/settings.py
Hinweis: Wird die Konfiguration geändert, nachdem das Web Frontend aufgerufen wurde, muss es neu gestartet werden:
mkdir -p ~/doms/lists.example.org/app-ssl/tmp
touch ~/doms/lists.example.org/app-ssl/tmp/restart.txt
Das für Logs definierte Verzeichnis anlegen:
mkdir -p ~/mailman/web/logs
Damit per Django verfügbare Kommandos leicht ausgeführt werden können, wird der Befehl mailman-web eingerichtet:
cat <<'EOD' >~/.local/bin/mailman-web
#!/bin/sh
export MAILMAN_WEB_CONFIG=$HOME/mailman/web/settings.py
cd ~/mailman
pipenv run mailman-web "$@"
EOD
chmod +x ~/.local/bin/mailman-web
Anschließend wird das Datenbankschema eingerichtet:
mailman-web migrate
Mit dem folgenden Kommando werden statische Daten für das Web Frontend ins konfiguriete Verzeichnis geschrieben:
mailman-web collectstatic
Nun müssen die statischen Dateien für das Web Frontend noch per HTTPS verfügbar gemacht werden:
ln -s ~/mailman/mailman-suite/mailman-suite_project/static ~/doms/lists.example.org/htdocs-ssl/
Zum Anlegen des Administrators des Web Frontends wird dieser Befehl ausgeführt:
mailman-web createsuperuser
Da die Übersetzungsdateien nur in Mailman Core, jedoch nicht bei den Web Frontend Komponenten im Binärformat enthalten sind, muss die Konvertierung nachgeholt werden:
for pofile in $(find $(pipenv --venv) -path '*/locale/*/LC_MESSAGES/*.po'); do
mofile=${pofile/.po/.mo}
if [ ! -f $mofile ] || [ $pofile -nt $mofile ]; then
echo $pofile
msgfmt $pofile -o $mofile -v
fi
done
Damit das Web Frontend per Phusion Passenger geladen werden kann:
cat <<EOD >~/doms/lists.example.org/app-ssl/passenger_wsgi.py
import os
import subprocess
import sys
os.environ['LANG'] = 'C.UTF-8'
os.environ['LC_ALL'] = 'C.UTF-8'
HOME = os.environ['HOME']
PIPENV = os.path.join(HOME, '.local', 'bin', 'pipenv')
PIPFILE_DIR = os.path.join(HOME, 'mailman')
PIPENV_PYTHON = subprocess.check_output([PIPENV, '--py'], cwd=PIPFILE_DIR).strip().decode('utf-8')
if sys.executable != PIPENV_PYTHON:
os.execl(PIPENV_PYTHON, PIPENV_PYTHON, *sys.argv)
os.environ['MAILMAN_WEB_CONFIG'] = os.path.join(HOME, 'mailman', 'web', 'settings.py')
from mailman_web.wsgi import application
EOD
Nun steht das Web Frontend unter https://lists.example.org/
zur Verfügung. Über die Django Administration sollte unter https://lists.example.org/admin/sites/site/1/change/
die Domäne angepasst werden.
Mails an Mailman weiterleiten
Da die MTA-Konfiguration nicht direkt angepasst werden kann, ist ein Hilfskonstrukt erforderlich: Mittels .forward-Datei werden eingehende Mails an das Programm msmtp
weitergeleitet, welches diese per LMTP bei Mailman abliefert. msmtp ist auf den Managed Servern vorinstalliert.
MM_LMTP_PORT=8024 # In Mailman Core konfigurierter Port cat <<EOD >.forward+mailman "|/usr/bin/msmtp --host=localhost --port=$MM_LMTP_PORT --protocol=lmtp --read-envelope-from \$(echo \$ORIGINAL_RECIPIENT | sed 's/+.\+@/@/')" EOD
Der sed
Befehl ist erforderlich, damit Mails mit Plus Addressing mit der eigentlichen Empfängeradresse bei Mailman ankommen.
Für die Domain lists.example.org
wird in HSAdmin oder per hssscript
eine Catchall-Adresse mit xyz00-lists+mailman
als Ziel eingerichtet. Bei einer Catchall-Adresse wird als localpart
ein leerer String angegeben.
Dienste starten und überwachen
Für die beiden benötigten Dienste kann monit wie folgt konfiguriert werden:
mkdir monit
cat <<EOD >~/.monitrc
set daemon 60
with start delay 90
set httpd unixsocket $HOME/monit/monit.sock
permission 600
allow mailman:monit
set mailserver localhost
set mail-format { from: monit@lists.example.org }
set alert admin@example.org
set logfile $HOME/monit/monit.log
set idfile $HOME/monit/monit.id
set pidfile $HOME/monit/monit.pid
set statefile $HOME/monit/monit.state
check process mailman
pidfile $HOME/mailman/core/master.pid
start program = "$HOME/.local/bin/mailman start"
stop program = "$HOME/.local/bin/mailman stop"
restart program = "$HOME/.local/bin/mailman restart"
check process mailman-web-qcluster
matching "mailman-web qcluster"
start program = "/bin/bash -c 'nohup $HOME/.local/bin/mailman-web qcluster >>$HOME/mailman/web/logs/qcluster.log 2>&1 &'"
stop program = "/usr/bin/pkill -f 'mailman-web qcluster'"
depends on mailman
EOD
Dienste starten:
monit
Für mailman-web qcluster
kann alternativ ein minütlich laufender Systemd Timer verwendet werden.
Logrotation
Die Rotation der Logdateien kann so konfiguriert werden:
cat <<EOD >~/logrotate.conf
compress
delaycompress
missingok
notifempty
dateext
$HOME/monit/monit.log {
rotate 1
weekly
maxsize 1M
}
$HOME/mailman/core/logs/*.log {
rotate 6
daily
sharedscripts
postrotate
$HOME/.local/bin/mailman reopen >/dev/null ||:
endscript
}
$HOME/mailman/web/logs/mailmanweb.log {
rotate 6
daily
}
$HOME/mailman/web/logs/qcluster.log {
rotate 1
size 100k
postrotate
/usr/bin/monit restart mailman-web-qcluster >/dev/null ||:
endscript
}
EOD
Hinweis: qcluster.log
wird hier nur bei Überschreiten der definierten Größe rotiert, um regelmäßige Mails von monit zu vermeiden.
Cron Jobs
Für Mailman sind verschiedene Cron Jobs erforderlich. Zudem sollen nach einem Neustart die monit
Dienste gestartet werden und täglich eine Logrotation erfolgen. Die Einrichtung kann so erfolgen (eine bereits existierende crontab wird überschrieben):
cat <<EOD | crontab -
MAILTO=admin@example.org
HOME=$HOME
PATH=$HOME/.local/bin:/usr/bin:/bin:/usr/sbin
@reboot rm -f \$HOME/monit/monit.pid \$HOME/mailman/core/master.pid && monit
@daily logrotate -s \$HOME/.logrotate_state \$HOME/logrotate.conf
# Send periodic digests.
@daily mailman digests --send
* * * * * mailman-web runjobs minutely
2,17,32,47 * * * * mailman-web runjobs quarter_hourly
@hourly mailman-web runjobs hourly
@daily mailman-web runjobs daily
@weekly mailman-web runjobs weekly
@monthly mailman-web runjobs monthly
@yearly mailman-web runjobs yearly
EOD
Soll eine existierende crontab nicht überschrieben werden, muss das Kommando crontab -e
ausgeführt und die crontab entsprechend angepasst werden. (Dabei \$HOME
mit $HOME
und $HOME
mit dem Pfad des Benutzerverzeichnisses ersetzen.)
Liste anlegen
Damit Mailman tatsächlich genutzt werden kann, muss natürlich eine Liste eingerichtet werden.
mailman create meine-erste-liste@lists.example.org # Alternativ über Web Frontend
Außerdem müssen die E-Mail Adressen für die Mailingliste angelegt werden, im HSAdmin. Zum Beispiel für die Liste meine-erste-liste: meine-erste-liste, meine-erste-liste-join, meine-erste-liste-leave, meine-erste-liste-owner, für die Domain lists.example.org. Die E-Mails sollen in das Postfach gehen, wo mailman installiert ist. Alternativ kann eine Catch-All Adresse eingerichtet werden, damit alle E-Mails an die Subdomain in das Postfach vom mailman gehen. Der Catch-All ist laut Postfix Regeln eine Adresse mit einem leeren lokalen Teil (siehe auch der Screenshot in der entsprechenden Anleitung von Sympa).
Die Selbst-Registrierung von Benutzern verhindern
Per Default kann sich jede Person im Mailman3 ein Benutzerkonto anlegen. Wenn das nicht erwünscht ist, kann in der Datei var/etc/settings.py
die folgende Zeile hinzugefügt werden:
ACCOUNT_ADAPTER = 'django_mailman3.views.user_adapter.DisableSignupAdapter'
Es können in diesem Fall im Django Backend durch den Administrator Benutzerkonten angelegt werden, auf https://lists.example.org/admin/auth/user/
Update
Mailman lässt sich wie im Folgenden beschrieben aktualisieren.
Python-Pakete für die Aktualisierungen vorliegen ausgeben:
cd ~/mailman
pipenv update --outdated
Vor dem eigentlichen Update empfiehlt es sich, die Release Notes (zumindest von Mailman) zu lesen und auf relevante Änderungen zu prüfen.
Mailman stoppen:
monit stop mailman
Update der Pakete:
pipenv update
Ggf. Pip Cache löschen:
pipenv --clear
Datenbankmigrationen durchführen:
mailman-web makemigrations
mailman-web migrate
Übersetzungen aktualisieren:
for pofile in $(find $(pipenv --venv) -path '*/locale/*/LC_MESSAGES/*.po'); do
mofile=${pofile/.po/.mo}
if [ ! -f $mofile ] || [ $pofile -nt $mofile ]; then
echo $pofile
msgfmt $pofile -o $mofile -v
fi
done
Statische Dateien aktualisieren:
mailman-web collectstatic -c
Abschließend die Dienste wieder starten:
monit start mailman
monit start mailman-web-qcluster
Web Frontend neu starten:
mkdir -p ~/doms/lists.example.org/app-ssl/tmp
touch ~/doms/lists.example.org/app-ssl/tmp/restart.txt