Linuxmuster-mail für LMN 6.2

Hallo,

aus Gründen habe ich Mailadressen für die SchülerInnen gebraucht und das im Hinblick auf die Version 7 auf einen eigenen Mailserver ausgelagert, und zwar mit dem später dafür vorgesehenen Paket linuxmuster-mail aus der LMN 7. Damit das mit dem OpenLDAP der Version 6.2 funktioniert, muss man allerdings ein paar Sachen anders machen/anpassen.

Wer das auch mal ausprobieren will, vielleicht auch als „produktive Vorübung für die Migration“ kann das dort anschauen und ausprobieren (ich habe ein Paket für die 6.2 gebaut):

…und in diesem Thread Fragen stellen.

Die Installation ist nicht schwer, da ich jedoch nicht soviel über den verwendeten Linuxmuster-Server weiss wie Thomas in seinem Paket gibt es potentiell mehr Möglichkeiten.

Absichtlich abgewichen vom ursprünglichen Paket bin ich beim SSL Zertifikat, das hole ich auf den Docker Server mit letsencrypt (dehydrated) und schiebe es wie bei Tvial empfohlen und dokumentiert in den Container rein.

So könnte man z.B, sehr einfach auch doch ein Roundcube auf dem Docker Host mit dem Mailserver-Container laufen lassen, wenn man keine Nextcloud mit Mailclient hat oder will.

VG Frank

2 „Gefällt mir“

Hi Frank,

könntest du noch in der ersten Beschreibung dazuschreiben, was man dann machen kann.

  • erreichbarer SMTP-Server im Internet (oder nicht?)
  • per imap erreichbare E-mail (intern oder auch extern?)
  • wie gehen die emails raus? über belwue-smtp? was macht man sonst?

Vllt. steht das noch weiter unten, aber das hab ich nicht ganz bis unten geschafft…

Vg, tobias

Der kann alles, was GitHub - docker-mailserver/docker-mailserver: Production-ready fullstack but simple mail server (SMTP, IMAP, LDAP, Antispam, Antivirus, etc.) running inside a container. kann. In der erzeugten Konfiguration ist es ein „echter“ Mailserver der POP3s, IMAPs, SMTP und SMTP Submission macht. Als Nutzer und Mailadressenbasis verwendet er das email Feld des OpenLDAP aus der LMN6.2

Genau wie es für die LMN7 vorgesehen ist? Aber irgendwie habe ich da die Übersicht völlig verloren, was da so der Stand der Dinge ist, also dünne ich mal meinen Server aus :wink:

VG

Frank

Hej,
habe Franks Docker-KISS-Host aufgesetzt und den linuxmuster-mail-docker in Betrieb genommen

LDAP etc. funktioniert. Aber es gibt noch ein Problem mit den Zertifikaten, bei dem ich einfach nicht weiterkomme…

Ich habe die (von dehydrated auf dem Host erstellten) Zertifikate nach /srv/docker/linuxmuster-mail/ssl/live/csg-tuebingen.de/ kopiert.

Die kommen im Container auch an:

root@susmail:/srv/docker/linuxmuster-mail# ./exec.sh /bin/bash
root@schulmail:/# ls /etc/letsencrypt/live/schulmail.csg-tuebingen.de/
cert-1556811816.csr  cert.csr  chain-1556811816.pem  fullchain-1556811816.pem  privkey-1556811816.pem
cert-1556811816.pem  cert.pem  chain.pem         fullchain.pem           privkey.pem

Dennoch spuckt dovecot immer nur ein Standard-Zertifkat aus:

me@home:~$ openssl s_client -connect schulmail.csg-tuebingen.de:143 -starttls imap

Im Thunderbird sieht das dann so aus:

Nicht gut… So kann das nicht klappen. Aber: Keine Ahnung, warum das nicht geht!

Sieht jemand, wo mein Fehler liegt oder hat mir zumindest eine Idee, wie ich den Fehler finden kann?

