Ghost 4 (CMS) auf Uberspace aktualisieren

By Frederik, published at 19.03.2021

Seit vielen Jahren setze ich hier im Blog auf Ghost als Blogging-Plattform und bin damit ziemlich zufrieden. Durch den modernen und minimalistischen Aufbau ist es schnell, unkompliziert und leicht anpassbar.

Da ich auch schon seit längerer Zeit auf Uberspace als Hoster vertraue, die eine Art semi-managed Server mit tollem Support und Preis-/Leistungsverhältnis anbieten, dafür aber keinen root-Zugriff ermöglichen, war es mir nie möglich Ghost auf die vorgesehene Art und Weise per Ghost-CLI zu aktualisieren.

Als Alternative gibt es für die erstmalige Installation diesen Guide im Uberlab und um Ghost regelmäßig zu aktualisieren habe ich ein Script geschrieben, was ich jetzt auch mit dem neuen Ghost 4 erfolgreich getestet habe (vorher Node.js auf Version 14 bringen mit uberspace tools version use node 14):

#!/bin/bash
#set -v
GHOSTDIR=~/ghost
PACKAGE_VERSION_OLD=$(sed -nE 's/^\s*"version": "(.*?)",$/\1/p' $GHOSTDIR/current/package.json)
CURRENT_GHOST=$(curl -s https://api.github.com/repos/TryGhost/Ghost/releases/latest | grep \"name\": | head -n 1 | cut -d '"' -f 4)
CURRENT_GHOST_DOWNLOAD=$(curl -s https://api.github.com/repos/TryGhost/Ghost/releases/latest | grep browser_download_url | cut -d '"' -f 4)
CURRENT_GHOST_FILE=$(echo $CURRENT_GHOST_DOWNLOAD | sed 's:.*/::')

echo "Installierte Version von Ghost: $PACKAGE_VERSION_OLD"
echo " Verfuegbare Version von Ghost: $CURRENT_GHOST"
cd $GHOSTDIR
if [[ $CURRENT_GHOST > $PACKAGE_VERSION_OLD ]]
then
    	read -r -p "Soll Ghost jetzt von Version $PACKAGE_VERSION_OLD auf $CURRENT_GHOST aktualisiert werden? [J/n] " response
        if [[ $response =~ ^([jJ][aA]|[jJ]|"")$ ]]
        then
            	echo "Pruefe auf Aktualisierung von npm..."
                echo "Node.js version: $( node -v)" && echo "Bisherige npm version: $(npm -v)"
                npm install -g npm
                echo "Neue npm version: $(npm -v)"
                echo "Pruefe auf Aktualisierung von knex-migrator..."
                echo "Bisherige knex-migrator version: $(knex-migrator -v)"
                npm install -g knex-migrator
                echo "Neue knex-migrator version: $(knex-migrator -v)"
                echo "Pruefe auf Aktualisierung von yarn..."
                echo "Bisherige yarn version: $(yarn --version)"
                npm install -g yarn
                echo "Neue yarn version: $(yarn --version)"
                echo "Ghost $CURRENT_GHOST wird heruntergeladen und entpackt..."
                cd $GHOSTDIR/versions/
                curl -LOk $CURRENT_GHOST_DOWNLOAD
                unzip $GHOSTDIR/versions/$CURRENT_GHOST_FILE -d $CURRENT_GHOST
                rm $GHOSTDIR/versions/$CURRENT_GHOST_FILE
                echo "Ghost wird jetzt aktualisiert..."
                cd $GHOSTDIR/versions/$CURRENT_GHOST
                yarn install --production
                echo "Die Datenbank von Ghost wird auf die neue Version migriert..."
                cd $GHOSTDIR
                NODE_ENV=production knex-migrator migrate --mgpath $GHOSTDIR/versions/$CURRENT_GHOST
                ln -sfn $GHOSTDIR/versions/$CURRENT_GHOST $GHOSTDIR/current
                PACKAGE_VERSION=$(sed -nE 's/^\s*"version": "(.*?)",$/\1/p' $GHOSTDIR/current/package.json)
                echo "Ghost wurde von Version $PACKAGE_VERSION_OLD auf Version $PACKAGE_VERSION aktualisiert und wird neu gestartet. Dies kann ein paar Sekunden dauern..."
                supervisorctl restart ghost
                supervisorctl status
                dir=$(cd $GHOSTDIR/versions && ls  -1rd */ | tail -n +4)
                keep=$(cd $GHOSTDIR/versions && ls -1rd */ | head -3)
                echo "Loesche alte Versionen" && echo $dir && echo "Behalte die letzten drei Versionen" && echo $keep
                cd $GHOSTDIR/versions && ls -1rd */ | tail -n +4 | xargs rm -rf
                                echo "Bei Fehlern Logfile ueberpruefen: 'supervisorctl tail ghost'"
                echo "Zum Zuruecksetzen auf Ghost $PACKAGE_VERSION_OLD folgenden Befehl ausfuehren: 'ln -sfn $GHOSTDIR/versions/$PACKAGE_VERSION_OLD $GHOSTDIR/current' und dann per 'supervisorctl restart ghost' neustarten."
        else
                echo "-> Ghost wird nicht aktualisiert"
        fi
else
        echo "-> Ghost ist bereits auf dem aktuellen Stand, keine Aktualisierung notwendig"
fi

Vor dem Update von Ghost 3.x auf 4.x sollte auf jeden Fall ein Backup erstellt und auf die letzte Version 3.42.5 (im Script folgende beiden Zeilen nutzen:)

CURRENT_GHOST=3.42.3
CURRENT_GHOST_DOWNLOAD=$"https://glare.now.sh/TryGhost/Ghost@3.x/Ghost"

aktualisiert werden.

Das Script beinhaltet ein automatisches Backup der letzten drei Versionen, auf die man einfach zurück wechseln kann.

Viel Erfolg beim Aktualisieren!

Profilbild

Frederik

My name is Frederik Niedernolte, I am 36 years young and a native of Detmold in NRW.
I am a media and business psychologist (working as Service Manager User Research), trained IT specialist and hobby photographer.
In this blog I report about everything that moves me, interests me, fascinates me and present some photos of me.

Comments

Comment now ⬇️
Comments
  • chibiribiri replied @ 15.04.2021 15:00

    Kleine Notiz, da ich das Script mal ausprobiert habe:
    Der Downloadlink und damit die erkannte Versionsbezeichnung hat sich geändert. Ich bin aktuell z.B. auf Version 4.2.1. Wenn ich das Script nutze, erkennt er aktuell, dass ich die Version 4.2.1 besitze, und das eine aktuellere Version, nämlich die Version v4.2.1 zur Verfügung steht. Da müsste man im Script nachbessern. Ich bin da leider nicht so bewandert. Ich verstehe zwar was abläuft, aber nicht, wo ich eine entsprechende Ergänzung machte könnte. Wahrscheinlich muss irgendwo noch ein “v+” vor.
    im package.json steht nämlich weiterhin die Versionsnummer ohne das v. :)


    ↩️ reply
    • Frederik  replied @ 15.04.2021 22:00

      Danke für den Hinweis, das liegt an dem vergebenen Tag bei Github. Ich habe es soeben behoben.
      Tausche einfach Zeile fünf (CURRENT_GHOST=) mit dem oben aktualisierten Inhalt aus und es sollte funktionieren.
      Ich würde mich über eine Rückmeldung freuen.


      ↩️ reply
  • chibiribiri replied @ 16.04.2021 15:55

    Scheint zu klappen.
    Eine Sache noch. In Zeile 50 wurde das Script wohl abgeschnitten. Ich habe es bei mir ergänzt, so dass die Zeile bei mir so aussieht:
    echo “Zum Zuruecksetzen auf Ghost $PACKAGE_VERSION_OLD folgenden Befehl ausfuehren: ‘ln -sfn $GHOSTDIR/versions/$PACKAGE_VERSION_OLD $GHOSTDIR/current’ und dann per ‘supervisorctl restart ghost’ neustarten”

    Bei dir steht dort am Ende nur supervisorctl resta$. Dadurch hatte ich dann einen Syntaxfehler, da das geöffnete Echo nicht geschlossen wurde :)


    ↩️ reply
    • Frederik  replied @ 16.04.2021 21:00

      Vielen Dank, sehr aufmerksam und gut korrigiert, habe ich auch gleich erledigt.


      ↩️ reply
  • Katharina  replied @ 27.05.2021 19:50

    Hi, vielen Dank für das Skript! Bei mir lief es erst auf einen Fehler, was daran lag, dass ich als node-Version noch 10 eingestellt hatte statt 12. Vielleicht kannst du diesen Hinweis noch ergänzen? Außerdem ist die letzte 3er-Version von Ghost bei mir mittlerweile 3.42.5 gewesen. Ansonsten hat alles tiptop geklappt. Danke nochmal!


    ↩️ reply
    • Frederik  replied @ 04.06.2021 15:50

      Hi Katharina, danke für Deinen Kommentar, ich habe die beiden Punkte gleich mal hinzugefügt.


      ↩️ reply
  • Korbinian  replied @ 06.06.2022 10:10

    Hallo,

    ich habe nach längerem mal wieder versucht, meinen Ghost-Blog auszugraben. Mittlerweile ist ja schon Ghost 5.0 draußen. Kann ich obige Anleitung denn verwenden um von 4 auf 5 upzugrade, oder muss ich da was besonderes beachten?

    Gruß

    Korbinian


    ↩️ reply
  • Valentin  replied @ 28.06.2023 17:40

    Der Link zur Ghost Installationsanleitung im Uberlab funktioniert nicht mehr:
    https://lab.uberspace.de/guide_ghost.html
    Weißt Du zufällig, ob hier eine aktualisierte Anleitung kommen wird? Oder sind die aktuellen Version von Ghost nicht mehr kompatibel mit Uberspace?

    Wenn ich hier im Kommentarbereich auf “Woanders antworten: Mastodon” klicke bekomme ich auch eine nicht gefunden Fehlermeldung. https://www.addtoany.com/add_to/mastodon?linkurl=https://www.peleke.de/de/blog/ghost-4-uberspace-aktualisieren


    ↩️ reply
    • Frederik  replied @ 28.06.2023 22:15

      Hallo Valentin, danke für Deinen Kommentar, da musst Du wohl mal bei Uberspace nachfragen, warum der Artikel gelöscht wurde.

      Bezüglich des Fehlers von Mastodon schreib mir doch gerne eine E-Mail mit Screenshot.


      ↩️ reply
      • Valentin  replied @ 24.12.2023 01:05

        Ersteres hat Peter herausgefunden ^^^
        Der Mastodon-Link funktioniert inzwischen.


        ↩️ reply
  • Peter replied @ 28.07.2023 12:20

    Uberspace hat den Artikel gelöscht, weil ein aktuelles ghost (demnächst) nicht mehr auf uberspace lauffähig sein wird.

    Der drop des MariaDB (oder MySQL, jedenfalls eines von beiden)-Supports war und ist der Auslöser.

    Mein Workaround ist, eine installation mit sqlite, die vmtl immer lauffähig sein wird. Solle das an das Ressourcenlimit stoßen, werde ich wohl auf einen anderen hoster wechseln müssen.

    PS Läuft das Skript problemlos mit Ghost 5.x? Stehe nämlich auch vor dem “Problem” updaten zu müssen.

    PPS: Frederik, wie erstellst Du backups? ghost backup erfordert ja auch ein sudo Passwort.


    ↩️ reply
  • Peter replied @ 28.07.2023 13:45

    Die ZIP Download URL hat sich übrigens (erneut?) geändert. Das Skript muss jetzt nach zipball_url greppen:

    CURRENT_GHOST_DOWNLOAD=$(curl -s https://api.github.com/repos/TryGhost/Ghost/releases/latest | grep zipball_url | cut -d '"' -f 4)

    ↩️ reply
Your E-Mail address will be encrypted before saving the comment. It will only be used to display a gravatar. By submitting your data, you agree that all entered data may be saved and displayed as a comment.