Tutorial: Mailcow-Mailserver automatisch aktualisieren

Alexander Nolte
Alexander Nolte 3 Minuten Lesezeit

Ein Mailserver ist eine der kritischsten Komponenten in deiner gesamten Infrastruktur. Mailcow (dockerized) bringt glücklicherweise ein eigenes, mächtiges Update-Skript (update.sh) mit. Dieses Skript zieht die neuesten Änderungen aus dem offiziellen Git-Repository, lädt aktualisierte Docker-Images herunter und startet die Mailserver-Komponenten (Postfix, Dovecot, Rspamd etc.) neu.

Da das Skript im Standardmodus interaktive Fragen stellt (z. B. ob ein Backup gemacht wurde oder ob alte Images gelöscht werden sollen), automatisieren wir diesen Prozess in diesem Tutorial vollständig mit Ansible für den unbeaufsichtigten Betrieb.

Teil 1: Die Logik des Mailcow-Updates

Damit das Update vollautomatisch über die Ansible-Zentrale laufen kann, nutzt das Playbook clevere Kniffe:

  1. Verzeichnisprüfung: Ansible schaut zuerst nach, ob der Pfad /opt/mailcow-dockerized existiert, um Fehler auf Servern ohne Mailcow zu vermeiden.

  2. Die "Piping"-Methode (yes y | ...): Das Mailcow-Skript fordert während des Updates Bestätigungen vom Benutzer. Indem wir den Linux-Befehl yes y vorschalten und die Ausgabe per Pipe (|) an das Skript übergeben, beantwortet das System jede Sicherheitsabfrage automatisch im Hintergrund mit "Yes".

  3. Intelligente Status-Erkennung (changed_when): Das Skript gibt Text auf der Konsole aus. Ansible liest diesen Text und erkennt anhand des Satzes 'No updates available', ob tatsächlich etwas installiert wurde oder ob der Server bereits aktuell war.

  4. Aufräumen nach dem Update: Nach erfolgreichen Updates bleiben oft hunderte Megabyte an alten Docker-Images zurück. Diese lassen wir das Skript direkt im Anschluss wegräumen.

Teil 2: Das automatisierte Ansible-Playbook

Erstelle in deinem Projektordner ~/ansible-inframanagement/ eine neue Datei namens update-mailcow.yaml:

nano update-mailcow.yaml

Füge dort das folgende vollständige Playbook ein:

---
- name: Mailcow auf dem Mailserver aktualisieren
  hosts: mailserver
  become: true                        # Erfordert Root-Rechte für Docker/Git
  gather_facts: false

  vars:
    mailcow_path: "/opt/mailcow-dockerized"

  tasks:
    - name: 🔍 Prüfen, ob das Mailcow-Verzeichnis existiert
      ansible.builtin.stat:
        path: "{{ mailcow_path }}"
      register: mailcow_dir

    - name: 🔄 Mailcow-Update durchführen (Erzwungen non-interactive)
      ansible.builtin.shell:
        cmd: "yes y | ./update.sh --non-interactive"
        chdir: "{{ mailcow_path }}"
      register: mailcow_update_output
      # Erkennt anhand der Mailcow-Ausgabe, ob tatsächlich ein Update eingespielt wurde
      changed_when: "'No updates available' not in mailcow_update_output.stdout"
      when: mailcow_dir.stat.exists

    - name: 🧹 Alte, ungenutzte Mailcow Docker-Images aufräumen
      ansible.builtin.shell:
        cmd: "yes y | ./update.sh --purge-images"
        chdir: "{{ mailcow_path }}"
      when: 
        - mailcow_dir.stat.exists
        - "'No updates available' not in mailcow_update_output.stdout"

    - name: 📊 Update-Status auf der Konsole ausgeben
      ansible.builtin.debug:
        msg: >-
          {% if 'No updates available' in mailcow_update_output.stdout %}
          🎉 Mailcow ist bereits auf dem neuesten Stand!
          {% else %}
          🚀 Mailcow wurde erfolgreich aktualisiert und die Container neu gestartet!
          {% endif %}
      when: mailcow_dir.stat.exists and mailcow_update_output.stdout is defined

Teil 3: Ausführung und Kontrolle

Führe das Playbook von deiner Ansible-Zentrale aus

ansible-playbook -i hosts update-mailcow.yaml

Was passiert bei der Ausführung?

  • War kein Update verfügbar, läuft das Playbook in wenigen Sekunden durch und gibt dir die grüne Meldung 🎉 Mailcow ist bereits auf dem neuesten Stand! aus.

  • Gibt es ein Update, lädt das Skript die neuen Container-Schichten herunter. Der Mailserver startet die betroffenen Dienste neu (kurze Downtime von wenigen Sekunden) und bereinigt danach mit dem --purge-images-Task die Festplatte.

Teil 4: Die monatliche oder wöchentliche Automatisierung

Da Mailcow-Updates sehr stabil laufen, aber sensible Kernkomponenten betreffen, empfiehlt sich ein wöchentlicher oder zweiwöchentlicher Rhythmus in den frühen Morgenstunden.

  1. Öffne die Crontab auf der Zentrale: crontab -e

  2. Füge die folgende Zeile hinzu (Beispiel: Jeden Sonntag um 04:00 Uhr nachts):

0 4 * * 7 cd /root/ansible-inframanagement && /usr/bin/ansible-playbook update-mailcow.yaml > /var/log/ansible-mailcow-update.log 2>&1

Log-Kontrolle

Ob das Update erfolgreich war oder ob das Skript mangels neuer Versionen direkt übersprungen wurde, zeigt dir ein Blick in das Logfile:

cat /var/log/ansible-mailcow-update.log

Damit hast du das letzte große Puzzleteil deiner Serverwartung erfolgreich auf Autopilot gestellt! Dein Mailserver bleibt sicher, performant und absolut up-to-date.