Bitte um Hilfe
Grüße
Michael

Hej,
hat wirklich keiner eine Idee? Ich hänge fest und würde mich schon über einen minimalen Lösungsansatz freuen…
Grüße
Michael

Hi Michael,

hast du in der docker-compose.yml auch die SSL-Variablen gesetzt?

      - SSL_TYPE=manual
      - SSL_CERT_PATH=/etc/letsencrypt/live/.../fullchain.pem
      - SSL_KEY_PATH=/etc/letsencrypt/live/.../privkey.pem

VG, Thomas

Hej Thomas,
Volltreffer! Da war nur SSL_TYPE gesetzt - und zwar auf SSL_Type= letsencrypt.
Vielen Dank für den Hinweis!

Versenden geht nun, beim Empfangen gibt es noch einen Relay-access-denied-Fehler. Die Fehlersuche muss ich hier noch ein bisschen verschieben. Notenkonferenzen, uuh.

Danke nochmal und Grüße
Michael

Hej,
falls das jemand außer mir verwendet. Mit Thomas Anleitung ist nun auch das Relay-Access-Denied-Problem gelöst.

Wir haben noch ein paar Variablen in der docker-compose-Datei angepasst:

    - LDAP_QUERY_FILTER_USER=(&(objectClass=posixAccount)(mail=%s))
    - LDAP_QUERY_FILTER_GROUP=(&(objectClass=posixGroup)(mail=%s))
    - LDAP_QUERY_FILTER_ALIAS=(&(objectClass=posixAccount)(otherMailbox=%s))
    - LDAP_QUERY_FILTER_DOMAIN=(mail=*@%s)
    - DOVECOT_PASS_FILTER=(&(objectclass=posixAccount)(mail=%u))
    - DOVECOT_USER_FILTER=(&(objectclass=posixAccount)(mail=%u))
    - SASLAUTHD_LDAP_FILTER="(&(uid=%u)(objectclass=posixAccount))"

Dafür haben wir die volumes, in denen die postfix-confs stehen, gelöscht:

    - ./config/postfix/ldap-users.cf:/etc/postfix/ldap-users.cf:ro
    - ./config/postfix/ldap-groups.cf:/etc/postfix/ldap-groups.cf:ro
    - ./config/postfix/ldap-aliases.cf:/etc/postfix/ldap-aliases.cf:ro
    - ./config/postfix/ldap-domains.cf:/etc/postfix/ldap-domains.cf:ro

Jetzt tuuuuuut’s! Sehr hübsch.

Danke nochmal, Thomas
Grüße
Michael

Hi.
Ich habe mich auch gerade mal den docker-Container linuxmuster-mail angesehen – allerdings für v7. (Wenn das eher in einen neuen Thread gehört, müsste es hier abgeschnitten werden …?!)

Mir ist die Vorgehensweise nicht ganz klar. Ich habe bisher auf dem docker-host der v7 lediglich das hier gemacht
cd /srv/docker/ --> git clone https://github.com/linuxmuster/linuxmuster-mail.git

Im Verzeichnis /srv/docker/linuxmuster-mail/share/templates/docker sind dann zwar alle möglichen .conf-Dateien aber ich nehme nicht an, dass die manuell editiert werden müssen sondern von linuxmuster-mail.py ge-/ersetzt werden sollen?!?

Eine Datei wie Frank sie für seinen 6.2 Container beschreibt (mailserver.ini-example) finde ich dort aber nicht. Vermutlich kann man die ini aus dem v6.2-Beispiel nicht verwenden??

Wer kann nochmal kurz sagen, wie man für v7 starten muss? Oder ist der Container noch gar nicht startklar?

Schöne Grüße,
Michael

Hallo Michael,

das ist der Ort für die Entwicklung. Als Nutzer installierst Du einfach aus den Paketquellen das Paket linuxmuster-mail.

Beste Grüße

