Ein Skript wie hier präsentiert hat mir schon ein paarmal viel lästige Arbeit abgenommen. Vielleicht findet es jemand nützlich?

Was ist das jetzt wieder... brauch' ich das?

Nun, nur, wenn folgende Bedingungen erfüllt sind:

  • Es wird eine ownCloud-Instanz betrieben.
    Bei mir ist das ein Raspberry Pi 2, aber vermutlich gilt das so ähnlich auf anderen Linux-Systemen auch.
  • Es ist nötig oder erwünscht, manuelle Upgrades durchzuführen.
    Wer z.B. ein Repository benutzt, das immer die aktuelle ownCloud-Version vorhält (gibt's sowas??), braucht sich freilich nicht plagen: sudo yum update o.ä. reicht dann (vielleicht – wir reden hier immerhin von ownCloud...).
    Ich finde das so inzwischen bequemer als den eingebauten Updater, dem traue ich nicht so ganz, außerdem muss man da auch mit den Zugriffsrechten vorher/nachher jonglieren.

Wem das jetzt alles gar nichts sagt – dann ist das kein Problem, sondern nur ein Fall von „falsche Zielgruppe erwischt“. In dem Fall gilt:

Bitte gehen Sie weiter, es gibt hier nichts zu sehen.

Weil ich selbst kein fertiges Skript im Netz klauenfinden konnte, musste ich mir doch tatsächlich selbst eines schreiben. Damit dem geneigten Leser/der geneigten Leserin[1] dieses schröckliche Schicksal erspart bleiben möge, stelle ich das Skript hier zur Verfügung. Das Skript versucht zwar, erst mal Backups von der Datenbank und dem Installationsverzeichnis zu machen, jedoch: Alles ohne Gewähr, wie man sich wohl denken kann. Deshalb an dieser Stelle der Profi-Tipp:

Führe keine Skripte aus, die du nicht (zumindest grob) verstanden hast!

Außerdem wichtig:

  • ownCloud mag es nicht, wenn man über mehrere Versionen hinweg Upgrades macht. Über Major Releases eh nicht (also z. B. 7 > 9), aber auch bei den Minor Releases sollte man sich an die empfohlene Reihenfolge halten, also: 7.0.x > 7.0.14 > 8.0.13 > 8.1.8 > 8.2.7 > 9.0.2.
  • Apps sollten vorher deaktiviert werden (und hinterher wieder aktiviert).

Das Upgrade-Skript

Das Skript sollte so für Nginx funktionieren; für Apache oder lighttpd sollte es genauso gehen, man muss dann nur Start und Stopp des Services entsprechend anpassen.
Weiterhin geht das Skript davon aus, dass

  • ownCloud in /var/www/owncloud installiert wurde,
  • der Webserver mit dem User www-data läuft,[2]
  • eine USB-Festplatte unter /media/usb-hd gemounted wurde, mit einem existierenden Verzeichnis raspberrypi_backups für Backups.

Diese Einstellungen sind in den Variablen am Anfang konfiguriert, ebenso wie die herunterzuladende, neue ownCloud-Version.
Das Skript läuft ohne Eingaben durch, mit der Ausnahme des Datenbank-Passworts und einiger Pausen, die mit Return bestätigt werden müssen. Sie sollen sicherstellen, dass bei etwaigen Fehlern abgebrochen werden kann.

#!/usr/bin/env bash

# Hier die neue Version eintragen!
export VERSION_OWNCLOUD=8.2.7

# Download-Pfad, sollte sich nicht aendern
export SOURCE_OWNCLOUD=https://download.owncloud.org/community/owncloud- 

# Pfad zum Backup-Verzeichnis, Anpassen erforderlich!
export path2backup='/media/usb-hd/raspberrypi_backups'

export htuser='www-data' # User unter dem der Webserver laeuft  
export ocpath='/var/www/owncloud' # Pfad zur ownCloud-Installation

ROOTUID="0"
if [ "$(id -u)" -ne "$ROOTUID" ] ; then
    echo "Dieses Skript braucht Root-Rechte."
    exit 1
fi

echo "Schalte Maintenance Mode ein..."
read -p "Return druecken oder mit CTRL-C abbrechen"
sudo -u ${htuser} php ${ocpath}/occ maintenance:mode --on
echo -e "\nStoppe Nginx..."
read -p "Return druecken oder mit CTRL-C abbrechen"
service nginx stop

echo -e "\n Backup der DB... (du brauchst gleich das DB-Passwort!)"
read -p "Return druecken oder mit CTRL-C abbrechen"
mysqldump --lock-tables -u root -p  owncloud > ${path2backup}/owncloud-sqlbkp_`date +"%Y%m%d"`.bak
echo -e "...erledigt.\n"

echo "Backup der Owncloud-Installation..."
rsync -Aax ${ocpath}/ ${path2backup}/owncloud-dirbkp_`date +"%Y%m%d"`/
echo -e "...erledigt.\n"

echo "Hole neue Version..."
mkdir ~/owncloud-Download-$VERSION_OWNCLOUD
cd ~/owncloud-Download-$VERSION_OWNCLOUD
wget $SOURCE_OWNCLOUD$VERSION_OWNCLOUD.tar.bz2
echo "...und entpacke sie..."
tar xjf owncloud-$VERSION_OWNCLOUD.tar.bz2
echo -e "...erledigt.\n"
cd owncloud

echo "Verschiebe altes Owncloud-Verzeichnis..."
read -p "Return druecken oder mit CTRL-C abbrechen"
mv ${ocpath} ${ocpath}_before_$VERSION_OWNCLOUD
cp -r ~/owncloud-Download-$VERSION_OWNCLOUD/owncloud /var/www/

echo "Kopiere neues Owncloud-Verzeichnis..."
read -p "Return druecken oder mit CTRL-C abbrechen"
cp ${ocpath}_before_$VERSION_OWNCLOUD/config/config.php ${ocpath}/config/

echo "Setze Rechte..."
find ${ocpath}/ -type f -print0 | xargs -0 chmod 0640
find ${ocpath}/ -type d -print0 | xargs -0 chmod 0750
chown -R root:${htuser} ${ocpath}/
chown -R ${htuser}:${htuser} ${ocpath}/apps/
chown -R ${htuser}:${htuser} ${ocpath}/config/
# Dieses Verzeichnis ist oft ausgelagert, in dem Fall ggfs. anpassen:
# chown -R ${htuser}:${htuser} ${ocpath}/data/ 

echo "Starte Nginx..."
service nginx start

echo "Schalte Maintenance Mode aus..."
sudo -u ${htuser} php ${ocpath}/occ maintenance:mode --off

Skript ausführen

Was jetzt noch zu tun ist:

  1. Skript von oben kopieren und in eine Datei speichern (z. B. upgrade-oc.sh).
  2. Mindestens die Variablen am Anfang anpassen.
  3. Datei ausführbar machen: chmod +x upgrade-oc.sh
  4. Starten: sudo ./upgrade-oc.sh
  5. Hoffen...

Wenn alles funktioniert hat, muss man jetzt noch das ownCloud-interne Update ausführen, entweder im Browser oder mit dem occ-Tool und evtl. Apps aktivieren.

Titelfoto: Lim changwon / Unsplash


  1. Ich schreibe fürderhin meist generisches Maskulinum. Alle Genders sind aber von Herzen mit gemeint. ↩︎

  2. Das ist der Default unter Debian/Raspbian. ↩︎