Mattermost Update Script

Kategorie:

Für die Kommunikation mit meiner Familie betreibe ich bei uberspace ein kleines Mattermost in der Team-Edition. Dafür stehen regelmäßig Updates an. Aber wie diese Updates machen?

Die Upgrade-Schritte in der Dokumentation sind zwar recht übersichtlich, wenn man sie mal durchstiegen hat. Da die regulären Server-Releases aber nur eine recht kurze Lebensdauer haben, macht man doch recht häufig Updates. Die Schritte dann immer wieder neu zu kopieren und anzupassen ist nach ein paar mal doch recht nervig und vor allem auch fehleranfällig.

Und als Entwickler ist schnell klar: Da muss ein Script her. Also los!

Das Upgrade-Script

Hier einmal das komplette Script, das ich im Einsatz habe. Darunter kommt dann die Erklärung zu den einzelnen Schritten mit Hinweisen, was du beachten musst, wenn du das Script für dich anpassen möchtest.

#!/usr/bin/env bash
# ------------------------------------------------------------
# Mattermost Upgrade Script
# based on https://docs.mattermost.com/administration-guide/upgrade/upgrading-mattermost-server.html#id2
# ------------------------------------------------------------
# Usage:   ./upgrade-mattermost.sh <VERSION>
# Example: ./upgrade-mattermost.sh 11.6.1
# ------------------------------------------------------------

# kurz: set -euo pipefail
set --errexit ----nounset -o pipefail

log() {
  printf '[%s] %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$*"
}

