janeberl Jan Eberl .de

Ghost ohne ghost-cli auf Uberspace 7 installieren

Endlich geschafft: Ghost 1.0 auf dem neuen Uberspace!. Da ein bisschen Fummelei nötig war, beschreibe ich hier kurz wie das geht.

Der Ansatz für diesen Artikel ist das Grundproblem, dass Uberspace zwar der geilste Hoster der Welt ist, aber nun mal keinen root oder sudo zur verfügung stellt.

Alternative: Ghost als npm module installieren

Es ist unter Umständen auch möglich, Ghost als npm Modul zu installieren, allerdings gibt es dort einen kleinen Bug mit den Content-Pfaden, der das zusätzlich erschwert. Deshalb hier die straight-forward-Variante.

0 Inhalte migrieren

Wie du deine Inhalte aus einer älteren Installation auf deine neue Ghost-Instanz migrieren willst, ist in der Ghost-Doku beschrieben.

1 yarn installieren

Ehrlich gesagt braucht man yarn nicht unbedingt, aber Ghost kommt bereits mit einem yarn.lock file, und yarn ist cool. Also fix installiert:

curl -o- -L https://yarnpkg.com/install.sh | bash

2 Ghost herunterladen

Jetzt laden wir einfach die aktuelle Ghost-Version als Zip herunter:

curl -L https://ghost.org/zip/ghost-latest.zip -o ghost-latest.zip

Und entpacken alles in einen Ordner unserer Wahl. Ich habe einfach ~/ghost genommen.

unzip ghost-latest.zip -d ghost

3 Dependencies installieren

Jetzt wechseln wir in den Ordner, in den wir Ghost entpackt haben und installieren die Dependencies mit yarn:

cd ghost
yarn install

4 Konfiguration

Da wir nicht das Ghost CLI verwenden, müssen wir unsere config manuell generieren. Glücklicherweise gibt es bereits einige config-Vorlagen, die Ghost bereits mitbringt, also können wir uns eine davon schnappen und in unser Ghost-Verzeichnis kopieren:

cp core/server/config/env/config.production.json config.production.json

Jetzt editieren wir die config.production.json. Darin musst du nun vor Allem die Datenbank-Einstellungen vornehmen, und die URL deines Blogs festlegen.

Hinweis: Info zu deinem Datenbankzugang findest du auf dem Uberspace in der Datei .my.cnf in deinem Home-Verzeichnis (cat ~/.my.cnf). Dein Datenbankname ist dein Uberspace-Username.

4.1) Port finden

Du brauchst einen Port, auf dem dein Ghost-Blog erreichbar ist. Laut der Uberspace-Doku sollen möglichst nur Ports zwischen 61000 und 65535 verwendet werden. Um einen freien Port zu finden, verwende folgenden Befehl:

netstat -tulpen | grep PORTNUMMER

Ist die Ausgabe leer, ist der Port frei, und du kannst ihn verwenden.

4.2) Alles eintragen

So oder so ähnlich sollte dann deine config.production.json aussehen; Ich habe hier alle einzutragenden Daten in spitze Klammern gesetzt:

{
    "url": "<DOMAIN>",
    "server": {
        "host": "127.0.0.1",
        "port": "<GHOST-PORT>"
    },
    "database": {
        "client": "mysql",
        "connection": {
            "host"     : "127.0.0.1",
            "user"     : "<DB-USER>",
            "password" : "<DB-PASSWORD>",
            "database" : "<DB-NAME>"
        }
    },
    "auth": {
        "type": "password"
    },
    "paths": {
        "contentPath": "content/"
    },
    "logging": {
        "level": "info",
        "rotation": {
            "enabled": true
        },
        "transports": ["file", "stdout"]
    }
}

5 Knex migrator

Ghost benutzt ein Tool namens Knex migrator für Datenbank-Migration und -Vorbereitung. Dieses Tool müssen wir noch installieren

npm install -g knex-migrator

und initialisieren

NODE_ENV=production knex-migrator init

Knex migrator wird daraufhin alle nötigen Tabellen in deiner Datenbank anlegen.

6 .htaccess-Weiterleitung

Jetzt müssen wir noch eine .htaccess-Datei in unseren Document Root ~/html legen, damit der geneigte Leser auch auf den Ghost-Service weitergeleitet wird, wenn er deinen Uberspace besucht.

Ich hatte mit meiner Installation ein kleines Problemchen, bei der der Webserver immer /index.html/an meine domain gehängt hat. Unterseiten funktionierten alle super, lediglich die Startseite hatte das Problem. Nach einer schnellen Mail an Uberspace und deren ultraschneller Antwort (Ernsthaft: Die Jungs antworten schneller, als 80% der Bevölkerung brauchen, um eine Mail überhaupt zu öffnen! Vielen Dank an dieser Stelle nochmal an Nico für die schnelle Hilfe). Das Problem war schnell gefunden: Der Apache in Version 2.4 erzwingt diesen redirect bei Proxy-Rewrites. Also schnell ein DirectoryIndex disabled an den Anfang der .htaccess getackert, und alles lief wie gewünscht.

DirectoryIndex disabled
RewriteEngine On
RewriteBase /

RewriteCond %{HTTPS} !=on
RewriteCond %{ENV:HTTPS} !=on
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
RewriteRule (.*) http://localhost:63000/$1 [P]

Eigentlich erzwingt Uberspace 7 mittlerweile ohnehin https, daher sind die Zeilen 5 und 6 nicht wirklich nötig. Ich habe hier einfach meine alte .htaccess weitergenutzt.

7 Fertig. Fast.

Jetzt können wir Ghost starten. Zum Test kannst du Ghost direkt über node starten. So kannst du schauen, ob alles läuft, und bekommst auch als Ausgabe in der Konsole die Requests, die im Ghost aufschlagen.

8 Bonus: Ghost als Service auf u7

Für den Produktivbetrieb willst du wahrscheinlich Ghost als Service laufen lassen. Hierzu brauchst du zwei Dateien: Ein Skript, welches Ghost startet, sowie eine .ini in ~/etc/services.d

8.1 Startskript anlegen

In unserem ~/bin-Verzeichnis (Oder wo immer du willst) legen wir nun ein bash-Skript ab, welches den Start von Ghost automatisiert.

cd ~/bin
touch ghostd

Hier der Inhalt der ghostd

#!/bin/sh
cd /home/<dein-uberspaceuser/ghost && NODE_ENV=production node index.js

8.2 ghostd.ini anlegen

Nun wechseln wir ins Verzeichnis ~/etc/services.d und legen eine ghostd.ini darin an

cd ~/etc/services.d
touch ghostd.ini

Da rein kommt folgender Inhalt, der auf das eben von uns angelegte Skript verweist.

[program:ghostd]
command=/home/<dein-uberspaceuser>/bin/ghostd

Nun lesen wir das services-Verzeichnis neu in supervisorctl ein

[du@uberspace ~]$ supervisorctl reread
ghostd: available

Jetzt kannst du deinen Ghost-Daemon mit supervisorctl starten und beenden:

[du@uberspace ~]$ supervisorctl start ghostd
ghostd: started
[du@uberspace ~]$ supervisorctl stop ghostd
ghostd: stopped
[du@uberspace ~]$ supervisorctl restart ghostd
ghostd: stopped
ghostd: started