Jörg

Oh – so einfach :slight_smile: :slight_smile: :+1:

… nun gut … installierbar ist das Paket – aber es läuft nicht. Laut Doku soll es so sein:

Legt unterhalb von /srv/docker/linuxmuster-mail die Docker-Steuerdatei docker-compose.yml und diverse Bashskripte an.

Die bash-Scripte (start|stop|exec) sind da, aber von docker-compose.yml fehlt jede Spur … alles andere unter config ist ebenfalls leer.

 Commandline: apt install linuxmuster-mail
 Install: linuxmuster-mail:amd64 (0.4.1-0ubuntu0)

Hi
Kann man es evtl so machen, dass man die yml selbst herunterlädt und linuxmuster-mail.py dann manuell anstößt? Hat den Container jemand von euch am Start??

Schöne Grüße
Michael

Es kam eine Antwort auf github:
„Das ist eigentlich als Helperskript für die Ersteinrichtung mit linuxmuster-setup auf dem Server gedacht. Will man das nachträglich machen, muss man die Datei /var/lib/linuxmuster/setup.ini vom Server auf die Dockermaschine kopieren. Dann kann man es als root mit
linuxmuster-mail.py -c setup.ini
einrichten.“

Dazu gleich noch eine Frage: in der genannten setup.ini steht u.a. das adminPW im Klartext. Soll das so? Die Datei ist zwar mit den Rechten 600 „gesichert“ aber das ist natürlich trotzdem nicht die feine Art, oder?

Die zweite Frage ist, wie das Zusammenspiel des mail-docker-Containers mit Nextcloud-Rainloop funktioniert. Ist das so gedacht, wie ich mir das vorstelle: Jeder Schüler kann seine eMail-Adresse aus dem AD damit nutzen und es sind auch (weiterhin) eMail-Verteiler an Klassen & Gruppen möglich?

Schönen Gruß,
Michael


Update:
Und direkt noch eine Antwort: Wenn man das so macht wie beschrieben, bricht das Script ab mit „Script finished with error!“
Nach etwas debugging wurde heute klar, woran das liegt:
In deinem Python-Script wird die Variable binduserpw abgefragt und soll mit dem entsprechenden Eintrag aus der setup.ini ersetzt werden. Diese Variable kommt aber in der setup.ini gar nicht vor – daher der Abbruch. Das ist also ein kleiner Bug. Man kann den Eintrag in der setup.ini selbst ergänzen und anschließend läuft das Script auch durch. Danach hat man also einen laufenden Docker-container, der auf den Ports
0.0.0.0:25->25/tcp, 110/tcp, 0.0.0.0:143->143/tcp, 0.0.0.0:587->587/tcp, 465/tcp, 995/tcp, 0.0.0.0:993->993/tcp,
lauscht.
Aber: Wie geht’s nun weiter?
Wie sorge ich jetzt dafür, dass jeder Schüler sein Postfach dort erhält (am besten gleich mit quota). Gibt’s da weitere Anleitungen?
Danke …
Michael

Gibt es schon jemanden der den linuxmuster-mail Server installiert hat in der v7?

Wo muss der installiert werden?
Kann ich diesen auf dem Dockerhost laufen lassen?

Gibt es irgendwo eine Anleitung wie ich den konfiguriere für v7

Gruß Pascal

Ja, aber das ist hier der falsche Thread … hier geht’s weiter:

Ich bin aber noch nicht soweit, dass ich sagen könnte, dass es funktioniert. Der container startet aber bereits und nimmt auch eMails an … weiter bin ich noch nicht.

Hallo!
Meine Schule nutzt das LML 6.2 eigene Mailsystem sehr intensiv. Um die Migration zu LML7 vorzubereiten, wollen wir die Emailfunktionalität an das hier beschriebene Dockersystem übertragen. Dazu ein paar Fragen:

Wie habt ihr die Aliase übertragen?

