Mailarchiva ist nicht wirklich Opensource, jedoch erlaubt die Lizenz die private Nutzung bis zu einer bestimmten Grenze von Postfächern. Näheres ist der Lizenz Informationen von Mailarchiva zu entnehmen.

Docker Container für Mailarchiva

Wer Mailarchiva in einem Docker-Container laufen lassen möchte, findet nicht viel Informationen im Netz. Ich habe daher die Informationen zusammengetragen und diese an die Anforderungen angepasst.

Eine Docker Installation auf dem Rechner wird vorausgesetzt. Ebenso ein gewisser Umgang mit Images und Containern.

Um ein Docker-Container für Mailarchiva zu erstellen, benötigt ihr zu erst ein Verzeichnis indem ihre das Binary von der Mailarchiva Download Seite herunter ladet. In meinem Beispiel nehme ich ~/mailarchiva-docker.

In diesem File wird die Linux-Version von Mailarchiva abgespeichert (z.B. mailarchiva.v7.6.12.tar.gz). Nun wird ein Installationsfile für Mailarchiva erzeugt:

[expect-install]

#!/usr/bin/expect -f
#
# This Expect script was generated by autoexpect on Tue Sep 23 15:16:26 2014
# Expect and autoexpect were both written by Don Libes, NIST.
#
# Note that autoexpect does not guarantee a working script. It
# necessarily has to guess about certain things. Two reasons a script
# might fail are:
#
# 1) timing - A surprising number of programs (rn, ksh, zsh, telnet,
# etc.) and devices discard or ignore keystrokes that arrive "too
# quickly" after prompts. If you find your new script hanging up at
# one spot, try adding a short sleep just before the previous send.
# Setting "force_conservative" to 1 (see below) makes Expect do this
# automatically - pausing briefly before sending each character. This
# pacifies every program I know of. The -c flag makes the script do
# this in the first place. The -C flag allows you to define a
# character to toggle this mode off and on.

set force_conservative 0 ;# set to 1 to force conservative mode even if
;# script wasn't run conservatively originally
if {$force_conservative} {
set send_slow {1 .1}
proc send {ignore arg} {
sleep .1
exp_send -s -- $arg
}
}

#
# 2) differing output - Some programs produce different output each time
# they run. The "date" command is an obvious example. Another is
# ftp, if it produces throughput statistics at the end of a file
# transfer. If this causes a problem, delete these patterns or replace
# them with wildcards. An alternative is to use the -p flag (for
# "prompt") which makes Expect only look for the last line of output
# (i.e., the prompt). The -P flag allows you to define a character to
# toggle this mode off and on.
#
# Read the man page for more info.
#
# -Don

set timeout -1
spawn $::env(MAILARCHIVA_INSTALL_DIR)/mailarchiva-inst/install
expect -exact "Press \[enter\] to read the license agreement..."
sleep 1
send -- "\r"
#expect -exact "SOFTWARE LICENCE"
#send -- "\r"
#Hit space to scroll through agreement
expect -exact "Do you agree to the terms of the agreement"
send -- "yes\r"
expect -exact "Max heap size \[2048m-11763m\]?:"
sleep 1
send -- "$::env(MAILARCHIVA_HEAP_SIZE)\r"
expect -exact "$::env(MAILARCHIVA_HEAP_SIZE)"
sleep 1
send -- "\r"
expect -exact "# "

 

Die Version ist abgestimmt auf die Version 7.3.5 von Mailarchiva. Sollte sich der Lizenzvertrag in Zukunft ändern oder ihr möchtet der Instanz mehr RAM zuweisen, so ist das File entsprechend anzupassen.

Der nächste Schritt ist die Erzeugung des Dockerfiles:

[Dockerfile]


FROM debian

MAINTAINER <Euer Name>

LABEL version="1.0"
LABEL description="Mailarchiva v7.6.12"

# Version: 7.6.12
ENV MAILARCHIVA_TAR mailarchiva.v7.6.12.tar.gz
ENV MAILARCHIVA_INSTALL_DIR /opt
ENV MAILARCHIVA_HEAP_SIZE 2048m

RUN apt-get update
RUN apt-get install -y apt-utils expect wget iproute2 expect haveged
RUN update-rc.d haveged defaults

