Beiträge zu “Docker”

Debugging Mailman 3 in Docker

Hier ein paar Notizen von heute als ich versucht habe einen Mailman3 Service unter Docker zu reanimieren (damit es beim nächsten Mal nicht so lange dauert).

Ich habe die Docker Container neu gebaut

 docker-compose up
 Starting docker-mailman_database_1 ... done
 Starting mailman-core              ... done
 Starting mailman-web               ... done
 Attaching to docker-mailman_database_1, mailman-core, mailman-web
 database_1      | WARNING: no logs are available with the 'syslog' log driver
 mailman-core    | WARNING: no logs are available with the 'syslog' log driver
 mailman-web     | WARNING: no logs are available with the 'syslog' log driver
 mailman-core exited with code 1

und der Container mailman-core steigt einfach aus. Hilfreich ist dabei der Befehl

 docker ps -a

Der zeigt vor allem auch Informationen zu Container die nicht gestartet worden sind. Sucht man nach Fehlermeldung für den Docker Container kann man die im daemon.log finden

 tail /var/log/daemon.log -n 300 -f

In meinem Fall stand dort

  Jan 20 10:17:16 eagle 2ca6ed4f2561[898]: chown: /opt/mailman/var/templates/lists/digitaler-campus.bessere-schulen-meckenheim.de/en/list:member:generic:footer.txt: Operation not permitted
  Jan 20 10:17:16 eagle 2ca6ed4f2561[898]: chown: /opt/mailman/var/templates/lists/digitaler-campus.bessere-schulen-meckenheim.de/en/list:user:action:unsubscribe.txt: Operation not permitted
  Jan 20 10:17:16 eagle 2ca6ed4f2561[898]: chown: /opt/mailman/var/templates/lists/digitaler-campus.bessere-schulen-meckenheim.de/en/list:user:action:subscribe.txt: Operation not permitted
  Jan 20 10:17:16 eagle 2ca6ed4f2561[898]: chown: /opt/mailman/var/templates/lists/digitaler-campus.bessere-schulen-meckenheim.de/en/t: Operation not permitted

Das Rechteproblem hatte ich auch schon bei der Erstinstallation. Es scheint so zu sein das nach dem Neubau des Containers ein anderen Benutzer verwendet wird der nicht auf die “Core” Daten zugreifen darf.

  4,0K drwxr-xr-x  3 952068 952038 4,0K Dez  1 10:42 core
  4,0K drwx------ 19 952038 952038 4,0K Jan 20 08:02 database

Wenn ich die Rechte für das “Core” Verzeichnis so setze wie die für das database Verzeichnis

 chown 952038:952038 core -R

dann geht es.

22.1.19
Weitere Beiträge zu: Mailman3   Docker  

Troubleshooting in einem PostgreSQL Dockercontainter

Aus Gründen dich ich nicht mehr nachvollziehen kann ist mir eine PostgreSQL Datenbank einer Docker Mailman Installation in die Wicken gegangen. Leider kam ich noch nicht dazu diese in meine Backups aufzunehmen. Es waren aber schon genug Anwender auf dem Server angemeldet das ich ein “meldet auch alle noch mal an” vermeiden wollte. Ich wollte also zu mindestens die Mailinglisten mit Abonnenten bekommen.

Ich hatte bisher noch keinerlei Erfahrungen mit der Datenbank. Hier die Dokumentation meiner Anfängerschritte. Use at your own Risk.

Auf dem Docker Server habe ich ein Backup des korrupten Datenbankverzeichnis erstellen und auf einen Testserver kopiert und ausgepackt.

tar xf database.tar

Gemäß dieser Beschreibung haben ich dann einen Postgress Docker Image erstellt. Zu Beginn lies sich Docker Server nicht starten da das Standard Mailman Dockerfile eine ältere Version verwendet. Das konnte ich aber erst sehen nachdem ich auf den Parameter -d verzichtet habe.

docker network create --driver bridge postgres-network
sudo docker run --name postgres4 --network postgres-network -v /path/toyour/tmp/database:/var/lib/postgresql/data -e POSTGRES_PASSWORD=geheim  postgres:9.6-alpine

Dann konnte ich mit mich von einem zweiten Terminal in das Docker Image bewegen. Der Befehl

sudo docker ps

liefert mir die Container ID und mit

sudo docker exec -it "containerid" bash

kam ich auf die Kommandozeile in den Container. Dort habe ich mit

psql mailmandb mailman

versucht herauszufinden wo meine “wichtigen “ Daten sind. Mit dem Befehl \dt habe ich die Tabellennamen bekommen und dann konnte man wie bei mysql die sql befehle absetzen.

