A Freak Like Me

Oder: Ich bin ganz normal

  •  
  •  
  • Über mich
  • Datenschutzerklärung
  • Impressum

GNU Mailman 3 als Docker Image

9. April 2019 by Stephan 0 Comments

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!

Ähnliche Beiträge

Categories Server

About Stephan

See all the posts by Stephan at this link.

Kommentar verfassen Antwort abbrechen

Neueste Beiträge

  • Misskey auf CentOS 7 installieren
  • Benachrichtigungen von Icinga2 mittels Signal
  • [Werbung] Nestlé Special.T Mini.T
  • Wie ich mich vor „hacking“ schütze
  • Matrix – Referenz Server „Synapse“ installieren

Kategorien

  • Allgemein
  • Komplettlösung
  • Nintendo
  • Produkttests
  • Review
  • Security
  • Server
  • Werbung
  • Zelda

Gib mir dein Like!

Gib mir dein Like!

Mastodon Link

@therealkings@toot.krinetzki.de


Stop Spam Harvesters, Join Project Honey Pot

Archiv

Neueste Beiträge

  • Misskey auf CentOS 7 installieren
  • Benachrichtigungen von Icinga2 mittels Signal
  • [Werbung] Nestlé Special.T Mini.T
  • Wie ich mich vor „hacking“ schütze
  • Matrix – Referenz Server „Synapse“ installieren

Neueste Kommentare

  • Rasierer - Reinhard bei Neuer Produkttest: Panasonic ES-LT4N Nass/Trocken-Rasierer
  • Prov94 bei Installation von Mastodon auf Debian 8 (Jessie)
  • Balack bei Neuer Produkttest: Panasonic ES-LT4N Nass/Trocken-Rasierer
  • Showdown: Panasonic ES-LT4N VS. Braun Series 7 7898cc – A Freak Like Me bei Braun Series 7 im trnd-Produkttest
  • Braun Series 7 im trnd-Produkttest – A Freak Like Me bei Neuer Produkttest: Panasonic ES-LT4N Nass/Trocken-Rasierer

Copyright © 2022 ~ A Freak Like Me ~ The Funk
Proudly powered by WordPress