Sie nehmen bei uns Zuordnungen der Funktionen zu den Personen vor (etwa FLDeutsch@schule -> Meyer@schule) Meine Idee ist /etc/aliases stur auf den Dockerhost zu rsyncen und dort die aliases in den Container zu mounten.

Wie habt ihr die Quotas vom LML 6.2 übernommen? Hier habe ich gerade gar keinen Ansatz.

Wie werden die Emailkonten (genauer das Dovecotverzeichnis) alter SchülerInnen und KollegInnen aus dem Dockercontainer gelöscht? Hier habe ich auch keinen guten Ansatz. Soweit ich weiß, bietet Sophomorix leider keine Hooks mit denen man das beim Killen eines Users mit erledigen könnte.

Ok, Aliase waren ein Ritt. /etc/aliases funktioniert nicht.
Stattdessen wird ein über die /srv/docker/linuxmuster-mail/config/postfix/ldap-aliases.cf
hiernach gesucht:

query_filter = (mail=%s)

und das zurückgegeben:

result_attribute = mail

Da kann kein Alias a la admin → frithjof bei rauskommen. Dies sieht wie eine (sinnfreie) Zuordnung aus: Suche nach mail=name@domain.de und bekomme name@domain.de zurück.

Da uns die Aliase sehr wichtig sind, habe ich das so gelöst.
Die Datei /srv/docker/linuxmuster-mail/config/postfix-main.cf wird - wenn sie vorhanden ist - automatisch beim Start des Dockercontainers „benutzt“. Sie enthält bei mir nur eine Zeile:

root@mail:/srv/docker/linuxmuster-mail/config# cat postfix-main.cf
virtual_alias_maps = texthash:/etc/postfix/virtual, ldap:/etc/postfix/ldap-aliases.cf, ldap:/etc/postfix/ldap-groups.cf

Damit wird die Datei /etc/postfix/virtual als Datei für virtual_aliase benutzt. Die Datei heißt außerhalb des Containers /srv/docker/linuxmuster-mail/config/postfix-virtual.cf und hat dies Format:

alias@domain.de ziel1@domain.de, ziel2@domain.de

Wenn die Datei geändert wurde, muss Postfix die Datei neu einlesen. Ich weiß aber nicht, wie man das im Dockercontainer machen könnte. Das Docker-Startup-Script (wie immer es heißt), macht das jedoch nur einmal beim starten des Containers. Daher mache ich das so:

root@mail:/srv/docker/linuxmuster-mail# ./stop.sh && ./start.sh

Ich habe die Aliase aus meiner alten /etc/aliases per Hand übertragen.

Des Spaßes halber habe ich mir die Struktur eines Gruppeneintrags im LDAP unter 6.2 angesehen:

dn: cn=teachers,ou=groups,dc=lokal,dc=carl-bosch-oberschule,dc=de
structuralObjectClass: posixGroup
entryUUID: 4022d052-24a5-1038-8ac2-ffb4d94b904d
creatorsName: cn=admin,dc=lokal,dc=carl-bosch-oberschule,dc=de
createTimestamp: 20180725222433Z
gidNumber: 10000
sambaSID: S-1-5-21-1074942382-4079026230-725720162-21001
cn: teachers
sambaGroupType: 2
memberUid: Username1
memberUid: UserName2
memberUid: …
objectClass: posixGroup
objectClass: top
objectClass: sambaGroupMapping
displayName: teachers
entryCSN: 20200903122706.613666Z#000000#000#000000
modifiersName: cn=admin,dc=lokal,dc=carl-bosch-oberschule,dc=de
modifyTimestamp: 20200903122706Z

dort steht kein mail-Attribut drinne. Ich lese in der ldap-groups.cf, das postfix das aber auslesen will:

query_filter = (mail=%s)
#query_filter = (uid=%s)
result_attribute = mail

Das scheint mir noch ein schönes Stück Arbeit zu sein.