# Get the mailarchiva package and extract it
WORKDIR $MAILARCHIVA_INSTALL_DIR
COPY $MAILARCHIVA_TAR $MAILARCHIVA_INSTALL_DIR
RUN cd $MAILARCHIVA_INSTALL_DIR && tar xvfz $MAILARCHIVA_TAR
RUN rm $MAILARCHIVA_TAR
RUN mv $MAILARCHIVA_INSTALL_DIR/mailarchiva_* $MAILARCHIVA_INSTALL_DIR/mailarchiva-inst
# Install mailarchiva - use expect to automate the interactive install
ADD expect-install $MAILARCHIVA_INSTALL_DIR/mailarchiva-inst/expect-install
RUN cd $MAILARCHIVA_INSTALL_DIR/mailarchiva-inst && chmod 777 install
RUN cd $MAILARCHIVA_INSTALL_DIR/mailarchiva-inst && expect expect-install

# web
EXPOSE 8090
#smtp
EXPOSE 8091
#milter
EXPOSE 8092
#AJP
EXPOSE 8011

# cleanup
RUN apt-get remove -yf expect wget && apt-get autoremove -y
RUN apt-get autoclean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
RUN rm -rf /usr/share/locale/* /usr/share/man/* /usr/share/doc/* $MAILARCHIVA_INSTALL_DIR/mailarchiva-inst

ENTRYPOINT service mailarchiva start && /bin/bash

Dieses File erzeugt dann das Mailarchiva Images auf Basis von Debian. Es kopiert die Mailarchiva Datei ins Images und führt die Installation durch.

Das Images kann nun mit "docker build -t mailarchiva ." erstellt werden.

Nun sollte mit "docker images" ein neues mailarchiva:latest Images erzeugt sein.

Als Abschluss kann man nun mit folgende Befehl eine Instanz erzeugen:


docker run -t -d -p <Rechner IP>:8090:8090 \
-v /etc/opt/mailarchiva/ROOT:/etc/opt/mailarchiva/ROOT \
-v /var/log/mailarchiva/ROOT:/var/log/mailarchiva/ROOT \
-v /var/opt/mailarchiva/ROOT:/var/opt/mailarchiva/ROOT \
-v /var/opt/vol:/var/opt/vol \
-v /var/opt/volbackup:/var/opt/volbackup \
--name mailarchiva mailarchiva:latest

Die lokalen Verzeichnisse sind notwendig, damit bei einem erneuten Erzeugen des Images eure Mails im Archiv nicht weg sind und ihr das Archiv separat backupen könnt. Wer außer der Weboberfläche noch weitere Ports benötigt muss die Ports in der Erzeugung des Containers zusätzlich durchleiten.

Upgrade auf Version 8.11.XX

Wer eine frühere Version als 8.11.32 hatte, der muss nun ein paar Änderungen vornehmen. Zuerst läuft es ähnlich wie zuvor schon. Download der Version von Mailarchiva. In meinem Fall 8.11.59. Wichtig das Tar-File umbenennen zu mailarchiva.v8.11.59.tar.gz.

Die neue Antwort-Datei [expect-install]

-----------------------------------------

#!/usr/bin/expect -f
#
# This Expect script was generated by autoexpect on Tue Sep 23 15:16:26 2014
# Expect and autoexpect were both written by Don Libes, NIST.
#
# Note that autoexpect does not guarantee a working script.  It
# necessarily has to guess about certain things.  Two reasons a script
# might fail are:
#
# 1) timing - A surprising number of programs (rn, ksh, zsh, telnet,
# etc.) and devices discard or ignore keystrokes that arrive "too
# quickly" after prompts.  If you find your new script hanging up at
# one spot, try adding a short sleep just before the previous send.
# Setting "force_conservative" to 1 (see below) makes Expect do this
# automatically - pausing briefly before sending each character.  This
# pacifies every program I know of.  The -c flag makes the script do
# this in the first place.  The -C flag allows you to define a
# character to toggle this mode off and on.

set force_conservative 0  ;# set to 1 to force conservative mode even if
       ;# script wasn't run conservatively originally
if {$force_conservative} {
 set send_slow {1 .1}
 proc send {ignore arg} {
   sleep .1
   exp_send -s -- $arg
 }
}

#
# 2) differing output - Some programs produce different output each time
# they run.  The "date" command is an obvious example.  Another is
# ftp, if it produces throughput statistics at the end of a file
# transfer.  If this causes a problem, delete these patterns or replace
# them with wildcards.  An alternative is to use the -p flag (for
# "prompt") which makes Expect only look for the last line of output
# (i.e., the prompt).  The -P flag allows you to define a character to
# toggle this mode off and on.
#
# Read the man page for more info.
#
# -Don

set timeout -1
spawn $::env(MAILARCHIVA_INSTALL_DIR)/mailarchiva-inst/install
expect -exact "Press \[enter\] to read the license agreement..."
sleep 1
send -- "\r"
#expect -exact "SOFTWARE LICENCE"
#send -- "\r"
#Hit space to scroll through agreement
expect -exact "Do you agree to the terms of the agreement"
send -- "yes\r"
expect -exact "Max heap size \[2048m-11720m\]?:"
sleep 1
send --  "$::env(MAILARCHIVA_HEAP_SIZE)\r"
expect -exact "$::env(MAILARCHIVA_HEAP_SIZE)"
sleep 1
send -- "\r"
expect -exact "# "

-----------------------------------------

Falls das spätere Build bei der Speicherwahl hängen bleibt, müsst ihr den Wert bei "heap size" auf den angezeigten Maximalwert ändern.

Nun noch das Dockerfile [Dockerfile]

-----------------------------------------

FROM debian

MAINTAINER Tjard Strobl

LABEL version="1.0"
LABEL description="Mailarchiva v8.11.59"

# Version: 7.11.2
ENV MAILARCHIVA_TAR mailarchiva.v8.11.59.tar.gz
ENV MAILARCHIVA_INSTALL_DIR /opt
ENV MAILARCHIVA_HEAP_SIZE 2048m

RUN apt-get update
RUN apt-get install -y apt-utils expect wget iproute2 expect haveged less procps apt-utils locales vim curl
RUN update-rc.d haveged defaults

# Get the mailarchiva package and extract it
WORKDIR $MAILARCHIVA_INSTALL_DIR
COPY $MAILARCHIVA_TAR $MAILARCHIVA_INSTALL_DIR
RUN cd $MAILARCHIVA_INSTALL_DIR && tar xvfz $MAILARCHIVA_TAR
RUN rm $MAILARCHIVA_TAR
RUN mv $MAILARCHIVA_INSTALL_DIR/mailarchiva_* $MAILARCHIVA_INSTALL_DIR/mailarchiva-inst
# Install mailarchiva - use expect to automate the interactive install
ADD expect-install $MAILARCHIVA_INSTALL_DIR/mailarchiva-inst/expect-install
RUN cd $MAILARCHIVA_INSTALL_DIR/mailarchiva-inst && chmod 777 install
RUN cd $MAILARCHIVA_INSTALL_DIR/mailarchiva-inst && expect expect-install

# web
EXPOSE 8090
#smtp
EXPOSE 8091
#milter
EXPOSE 8092
#AJP
EXPOSE 8011

# cleanup
RUN apt-get remove -yf expect wget && apt-get autoremove -y  
RUN apt-get autoclean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
RUN rm -rf $MAILARCHIVA_INSTALL_DIR/mailarchiva-inst

ENTRYPOINT /bin/sh /opt/mailarchiva/server/startserver && /bin/bash

-----------------------------------------

Nun könnt ihr das Image erzeugen:

docker build --no-cache -t mailarchiva .

Am Ende sollte es ein Image Mailarchiva geben. Ihr könnt nun den Container erstellen und starten.

docker run -t -d -p <Rechner IP>:8090:8090 \
-v /etc/opt/mailarchiva/ROOT:/etc/opt/mailarchiva/ROOT \
-v /var/log/mailarchiva/ROOT:/var/log/mailarchiva/ROOT \
-v /var/opt/mailarchiva/ROOT:/var/opt/mailarchiva/ROOT \
-v /var/opt/vol:/var/opt/vol \
-v /var/opt/volbackup:/var/opt/volbackup \
--name mailarchiva mailarchiva:latest

Upgrade Issues

Leider wollte der Start nicht so richtig funktionieren. Es musste noch einige Datenbanken umbenannt werden. Dazu habe ich mir eine Bash-Shell im Container erstellt und die Arbeiten im Container erledigt:

docker exec -i -t <container ID> /bin/bash

/bin/sh /opt/mailarchiva/server/stopserver

rm -rf /var/opt/mailarchiva/ROOT/database/archiva

cd /var/opt/mailarchiva/ROOT/queue/

mv receive restore_receive

mv index restore_index 

evtl. müsst ich noch folgendes löschen:

rm /var/opt/mailarchiva/ROOT/logs/audit/index

Dann Mailarchiva wieder starten:

/bin/sh /opt/mailarchiva/server/startserver