<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki.hostsharing.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Dtu00-wiki</id>
	<title>Hostsharing Wiki - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.hostsharing.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Dtu00-wiki"/>
	<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Spezial:Beitr%C3%A4ge/Dtu00-wiki"/>
	<updated>2026-04-25T21:34:44Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Mailman_3_installieren&amp;diff=6346</id>
		<title>Mailman 3 installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Mailman_3_installieren&amp;diff=6346"/>
		<updated>2024-01-19T21:28:38Z</updated>

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

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

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

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

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

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

		<summary type="html">&lt;p&gt;Dtu00-wiki: Verschiedene Korrekturen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die folgende Anleitung zur Installation von Mailman 3 auf Hostsharing geht davon aus, dass als Domäne &#039;&#039;lists.example.org&#039;&#039; und als Domänennutzer &#039;&#039;xyz00-lists&#039;&#039; verwendet wird. Es ist zu empfehlen, auszuführende Befehle und Konfigurationen vorab auf zu ersetzende Werte zu prüfen. Alle Befehle sind als Benutzer &#039;&#039;xyz00-lists&#039;&#039; zu starten. Damit mehrere aufeinander folgende Shell-Kommandos leichter kopiert werden können, wird nur vor das jeweils erste Kommando ein &#039;&#039;$&#039;&#039; gesetzt. Zum Verständnis mancher der folgenden Anweisungen kann es hilfreich sein, die [https://mailman.readthedocs.io/ Mailman-Dokumentation] gelesen und sich mit [https://pipenv.readthedocs.io/en/latest/ Pipenv] beschäftigt zu haben.&lt;br /&gt;
&lt;br /&gt;
Achtung: Mailman 3 benötigt zahlreiche Hintergrundprozesse, was beim Managed Webspace zusätzliche Kosten verursacht.&lt;br /&gt;
&lt;br /&gt;
== Datenbank ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Mailman Core ==&lt;br /&gt;
Für die Installation von Mailman Core sind folgende Kommandos auszuführen:&lt;br /&gt;
 $ pip3 install --user pipenv&lt;br /&gt;
 echo &#039;export PATH=&amp;quot;$HOME/.local/bin:$PATH&amp;quot;&#039; &amp;gt;&amp;gt; ~/.profile&lt;br /&gt;
 source ~/.profile&lt;br /&gt;
 mkdir ~/mailman&lt;br /&gt;
 cd ~/mailman&lt;br /&gt;
 pipenv install mailman mailman-hyperkitty&lt;br /&gt;
 pipenv install psycopg2-binary # Für PostgreSQL&lt;br /&gt;
 pipenv install pymsql # Für MySQL&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend wird das Verzeichnis für die Konfigurationsdatei angelegt:&lt;br /&gt;
 $ mkdir -p ~/mailman/var/etc&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration wird in die Datei &amp;lt;code&amp;gt;~/mailman/var/etc/mailman.cfg&amp;lt;/code&amp;gt; geschrieben:&lt;br /&gt;
 [mailman]&lt;br /&gt;
 site_owner: admin@example.org&lt;br /&gt;
 default_language: de&lt;br /&gt;
 &lt;br /&gt;
 [database] # https://mailman.readthedocs.io/en/latest/src/mailman/docs/database.html&lt;br /&gt;
 class: mailman.database.postgresql.PostgreSQLDatabase&lt;br /&gt;
 url: postgres://myuser:mypassword@mypghost/mailman&lt;br /&gt;
 # Fallls MySQL verwendet:&lt;br /&gt;
 #class: mailman.database.mysql.MySQLDatabase&lt;br /&gt;
 #url: mysql+pymysql://myuser:mypassword@mymysqlhost/mailman?charset=utf8&amp;amp;use_unicode=1&lt;br /&gt;
 # SQLite ist Standard, wenn nichts konfiguriert ist&lt;br /&gt;
 &lt;br /&gt;
 [webservice] # REST Service von Mailman. Wird von [[#Web_Frontend|Web Frontend]] verwendet&lt;br /&gt;
 port: 8001 # ändern, falls belegt&lt;br /&gt;
 admin_user: restadmin&lt;br /&gt;
 admin_pass: restpass&lt;br /&gt;
 &lt;br /&gt;
 [mta]&lt;br /&gt;
 smtp_host: xyz00.hostsharing.net&lt;br /&gt;
 smtp_port: 4587&lt;br /&gt;
 smtp_user: xyz00-lists&lt;br /&gt;
 smtp_pass: secret&lt;br /&gt;
 smtp_secure_mode: starttls&lt;br /&gt;
 # VERP ist nicht möglich, da [https://de.wikipedia.org/wiki/Mail_Transfer_Agent MTA] nicht selbst konfiguriert werden kann&lt;br /&gt;
 verp_confirm_format: $address&lt;br /&gt;
 # https://mailman.readthedocs.io/en/latest/src/mailman/docs/mta.html&lt;br /&gt;
 # NullMTA, da MTA nicht selbst konfiguriert werden kann&lt;br /&gt;
 incoming: mailman.mta.null.NullMTA&lt;br /&gt;
 lmtp_port: 8024 # ändern, falls belegt&lt;br /&gt;
 &lt;br /&gt;
 [runner.nntp]&lt;br /&gt;
 # Runner für [https://de.wikipedia.org/wiki/Network_News_Transfer_Protocol NNTP] Gateway ausschalten &lt;br /&gt;
 start: no&lt;br /&gt;
 &lt;br /&gt;
 [archiver.hyperkitty]&lt;br /&gt;
 class: mailman_hyperkitty.Archiver&lt;br /&gt;
 enable: yes&lt;br /&gt;
 # $HOME muss durch den tatsächlichen Pfad zum Benutzerverzeichnis ersetzt werden&lt;br /&gt;
 configuration: $HOME/mailman/var/etc/mailman-hyperkitty.cfg&lt;br /&gt;
&lt;br /&gt;
Zugriffsrechte einschränken:&lt;br /&gt;
 $ chmod 0600 ~/mailman/var/etc/mailman.cfg&lt;br /&gt;