Für mich waren am Ende vor allem zwei Tabellen wichtig. Die Benutzer und die Zuordnungen zu den Mailinlisten . Dann konnte man von der Container Kommandozeile sich die Daten schön in eine Textdatei schreiben die man auch auf dem Host dann lassen konnte.

psql mailmandb mailman -c 'select list_id,address_id,preferences_id from member;' > /var/lib/postgresql/data/list-infos.txt
psql mailmandb mailman -c 'select email, display_name, user_id from address;' > /var/lib/postgresql/data/user-infos.txt
17.11.18
Weitere Beiträge zu: Docker   PostgreSQL   Mailman  

Installation Mailman auf Docker

Dies ist der zweite Beitrag über meinen Weg zu einem eigenen Mailinglisten Server auf Basis eines Docker Container. Meine ersten Erkenntnisse hatte ich hier dokumentiert. Die Installation ist an die Original Dokumentation angelehnt hat aber einige persönliche Erweiterungen.

Um den Webzugriff auf den Administrationsbereich für den Beginn erst einmal abzusichern richte in einem neuen Nginx virtual host eine Konfiguration für den späteren Proxy ein der über eine Kennwort geschützt ist

vi /etc/nginx/conf.d/host.conf>

  location / {
  uwsgi_pass 172.19.199.3:8080;
  		include uwsgi_params;
  		uwsgi_read_timeout 300;
  auth_basic "Restricted";
  auth_basic_user_file /etc/nginx/.htpasswd;
  }
  location /static {
     alias /opt/mailman/web/static;
     auth_basic "Restricted";
     auth_basic_user_file /etc/nginx/.htpasswd;
  }

Das Kennwort für diesen Proxy können wir mit htpasswd erstellen

  htpasswd -c /etc/nginx/.htpasswd <yourlistadmin>

Wenn wir jetzt auf die Seite https:// gehen werden wir zuerst nach dem Kennwort gefragt und dann nach einer Weile bekommen wir einen Timeout da ja noch gar kein Dienst dort arbeitet. Aber der kommt gleich und ist dann schon abgesichert.

Dann geht es los mit der eigentlichen Installation

  cd /opt/
  mkdir -p /opt/mailman/core
  mkdir -p /opt/mailman/web
  git clone https://github.com/maxking/docker-mailman
  cd docker-mailman

Docker-Compose ist ein Werkzeug mit dem man Anwendungen auf verschiedene Docker Container verteilen kann so das sie in einen kleinen Docker Netzwerk “zusammenarbeiten”. In dieser Fall ist es so das die wichtigsten Anwendungseinstellungen für Mailman als Umgebungsvariablen gesetzt werden. Diese sind gemäß Doku einzurichten

Zuerst muss docker-compose installiert werden

 pip install docker-compose
 vi docker-compose.yml
  HYPERKITTY_API_KEY=<ein key den ich aus keepassx genommen haben >
  SECRET_KEY=<noch ein geheimer key>
  SERVE_FROM_DOMAIN=www.yourdomain.de
  MAILMAN_ADMIN_USER=postmaster
  MAILMAN_ADMIN_EMAIL=postmaster@yourdomain.de

Dann geht es los. Docker-Compose hold sich die notwendigen Images und baut die 3 Container mit dem internen Netzwerk.

    docker-compose up -d
    Creating network "docker-mailman_mailman" with driver "bridge"
    Pulling database (postgres:9.6-alpine)...
    9.6-alpine: Pulling from library/postgres
    4fe2ade4980c: Pull complete
    ...
    ...
    e9f65487e6d9: Pull complete
    Digest: sha256:5f243ac0a7f3057757da445ff38031e1cd24d016b91fc3bf5e747e7a15547580
    Status: Downloaded newer image for postgres:9.6-alpine
    Pulling mailman-core (maxking/mailman-core:0.2)...
    0.2: Pulling from maxking/mailman-core
    81033e7c1d6a: Pull complete
    ...
    ...
    fafc78d0f4a7: Pull complete
    Digest: sha256:bc874d6b48aada777fe8da61ecc1532ea3dae29064f190603ba80299527b62bf
    Status: Downloaded newer image for maxking/mailman-core:0.2
    Pulling mailman-web (maxking/mailman-web:0.2)...
    0.2: Pulling from maxking/mailman-web
    911c6d0c7995: Pull complete
    ...
    ...
    1976ee7ab302: Pull complete
    Digest: sha256:c534d7d8bf412ea79988fbf98730f332ba084b5fa19a6510b5d8baef57863469
    Status: Downloaded newer image for maxking/mailman-web:0.2
    Creating docker-mailman_database_1 ... done
    Creating mailman-core              ... done
    Creating mailman-web               ... done

