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