# ---------- Parameter check ----------
if [[ $# -ne 1 ]]; then
  log "❌  Version number required."
  log "Usage:   $0 <VERSION>"
  log "Example: $0 11.6.1"
  exit 1
fi

VERSION=$1
TMP_DIR="${PWD}/tmp"
MATTERMOST_ROOT="${PWD}/mattermost"

log "🚀  Starting upgrade to Mattermost v${VERSION}"

# ---------- 1. Current version ----------
log "🔎 Current Mattermost version"
"${MATTERMOST_ROOT}/bin/mattermost" version

# ---------- 2. Download & extract new release ----------
log "⬇️ Downloading Mattermost v${VERSION}"
cd "${TMP_DIR}"
curl --location --output "mattermost-team-${VERSION}-linux-amd64.tar.gz" \
  "https://releases.mattermost.com/${VERSION}/mattermost-team-${VERSION}-linux-amd64.tar.gz"

log "📦 Extracting archive"
tar --extract \
    --file "mattermost-team-${VERSION}-linux-amd64.tar.gz" \
    --transform='s,^[^/]\+,\0-upgrade,'

cd "${PWD}"   # back to the original working directory

# ---------- 3. Stop service ----------
log "⏹️ Stopping Mattermost service"
supervisorctl stop mattermost

# ---------- 4. Backup ----------
log "💾 Running backup script"
./mattermost-backup.sh

# ---------- 5. Replace old files (keep config, logs, plugins, data) ----------
log "🔄 Updating Mattermost files"

find "$MATTERMOST_ROOT"/ "$MATTERMOST_ROOT"/client/ \
    -mindepth 1 -maxdepth 1 \
     \! \( -type d \
          \( -path "$MATTERMOST_ROOT"/client \
             -o -path "$MATTERMOST_ROOT"/client/plugins \
             -o -path "$MATTERMOST_ROOT"/config \
             -o -path "$MATTERMOST_ROOT"/logs \
             -o -path "$MATTERMOST_ROOT"/plugins \
             -o -path "$MATTERMOST_ROOT"/data \
          \) \
        -prune \
    \) \
    | sort | xargs rm -r

cp -an "${TMP_DIR}/mattermost-upgrade/." "$MATTERMOST_ROOT/"

# ---------- 6. Restart service ----------
log "▶️ Starting Mattermost"
supervisorctl start mattermost

# ---------- 7. Cleanup ----------
log "⚠️ Upgrade completed."
read -rp "Press ENTER to delete temporary files and exit … "

log "🧹 Removing temporary files"
rm -rf "${TMP_DIR}/mattermost-upgrade"
rm -f "${TMP_DIR}/mattermost-team-${VERSION}-linux-amd64.tar.gz"

log "✅ Upgrade to v${VERSION} finished successfully"

Schritt für Schritt

  1. Vorgeplänkel

    Zunächst kommen ein paar vorbereitende Maßnahmen. Ich setze die Bash-Optionen -e/--errexit, -u/--nounset und pipefail, um im Fehlerfall auch wirklich abzubrechen und das Script nicht versehentlich weiter laufen zu lassen. Danach folgt eine kleine Input-Validierung. Die könnte man mit einem regulären Ausdruck noch besser machen, aber mir reicht das so.

    Und dann bereite ich noch die Variablen für die Verzeichnisse vor. Wenn du das Script selbst nutzen möchtest, musst du hier die Pfade entsprechend deiner Umgebung anpassen.

  2. Aktuelle Version ausgeben

    Damit ich nochmal kurz sichergehen kann, das alles passt, gebe ich mit der mattermost-CLI die aktuell installierte Version aus.

  3. Neue Version herunterladen

    Als erstes Lade ich die neue Version runter. Ich nutze dabei wie gesagt die Team Edition von Mattermost, nicht die Enterprise Edition. Wenn du eine andere Edition nutzen möchtest, musst du das Link-Pattern entsprechend anpassen. Am einfachsten findest du die aktuellen Links im Versions-Archiv.

    Nachdem die gepackte und komprimierte TAR-Datei heruntergeladen ist, wird der Inhalt noch entpackt, damit wir die Dateien später leicht kopieren können.

  4. Service stoppen

    Web-Services, die dauerhaft laufen sollen und eine Webanwendung bereitstellen, werden bei Uberspace mit supervisord verwaltet. Damit während des Updates keine Änderungen durch z.B. Nachrichten vorgenommen werden, schalten wir daher erstmal den Service aus, bevor’s richtig losgeht.

    Wenn du Mattermost bei einem anderen Hoster oder auf einer anderen Plattform betreibst, wirst du hier (und beim Neustart später) Anpassungen vornehmen müssen.

  5. Backup machen

    Vor einem Upgrade natürlich immer wichtig: ein aktuelles Backup. Wie du das machst, bleibt dir überlassen. Ich habe dafür ein ganz kleines Backup-Script geschrieben, dass die Dateien und die Datenbank auf einen anderen Server kopiert. Das führe ich hier einmal aus.

  6. Dateien ersetzen

    Jetzt geht’s endlich ans eigentliche Update. Dafür löschen wir zuerst die bestehenden Dateien – die Config, Upload-Dateien sowie Plugins und ein paar andere Ordner werden dabei natürlich ausgeschlossen. Anschließend werden die zuvor entpackten Dateien aus dem Tmp-Verzeichnis rüberkopiert. Dabei ist die Option -n/--no-clobber besonders wichtig. Sie verhindert, dass die bestehenden Dateien, die wir vorher ja extra behalten haben, nicht überschrieben werden.

  7. Service wieder starten

    Jetzt kann der supervisord-Service auch schon wieder gestartet werden. Das dauert ein paar Sekunden.

    Und damit ist eigentlich auch schon alles fertig. Das System sollte jetzt wieder verfügbar sein.

  8. Hinterher durchwischen

    Naja, so ganz fertig ist es noch nicht. Natürlich lösche ich die temporären Dateien noch. Aber davor möchte ich die Gelegenheit haben, einmal zu prüfen, ob alles passt. Daher kommt hier eine kleine Pause und ich teste einmal manuell, ob alles läuft und die richtige Version angezeigt wird. Sollte das nicht der Fall sein, kann ich hier abbrechen und Sachen manuell reparieren. Wenn alles passt, setze ich die Ausführung fort und die Dateien werden gelöscht.

So habe ich den Prozess, der mich vorher gefühlt immer eine halbe Stunde gekostet hat, jetzt als fertiges Script, das ich jederzeit schnell ausführen kann. Ein Update geht für mich damit in unter 3 Minuten.

Bonus: Backup

Das Backup-Script mattermost-backup.sh habe ich ganz stumpf mit einem rsync auf einen File-Storage umgesetzt:

#!/bin/bash

rsync -az mattermost storage:mattermost

pg_dump -U mattermost mattermost | gzip > mattermost.sql.gz
scp mattermost.sql.gz storage:mattermost/
rm mattermost.sql.gz