Installation von Ghost auf Novatrend Webhosting

in #ghost3 years ago


Ghost ist eine freie Blogging-Plattform, die in JavaScript geschrieben ist und unter Node.js läuft. Sie ist minimalistisch aufgebaut und verfolgt das Ziel, ein einfaches System zum Verfassen und zur Veröffentlichung von Artikeln zu bieten ohne dass man viel Aufwand mit konfigurieren verbringen muß.

Ich habe die Installation von Ghost auf einem Root Server vor 6 Jahren (!) hier im Blog beschrieben - Ein Blog mit Ghost und Node.js. Damals war es nicht möglich, Node.js in einem Webhosting zu verwenden. Heute geht das aber problemlos und daher nun die Anleitung, wie man das famose Ghost System auf einem ganz normalen Webhosting bei Novatrend installiert.

Wenn du noch unsicher bist, ob es sich lohnt, Ghost auszuprobieren, dann schau dir zu Motivationszwecken einfach mal Film zum Start des Projekts auf Kickstarter aus dem Jahr 2013 an.

Kickstarter Video für Ghost von 2013

Und denke dabei kurz daran, dass es den klassischen LAMP Stack nun auch schon wieder mehr als 25 Jahre gibt. 

Wenn du jetzt etwas überzeugter bist, dann lass uns starten. 

Node.js ist, im Gegensatz zu PHP bei vielen Hostern nicht gebräuchlich und so war es auch für uns eine kleine Herausforderung. Bedanken möchte ich mich bei Angelo Gründler, der die erfolgreiche “Forschung“ für diese Anleitung übernahm.

So grundsätzlich sind die Installationsschritte nicht schwer, aber für „gelernte“ LAMP-Stack Sitebuilder doch ein wenig ungewohnt.

Voraussetzung, um diese Anleitung nachvollziehen zu können ist ein Webhosting bei Novatrend und ein Zugang zur Konsole dieses Webhostings (siehe dazu auch den Blog post der letzten Woche: Arbeiten mit der Kommandozeile auf deinem Webhosting).

cPanel - 1. Teil

Wir erstellen zunächst innerhalb von cPanel eine Sub-Domain mit Zertifikat, eine Datenbank mit Benutzer und installieren dann das Ghost Blogging System als Node.js Applikation.

Domain nutzen oder Sub-Domain erstellen

Ich benutze für meine Beispiele hier im Blog meist eine Unterdomain (Sub-Domain). Mit einer Top Level Domain geht es natürlich auch.
Ich füge eine Sub-Domain im cPanel hinzu. Meine Sub-Domain heisst ghost.seafolly.ch und wird nur für das Ghost System verwendet.


Unterdomäne anlegen - ghost.seafolly.ch

TLS Zertifikat ausstellen und installieren

Wir benötigen natürlich ein Zertifikat und stellen ein kostenloses Let's Encrypt TLS Zertifikat für die Domain oder Sub-Domain aus (to issue).


Let‘s Encrypt Zertifikat ausstellen
Zertifikat ausstellen - Details

Datenbank

Ghost benötigt wie andere CMS eine Datenbank und so erstellen wir, wie bei WordPress, Joomla und Drupal, eine Datenbank und einen Datenbankbenutzer mit Vollzugriff für diesen Benutzer. In meinem Beipiel heissen Datenbank und Benutzer seafoll1_ghost.

Über den Datenbankassistent im cPanel lässt sich das einfach erledigen.


MySQL-Datenbank-Assistent - Schritt 1 - DB erstellen

Das Passwort für den Benutzer bitte unbedingt irgendwo aufschreiben, wir brauchen es später.


MySQL-Datenbank-Assistent - Schritt 2 - Benutzer erstellen

Der Benutzer benötigt alle Berechtigungen, also Vollzugriff auf die Datenbank.


MySQL-Datenbank-Assistent - Schritt 3 -Benutzer Berechtigungen festlegen

Konsole - 1. Teil

