Mattermost Update Script
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
-
Vorgeplänkel
Zunächst kommen ein paar vorbereitende Maßnahmen. Ich setze die Bash-Optionen
-e/--errexit,-u/--nounsetundpipefail, 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.
-
Aktuelle Version ausgeben
Damit ich nochmal kurz sichergehen kann, das alles passt, gebe ich mit der mattermost-CLI die aktuell installierte Version aus.
-
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.
-
Service stoppen
Web-Services, die dauerhaft laufen sollen und eine Webanwendung bereitstellen, werden bei Uberspace mit
supervisordverwaltet. 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.
-
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.
-
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-clobberbesonders wichtig. Sie verhindert, dass die bestehenden Dateien, die wir vorher ja extra behalten haben, nicht überschrieben werden. -
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.
-
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