&lt;br /&gt;
Damit Hyperkitty als [[#Web_Frontend|Web Frontend]] für das Archiv verwendet werden kann, ist in die Datei &amp;lt;code&amp;gt;~/mailman/var/etc/mailman-hyperkitty.cfg&amp;lt;/code&amp;gt; Foglendes zu schreiben:&lt;br /&gt;
 [general]&lt;br /&gt;
 base_url: &amp;lt;nowiki&amp;gt;https://lists.example.org/hyperkitty/&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 # Muss identisch mit Key in Hyperkitty sein&lt;br /&gt;
 api_key: SecretArchiverAPIKey&lt;br /&gt;
&lt;br /&gt;
Zugriffsrechte einschränken:&lt;br /&gt;
 $ chmod 0600 ~/mailman/var/etc/mailman-hyperkitty.cfg&lt;br /&gt;
&lt;br /&gt;
Kommando &#039;&#039;mailman&#039;&#039; anlegen:&lt;br /&gt;
 $ cat &amp;lt;&amp;lt;&#039;EOD&#039; &amp;gt;~/.local/bin/mailman&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 &lt;br /&gt;
 cd ~/mailman&lt;br /&gt;
 pipenv run mailman &amp;quot;$@&amp;quot;&lt;br /&gt;
 EOD&lt;br /&gt;
 &lt;br /&gt;
 chmod +x ~/.local/bin/mailman&lt;br /&gt;
&lt;br /&gt;
Nun kann mit &amp;lt;code&amp;gt;mailman info&amp;lt;/code&amp;gt; nochmal die aktuelle Konfiguration geprüft werden.&lt;br /&gt;
Danach kann Mailman gestartet werden:&lt;br /&gt;
 $ mailman start&lt;br /&gt;
&lt;br /&gt;
== Web Frontend ==&lt;br /&gt;
In diesem Abschnitt wird die Installation des Web Frontends beschrieben.&lt;br /&gt;
&lt;br /&gt;
Zunächst werden die Redirects aus der &amp;lt;code&amp;gt;.htaccess&amp;lt;/code&amp;gt; gelöscht:&lt;br /&gt;
 $ echo &amp;quot;&amp;quot; &amp;gt; ~/doms/lists.example.org/htdocs-ssl/.htaccess&lt;br /&gt;
&lt;br /&gt;
Anschließend werden die erforderlichen Python-Pakete installiert:&lt;br /&gt;
 $ cd ~/mailman&lt;br /&gt;
 pipenv install whoosh postorius hyperkitty&lt;br /&gt;
&lt;br /&gt;
Um Plattenplatz freizugeben, kann optional der Pip Cache gelöscht werden:&lt;br /&gt;
 $ rm -r ~/.cache/pip*&lt;br /&gt;
&lt;br /&gt;
Nun werden die Dateien geladen, mit denen Postorius und Hyperkitty konfiguriert und gestartet werden:&lt;br /&gt;
 $ git clone https://gitlab.com/mailman/mailman-suite.git&lt;br /&gt;
&lt;br /&gt;
Zur Konfiguration von Hyperkitty wird die IP-Adresse benötigt, von der die Anfragen von Mailman Core kommen. Diese kann wie folgt ermittelt werden:&lt;br /&gt;
 $ cat &amp;lt;&amp;lt;EOD &amp;gt;~/doms/lists.example.org/htdocs-ssl/ip.php&lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
 echo \$_SERVER[&#039;REMOTE_ADDR&#039;] . &amp;quot;\n&amp;quot;;&lt;br /&gt;
 EOD&lt;br /&gt;
 curl &amp;lt;nowiki&amp;gt;https://lists.example.org/ip.php&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 rm ~/doms/lists.example.org/htdocs-ssl/ip.php&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration wird nun in Die Datei &amp;lt;code&amp;gt;~/mailman/mailman-suite/mailman-suite_project/settings_local.py&amp;lt;/code&amp;gt; geschrieben:&lt;br /&gt;
 SECRET_KEY = &#039;change-this-on-your-production-server&#039;&lt;br /&gt;
 Debug = False&lt;br /&gt;
 ADMINS = (&lt;br /&gt;
      (&#039;Mailman Suite Admin&#039;, &#039;admin@example.org&#039;),&lt;br /&gt;
 )&lt;br /&gt;
 ALLOWED_HOSTS = [&lt;br /&gt;
     &#039;lists.example.org&#039;,&lt;br /&gt;
 ]&lt;br /&gt;
 MAILMAN_REST_API_URL = &#039;&amp;lt;nowiki&amp;gt;http://localhost:8001&amp;lt;/nowiki&amp;gt;&#039;&lt;br /&gt;
 MAILMAN_REST_API_USER = &#039;restadmin&#039;&lt;br /&gt;
 MAILMAN_REST_API_PASS = &#039;restpass&#039;&lt;br /&gt;
 MAILMAN_ARCHIVER_KEY = &#039;SecretArchiverAPIKey&#039;&lt;br /&gt;
 MAILMAN_ARCHIVER_FROM = (&#039;&amp;lt;IP von Mailman Core&amp;gt;&#039;)&lt;br /&gt;
 &lt;br /&gt;
 # Authentifizierung über externe Dienste ausschalten (s. django-allauth)&lt;br /&gt;
 from settings import INSTALLED_APPS&lt;br /&gt;
 INSTALLED_APPS = filter(lambda app: not app.startswith(&#039;allauth.socialaccount.&#039;) and app != &#039;django_mailman3.lib.auth.fedora&#039;, INSTALLED_APPS)&lt;br /&gt;
 INSTALLED_APPS = (&lt;br /&gt;
     &#039;hyperkitty&#039;,&lt;br /&gt;
     &#039;postorius&#039;,&lt;br /&gt;
     &#039;django_mailman3&#039;,&lt;br /&gt;
     # Uncomment the next line to enable the admin:&lt;br /&gt;
     &#039;django.contrib.admin&#039;,&lt;br /&gt;
     # Uncomment the next line to enable admin documentation:&lt;br /&gt;
     # &#039;django.contrib.admindocs&#039;,&lt;br /&gt;
     &#039;django.contrib.auth&#039;,&lt;br /&gt;
     &#039;django.contrib.contenttypes&#039;,&lt;br /&gt;
     &#039;django.contrib.sessions&#039;,&lt;br /&gt;
     &#039;django.contrib.sites&#039;,&lt;br /&gt;
     &#039;django.contrib.messages&#039;,&lt;br /&gt;
     &#039;django.contrib.staticfiles&#039;,&lt;br /&gt;
     &#039;rest_framework&#039;,&lt;br /&gt;
     &#039;django_gravatar&#039;,&lt;br /&gt;
     &#039;compressor&#039;,&lt;br /&gt;
     &#039;haystack&#039;,&lt;br /&gt;
     &#039;django_extensions&#039;,&lt;br /&gt;
     &#039;django_q&#039;,&lt;br /&gt;
     &#039;allauth&#039;,&lt;br /&gt;
     &#039;allauth.account&#039;,&lt;br /&gt;
     &#039;allauth.socialaccount&#039;,&lt;br /&gt;
 )&lt;br /&gt;
 &lt;br /&gt;
 # Standardkonfiguration verwendet SQLite&lt;br /&gt;
 DATABASES = {&lt;br /&gt;
     &#039;default&#039;: {&lt;br /&gt;
         &#039;ENGINE&#039;: &#039;django.db.backends.postgresql_psycopg2&#039;, # Für MySQL: django.db.backends.mysql&lt;br /&gt;
         &#039;HOST&#039;: &#039;localhost&#039;,&lt;br /&gt;
         &#039;NAME&#039;: &#039;database_name&#039;,&lt;br /&gt;
         &#039;USER&#039;: &#039;database_user&#039;,&lt;br /&gt;
         &#039;PASSWORD&#039;: &#039;database_password&#039;,&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 LANGUAGE_CODE = &#039;de-de&#039;&lt;br /&gt;
 TIME_ZONE = &#039;Europe/Berlin&#039;&lt;br /&gt;
 DEFAULT_FROM_EMAIL = &#039;mailing-lists@example.org&#039;&lt;br /&gt;
 SERVER_EMAIL = &#039;mailing-lists@example.org&#039;&lt;br /&gt;
 EMAIL_BACKEND = &#039;django.core.mail.backends.smtp.EmailBackend&#039;&lt;br /&gt;
 EMAIL_HOST = &#039;xyz00.hostsharing.net&#039;&lt;br /&gt;
 EMAIL_PORT = 4587&lt;br /&gt;
 EMAIL_USE_TLS = True&lt;br /&gt;
 EMAIL_HOST_USER = &#039;xyz00-lists&#039;&lt;br /&gt;
 EMAIL_HOST_PASSWORD = &#039;secret&#039;&lt;br /&gt;
 EMAIL_TIMEOUT = 60&lt;br /&gt;
 &lt;br /&gt;
 ACCOUNT_DEFAULT_HTTP_PROTOCOL = &#039;https&#039;&lt;br /&gt;
 &lt;br /&gt;
 COMPRESS_PRECOMPILERS = (&lt;br /&gt;
    (&#039;text/less&#039;, &#039;lessc {infile} {outfile}&#039;),&lt;br /&gt;
    (&#039;text/x-scss&#039;, &#039;sass -t compressed {infile} {outfile}&#039;),&lt;br /&gt;
    (&#039;text/x-sass&#039;, &#039;sass -t compressed {infile} {outfile}&#039;),&lt;br /&gt;
 )&lt;br /&gt;
 COMPRESS_OFFLINE = True&lt;br /&gt;
 &lt;br /&gt;
 # Workeranzahl reduzieren (optional)&lt;br /&gt;
 Q_CLUSTER = {&lt;br /&gt;
     &#039;workers&#039;: 1,&lt;br /&gt;
     &#039;timeout&#039;: 300,&lt;br /&gt;
     &#039;save_limit&#039;: 100,&lt;br /&gt;
     &#039;orm&#039;: &#039;default&#039;,&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Hinweis: Die Einstellungen in &amp;lt;code&amp;gt;settings_local.py&amp;lt;/code&amp;gt; überschreiben solche in &amp;lt;code&amp;gt;settings.py&amp;lt;/code&amp;gt;. Zwar kann &amp;lt;code&amp;gt;settings.py&amp;lt;/code&amp;gt; auch direkt angepasst werden, auf diese Weise werden jedoch mögliche Konflikte beim Update vermieden. &amp;lt;code&amp;gt;settings.py&amp;lt;/code&amp;gt; sollte dennoch dahingehend geprüft werden, ob man ggf. weitere Optionen ändern möchte.&lt;br /&gt;
&lt;br /&gt;
Das Mailman Web Frontend nutzt das Framework Django. Einige der Einstellungen sind in der [https://docs.djangoproject.com/en/2.2/ref/settings/ Dokumentation von Django] beschrieben, andere konfigurieren eine der in &amp;lt;code&amp;gt;INSTALLED_APPS&amp;lt;/code&amp;gt; definierten Anwendungen.&lt;br /&gt;
&lt;br /&gt;
Damit per Django verfügbare Kommandos leicht ausgeführt werden können, wird der Befehl &#039;&#039;mailman-django&#039;&#039; eingerichtet:&lt;br /&gt;
 $ cat &amp;lt;&amp;lt;&#039;EOD&#039; &amp;gt;~/.local/bin/mailman-django&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 &lt;br /&gt;
 cd ~/mailman&lt;br /&gt;
 pipenv run mailman-suite/mailman-suite_project/manage.py &amp;quot;$@&amp;quot;&lt;br /&gt;
 EOD&lt;br /&gt;
 &lt;br /&gt;
 chmod +x ~/.local/bin/mailman-django&lt;br /&gt;
&lt;br /&gt;
Anschließend können folgende Kommandos ausgeführt werden:&lt;br /&gt;
 $ mailman-django migrate&lt;br /&gt;
 mailman-django collectstatic&lt;br /&gt;
 mailman-django compress&lt;br /&gt;
 mailman-django createsuperuser&lt;br /&gt;
&lt;br /&gt;
Nun müssen die statischen Dateien für das Web Frontend noch per HTTPS verfügbar gemacht werden:&lt;br /&gt;
 $ ln -s ~/mailman/mailman-suite/mailman-suite_project/static ~/doms/lists.example.org/htdocs-ssl/&lt;br /&gt;
&lt;br /&gt;
Damit das Web Frontend per [[Phusion_Passenger|Phusion Passenger]] geladen werden kann:&lt;br /&gt;
 $ cat &amp;lt;&amp;lt;EOD &amp;gt;~/doms/lists.example.org/app-ssl/passenger_wsgi.py&lt;br /&gt;
 import os&lt;br /&gt;
 import subprocess&lt;br /&gt;
 import sys&lt;br /&gt;
 &lt;br /&gt;
 os.environ[&#039;LANG&#039;] = &#039;C.UTF-8&#039;&lt;br /&gt;
 os.environ[&#039;LC_ALL&#039;] = &#039;C.UTF-8&#039;&lt;br /&gt;
 &lt;br /&gt;
 HOME = os.getenv(&#039;HOME&#039;)&lt;br /&gt;
 PIPENV = os.path.join(HOME, &#039;.local&#039;, &#039;bin&#039;, &#039;pipenv&#039;)&lt;br /&gt;
 PIPFILE_DIR = os.path.join(HOME, &#039;mailman&#039;)&lt;br /&gt;
 INTERP = subprocess.check_output([PIPENV, &#039;run&#039;, &#039;which&#039;, &#039;python&#039;], cwd=PIPFILE_DIR).strip().decode(&#039;utf-8&#039;)&lt;br /&gt;
 if sys.executable != INTERP:&lt;br /&gt;
     os.execl(INTERP, INTERP, *sys.argv)&lt;br /&gt;
 &lt;br /&gt;
 WSGI_DIR = os.path.join(HOME, &#039;mailman&#039;, &#039;mailman-suite&#039;, &#039;mailman-suite_project&#039;)&lt;br /&gt;
 sys.path.append(WSGI_DIR)&lt;br /&gt;
 &lt;br /&gt;
 from wsgi import application&lt;br /&gt;
 EOD&lt;br /&gt;
&lt;br /&gt;
Nun steht das Web Frontend unter &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://lists.example.org/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; zur Verfügung. Über die Django Administration sollte unter &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://lists.example.org/admin/sites/site/1/change/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; die Domäne angepasst werden.&lt;br /&gt;
&lt;br /&gt;
== Cron Jobs ==&lt;br /&gt;
Es sind verschiedene Cron Jobs erforderlich. Hierzu &amp;lt;code&amp;gt;crontab -e&amp;lt;/code&amp;gt; ausführen und Folgendes eintragen:&lt;br /&gt;
 # An die in MAILTO eingetragene Adressen werden Ausgaben der Cron Jobs gesendet (optional)&lt;br /&gt;
 #MAILTO=admin@example.org&lt;br /&gt;
 PATH=$HOME/.local/bin:$PATH&lt;br /&gt;
 &lt;br /&gt;
 @reboot mailman start&lt;br /&gt;
 &lt;br /&gt;
 # Send periodic digests.&lt;br /&gt;
 @daily mailman digests --send&lt;br /&gt;
 &lt;br /&gt;
 @reboot mailman-django qcluster&lt;br /&gt;
 # Alternativ qcluster minütlich ausführen&lt;br /&gt;
 # * * * * * mailman-django qcluster --run-once&lt;br /&gt;
 &lt;br /&gt;
 * * * * * mailman-django runjobs minutely&lt;br /&gt;
 2,17,32,47 * * * * mailman-django runjobs quarter_hourly&lt;br /&gt;
 @hourly  mailman-django runjobs hourly&lt;br /&gt;
 @daily   mailman-django runjobs daily&lt;br /&gt;
 @weekly  mailman-django runjobs weekly&lt;br /&gt;
 @monthly mailman-django runjobs monthly&lt;br /&gt;
 @yearly  mailman-django runjobs yearly&lt;br /&gt;
&lt;br /&gt;
Hinweis: Der Einfachheit halber wird hier für &#039;&#039;mailman start&#039;&#039; und &#039;&#039;qcluster&#039;&#039; &amp;lt;code&amp;gt;@reboot&amp;lt;/code&amp;gt; verwendet. Besser wäre der Einsatz von monit. Beim Einsatz von monit würde sich auch der Neustart der Dienste nach einem [[#Update|Update]] ändern. (Anleitung gerne anpassen, sollte jemand monit einrichten.)&lt;br /&gt;
&lt;br /&gt;
== Mails an Mailman weiterleiten ==&lt;br /&gt;
Da die MTA-Konfiguration nicht direkt angepasst werden kann, ist ein Hilfskonstrukt erforderlich: Mittels &#039;&#039;.forward-Dateien&#039;&#039; und &#039;&#039;.promailrc&#039;&#039; werden eingehende Mails an das Programm msmtp weitergeleitet, welches diese per [https://de.wikipedia.org/wiki/Local_Mail_Transfer_Protocol LMTP] bei Mailman abliefert. msmtp ist auf den Managed Servern vorinstalliert.&lt;br /&gt;
&lt;br /&gt;
Die Einrichtung der eigentlichen Weiterleitung erfolgt im nächsten Abschnitt.&lt;br /&gt;
&lt;br /&gt;
== Liste anlegen ==&lt;br /&gt;
Damit Mailman tatsächlich genutzt werden kann, muss natürlich eine Liste eingerichtet werden.&lt;br /&gt;
&lt;br /&gt;
Mit den folgenden Kommandos werden eine Liste in Mailman erstellt, E-Mail-Adressen angelegt sowie Weiterleitungen konfiguriert:&lt;br /&gt;
 $ LISTNAME=test&lt;br /&gt;
 DOMAIN_ADMIN=xyz00&lt;br /&gt;
 DOMAIN_USER=xyz00-lists&lt;br /&gt;
 DOMAIN=lists.example.org&lt;br /&gt;
 LMTP_PORT=8024 # In Mailman Core konfigurierter Port&lt;br /&gt;
 &lt;br /&gt;
 mailman create $LISTNAME@$DOMAIN # Alternativ über Web Frontend&lt;br /&gt;
 &lt;br /&gt;
 for localpart in $LISTNAME ${LISTNAME}-admin ${LISTNAME}-bounces ${LISTNAME}-confirm ${LISTNAME}-join ${LISTNAME}-leave ${LISTNAME}-owner ${LISTNAME}-request ${LISTNAME}-subscribe ${LISTNAME}-unsubscribe; do&lt;br /&gt;
     hsscript -u $DOMAIN_ADMIN -e &amp;quot;emailaddress.add({set:{domain:&#039;$DOMAIN&#039;,localpart:&#039;$localpart&#039;,target:&#039;$DOMAIN_USER+$localpart&#039;}})&amp;quot;&lt;br /&gt;
     echo &amp;quot;\&amp;quot;|$HOME/.local/bin/msmtp --host=localhost --port=$LMTP_PORT --protocol=lmtp  --read-envelope-from $localpart@$DOMAIN\&amp;quot;&amp;quot; &amp;gt;~/.forward+$localpart&lt;br /&gt;
 done&lt;br /&gt;
&lt;br /&gt;
== Update ==&lt;br /&gt;
Mailman lässt sich wie im Folgenden beschrieben aktualisieren.&lt;br /&gt;
&lt;br /&gt;
Python-Pakete für die Aktualisierungen vorliegen ausgeben:&lt;br /&gt;
 $ cd ~/mailman&lt;br /&gt;
 pipenv update --outdated&lt;br /&gt;
&lt;br /&gt;
Vor dem eigentlichen Update empfiehlt es sich, die Release Notes (zumindest von Mailman) zu lesen und auf relevante Änderungen zu prüfen.&lt;br /&gt;
&lt;br /&gt;
Update der Pakete:&lt;br /&gt;
 $ pipenv update&lt;br /&gt;
&lt;br /&gt;
Ggf. Pip Cache löschen:&lt;br /&gt;
 $ rm -r ~/.cache/pip*&lt;br /&gt;
&lt;br /&gt;
Anschließend werden die Dateien aus dem &#039;&#039;mailman-suite&#039;&#039; Git-Repository aktualisiert. Vor dem Übernehmen der Änderungen (merge), sollten die Commit Logs und die Änderungen begutachtet werden, um festzustellen, ob ggf. die Konfiguration anzupassen ist:&lt;br /&gt;
 $ cd mailman-suite&lt;br /&gt;
 git fetch origin&lt;br /&gt;
 git log master..origin/master # Zeigt Commit logs&lt;br /&gt;
 git diff master..origin/master # Zeigt Änderungen&lt;br /&gt;
&lt;br /&gt;
Änderungen übernehmen:&lt;br /&gt;
 $ git merge origin/master&lt;br /&gt;
&lt;br /&gt;
Abschließend die verschiedenen Dienste neu starten:&lt;br /&gt;
 $ mailman restart&lt;br /&gt;
&lt;br /&gt;
qcluster neu starten, wenn als Dienst und nicht als Cron Job gestartet:&lt;br /&gt;
 $ pkill --oldest --full &#039;mailman-suite_project/manage.py qcluster$&#039;&lt;br /&gt;
 mailman-django qcluster &amp;amp;disown&lt;br /&gt;
&lt;br /&gt;
Web Frontend neu starten:&lt;br /&gt;
 $ mkdir -p ~/doms/&amp;lt;domain&amp;gt;/app-ssl/tmp&lt;br /&gt;
 touch ~/doms/&amp;lt;domain&amp;gt;/app-ssl/tmp/restart.txt&lt;br /&gt;
&lt;br /&gt;
Zur Aktualisierung von msmtp können die Schritte zur Installation (mit angepasster Versionsnummer) wiederholt werden.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:Mailinglisten]]&lt;br /&gt;
[[Kategorie:E-Mail]]&lt;/div&gt;</summary>
		<author><name>Dtu00-wiki</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Mailman_3_installieren&amp;diff=4994</id>
		<title>Mailman 3 installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Mailman_3_installieren&amp;diff=4994"/>
		<updated>2019-10-13T18:41:04Z</updated>

		<summary type="html">&lt;p&gt;Dtu00-wiki: Bereitstellung der statischen Dateien sowie Kategorien hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die folgende Anleitung zur Installation von Mailman 3 auf Hostsharing geht davon aus, dass als Domäne &#039;&#039;lists.example.org&#039;&#039; und als Domänennutzer &#039;&#039;xyz00-lists&#039;&#039; verwendet wird. Es ist zu empfehlen, auszuführende Befehle und Konfigurationen vorab auf zu ersetzende Werte zu prüfen. Alle Befehle sind als Benutzer &#039;&#039;xyz00-lists&#039;&#039; zu starten. Damit mehrere aufeinander folgende Shell-Kommandos leichter kopiert werden können, wird nur vor das jeweils erste Kommando ein &#039;&#039;$&#039;&#039; gesetzt. Zum Verständnis mancher der folgenden Anweisungen kann es hilfreich sein, die [https://mailman.readthedocs.io/ Mailman-Dokumentation] gelesen und sich mit [https://pipenv.readthedocs.io/en/latest/ Pipenv] beschäftigt zu haben.&lt;br /&gt;
&lt;br /&gt;
Achtung: Mailman 3 benötigt zahlreiche Hintergrundprozesse, was beim Managed Webspace zusätzliche Kosten verursacht.&lt;br /&gt;
&lt;br /&gt;
== Datenbank ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Mailman Core ==&lt;br /&gt;
Für die Installation von Mailman Core sind folgende Kommandos auszuführen:&lt;br /&gt;
 $ pip3 install --user pipenv&lt;br /&gt;
 echo &#039;export PATH=&amp;quot;$HOME/.local/bin:$PATH&amp;quot;&#039; &amp;gt;&amp;gt; ~/.profile&lt;br /&gt;
 source ~/.profile&lt;br /&gt;
 mkdir ~/mailman&lt;br /&gt;
 cd ~/mailman&lt;br /&gt;
 pipenv install mailman mailman-hyperkitty&lt;br /&gt;
 pipenv install psycopg2-binary # Für PostgreSQL&lt;br /&gt;
 pipenv install pymsql # Für MySQL&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend wird das Verzeichnis für die Konfigurationsdatei angelegt:&lt;br /&gt;
 $ mkdir -p ~/mailman/var/etc&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration wird in die Datei &amp;lt;code&amp;gt;~/mailman/var/etc/mailman.cfg&amp;lt;/code&amp;gt; geschrieben:&lt;br /&gt;
 [mailman]&lt;br /&gt;
 site_owner: admin@example.org&lt;br /&gt;
 default_language: de&lt;br /&gt;
 &lt;br /&gt;
 [database] # https://mailman.readthedocs.io/en/latest/src/mailman/docs/database.html&lt;br /&gt;
 class: mailman.database.postgresql.PostgreSQLDatabase&lt;br /&gt;
 url: postgres://myuser:mypassword@mypghost/mailman&lt;br /&gt;
 # Fallls MySQL verwendet:&lt;br /&gt;
 #class: mailman.database.mysql.MySQLDatabase&lt;br /&gt;
 #url: mysql+pymysql://myuser:mypassword@mymysqlhost/mailman?charset=utf8&amp;amp;use_unicode=1&lt;br /&gt;
 # SQLite ist Standard, wenn nichts konfiguriert ist&lt;br /&gt;
 &lt;br /&gt;
 [webservice] # REST Service von Mailman. Wird von [[#Web_Frontend|Web Frontend]] verwendet&lt;br /&gt;
 port: 8001 # ändern, falls belegt&lt;br /&gt;
 admin_user: restadmin&lt;br /&gt;
 admin_pass: restpass&lt;br /&gt;
 &lt;br /&gt;
 [mta]&lt;br /&gt;
 smtp_host: xyz00.hostsharing.net&lt;br /&gt;
 smtp_port: 4587&lt;br /&gt;
 smtp_user: xyz00-lists&lt;br /&gt;
 smtp_pass: secret&lt;br /&gt;
 smtp_secure_mode: starttls&lt;br /&gt;
 verp_confirm_format: $address # VERP ist nicht möglich, da [https://de.wikipedia.org/wiki/Mail_Transfer_Agent MTA] nicht selbst konfiguriert werden kann&lt;br /&gt;
 # https://mailman.readthedocs.io/en/latest/src/mailman/docs/mta.html&lt;br /&gt;
 incoming: mailman.mta.null.NullMTA # NullMTA, da MTA MTA nicht selbst konfiguriert werden kann&lt;br /&gt;
 lmtp_port: 8024 # ändern, falls belegt&lt;br /&gt;
 &lt;br /&gt;
 [runner.nntp]&lt;br /&gt;
 start: no # Runner für [https://de.wikipedia.org/wiki/Network_News_Transfer_Protocol NNTP] Gateway ausschalten&lt;br /&gt;
 &lt;br /&gt;
 [archiver.hyperkitty]&lt;br /&gt;
 class: mailman_hyperkitty.Archiver&lt;br /&gt;
 enable: yes&lt;br /&gt;
 # $HOME muss durch den tatsächlichen Pfad zum Benutzerverzeichnis ersetzt werden&lt;br /&gt;
 configuration: $HOME/mailman/var/etc/mailman-hyperkitty.cfg&lt;br /&gt;
&lt;br /&gt;
Zugriffsrechte einschränken:&lt;br /&gt;
 $ chmod 0600 ~/mailman/var/etc/mailman.cfg&lt;br /&gt;
&lt;br /&gt;
Damit Hyperkitty als [[#Web_Frontend|Web Frontend]] für das Archiv verwendet werden kann, ist in die Datei &amp;lt;code&amp;gt;~/mailman/var/etc/mailman-hyperkitty.cfg&amp;lt;/code&amp;gt; Foglendes zu schreiben:&lt;br /&gt;
 [general]&lt;br /&gt;
 base_url: &amp;lt;nowiki&amp;gt;https://lists.example.org/hyperkitty/&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 # Muss identisch mit Key in Hyperkitty sein&lt;br /&gt;
 api_key: SecretArchiverAPIKey&lt;br /&gt;
&lt;br /&gt;
Zugriffsrechte einschränken:&lt;br /&gt;
 $ chmod 0600 ~/mailman/var/etc/mailman-hyperkitty.cfg&lt;br /&gt;
&lt;br /&gt;
Kommando &#039;&#039;mailman&#039;&#039; anlegen:&lt;br /&gt;
 $ cat &amp;lt;&amp;lt;&#039;EOD&#039; &amp;gt;~/.local/bin/mailman&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 &lt;br /&gt;
 cd ~/mailman&lt;br /&gt;
 pipenv run mailman &amp;quot;$@&amp;quot;&lt;br /&gt;
 EOD&lt;br /&gt;
 &lt;br /&gt;
 chmod +x ~/.local/bin/mailman&lt;br /&gt;
&lt;br /&gt;
Nun kann mit &amp;lt;code&amp;gt;mailman info&amp;lt;/code&amp;gt; nochmal die aktuelle Konfiguration geprüft werden.&lt;br /&gt;
Danach kann Mailman gestartet werden:&lt;br /&gt;
 $ mailman start&lt;br /&gt;
&lt;br /&gt;
== Web Frontend ==&lt;br /&gt;
In diesem Abschnitt wird die Installation des Web Frontends beschrieben.&lt;br /&gt;
&lt;br /&gt;
Zunächst werden die Redirects aus der &amp;lt;code&amp;gt;.htaccess&amp;lt;/code&amp;gt; gelöscht:&lt;br /&gt;
 $ echo &amp;quot;&amp;quot; &amp;gt; ~/doms/lists.example.org/htdocs-ssl/.htaccess&lt;br /&gt;
&lt;br /&gt;
Anschließend werden die erforderlichen Python-Pakete installiert:&lt;br /&gt;
 $ cd ~/mailman&lt;br /&gt;
 pipenv install whoosh postorius hyperkitty&lt;br /&gt;
&lt;br /&gt;
Um Plattenplatz freizugeben, kann optional der Pip Cache gelöscht werden:&lt;br /&gt;
 $ rm -r ~/.cache/pip*&lt;br /&gt;
&lt;br /&gt;
Nun werden die Dateien geladen, mit denen Postorius und Hyperkitty konfiguriert und gestartet werden:&lt;br /&gt;
 $ git clone https://gitlab.com/mailman/mailman-suite.git&lt;br /&gt;
&lt;br /&gt;
Zur Konfiguration von Hyperkitty wird die IP-Adresse benötigt, von der die Anfragen von Mailman Core kommen. Diese kann wie folgt ermittelt werden:&lt;br /&gt;
 $ cat &amp;lt;&amp;lt;EOD &amp;gt;~/doms/lists.example.org/htdocs-ssl/ip.php&lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
 echo $_SERVER[&#039;REMOTE_ADDR&#039;] . &amp;quot;\n&amp;quot;;&lt;br /&gt;
 EOD&lt;br /&gt;
 curl &amp;lt;nowiki&amp;gt;https://lists.example.org/ip.php&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 rm ~/doms/lists.example.org/htdocs-ssl/ip.php&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration wird nun in Die Datei &amp;lt;code&amp;gt;~/mailman-suite/mailman-suite_project/settings_local.py&amp;lt;/code&amp;gt; geschrieben:&lt;br /&gt;
 SECRET_KEY = &#039;change-this-on-your-production-server&#039;&lt;br /&gt;
 Debug = False&lt;br /&gt;
 ADMINS = (&lt;br /&gt;
      (&#039;Mailman Suite Admin&#039;, &#039;admin@example.org&#039;),&lt;br /&gt;
 )&lt;br /&gt;
 ALLOWED_HOSTS = [&lt;br /&gt;
     &#039;lists.example.org&#039;,&lt;br /&gt;
 ]&lt;br /&gt;
 MAILMAN_REST_API_URL = &#039;&amp;lt;nowiki&amp;gt;http://localhost:8001&amp;lt;/nowiki&amp;gt;&#039;&lt;br /&gt;
 MAILMAN_REST_API_USER = &#039;restadmin&#039;&lt;br /&gt;
 MAILMAN_REST_API_PASS = &#039;restpass&#039;&lt;br /&gt;
 MAILMAN_ARCHIVER_KEY = &#039;SecretArchiverAPIKey&#039;&lt;br /&gt;
 MAILMAN_ARCHIVER_FROM = (&#039;&amp;lt;IP von Mailman Core&amp;gt;&#039;)&lt;br /&gt;
 &lt;br /&gt;
 # Authentifizierung über externe Dienste ausschalten (s. django-allauth)&lt;br /&gt;
 from settings import INSTALLED_APPS&lt;br /&gt;
 INSTALLED_APPS = filter(lambda app: not app.startswith(&#039;allauth.socialaccount.&#039;) and app != &#039;django_mailman3.lib.auth.fedora&#039;, INSTALLED_APPS)&lt;br /&gt;
 INSTALLED_APPS = (&lt;br /&gt;
     &#039;hyperkitty&#039;,&lt;br /&gt;
     &#039;postorius&#039;,&lt;br /&gt;
     &#039;django_mailman3&#039;,&lt;br /&gt;
     # Uncomment the next line to enable the admin:&lt;br /&gt;
     &#039;django.contrib.admin&#039;,&lt;br /&gt;
     # Uncomment the next line to enable admin documentation:&lt;br /&gt;
     # &#039;django.contrib.admindocs&#039;,&lt;br /&gt;
     &#039;django.contrib.auth&#039;,&lt;br /&gt;
     &#039;django.contrib.contenttypes&#039;,&lt;br /&gt;
     &#039;django.contrib.sessions&#039;,&lt;br /&gt;
     &#039;django.contrib.sites&#039;,&lt;br /&gt;
     &#039;django.contrib.messages&#039;,&lt;br /&gt;
     &#039;django.contrib.staticfiles&#039;,&lt;br /&gt;
     &#039;rest_framework&#039;,&lt;br /&gt;
     &#039;django_gravatar&#039;,&lt;br /&gt;
     &#039;compressor&#039;,&lt;br /&gt;
     &#039;haystack&#039;,&lt;br /&gt;
     &#039;django_extensions&#039;,&lt;br /&gt;
     &#039;django_q&#039;,&lt;br /&gt;
     &#039;allauth&#039;,&lt;br /&gt;
     &#039;allauth.account&#039;,&lt;br /&gt;
     &#039;allauth.socialaccount&#039;,&lt;br /&gt;
 )&lt;br /&gt;
 &lt;br /&gt;
 # Standardkonfiguration verwendet SQLite&lt;br /&gt;
 DATABASES = {&lt;br /&gt;
     &#039;default&#039;: {&lt;br /&gt;
         &#039;ENGINE&#039;: &#039;django.db.backends.postgresql_psycopg2&#039;, # Für MySQL: django.db.backends.mysql&lt;br /&gt;
         &#039;HOST&#039;: &#039;localhost&#039;,&lt;br /&gt;
         &#039;NAME&#039;: &#039;database_name&#039;,&lt;br /&gt;
         &#039;USER&#039;: &#039;database_user&#039;,&lt;br /&gt;
         &#039;PASSWORD&#039;: &#039;database_password&#039;,&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 LANGUAGE_CODE = &#039;de-de&#039;&lt;br /&gt;
 TIME_ZONE = &#039;Europe/Berlin&#039;&lt;br /&gt;
 DEFAULT_FROM_EMAIL = &#039;mailing-lists@example.org&#039;&lt;br /&gt;
 SERVER_EMAIL = &#039;mailing-lists@example.org&#039;&lt;br /&gt;
 EMAIL_BACKEND = &#039;django.core.mail.backends.smtp.EmailBackend&#039;&lt;br /&gt;
 EMAIL_HOST = &#039;xyz00.hostsharing.net&#039;&lt;br /&gt;
 EMAIL_PORT = 4587&lt;br /&gt;
 EMAIL_USE_TLS = True&lt;br /&gt;
 EMAIL_HOST_USER = &#039;xyz00-lists&#039;&lt;br /&gt;
 EMAIL_HOST_PASSWORD = &#039;secret&#039;&lt;br /&gt;
 EMAIL_TIMEOUT = 60&lt;br /&gt;
 &lt;br /&gt;
 ACCOUNT_DEFAULT_HTTP_PROTOCOL = &#039;https&#039;&lt;br /&gt;
 &lt;br /&gt;
 COMPRESS_PRECOMPILERS = (&lt;br /&gt;
    (&#039;text/less&#039;, &#039;lessc {infile} {outfile}&#039;),&lt;br /&gt;
    (&#039;text/x-scss&#039;, &#039;sass -t compressed {infile} {outfile}&#039;),&lt;br /&gt;
    (&#039;text/x-sass&#039;, &#039;sass -t compressed {infile} {outfile}&#039;),&lt;br /&gt;
 )&lt;br /&gt;
 COMPRESS_OFFLINE = True&lt;br /&gt;
 &lt;br /&gt;
 # Workeranzahl reduzieren (optional)&lt;br /&gt;
 Q_CLUSTER = {&lt;br /&gt;
     &#039;workers&#039;: 1,&lt;br /&gt;
     &#039;timeout&#039;: 300,&lt;br /&gt;
     &#039;save_limit&#039;: 100,&lt;br /&gt;
     &#039;orm&#039;: &#039;default&#039;,&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Hinweis: Die Einstellungen in &amp;lt;code&amp;gt;settings_local.py&amp;lt;/code&amp;gt; überschreiben solche in &amp;lt;code&amp;gt;settings.py&amp;lt;/code&amp;gt;. Zwar kann &amp;lt;code&amp;gt;settings.py&amp;lt;/code&amp;gt; auch direkt angepasst werden, auf diese Weise werden jedoch mögliche Konflikte beim Update vermieden. &amp;lt;code&amp;gt;settings.py&amp;lt;/code&amp;gt; sollte dennoch dahingehend geprüft werden, ob man ggf. weitere Optionen ändern möchte.&lt;br /&gt;
&lt;br /&gt;
Das Mailman Web Frontend nutzt das Framework Django. Einige der Einstellungen sind in der [https://docs.djangoproject.com/en/2.2/ref/settings/ Dokumentation von Django] beschrieben, andere konfigurieren eine der in &amp;lt;code&amp;gt;INSTALLED_APPS&amp;lt;/code&amp;gt; definierten Anwendungen.&lt;br /&gt;
&lt;br /&gt;
Damit per Django verfügbare Kommandos leicht ausgeführt werden können, wird der Befehl &#039;&#039;mailman-django&#039;&#039; eingerichtet:&lt;br /&gt;
 $ cat &amp;lt;&amp;lt;&#039;EOD&#039; &amp;gt;~/.local/bin/mailman-django&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 &lt;br /&gt;
 cd ~/mailman&lt;br /&gt;
 pipenv run mailman-suite/mailman-suite_project/manage.py &amp;quot;$@&amp;quot;&lt;br /&gt;
 EOD&lt;br /&gt;
 &lt;br /&gt;
 chmod +x ~/.local/bin/mailman-django&lt;br /&gt;
&lt;br /&gt;
Anschließend können folgende Kommandos ausgeführt werden:&lt;br /&gt;
 $ mailman-django migrate&lt;br /&gt;
 mailman-django collectstatic&lt;br /&gt;
 mailman-django compress&lt;br /&gt;
 mailman-django createsuperuser&lt;br /&gt;
&lt;br /&gt;
Nun müssen die statischen Dateien für das Web Frontend noch per HTTPS verfügbar gemacht werden:&lt;br /&gt;
 $ ln -s ~/mailman/mailman-suite/mailman-suite_project/static ~/doms/lists.example.org/htdocs-ssl/&lt;br /&gt;
&lt;br /&gt;
Damit das Web Frontend per [[Phusion_Passenger|Phusion Passenger]] geladen werden kann:&lt;br /&gt;
 $ cat &amp;lt;&amp;lt;EOD &amp;gt;~/doms/lists.example.org/app-ssl/passenger_wsgi.py&lt;br /&gt;
 import os&lt;br /&gt;
 import subprocess&lt;br /&gt;
 import sys&lt;br /&gt;
 &lt;br /&gt;
 os.environ[&#039;LANG&#039;] = &#039;C.UTF-8&#039;&lt;br /&gt;
 os.environ[&#039;LC_ALL&#039;] = &#039;C.UTF-8&#039;&lt;br /&gt;
 &lt;br /&gt;
 HOME = os.getenv(&#039;HOME&#039;)&lt;br /&gt;
 PIPENV = os.path.join(HOME, &#039;.local&#039;, &#039;bin&#039;, &#039;pipenv&#039;)&lt;br /&gt;
 PIPFILE_DIR = os.path.join(HOME, &#039;mailman&#039;)&lt;br /&gt;
 INTERP = subprocess.check_output([PIPENV, &#039;run&#039;, &#039;which&#039;, &#039;python&#039;], cwd=PIPFILE_DIR).strip().decode(&#039;utf-8&#039;)&lt;br /&gt;
 if sys.executable != INTERP:&lt;br /&gt;
     os.execl(INTERP, INTERP, *sys.argv)&lt;br /&gt;
 &lt;br /&gt;
 WSGI_DIR = os.path.join(HOME, &#039;mailman&#039;, &#039;mailman-suite&#039;, &#039;mailman-suite_project&#039;)&lt;br /&gt;
 sys.path.append(WSGI_DIR)&lt;br /&gt;
 &lt;br /&gt;
 from wsgi import application&lt;br /&gt;
 EOD&lt;br /&gt;
&lt;br /&gt;
Nun steht das Web Frontend unter &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://lists.example.org/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; zur Verfügung. Über die Django Administration sollte unter &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://lists.example.org/admin/sites/site/1/change/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; die Domäne angepasst werden.&lt;br /&gt;
&lt;br /&gt;
== Cron Jobs ==&lt;br /&gt;
Es sind verschiedene Cron Jobs erforderlich. Hierzu &amp;lt;code&amp;gt;crontab -e&amp;lt;/code&amp;gt; ausführen und Folgendes eintragen:&lt;br /&gt;
 # An die in MAILTO eingetragene Adressen werden Ausgaben der Cron Jobs gesendet (optional)&lt;br /&gt;
 #MAILTO=admin@example.org&lt;br /&gt;
 PATH=$HOME/.local/bin:$PATH&lt;br /&gt;
 &lt;br /&gt;
 @reboot mailman start&lt;br /&gt;
 &lt;br /&gt;
 # Send periodic digests.&lt;br /&gt;
 @daily mailman digests --send&lt;br /&gt;
 &lt;br /&gt;
 @reboot mailman-django qcluster&lt;br /&gt;
 # Alternativ qcluster minütlich ausführen&lt;br /&gt;
 # * * * * * mailman-django qcluster --run-once&lt;br /&gt;
 &lt;br /&gt;
 * * * * * mailman-django runjobs minutely&lt;br /&gt;
 2,17,32,47 * * * * mailman-django runjobs quarter_hourly&lt;br /&gt;
 @hourly  mailman-django runjobs hourly&lt;br /&gt;
 @daily   mailman-django runjobs daily&lt;br /&gt;
 @weekly  mailman-django runjobs weekly&lt;br /&gt;
 @monthly mailman-django runjobs monthly&lt;br /&gt;
 @yearly  mailman-django runjobs yearly&lt;br /&gt;
&lt;br /&gt;
Hinweis: Der Einfachheit halber wird hier für &#039;&#039;mailman start&#039;&#039; und &#039;&#039;qcluster&#039;&#039; &amp;lt;code&amp;gt;@reboot&amp;lt;/code&amp;gt; verwendet. Besser wäre der Einsatz von monit. Beim Einsatz von monit würde sich auch der Neustart der Dienste nach einem [[#Update|Update]] ändern. (Anleitung gerne anpassen, sollte jemand monit einrichten.)&lt;br /&gt;
&lt;br /&gt;
== Mails an Mailman weiterleiten ==&lt;br /&gt;
Da die MTA-Konfiguration nicht direkt angepasst werden kann, ist ein Hilfskonstrukt erforderlich: Mittels &#039;&#039;.forward-Dateien&#039;&#039; werden eingehende Mails an das Programm msmtp weitergeleitet, welches diese per [https://de.wikipedia.org/wiki/Local_Mail_Transfer_Protocol LMTP] bei Mailman abliefert.&lt;br /&gt;
&lt;br /&gt;
msmtp kann wie folgt installiert werden:&lt;br /&gt;
 $ MSMTP_VERSION=1.8.6 # ggf. aktualisieren&lt;br /&gt;
 wget &amp;lt;nowiki&amp;gt;https://marlam.de/msmtp/releases/msmtp-$MSMTP_VERSION.tar.xz&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 tar xf msmtp-$MSMTP_VERSION.tar.xz&lt;br /&gt;
 cd msmtp-$MSMTP_VERSION&lt;br /&gt;
 ./configure --without-msmtpd&lt;br /&gt;
 make&lt;br /&gt;
 mv src/msmtp ~/.local/bin/&lt;br /&gt;
 cd ..&lt;br /&gt;
 rm -r msmtp-$MSMTP_VERSION msmtp-$MSMTP_VERSION.tar.xz&lt;br /&gt;
&lt;br /&gt;
Die Einrichtung der eigentlichen Weiterleitung erfolgt im nächsten Abschnitt.&lt;br /&gt;
&lt;br /&gt;
== Liste anlegen ==&lt;br /&gt;
Damit Mailman tatsächlich genutzt werden kann, muss natürlich eine Liste eingerichtet werden.&lt;br /&gt;
&lt;br /&gt;
Mit den folgenden Kommandos werden eine Liste in Mailman erstellt, E-Mail-Adressen angelegt sowie Weiterleitungen konfiguriert:&lt;br /&gt;
 $ LISTNAME=test&lt;br /&gt;
 DOMAIN_ADMIN=xyz00&lt;br /&gt;
 DOMAIN_USER=xyz00-lists&lt;br /&gt;
 DOMAIN=lists.example.org&lt;br /&gt;
 LMTP_PORT=8024 # In Mailman Core konfigurierter Port&lt;br /&gt;
 &lt;br /&gt;
 mailman create $LISTNAME@$DOMAIN # Alternativ über Web Frontend&lt;br /&gt;
 &lt;br /&gt;
 for localpart in $LISTNAME ${LISTNAME}-admin ${LISTNAME}-bounces ${LISTNAME}-confirm ${LISTNAME}-join ${LISTNAME}-leave ${LISTNAME}-owner ${LISTNAME}-request ${LISTNAME}-subscribe ${LISTNAME}-unsubscribe; do&lt;br /&gt;
     hsscript -u $DOMAIN_ADMIN -e &amp;quot;emailaddress.add({set:{domain:&#039;$DOMAIN&#039;,localpart:&#039;$localpart&#039;,target:&#039;$DOMAIN_USER+$localpart&#039;}})&amp;quot;&lt;br /&gt;
     echo &amp;quot;\&amp;quot;|$HOME/.local/bin/msmtp --host=localhost --port=$LMTP_PORT --protocol=lmtp $localpart@$DOMAIN\&amp;quot;&amp;quot; &amp;gt;~/.forward+$localpart&lt;br /&gt;
 done&lt;br /&gt;
&lt;br /&gt;
== Update ==&lt;br /&gt;
Mailman lässt sich wie im Folgenden beschrieben aktualisieren.&lt;br /&gt;
&lt;br /&gt;
Python-Pakete für die Aktualisierungen vorliegen ausgeben:&lt;br /&gt;
 $ cd ~/mailman&lt;br /&gt;
 pipenv update --outdated&lt;br /&gt;
&lt;br /&gt;
Vor dem eigentlichen Update empfiehlt es sich, die Release Notes (zumindest von Mailman) zu lesen und auf relevante Änderungen zu prüfen.&lt;br /&gt;
&lt;br /&gt;
Update der Pakete:&lt;br /&gt;
 $ pipenv update&lt;br /&gt;
&lt;br /&gt;
Ggf. Pip Cache löschen:&lt;br /&gt;
 $ rm -r ~/.cache/pip*&lt;br /&gt;
&lt;br /&gt;
Anschließend werden die Dateien aus dem &#039;&#039;mailman-suite&#039;&#039; Git-Repository aktualisiert. Vor dem Übernehmen der Änderungen (merge), sollten die Commit Logs und die Änderungen begutachtet werden, um festzustellen, ob ggf. die Konfiguration anzupassen ist:&lt;br /&gt;
 $ cd mailman-suite&lt;br /&gt;
 git fetch origin&lt;br /&gt;
 git log master..origin/master # Zeigt Commit logs&lt;br /&gt;
 git diff master..origin/master # Zeigt Änderungen&lt;br /&gt;
&lt;br /&gt;
Änderungen übernehmen:&lt;br /&gt;
 $ git merge origin/master&lt;br /&gt;
&lt;br /&gt;
Abschließend die verschiedenen Dienste neu starten:&lt;br /&gt;
 $ mailman restart&lt;br /&gt;
&lt;br /&gt;
qcluster neu starten, wenn als Dienst und nicht als Cron Job gestartet:&lt;br /&gt;
 $ pkill --oldest --full &#039;mailman-suite_project/manage.py qcluster$&#039;&lt;br /&gt;
 mailman-django qcluster &amp;amp;disown&lt;br /&gt;
&lt;br /&gt;
Web Frontend neu starten:&lt;br /&gt;
 $ mkdir -p ~/doms/&amp;lt;domain&amp;gt;/app-ssl/tmp&lt;br /&gt;
 touch ~/doms/&amp;lt;domain&amp;gt;/app-ssl/tmp/restart.txt&lt;br /&gt;
&lt;br /&gt;
Zur Aktualisierung von msmtp können die Schritte zur Installation (mit angepasster Versionsnummer) wiederholt werden.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:HSDoku]]&lt;br /&gt;
[[Kategorie:Installationsanleitungen]]&lt;br /&gt;
[[Kategorie:Software]]&lt;br /&gt;
[[Kategorie:Mailinglisten]]&lt;br /&gt;
[[Kategorie:E-Mail]]&lt;/div&gt;</summary>
		<author><name>Dtu00-wiki</name></author>
	</entry>
	<entry>
		<id>https://wiki.hostsharing.net/index.php?title=Mailman_3_installieren&amp;diff=4993</id>
		<title>Mailman 3 installieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.hostsharing.net/index.php?title=Mailman_3_installieren&amp;diff=4993"/>
		<updated>2019-10-13T18:26:25Z</updated>

		<summary type="html">&lt;p&gt;Dtu00-wiki: Anleitung zur Installation von Mailman 3 angelegt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Mailman 3 installieren =&lt;br /&gt;
&lt;br /&gt;
Die folgende Anleitung zur Installation von Mailman 3 auf Hostsharing geht davon aus, dass als Domäne &#039;&#039;lists.example.org&#039;&#039; und als Domänennutzer &#039;&#039;xyz00-lists&#039;&#039; verwendet wird. Es ist zu empfehlen, auszuführende Befehle und Konfigurationen vorab auf zu ersetzende Werte zu prüfen. Alle Befehle sind als Benutzer &#039;&#039;xyz00-lists&#039;&#039; zu starten. Damit mehrere aufeinander folgende Shell-Kommandos leichter kopiert werden können, wird nur vor das jeweils erste Kommando ein &#039;&#039;$&#039;&#039; gesetzt. Zum Verständnis mancher der folgenden Anweisungen kann es hilfreich sein, die [https://mailman.readthedocs.io/ Mailman-Dokumentation] gelesen und sich mit [https://pipenv.readthedocs.io/en/latest/ Pipenv] beschäftigt zu haben.&lt;br /&gt;
&lt;br /&gt;
Achtung: Mailman 3 benötigt zahlreiche Hintergrundprozesse, was beim Managed Webspace zusätzliche Kosten verursacht.&lt;br /&gt;
&lt;br /&gt;
== Datenbank ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Mailman Core ==&lt;br /&gt;
Für die Installation von Mailman Core sind folgende Kommandos auszuführen:&lt;br /&gt;
 $ pip3 install --user pipenv&lt;br /&gt;
 echo &#039;export PATH=&amp;quot;$HOME/.local/bin:$PATH&amp;quot;&#039; &amp;gt;&amp;gt; ~/.profile&lt;br /&gt;
 source ~/.profile&lt;br /&gt;
 mkdir ~/mailman&lt;br /&gt;
 cd ~/mailman&lt;br /&gt;
 pipenv install mailman mailman-hyperkitty&lt;br /&gt;
 pipenv install psycopg2-binary # Für PostgreSQL&lt;br /&gt;
 pipenv install pymsql # Für MySQL&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anschließend wird das Verzeichnis für die Konfigurationsdatei angelegt:&lt;br /&gt;
 $ mkdir -p ~/mailman/var/etc&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration wird in die Datei &amp;lt;code&amp;gt;~/mailman/var/etc/mailman.cfg&amp;lt;/code&amp;gt; geschrieben:&lt;br /&gt;
 [mailman]&lt;br /&gt;
 site_owner: admin@example.org&lt;br /&gt;
 default_language: de&lt;br /&gt;
 &lt;br /&gt;
 [database] # https://mailman.readthedocs.io/en/latest/src/mailman/docs/database.html&lt;br /&gt;
 class: mailman.database.postgresql.PostgreSQLDatabase&lt;br /&gt;
 url: postgres://myuser:mypassword@mypghost/mailman&lt;br /&gt;
 # Fallls MySQL verwendet:&lt;br /&gt;
 #class: mailman.database.mysql.MySQLDatabase&lt;br /&gt;
 #url: mysql+pymysql://myuser:mypassword@mymysqlhost/mailman?charset=utf8&amp;amp;use_unicode=1&lt;br /&gt;
 # SQLite ist Standard, wenn nichts konfiguriert ist&lt;br /&gt;
 &lt;br /&gt;
 [webservice] # REST Service von Mailman. Wird von [[#Web_Frontend|Web Frontend]] verwendet&lt;br /&gt;
 port: 8001 # ändern, falls belegt&lt;br /&gt;
 admin_user: restadmin&lt;br /&gt;
 admin_pass: restpass&lt;br /&gt;
 &lt;br /&gt;
 [mta]&lt;br /&gt;
 smtp_host: xyz00.hostsharing.net&lt;br /&gt;
 smtp_port: 4587&lt;br /&gt;
 smtp_user: xyz00-lists&lt;br /&gt;
 smtp_pass: secret&lt;br /&gt;
 smtp_secure_mode: starttls&lt;br /&gt;
 verp_confirm_format: $address # VERP ist nicht möglich, da [https://de.wikipedia.org/wiki/Mail_Transfer_Agent MTA] nicht selbst konfiguriert werden kann&lt;br /&gt;
 # https://mailman.readthedocs.io/en/latest/src/mailman/docs/mta.html&lt;br /&gt;
 incoming: mailman.mta.null.NullMTA # NullMTA, da MTA MTA nicht selbst konfiguriert werden kann&lt;br /&gt;
 lmtp_port: 8024 # ändern, falls belegt&lt;br /&gt;
 &lt;br /&gt;
 [runner.nntp]&lt;br /&gt;
 start: no # Runner für [https://de.wikipedia.org/wiki/Network_News_Transfer_Protocol NNTP] Gateway ausschalten&lt;br /&gt;
 &lt;br /&gt;
 [archiver.hyperkitty]&lt;br /&gt;
 class: mailman_hyperkitty.Archiver&lt;br /&gt;
 enable: yes&lt;br /&gt;
 # $HOME muss durch den tatsächlichen Pfad zum Benutzerverzeichnis ersetzt werden&lt;br /&gt;
 configuration: $HOME/mailman/var/etc/mailman-hyperkitty.cfg&lt;br /&gt;
&lt;br /&gt;
Zugriffsrechte einschränken:&lt;br /&gt;
 $ chmod 0600 ~/mailman/var/etc/mailman.cfg&lt;br /&gt;
&lt;br /&gt;
Damit Hyperkitty als [[#Web_Frontend|Web Frontend]] für das Archiv verwendet werden kann, ist in die Datei &amp;lt;code&amp;gt;~/mailman/var/etc/mailman-hyperkitty.cfg&amp;lt;/code&amp;gt; Foglendes zu schreiben:&lt;br /&gt;
 [general]&lt;br /&gt;
 base_url: &amp;lt;nowiki&amp;gt;https://lists.example.org/hyperkitty/&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 # Muss identisch mit Key in Hyperkitty sein&lt;br /&gt;
 api_key: SecretArchiverAPIKey&lt;br /&gt;
&lt;br /&gt;
Zugriffsrechte einschränken:&lt;br /&gt;
 $ chmod 0600 ~/mailman/var/etc/mailman-hyperkitty.cfg&lt;br /&gt;
&lt;br /&gt;
Kommando &#039;&#039;mailman&#039;&#039; anlegen:&lt;br /&gt;
 $ cat &amp;lt;&amp;lt;&#039;EOD&#039; &amp;gt;~/.local/bin/mailman&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 &lt;br /&gt;
 cd ~/mailman&lt;br /&gt;
 pipenv run mailman &amp;quot;$@&amp;quot;&lt;br /&gt;
 EOD&lt;br /&gt;
 &lt;br /&gt;
 chmod +x ~/.local/bin/mailman&lt;br /&gt;
&lt;br /&gt;
Nun kann mit &amp;lt;code&amp;gt;mailman info&amp;lt;/code&amp;gt; nochmal die aktuelle Konfiguration geprüft werden.&lt;br /&gt;
Danach kann Mailman gestartet werden:&lt;br /&gt;
 $ mailman start&lt;br /&gt;
&lt;br /&gt;
== Web Frontend ==&lt;br /&gt;
In diesem Abschnitt wird die Installation des Web Frontends beschrieben.&lt;br /&gt;
&lt;br /&gt;
Zunächst werden die erforderlichen Python-Pakete installiert:&lt;br /&gt;
 $ cd ~/mailman&lt;br /&gt;
 pipenv install whoosh postorius hyperkitty&lt;br /&gt;
&lt;br /&gt;
Um Plattenplatz freizugeben, kann optional der Pip Cache gelöscht werden:&lt;br /&gt;
 $ rm -r ~/.cache/pip*&lt;br /&gt;
&lt;br /&gt;
Nun werden die Dateien geladen, mit denen Postorius und Hyperkitty konfiguriert und gestartet werden:&lt;br /&gt;
 $ git clone https://gitlab.com/mailman/mailman-suite.git&lt;br /&gt;
&lt;br /&gt;
Zur Konfiguration von Hyperkitty wird die IP-Adresse benötigt, von der die Anfragen von Mailman Core kommen. Diese kann wie folgt ermittelt werden:&lt;br /&gt;
 $ cat &amp;lt;&amp;lt;EOD &amp;gt;~/doms/lists.example.org/htdocs-ssl/ip.php&lt;br /&gt;
 &amp;lt;?php&lt;br /&gt;
 echo $_SERVER[&#039;REMOTE_ADDR&#039;] . &amp;quot;\n&amp;quot;;&lt;br /&gt;
 EOD&lt;br /&gt;
 curl &amp;lt;nowiki&amp;gt;https://lists.example.org/ip.php&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 rm ~/doms/lists.example.org/htdocs-ssl/ip.php&lt;br /&gt;
&lt;br /&gt;
Die Konfiguration wird nun in Die Datei &amp;lt;code&amp;gt;~/mailman-suite/mailman-suite_project/settings_local.py&amp;lt;/code&amp;gt; geschrieben:&lt;br /&gt;
 SECRET_KEY = &#039;change-this-on-your-production-server&#039;&lt;br /&gt;
 Debug = False&lt;br /&gt;
 ADMINS = (&lt;br /&gt;
      (&#039;Mailman Suite Admin&#039;, &#039;admin@example.org&#039;),&lt;br /&gt;
 )&lt;br /&gt;
 ALLOWED_HOSTS = [&lt;br /&gt;
     &#039;lists.example.org&#039;,&lt;br /&gt;
 ]&lt;br /&gt;
 MAILMAN_REST_API_URL = &#039;&amp;lt;nowiki&amp;gt;http://localhost:8001&amp;lt;/nowiki&amp;gt;&#039;&lt;br /&gt;
 MAILMAN_REST_API_USER = &#039;restadmin&#039;&lt;br /&gt;
 MAILMAN_REST_API_PASS = &#039;restpass&#039;&lt;br /&gt;
 MAILMAN_ARCHIVER_KEY = &#039;SecretArchiverAPIKey&#039;&lt;br /&gt;
 MAILMAN_ARCHIVER_FROM = (&#039;&amp;lt;IP von Mailman Core&amp;gt;&#039;)&lt;br /&gt;
 &lt;br /&gt;
 # Authentifizierung über externe Dienste ausschalten (s. django-allauth)&lt;br /&gt;
 from settings import INSTALLED_APPS&lt;br /&gt;
 INSTALLED_APPS = filter(lambda app: not app.startswith(&#039;allauth.socialaccount.&#039;) and app != &#039;django_mailman3.lib.auth.fedora&#039;, INSTALLED_APPS)&lt;br /&gt;
 INSTALLED_APPS = (&lt;br /&gt;
     &#039;hyperkitty&#039;,&lt;br /&gt;
     &#039;postorius&#039;,&lt;br /&gt;
     &#039;django_mailman3&#039;,&lt;br /&gt;
     # Uncomment the next line to enable the admin:&lt;br /&gt;
     &#039;django.contrib.admin&#039;,&lt;br /&gt;
     # Uncomment the next line to enable admin documentation:&lt;br /&gt;
     # &#039;django.contrib.admindocs&#039;,&lt;br /&gt;
     &#039;django.contrib.auth&#039;,&lt;br /&gt;
     &#039;django.contrib.contenttypes&#039;,&lt;br /&gt;
     &#039;django.contrib.sessions&#039;,&lt;br /&gt;
     &#039;django.contrib.sites&#039;,&lt;br /&gt;
     &#039;django.contrib.messages&#039;,&lt;br /&gt;
     &#039;django.contrib.staticfiles&#039;,&lt;br /&gt;
     &#039;rest_framework&#039;,&lt;br /&gt;
     &#039;django_gravatar&#039;,&lt;br /&gt;
     &#039;compressor&#039;,&lt;br /&gt;
     &#039;haystack&#039;,&lt;br /&gt;
     &#039;django_extensions&#039;,&lt;br /&gt;
     &#039;django_q&#039;,&lt;br /&gt;
     &#039;allauth&#039;,&lt;br /&gt;
     &#039;allauth.account&#039;,&lt;br /&gt;
     &#039;allauth.socialaccount&#039;,&lt;br /&gt;
 )&lt;br /&gt;
 &lt;br /&gt;
 # Standardkonfiguration verwendet SQLite&lt;br /&gt;
 DATABASES = {&lt;br /&gt;
     &#039;default&#039;: {&lt;br /&gt;
         &#039;ENGINE&#039;: &#039;django.db.backends.postgresql_psycopg2&#039;, # Für MySQL: django.db.backends.mysql&lt;br /&gt;
         &#039;HOST&#039;: &#039;localhost&#039;,&lt;br /&gt;
         &#039;NAME&#039;: &#039;database_name&#039;,&lt;br /&gt;
         &#039;USER&#039;: &#039;database_user&#039;,&lt;br /&gt;
         &#039;PASSWORD&#039;: &#039;database_password&#039;,&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 LANGUAGE_CODE = &#039;de-de&#039;&lt;br /&gt;
 TIME_ZONE = &#039;Europe/Berlin&#039;&lt;br /&gt;
 DEFAULT_FROM_EMAIL = &#039;mailing-lists@example.org&#039;&lt;br /&gt;
 SERVER_EMAIL = &#039;mailing-lists@example.org&#039;&lt;br /&gt;
 EMAIL_BACKEND = &#039;django.core.mail.backends.smtp.EmailBackend&#039;&lt;br /&gt;
 EMAIL_HOST = &#039;xyz00.hostsharing.net&#039;&lt;br /&gt;
 EMAIL_PORT = 4587&lt;br /&gt;
 EMAIL_USE_TLS = True&lt;br /&gt;
 EMAIL_HOST_USER = &#039;xyz00-lists&#039;&lt;br /&gt;
 EMAIL_HOST_PASSWORD = &#039;secret&#039;&lt;br /&gt;
 EMAIL_TIMEOUT = 60&lt;br /&gt;
 &lt;br /&gt;
 ACCOUNT_DEFAULT_HTTP_PROTOCOL = &#039;https&#039;&lt;br /&gt;
 &lt;br /&gt;
 COMPRESS_PRECOMPILERS = (&lt;br /&gt;
    (&#039;text/less&#039;, &#039;lessc {infile} {outfile}&#039;),&lt;br /&gt;
    (&#039;text/x-scss&#039;, &#039;sass -t compressed {infile} {outfile}&#039;),&lt;br /&gt;
    (&#039;text/x-sass&#039;, &#039;sass -t compressed {infile} {outfile}&#039;),&lt;br /&gt;
 )&lt;br /&gt;
 COMPRESS_OFFLINE = True&lt;br /&gt;
 &lt;br /&gt;
 # Workeranzahl reduzieren (optional)&lt;br /&gt;
 Q_CLUSTER = {&lt;br /&gt;
     &#039;workers&#039;: 1,&lt;br /&gt;
     &#039;timeout&#039;: 300,&lt;br /&gt;
     &#039;save_limit&#039;: 100,&lt;br /&gt;
     &#039;orm&#039;: &#039;default&#039;,&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Hinweis: Die Einstellungen in &amp;lt;code&amp;gt;settings_local.py&amp;lt;/code&amp;gt; überschreiben solche in &amp;lt;code&amp;gt;settings.py&amp;lt;/code&amp;gt;. Zwar kann &amp;lt;code&amp;gt;settings.py&amp;lt;/code&amp;gt; auch direkt angepasst werden, auf diese Weise werden jedoch mögliche Konflikte beim Update vermieden. &amp;lt;code&amp;gt;settings.py&amp;lt;/code&amp;gt; sollte dennoch dahingehend geprüft werden, ob man ggf. weitere Optionen ändern möchte.&lt;br /&gt;
&lt;br /&gt;
Das Mailman Web Frontend nutzt das Framework Django. Einige der Einstellungen sind in der [https://docs.djangoproject.com/en/2.2/ref/settings/ Dokumentation von Django] beschrieben, andere konfigurieren eine der in &amp;lt;code&amp;gt;INSTALLED_APPS&amp;lt;/code&amp;gt; definierten Anwendungen.&lt;br /&gt;
&lt;br /&gt;
Damit per Django verfügbare Kommandos leicht ausgeführt werden können, wird der Befehl &#039;&#039;mailman-django&#039;&#039; eingerichtet:&lt;br /&gt;
 $ cat &amp;lt;&amp;lt;&#039;EOD&#039; &amp;gt;~/.local/bin/mailman-django&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 &lt;br /&gt;
 cd ~/mailman&lt;br /&gt;
 pipenv run mailman-suite/mailman-suite_project/manage.py &amp;quot;$@&amp;quot;&lt;br /&gt;
 EOD&lt;br /&gt;
 &lt;br /&gt;
 chmod +x ~/.local/bin/mailman-django&lt;br /&gt;
&lt;br /&gt;
Anschließend können folgende Kommandos ausgeführt werden:&lt;br /&gt;
 $ mailman-django migrate&lt;br /&gt;
 mailman-django collectstatic&lt;br /&gt;
 mailman-django compress&lt;br /&gt;
 mailman-django createsuperuser&lt;br /&gt;
&lt;br /&gt;
Damit das Web Frontend per [[Phusion_Passenger|Phusion Passenger]] geladen werden kann:&lt;br /&gt;
 $ cat &amp;lt;&amp;lt;EOD &amp;gt;~/doms/lists.example.org/app-ssl/passenger_wsgi.py&lt;br /&gt;
 import os&lt;br /&gt;
 import subprocess&lt;br /&gt;
 import sys&lt;br /&gt;
 &lt;br /&gt;
 os.environ[&#039;LANG&#039;] = &#039;C.UTF-8&#039;&lt;br /&gt;
 os.environ[&#039;LC_ALL&#039;] = &#039;C.UTF-8&#039;&lt;br /&gt;
 &lt;br /&gt;
 HOME = os.getenv(&#039;HOME&#039;)&lt;br /&gt;
 PIPENV = os.path.join(HOME, &#039;.local&#039;, &#039;bin&#039;, &#039;pipenv&#039;)&lt;br /&gt;
 PIPFILE_DIR = os.path.join(HOME, &#039;mailman&#039;)&lt;br /&gt;
 INTERP = subprocess.check_output([PIPENV, &#039;run&#039;, &#039;which&#039;, &#039;python&#039;], cwd=PIPFILE_DIR).strip().decode(&#039;utf-8&#039;)&lt;br /&gt;
 if sys.executable != INTERP:&lt;br /&gt;
     os.execl(INTERP, INTERP, *sys.argv)&lt;br /&gt;
 &lt;br /&gt;
 WSGI_DIR = os.path.join(HOME, &#039;mailman&#039;, &#039;mailman-suite&#039;, &#039;mailman-suite_project&#039;)&lt;br /&gt;
 sys.path.append(WSGI_DIR)&lt;br /&gt;
 &lt;br /&gt;
 from wsgi import application&lt;br /&gt;
 EOD&lt;br /&gt;
&lt;br /&gt;
Nun steht das Web Frontend unter &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://lists.example.org/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; zur Verfügung. Über die Django Administration sollte unter &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;https://lists.example.org/admin/sites/site/1/change/&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; die Domäne angepasst werden.&lt;br /&gt;
&lt;br /&gt;
== Cron Jobs ==&lt;br /&gt;
Es sind verschiedene Cron Jobs erforderlich. Hierzu &amp;lt;code&amp;gt;crontab -e&amp;lt;/code&amp;gt; ausführen und Folgendes eintragen:&lt;br /&gt;
 # An die in MAILTO eingetragene Adressen werden Ausgaben der Cron Jobs gesendet (optional)&lt;br /&gt;
 #MAILTO=admin@example.org&lt;br /&gt;
 PATH=$HOME/.local/bin:$PATH&lt;br /&gt;
 &lt;br /&gt;
 @reboot mailman start&lt;br /&gt;
 &lt;br /&gt;
 # Send periodic digests.&lt;br /&gt;
 @daily mailman digests --send&lt;br /&gt;
 &lt;br /&gt;
 @reboot mailman-django qcluster&lt;br /&gt;
 # Alternativ qcluster minütlich ausführen&lt;br /&gt;
 # * * * * * mailman-django qcluster --run-once&lt;br /&gt;
 &lt;br /&gt;
 * * * * * mailman-django runjobs minutely&lt;br /&gt;
 2,17,32,47 * * * * mailman-django runjobs quarter_hourly&lt;br /&gt;
 @hourly  mailman-django runjobs hourly&lt;br /&gt;
 @daily   mailman-django runjobs daily&lt;br /&gt;
 @weekly  mailman-django runjobs weekly&lt;br /&gt;
 @monthly mailman-django runjobs monthly&lt;br /&gt;
 @yearly  mailman-django runjobs yearly&lt;br /&gt;
&lt;br /&gt;
Hinweis: Der Einfachheit halber wird hier für &#039;&#039;mailman start&#039;&#039; und &#039;&#039;qcluster&#039;&#039; &amp;lt;code&amp;gt;@reboot&amp;lt;/code&amp;gt; verwendet. Besser wäre der Einsatz von monit. Beim Einsatz von monit würde sich auch der Neustart der Dienste nach einem [[#Update|Update]] ändern. (Anleitung gerne anpassen, sollte jemand monit einrichten.)&lt;br /&gt;
&lt;br /&gt;
== Mails an Mailman weiterleiten ==&lt;br /&gt;
Da die MTA-Konfiguration nicht direkt angepasst werden kann, ist ein Hilfskonstrukt erforderlich: Mittels &#039;&#039;.forward-Dateien&#039;&#039; werden eingehende Mails an das Programm msmtp weitergeleitet, welches diese per [https://de.wikipedia.org/wiki/Local_Mail_Transfer_Protocol LMTP] bei Mailman abliefert.&lt;br /&gt;
&lt;br /&gt;
msmtp kann wie folgt installiert werden:&lt;br /&gt;
 $ MSMTP_VERSION=1.8.6 # ggf. aktualisieren&lt;br /&gt;
 wget &amp;lt;nowiki&amp;gt;https://marlam.de/msmtp/releases/msmtp-$MSMTP_VERSION.tar.xz&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 tar xf msmtp-$MSMTP_VERSION.tar.xz&lt;br /&gt;
 cd msmtp-$MSMTP_VERSION&lt;br /&gt;
 ./configure --without-msmtpd&lt;br /&gt;
 make&lt;br /&gt;
 mv src/msmtp ~/.local/bin/&lt;br /&gt;
 cd ..&lt;br /&gt;
 rm -r msmtp-$MSMTP_VERSION msmtp-$MSMTP_VERSION.tar.xz&lt;br /&gt;
&lt;br /&gt;
Die Einrichtung der eigentlichen Weiterleitung erfolgt im nächsten Abschnitt.&lt;br /&gt;
&lt;br /&gt;
== Liste anlegen ==&lt;br /&gt;
Damit Mailman tatsächlich genutzt werden kann, muss natürlich eine Liste eingerichtet werden.&lt;br /&gt;
&lt;br /&gt;
Mit den folgenden Kommandos werden eine Liste in Mailman erstellt, E-Mail-Adressen angelegt sowie Weiterleitungen konfiguriert:&lt;br /&gt;
 $ LISTNAME=test&lt;br /&gt;
 DOMAIN_ADMIN=xyz00&lt;br /&gt;
 DOMAIN_USER=xyz00-lists&lt;br /&gt;
 DOMAIN=lists.example.org&lt;br /&gt;
 LMTP_PORT=8024 # In Mailman Core konfigurierter Port&lt;br /&gt;
 &lt;br /&gt;
 mailman create $LISTNAME@$DOMAIN # Alternativ über Web Frontend&lt;br /&gt;
 &lt;br /&gt;
 for localpart in $LISTNAME ${LISTNAME}-admin ${LISTNAME}-bounces ${LISTNAME}-confirm ${LISTNAME}-join ${LISTNAME}-leave ${LISTNAME}-owner ${LISTNAME}-request ${LISTNAME}-subscribe ${LISTNAME}-unsubscribe; do&lt;br /&gt;
     hsscript -u $DOMAIN_ADMIN -e &amp;quot;emailaddress.add({set:{domain:&#039;$DOMAIN&#039;,localpart:&#039;$localpart&#039;,target:&#039;$DOMAIN_USER+$localpart&#039;}})&amp;quot;&lt;br /&gt;
     echo &amp;quot;\&amp;quot;|$HOME/.local/bin/msmtp --host=localhost --port=$LMTP_PORT --protocol=lmtp $localpart@$DOMAIN\&amp;quot;&amp;quot; &amp;gt;~/.forward+$localpart&lt;br /&gt;
 done&lt;br /&gt;
&lt;br /&gt;
== Update ==&lt;br /&gt;
Mailman lässt sich wie im Folgenden beschrieben aktualisieren.&lt;br /&gt;
&lt;br /&gt;
Python-Pakete für die Aktualisierungen vorliegen ausgeben:&lt;br /&gt;
 $ cd ~/mailman&lt;br /&gt;
 pipenv update --outdated&lt;br /&gt;
&lt;br /&gt;
Vor dem eigentlichen Update empfiehlt es sich, die Release Notes (zumindest von Mailman) zu lesen und auf relevante Änderungen zu prüfen.&lt;br /&gt;
&lt;br /&gt;
Update der Pakete:&lt;br /&gt;
 $ pipenv update&lt;br /&gt;
&lt;br /&gt;
Ggf. Pip Cache löschen:&lt;br /&gt;
 $ rm -r ~/.cache/pip*&lt;br /&gt;
&lt;br /&gt;
Anschließend werden die Dateien aus dem &#039;&#039;mailman-suite&#039;&#039; Git-Repository aktualisiert. Vor dem Übernehmen der Änderungen (merge), sollten die Commit Logs und die Änderungen begutachtet werden, um festzustellen, ob ggf. die Konfiguration anzupassen ist:&lt;br /&gt;
 $ cd mailman-suite&lt;br /&gt;
 git fetch origin&lt;br /&gt;
 git log master..origin/master # Zeigt Commit logs&lt;br /&gt;
 git diff master..origin/master # Zeigt Änderungen&lt;br /&gt;
&lt;br /&gt;
Änderungen übernehmen:&lt;br /&gt;
 $ git merge origin/master&lt;br /&gt;
&lt;br /&gt;
Abschließend die verschiedenen Dienste neu starten:&lt;br /&gt;
 $ mailman restart&lt;br /&gt;
&lt;br /&gt;
qcluster neu starten, wenn als Dienst und nicht als Cron Job gestartet:&lt;br /&gt;
 $ pkill --oldest --full &#039;mailman-suite_project/manage.py qcluster$&#039;&lt;br /&gt;
 mailman-django qcluster &amp;amp;disown&lt;br /&gt;
&lt;br /&gt;
Web Frontend neu starten:&lt;br /&gt;
 $ mkdir -p ~/doms/&amp;lt;domain&amp;gt;/app-ssl/tmp&lt;br /&gt;
 touch ~/doms/&amp;lt;domain&amp;gt;/app-ssl/tmp/restart.txt&lt;br /&gt;
&lt;br /&gt;
Zur Aktualisierung von msmtp können die Schritte zur Installation (mit angepasster Versionsnummer) wiederholt werden.&lt;/div&gt;</summary>
		<author><name>Dtu00-wiki</name></author>
	</entry>
</feed>