Eigentlich sollte man jetzt mit diesem Befehl auf dem Server “etwas html” bekommen

   curl http://172.19.199.3:8000/postorius/lists/
   curl: (7) Failed to connect to 172.19.199.3 port 8000: Keine Route zum Zielrechner

Mit “docker ps” kann man sehen welche Container laufen. Wie man sieht fehlt hier einer.

   docker ps
   CONTAINER ID        IMAGE                 COMMAND                  CREATED              STATUS              PORTS               NAMES
   67b5ae7fcb64        postgres:9.6-alpine   "docker-entrypoint.s…"   About a minute ago   Up About a minute   5432/tcp            docker-mailman_database_1

Im Logfile habe ich diese Zeile gefunden die auf ein Zugriffsrechteproblem hinweist.

  mkdir: can't create directory '/opt/mailman-web-data/logs/': Permission denied

Warum das so ist habe ich nicht verstanden aber nach einem Wechsel des Owner ging es dann

  ls -ls /opt/mailman/
  insgesamt 12K
  4,0K drwxr-xr-x  2 root   root   4,0K Sep 15 10:33 core
  4,0K drwx------ 19 952038 951968 4,0K Sep 15 10:24 database
  4,0K drwxr-xr-x  2 root   root   4,0K Sep 15 10:33 web

  chown 951968:951968 web -R
  chown 951968:951968 core -R

  docker ps
  CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS              PORTS                NAMES
  e7f531a065d0        maxking/mailman-web:0.2    "docker-entrypoint.s…"   16 minutes ago      Up 7 seconds        8000/tcp, 8080/tcp   mailman-web
  b48b8757512e        maxking/mailman-core:0.2   "docker-entrypoint.s…"   16 minutes ago      Up 8 seconds        8001/tcp, 8024/tcp   mailman-core
  67b5ae7fcb64        postgres:9.6-alpine        "docker-entrypoint.s…"   16 minutes ago      Up 16 minutes       5432/tcp             docker-mailman_database_1

dann liefert auch dieser Befehl html zurück

 curl http://172.19.199.3:8000/postorius/lists/

Ich musste dann noch etwas länger mit dem statischen Alias in der Nginx Konfiguration kämpfen aber das lag an meinen Standardeinstellungen die ich für meine Webserver im allgemeinen einrichte.

Dann bekam ich endlich die richtig formatierte Startseite.

Anbindung Postfix zu Mailman

Die Anbindung des Docker Containers an Postfix geschieht in zwei Richtungen, von “Innen” nach “Außen” und umgekehrt.

Da ich in meinem Fall einen konfigurierten Postfix Server habe der schon Mails für andere Domainen außerhalb von Mailman empfängt bin ich mit der Standardkonfiguration nicht erfolgreich gewesen. Es wurden dann nämlich alle alte Adressen als unbekannt abgewiesen.

Mit folgenden Änderungen war ich dann am Ende erfolgreich

 vi /etc/postfix/main.cf
  mydestination = ........, yourserver.de
  mynetworks ...... 172.19.199.3
  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 = proxy:unix:passwd.byname $alias_maps regexp:/opt/mailman/core/var/data/postfix_lmtp
  relay_domains = regexp:/opt/mailman/core/var/data/postfix_domains $mydestination

  /etc/init.d/postfix reload

Auf die relay_domains kann man vermutlich erst einmal verzichten wenn man nicht dynamisch durch Endbenutzer neue Domainen anlegen möchte.

Anbindung Mailman zu Postfix

Damit das Mailman-Core im Container auch jemanden hat bei dem er Nachrichten abliefern kann konnte ich die Standardeinstellungen der Doku verwenden.

