Hallo zusammen,
lange wurde hier nichts mehr gepostet, aber das soll sich nun wieder ändern 🙂 Nachdem ich Ende März von Host Europe nach Hetzner umgezogen bin und dort auf einen echten Root Server, möchte ich diesen natürlich auch vielseitig nutzen. Und da kommt ja der „Trend“ schlecht hin ins Spiel: Docker.
Docker ist im Grunde nichts anderes als eine Container Verwaltung. Einmal installiert kann man diverse Container starten, stoppen und verwalten. Das ganze geht nicht nur bei „fertiger“ Software, sondern natürlich auch mit eigenen Images. Da ich allerdings noch ganz am Anfang meiner Docker Erfahrungen bin, habe ich mich dazu entschlossen, ein wenig Software in Containern zu verwalten. Wie praktisch, dass Mailman in seiner neusten Version als Docker Version angeboten wird.
Doch wie wird das ganzen nun unter centOS 7 (einer RedHat Variante) aufgesetzt? Hier möchte ich euch eine kleine Anleitung geben 🙂
Docker installieren
Zunächst einmal müsst ihr euch Docker installieren. Dazu folgt der Anleitung unter
https://docs.docker.com/install/linux/docker-ce/centos/ :
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io
sudo systemctl enable docker
sudo systemctl start docker
Damit ist dann Docker installiert. Das ganze kann man nun ganz einfach testen:
sudo docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
Dieser Befehl sollte einen Container herunterladen, ein paar Infos ausgeben und danach beendet werden. Diesen Container können wir dann auch wieder löschen, da wir ihn ja nicht brauchen:
sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ac2ea2ca46d7 hello-world "/hello" 21 seconds ago Exited (0) 21 seconds ago competent_fermi
sudo docker rm competent_fermi -f
Hier ist der Name des Containers in der letzten Spalte competent_fermi. Dieser kann dann mit dem Befehl in der letzten Zeile gelöscht werden. Nun können wir zwar als root-Nutzer Container erstellen und verwalten.
Neben Docker brauchen wir für Mailman 3 noch den Befehl ‚docker-compose‘. Den installiert man so:
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
Damit ist nun auch Docker Compose installiert und einsatzbereit. Nun kommen wir zu Mailman.
Mailman Docker Image
Das Mailman Docker Image liegt auf GitHub unter der folgenden Adresse:
https://github.com/maxking/docker-mailman. Um das Repository nutzen zu können, brauchen wir das Versionierungstool ‚git‘ und einen lokalen Klon von dem Repository. Das kann man so machen:
sudo su -
cd ~
yum install git
git clone https://github.com/maxking/docker-mailman.git
Danach entsteht unter /root/docker-mailman das gewünscht Repository. Wir wechseln nun in das Verzeichnis und bearbeiten dort die Datei ‚docker-compose.yml‘:
version: '2'
services:
mailman-core:
image: maxking/mailman-core:0.2
container_name: mailman-core
hostname: mailman-core
volumes:
- /opt/mailman/core:/opt/mailman/
stop_grace_period: 30s
links:
- database:database
depends_on:
- database
environment:
- DATABASE_URL=postgres://mailman:mailmanpass@database/mailmandb
- DATABASE_TYPE=postgres
- DATABASE_CLASS=mailman.database.postgresql.PostgreSQLDatabase
- HYPERKITTY_API_KEY=<API KEY>
networks:
mailman:
ipv4_address: 172.19.199.2
mailman-web:
image: maxking/mailman-web:0.2
container_name: mailman-web
hostname: mailman-web
depends_on:
- database
links:
- mailman-core:mailman-core
- database:database
volumes:
- /opt/mailman/web:/opt/mailman-web-data
environment:
- DATABASE_TYPE=postgres
- DATABASE_URL=postgres://mailman:mailmanpass@database/mailmandb
- HYPERKITTY_API_KEY=<API KEY>
- UWSGI_STATIC_MAP=/static=/opt/mailman-web-data/static
- SERVE_FROM_DOMAIN=<DOMAIN>
- MAILMAN_ADMIN_USER=<ADMIN USER>
- MAILMAN_ADMIN_EMAIL=<ADMIN E-MAIL>
- SECRET_KEY=<SECRET KEY>
networks:
mailman:
ipv4_address: 172.19.199.3
database:
environment:
POSTGRES_DB: mailmandb
POSTGRES_USER: mailman
POSTGRES_PASSWORD: mailmanpass
restart: always
image: postgres:9.6-alpine
volumes:
- /opt/mailman/database:/var/lib/postgresql/data
networks:
mailman:
ipv4_address: 172.19.199.4
networks:
mailman:
driver: bridge
ipam:
driver: default
config:
-
subnet: 172.19.199.0/24
In Zeile 19 muss, wie auch in Zeile 38, der API Key für Hyperkitty gesetzt werden. Der muss an beiden stellen gleich sein. Einen passenden Key kann man zum Beispiel mittels ‚pwgen‘ erzeugen:
yum install pwgen
pwgen -s 128
Aus der Liste kann man sich nun einen Key raussuchen und diesen in den Zeilen einfügen.
In Zeile 39 legen wir fest, wo die ’static‘-Files abgelegt werden sollen. Das sind Bilder, CSS-Dateien und auch JavaScripts. Dieses Verzeichnis muss von eurem Webserver (ich nutze noch den good old Apache) als Alias für /static eingebunden werden.
In Zeile 40 legt ihr die Domain fest, unter der eure Mailman Installation laufen soll. Ein Beispiel wäre lists.example.com, andere Adressen gehen auch.
In Zeile 41 legt ihr den Benutzernamen das Administrators fest, in Zeile 42 die entsprechende E-Mail Adresse. Wichtig ist, dass die E-Mail Adresse erreichbar ist, da ihr nach der Installation kein Passwort habt und ihr euch eines durch das Passwort zurücksetzen zu schicken lassen müsst.
Das sind die Einstellungen in der docker-compose.yml. Nun müsst ihr noch ein paar Verzeichnisse anlegen:
mkdir -p /opt/mailman/core
mkdir -p /opt/mailman/web
mkdir -p /opt/mailman-web-data/static
Weiterhin müsst ihr die Datei /opt/mailman/web/settings_local.py mit folgendem Inhalt anlegen:
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = '172.19.199.1'
EMAIL_PORT = 25
USE_SSL = False
DEFAULT_FROM_EMAIL = "<E-MAIL>"
SERVER_EMAIL = "<E-MAIL>"
Hier tauscht ihr <E-MAIL> durch eure Server Adresse aus. Zum Beispiel mailman@lists.example.com
Damit Postfix eure E-Mails auch versendet, legt ihr noch die Datei /opt/mailman/core/mailman-extra.cfg mit folgendem Inhalt an:
[mta]
incoming: mailman.mta.postfix.LMTP
outgoing: mailman.mta.deliver.deliver
lmtp_host: 172.19.199.2
lmtp_port: 8024
smtp_host: 172.19.199.1
smtp_port: 25
configuration: /etc/postfix-mailman.cfg
Nun seid ihr soweit, dass Ihr eure Container starten könnt:
sudo su -
cd /root/mailman-docker
docker-compose up -d
Damit sollte nun folgendes möglich sein:
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e29f164cf0e1 maxking/mailman-web:0.2 "docker-entrypoint.s…" 22 hours ago Up 22 hours 8000/tcp, 8080/tcp mailman-web
51806a452897 maxking/mailman-core:0.2 "docker-entrypoint.s…" 22 hours ago Up 22 hours 8001/tcp, 8024/tcp mailman-core
e606290d7c02 postgres:9.6-alpine "docker-entrypoint.s…" 22 hours ago Up 22 hours 5432/tcp docker-mailman_database_1
Damit laufen die Container. Klappt nun die Verbindung?
curl http://172.19.199.3:8000/postorius/lists/
Wenn hier nun ne Menge HTML erscheint, ist alles erfolgreich angelegt. Nun fehlen nur die Konfiguration von Postfix und dem Apache.
Konfiguration von Postfix
In der main.cf (bei centOS /etc/postfix/main.cf) folgendes Ergänzen bzw. erweitern:
# main.cf
# mynetworks erweitern um 172.19.199.2 und 172.19.199.3
# Support the default VERP delimiter.
recipient_delimiter = +
unknown_local_recipient_reject_code = 550
owner_request_special = no
transport_maps =
regexp:/opt/mailman/core/var/data/postfix_lmtp
local_recipient_maps =
regexp:/opt/mailman/core/var/data/postfix_lmtp
relay_domains =
regexp:/opt/mailman/core/var/data/postfix_domains
Danach nur noch systemctl restart postfix und das war es schon auf Postfix Seite. Fehlt nur noch der Apache
Konfiguration von Apache
Bei einem Server, der mehrer VHosts hat, habe ich folgende Konfiguration laufen:
<VirtualHost *:80>
ServerAdmin stephan@krinetzki.de
ServerName lists.krinetzki.de
#RewriteEngine On
#RewriteCond %{HTTPS} !=on
#RewriteCond %{REQUEST_URI} !^/\.well\-known/acme\-challenge/
#RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]
DocumentRoot /var/www/lists.krinetzki.de
</VirtualHost>
<VirtualHost *:443>
ServerAdmin stephan@krinetzki.de
ServerName lists.krinetzki.de
DocumentRoot /opt/mailman/web/static
Use SSLSettings lists.krinetzki.de
Alias /static /opt/mailman/web/static
<Directory /opt/mailman/web/static>
Require all granted
</Directory>
ProxyPass / http://172.19.199.3:8000/
RemoteIPHeader X-Forwarded-For
ProxyPreserveHost On
# Logfiles
CustomLog /var/log/httpd/lists.krinetzki.de_access_log combined
ErrorLog /var/log/httpd/lists.krinetzki.de_error_log
ServerSignature Off
</VirtualHost>
SSLSettings ist bei ein Macro, das so aussieht:
<Macro SSLSettings $host>
SSLEngine on
SSLCertificateKeyFile /etc/letsencrypt/live/$host/privkey.pem
SSLCertificateFile /etc/letsencrypt/live/$host/cert.pem
SSLCertificateChainFile /etc/letsencrypt/live/$host/chain.pem
Header always set Strict-Transport-Security "max-age=15768000; includeSubDomains; preload"
SSLProtocol all -SSLv3
SSLCipherSuite ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS
SSLHonorCipherOrder on
SSLCompression off
</Macro>
Wie ihr seht, verwende ich einige spezieller Cipher und Let’s Encrypt. Nach einem systemctl reload httpd ist die Seite auch erreichbar.
Viel Spaß beim Mailen auf den Mailinglisten!
Kommentar verfassen