Nun wechseln wir das erste Mal auf die Kommandozeile und loggen uns auf unserem Webhosting ein.

Im Home Verzeichnis muss das Verzeichnis node/$domainname angelegt werden

$ mkdir -p node/ghost.seafolly.ch

In meinem Fall ist das komplette Verzeichnis dann

/home/seafoll1/node/ghost.seafolly.ch 

cPanel - 2. Teil

Im cPanel gibt es einen Punkt Node.js. Dort erstellen wir eine Applikation (Create Application).

  • Node.js version: 12.18.3 oder vergleichbar vom 12er wählen.
  • Application mode: Production
  • Application root: node/ghost.seafolly.ch (node/$domainname)
  • Bei Application URL die Domain oder Subdomain auswählen
  • Application startup file: index.js

Node.js Applikation erstellen

Browser - Ghost - 1. Teil

Nach dem Speichern (create) kannst du im Browser deine Domain aufrufen, im meinem Fall also https://ghost.seafolly.ch.

Es sollte eine "It works" Nachricht mit der Node.js Version erscheinen.

Konsole - 2. Teil

Wechsle nun wieder auf die Kommandozeile und setze diese beiden Befehle ab

$ source /home/seafoll1/nodevenv/node/ghost.seafolly.ch/12/bin/activate && cd /home/seafoll1/node/ghost.seafolly.ch

Wenn alles funktioniert hat, dann sind wir jetzt in diesem Verzeichnis

/home/musterb1/node/ghost.seafolly.ch  

Verzeichnis in der Konsole

Mit dem Befehl pwd kannst du das überprüfen.

Als nächsten Schritt installieren wir das Ghost-cli (Command Line Interface). Mit diesem Tool lässt sich Ghost installieren und warten. Damit die Installation sauber durchläuft, erstellen wir noch ein separates install-Verzeichnis. Dann wechseln wir in dieses Verzeichnis und installieren das Ghost-cli.

$ mkdir install 
$ cd install  
$ npm install ghost-cli@latest -g

Ghost-cli installieren

Das Ghost-cli lässt sich mit dem Befehl Ghost aufrufen und die Installation des Ghost Blogs erfolgt mit dem Befehl

$ ghost install local

Die Installation läuft sauber durch, bricht dann aber beim Versuch Ghost zu starten ("Starting Ghost") mit einer Fehlermeldung ab. Du erkennst das am roten Kreuzchen x. 


Ghost Installation bricht beim Schritt „Starting Ghost“ ab

Das Problem ist die fehlende Datenbank-Konfiguration. Die erstellen wir nachträglich mit dem Befehl ghost setup:

$ ghost setup

Das Ghost Setup fragt die Datenbank-Parameter ab, die du entsprechend ausfüllen und mit der Enter Taste bestätige musst.

? Enter your blog URL: https://ghost.seafolly.ch
? Enter your MySQL hostname: localhost
? Enter your MySQL username: seafoll1_ghost
? Enter your MySQL password: ****
? Enter your Ghost database name: seafoll1_ghost

Ghost setup

Ausser der Datenbank versucht das Ghost Setup auch andere Dinge zu konfigurieren, die nichts mit den Shared Hosting/Webhosting zu tun haben. Diese Aktionen erzeugen Fehlermeldungen, weil die entsprechenden Berechtigungen nicht vorhanden sind.

Trotzdem hat Ghost mit diesem Setup eine Datei namens config.production.json erstellt. Diese Datei verschieben (mv) wir eine Ebene höher. Das wäre in meinem Beispiel wieder /home/seafoll1/node/ghost.seafoll1.ch und da wechseln (cd) wir auch hin:

$ ls
config.development.json config.production.json content current versions
$ mv config.production.json ../
$ cd ..

Nun versuchen wir Ghost zu starten. Wenn es klappt, werden jetzt die Verbindung zur MySQL Datenbank hergestellt und die notwendigen Tabellen erstellt:

$ node install/current/index.js