vi /opt/mailman/core/mailman-extra.cfg
   [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

Auch diese Datei braucht den richtigen Owner sonst knallt es später

 chown  952068:952068 /opt/mailman/core/mailman-extra.cfg

Damit die Weboberfläche auch Mails versenden kann sind diese Änderungen notwendig:

vi settings_local.py
    USE_SSL = False
    EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
    EMAIL_HOST = '172.19.199.1'
    EMAIL_PORT = 25
    DEFAULT_FROM_EMAIL = "lists@yourserver.de"
    SERVER_EMAIL = "postmaster@yourserver.de"

Dazu kam noch das Bekanntgeben der neuen Netzwerkadresse und Mail Domaine im Host Postfix

  vi /etc/postfix/main.cf
   mydestination = ........, yourserver.de
   mynetworks ...... 172.19.199.3

/etc/init.d/postfix reload

Dann kann man sich über die Weboberfläche ein Passwordreset des “postmaster” durchführen und nachdem man die Mailadresse bestätigt hat bekommt man die Admin Oberfläche.

Als erstes richten wir eine neue Maildomaine ein:

Und dann unsere erste Maillingliste

und können uns dann direkt bei der Liste anmelden

im Hintergrund hat jetzt Mailman zwei Konfigurationsdateien für den Postfix angepasst

 more /opt/mailman/core/var/data/postfix_domains
     # AUTOMATICALLY GENERATED BY MAILMAN ON 2018-09-16 08:26:45
     #
     # This file is generated by Mailman, and is kept in sync with the binary hash
     # file.  YOU SHOULD NOT MANUALLY EDIT THIS FILE unless you know what you're
     # doing, and can keep the two files properly in sync.  If you screw it up,
     # you're on your own.
     /^yourserver\.de$/ yourserver.de


 more /opt/mailman/core/var/data/postfix_lmtp
    # AUTOMATICALLY GENERATED BY MAILMAN ON 2018-09-16 08:26:45
    # This file is generated by Mailman, and is kept in sync with the binary hash
    # file.  YOU SHOULD NOT MANUALLY EDIT THIS FILE unless you know what you're
    # doing, and can keep the two files properly in sync.  If you screw it up,
    # you're on your own.
    # Aliases which are visible only in the @yourserver.de domain.
    /^firstlist@yourserver\.de$/                  lmtp:[172.19.199.2]:8024
    /^firstlist-bounces(\+.*)?@yourserver\.de$/   lmtp:[172.19.199.2]:8024
    /^firstlist-confirm(\+.*)?@yourserver\.de$/   lmtp:[172.19.199.2]:8024
    /^firstlist-join@yourserver\.de$/             lmtp:[172.19.199.2]:8024
    /^firstlist-leave@yourserver\.de$/            lmtp:[172.19.199.2]:8024
    /^firstlist-owner@yourserver\.de$/            lmtp:[172.19.199.2]:8024
    /^firstlist-request@yourserver\.de$/          lmtp:[172.19.199.2]:8024
    /^firstlist-subscribe@yourserver\.de$/        lmtp:[172.19.199.2]:8024
    /^firstlist-unsubscribe@yourserver\.de$/      lmtp:[172.19.199.2]:8024

Freischaltung in Rspamd

Da ich hier rspamd verwende wurde der Docker Mailversand zu Beginn enorm verzögert. Eine Freischaltung der IP Adresse hat dann geholfen

  vi /etc/rspamd/local.d/ip.map
    172.19.199.2

Danach konnte ich dann schön die ersten Diskussionen starten.

24.9.18
Weitere Beiträge zu: Docker   Mailman  

Mailman 3 auf Docker

Vor einiger Zeit habe ich meinen ersten Dockerserver aufgesetzt. Ziel war es die Möglichkeit zu schaffen weitere Komponenten auf dem Server zu installieren und Konflikte zwischen Softwarevoraussetzungen zu vermeiden.

GNU Mailman war damals schon mein erster Fall den ich vor Augen hatte. Ich möchte diesen Listserver verwenden um Maillinglisten für Schulklassen und Elternpflegschaften zu verwalten.

Die Installation von Mailman per Docker wird von den Entwickler befürwortet und die Dokumentation erweckt den Eindruck das der Autor weiß was er tut.

Da ich generell noch etwas misstrauisch bin wollte ich mir diese Installationsweise vorab etwas genauer ansehen.

Es gib 3 Dockercontainer die über ein eigenes internes Netz verbunden sind. Diese “sprechen” nach außen über die internen Docker IP Adressen und sollten damit nicht von extern ansprechbar sein. Es gibt 3 Schnittstellen nach außen

  • Konfigurationsverzeichnisse in die Container
  • Zwei Ports über die die Kommunikation des Core Service angesprochen werden kann
  • Ein Port über den der Webserver arbeiten kann.

Damit sollte nach meinem Kenntnisstand die Installation erst einmal recht risikoarm sein da an sich der Dockercontainer abgekappselt ist.

Die eigenen Konfigurationen werden in einem Verzeichnis des Host Servers gehalten und in den Docker Container “an die richtige Stelle” gemappt. Die Daten werden in /opt/mailman/databases gehalten

Backup:

Um die Daten und Konfigurationen des Mailman Servers zu sichern sollte es ausreichen man das Verzeichnis /opt/mailman in das Backup mit aufzunehmen. Dort müssten alle Daten und eigenen Konfigurationen enthalten sein.

Installation

Die Installation müsste recht einfach sein. Aber das scheint wahrscheinlich nur so. Mal sehen.

16.9.18
Weitere Beiträge zu: Mailman3   Docker   Debian  

Dies ist ein privater Blog von Hagen Bauer- berufstätiger Vater, Ehemann, Naturliebhaber, Läufer, Zelter, technikverliebt.


Creative Commons License
This blog is licensed under a Creative Commons License