Wichtiger Hinweis für Neuinstallationen
Die CPU der VM (und damit auch die CPU des VM-Hosts), auf der der Datenbankserver läuft, muss jetzt AVX unterstützen. Dies ist nötig, da MongoDB 4.4 EOL ist und MongoDB 5.0 diese Voraussetzung hat.
Upgrade-Plugin
Das untenstehende Upgrade-Skript kann als Bash-Plugin in der Plattform eingetragen werden und mittels dem "Testen"-Button einmalig auf DB-, App- und Komponentenserver ausgeführt werden. Es ist für alle drei Installationsvarianten gültig und passt sich entsprechend der installierten Pakete an.
Das Skript stoppt sofort bei jeglichem Fehler und prüft auch, ob einige Änderungen am System vorgenommen wurden, die dem Upgrade im Weg stehen könnten. Es werden Backups der geänderten Einstellungsdateien angefertigt und zurückgespielt, falls das Skript fehlschlägt. Dies bringt aber nur etwas, wenn das tatsächliche Upgrade nicht bereits angestoßen wurde; sobald Pakete aus dem Bullseye-Repo installiert wurden, kann nicht mehr ohne VM-Backup zurückgerollt werden.
Der Datenbankserver wird vom Skript nur dann auf MongoDB 5.0 aktualisiert, wenn die CPU AVX-Unterstützung ausweist. Andernfalls wird die bestehende Installation von MongoDB 4.4 nicht angerührt, der Rest des Systems aber dennoch aktualisiert.
Die Plattform scheint etwas Probleme zu haben, den Fortschritt des Skripts zu tracken, wenn der "Testen"-Button genutzt wird. Es ist sinnvoller, nach Anstoßen des Upgrades auf den jeweiligen Host->Jobs zu wechseln und zu warten, bis der Status des Plugins dort angezeigt wird.
Wenn der Status des Skripts in der Plattform als erfolgreich angezeigt wird, war es auch wirklich definitiv erfolgreich. Jegliche Meldungen im Standardfehler (stderr
) können in diesem Fall ignoriert werden.
Das Skript loggt zusätzlich in eine Datei unter /var/log
, deren Name zu Beginn des Skripts ausgegeben wird und in jedem Fall in der Plugin-Ausgabe sichtbar ist. Dies ist nötig, da die Ausgabelänge für Plugins begrenzt ist und vom Upgrade im Normalfall überschritten wird.
WICHTIG:
- Es muss in jedem Fall vor Anstoßen des Upgrades ein Backup/Snapshot der jeweiligen VM erstellt werden!
- Das Upgrade erfordert immer einen Neustart der VM!
#!/bin/bash
# Debian buster -> bullseye upgrade script
# (C) 2022
#
# # # Enginsight GmbH
# # # # Geschäftsführer: Mario Jandeck, Eric Range
# # # Hans-Knöll-Straße 6, 07745 Jena
#
function restore_backup() {
find /etc/apt/ -type f -name '*.list.backup' -exec bash -c 'mv $0 ${0%.backup}' {} \;
find /etc/apt/preferences.d -type f -name '*.backup' -exec bash -c 'mv $0 ${0%.backup}' {} \;
echo "Upgrade failed. Restored backup files"
}
logFileName=/var/log/$(date +%Y%m%d%H%M%S)_upgrade.log
echo "Log will be written to $logFileName"
{
set -e -u
export DEBIAN_FRONTEND=noninteractive
echo "Checking whether apt-get update currently runs successfully"
apt-get -y update
echo "Checking whether any packages are held or broken"
audit=$(dpkg --audit)
if [[ $audit ]]
then
echo "Cannot upgrade: you have held or broken packages. Please fix this situation manually and attempt the upgrade again"
echo $audit
exit 1
fi
echo "Backing up sources.list files"
find /etc/apt/ -type f -name '*.list' -exec cp {} {}.backup \;
if dpkg -l | grep -q mongodb-org
then
# If the CPU supports AVX, upgrade MongoDB to 5.0 and the bullseye repo.
echo "Checking whether CPU supports AVX"
if grep -q avx /proc/cpuinfo
then
echo "CPU supports AVX. Upgrading to MongoDB 5"
find /etc/apt/ -type f -name '*.list' -exec sed -i 's/buster\/mongodb-org\/4.4/bullseye\/mongodb-org\/5.0/g' {} \;
if ! dpkg -l | grep -q gnupg
then
apt-get install -o Dpkg::Options::=--force-confold -o Dpkg::Options::=--force-confdef -y gnupg
fi
curl -sSL https://www.mongodb.org/static/pgp/server-5.0.asc | apt-key add -
else
echo "CPU does not support AVX, not upgrading MongoDB."
fi
fi
echo "Checking apt preferences"
if [[ -f /etc/apt/preferences ]]
then
echo "WARNING: found apt preference file /etc/apt/preferences not set by Enginsight. This may break the upgrade. Make sure your preferences are valid afterwards!"
fi
pinFiles=("98libcurl3-gnutls" "99debian-backports")
aptPreferenceFiles=($(shopt -s nullglob; shopt -s dotglob; echo /etc/apt/preferences.d/*))
for aptPreferenceFile in ${aptPreferenceFiles[@]}
do
found=false
for pinFile in ${pinFiles[@]}
do
if [[ "${aptPreferenceFile##*/}" == "$pinFile" ]]
then
echo "Disabling obsolete preference file ${aptPreferenceFile##*/}"
mv $aptPreferenceFile $aptPreferenceFile.backup
found=true
break
fi
done
if [ "$found" = false ]
then
echo "WARNING: found apt preference file ${aptPreferenceFile##*/} not set by Enginsight. This may break the upgrade. Make sure your preferences are valid afterwards!"
fi
done
echo "Replacing buster with bullseye in all sources.list files"
find /etc/apt/ -type f -name '*.list' -exec sed -E -i 's/(deb.*?https?:\/\/.*debian\.org\/debian\/?\s+)buster(.*)/\1bullseye\2/g' {} \;
if dpkg -l | grep -q docker-ce
then
find /etc/apt/ -type f -name '*.list' -exec sed -E -i 's/(deb.*?https?:\/\/.*docker\.com[^\s]+\s+)buster(.*)/\1bullseye\2/g' {} \;
fi
# https://www.debian.org/releases/bullseye/amd64/release-notes/ch-upgrading.en.html#bullseye-security
echo "Replacing buster/updates with bullseye-security in all sources.list files"
find /etc/apt/ -type f -name '*.list' -exec sed -E -i 's/(deb.*?https?:\/\/.*debian\.org\/debian-security\s+)buster\/updates(.*)/\1bullseye-security\2/g' {} \;
echo "Disabling backports repositories"
find /etc/apt/ -type f -name '*.list' -exec sed -E -i 's/(.*backports.*)/#\1/g' {} \;
# https://www.debian.org/releases/bullseye/amd64/release-notes/ch-upgrading.en.html#clean-up-leftover-configuration-files
echo "Cleaning up leftover configuration files"
find /etc -name '*.dpkg-*' -o -name '*.ucf-*' -o -name '*.merge-error' -exec rm {} \;
echo "Running apt update"
apt-get -y update --allow-releaseinfo-change
echo "Performing minimal upgrade"
apt-get --without-new-pkgs -o Dpkg::Options::=--force-confold -o Dpkg::Options::=--force-confdef -y upgrade
echo "Performing remaining upgrade steps"
apt-get -o Dpkg::Options::=--force-confold -o Dpkg::Options::=--force-confdef -y full-upgrade
echo "Removing unnecessary packages"
apt-get -y autoremove --purge
removed=$(dpkg -l | awk '/^rc/ { print $2 }')
if [[ $removed ]]
then
echo "Purging removed packages"
apt purge -y $removed
fi
echo "Upgrade completed. Please reboot the system"
} |& tee $logFileName
ret=${PIPESTATUS[0]}
if [ $ret -ne 0 ]; then restore_backup; fi
exit $ret