Leider klappt es noch nicht und es wird eine Fehlermeldung ausgeworfen:

ERROR Field length of customer_id in members_stripe_customers is too long! 
"This usually happens if your database encoding is utf8mb4.
All unique fields and indexes must be lower than 191 characters.
Please correct your field length and reset your database with knex-migrator reset." 
Read more here: https://github.com/TryGhost/knex-migrator/issues/51

Also müssen wir in der Datenbank das Problem beheben. Dazu melden wir uns auf der Kommandozeile beim MySQL Monitor an:

$ mysql -u seafoll1_ghost -p seafoll1_ghost

Nach Eingabe des Passworts sind wir in der MySQL/MariaDB Umgebung:

MariaDB [seafoll1_ghost]>

Nun muss folgender MySQL Befehl ausgeführt werden. Er passt die Länge und den Zeichensatz des Feldes an, so dass Ghost damit arbeiten kann. Mit dem Befehl exit verlassen wir danach den MySQL Monitor wieder:

ALTER TABLE members_stripe_customers CHANGE customer_id customer_id VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL;
exit

DB anpassen

2. Versuch Ghost zu starten:

$ node install/current/index.js

Leider gibt es ein weiteres zu langes Feld und eine entsprechende Fehlermeldung:

ERROR Field length of subscription_id in members_stripe_customers_subscriptions is too long!

Also auch das noch beheben:

$ mysql -u seafoll1_ghost -p seafoll1_ghost

Den MySQL Befehl ausführen und wieder mit exit verlassen:

ALTER TABLE members_stripe_customers_subscriptions CHANGE subscription_id subscription_id VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL;
exit

Aller guten Dinge sind drei.
Beim dritten Versuch sollte der Start von Ghost klappen:

$ node install/current/index.js
INFO Your site is now available on https://ghost.seafolly.ch/ INFO Ctrl+C to shut down

Da wir im Webhosting die Node Applikation über cPanel verwalten und nicht über die Kommandozeile, stoppen wir sie hier gleich mit Ctrl+C.

Nun sind alle Arbeiten auf der Kommandozeile erledigt, Ghost funktioniert, und wir wechseln wieder in das cPanel.

cPanel - 3. Teil

Zurück zu cPanel -> Node.js -> Edit this Application.

Zunächst muss die Anwendung gestoppt werden (Stop Button klicken). Der Wert im Feld Application startup file muss auf die nun vom Ghost Installationsprogramm erstellte index.js Datei umgestellt werden.

install/current/index.js

Oben rechts den Save Button klicken und nun sollte unser Ghost Blog laufen.


Application Startup File ändern

Browser - Ghost - 2. Teil

Die benutzte Domain https://ghost.seafolly.ch im Browser aufrufen. Anfangs kommt noch eine Meldung "Site is starting up". In diesem Falle ist die Node.js Applikation noch nicht vollständig gestartet.

Also einfach so lange den Browser aktualisieren (F5-Taste) bis der Blog erscheint.


Welcome to Ghost

Das treibt einem schon mal die Freudentränen in die Augen 😉.
Das Ghost Blog läuft und nun muss nur noch ein administrativer Benutzer erstellt werden und optional können Einladungen an weitere Nutzer verschickt werden.

Hierzu musst du https://ghost.seafolly.ch/ghost/ aufrufen und einfach dem Einrichtungs-Assistenten folgen.


Welcome to Ghost!

Fazit

Es ist möglich ein Ghost Blog auf einem Novatrend Webhosting aufzusetzen.
Der Seitenaufbau erfolgt wirklich sehr schnell.
Nun ist es an der Zeit Ghost in allen Verästelungen auszuprobieren. Es ist ein tolles System und wir werden weitere Tips zu Ghost veröffentlichen.


tl;dr: Bei uns kannst du ein Ghost Blog basierend auf Node.js hosten



Posted from my blog with SteemPress : https://blog.novatrend.ch/2020/11/30/installation-von-ghost-auf-novatrend-webhosting/