Ein Blog mit node.js und ghost

Der erste Post: Die Infrastruktur.

Das ist mein erster Blogeintrag und gleichzeitig mein erster Blog, der nicht auf Wordpress oder .NET-Lösungen basiert, sondern auf ghost und damit auf nodejs als Plattform läuft. Hier also einige Informationen zur Infrastruktur des Blogs und den Erfahrungen, die ich in der letzten Stunde beim Einrichten gemacht habe.

Alle älteren Artikel stammen ursprünglich aus meinem Blog agil und frei, der sich stärker mit agiler Softwareentwicklung befasst hat.

Der Provider uberspace

Da ich das hier eher als experimentelles Blog-Projekt betrachte und nicht weiß, wie viel Energie und Zeit ich in das Projekt stecken werde, spiegelt sich das auch in der Wahl des Providers (was nicht negativ gemeint ist): der Blog wird als uberspace beim gleichnamigen Provider gehostet.

Das besondere bei uberspace ist der Preis, der vom Anwender jederzeit angepasst werden kann und die sehr flexiblen Vertragsbindungen mit monatlichen Kündigungsfristen. Das Motto von uberspace ist:

DU BESTIMMST DEN PREIS.

Dieser muss mindestens 1 EUR pro Monat betragen, was ideal für kleine Testseiten und geringe Budgets ist, sollte jedoch der Fairness halber entsprechend erhöht werden, wenn sich die Rahmenbedingungen ändern. Zur Verfügung stehen 10 GB Webspace, eine mysql-Datenbank, ein ssh-Zugang für die Administration per Kommandozeile und noch etliche Features mehr...

Wer selbst bei uberspace seine Seite anlegen möchte, sollte dort auch die jeweils aktuellste Dokumentation zur Installation von ghost als Referenz nutzen. Die Beschreibung hier ist jedoch an einigen Stellen ausführlicher und außerdem für mich selbst auch als kleine Doku gedacht für die durchgeführten Aktionen.

Die Blog-Engine Ghost

Ghost is a simple, powerful publishing platform that allows you to share your stories with the world.

Meine Geschichten mit der Welt zu teilen und ohne große Anlaufhürden anfangen mit dem Schreiben, das ist genau, wonach mir der Sinn steht und ansonsten ist die Entscheidung für ghost als blog engine eher eine intuitive Entscheidung, die sehr stark durch das minimalistische Layout und den starken Fokus von ghost aufs Schreiben und Publizieren von Inhalten beeinflusst worden ist.

Die Domäne

Ich selbst registriere und verwalte meine Domänen seit vielen Jahren schon beim Berliner Anbieter InternetWorX, aber hier ist sicher auch jeder andere Domain Registrar möglich, der es erlaubt, die DNS-Einträge der Domänen zu bearbeiten. Meine Domäne cross-platform.info hatte ich schon vor zwei Wochen erworben, als ich die Entscheidung gefasst habe, im Jahr 2015 intensiv in die Cross-Plattform-Entwicklung einzusteigen und das ganze in Form eines Blogs zu begleiten.

So, nachdem jetzt alle Entscheidungen und Voraussetzungen erfüllt sind, geht es daran, ghost zu installieren und einzurichten.

Die Schritte im Einzelnen

SSH-Zugang bei uberspace

Der einfachste Zugang ist, im uberspace Account auf der Webseite ein Passwort für den SSH-Zugang einzurichten. Der Bereich Datenblatt zeigt dann die Zugangsmöglichkeiten. Das entsprechende ssh-Kommando zum Verbinden:

ssh MY_UBERSPACE_NAME@diphda.uberspace.de

Danach wird man nach seinem Kennwort gefragt, dass man übers Webinterface eingegeben hat und dann kann es losgehen.

Die ssh-Verbindung kann übrigens über exit geschlossen werden.

Domäne aufschalten

Da ich meine Domäne schon vor ca. zwei Wochen registriert hatte, wollte ich gleich als erstes meine Domäne einrichten.

Es gibt hier ein Service, der das Verbinden von Domains erleichtert, je nachdem, welche Form der Domain man bevorzugt, lässt sich die Variante mit oder ohne www oder mit oder ohne Wildcard verwenden, hier alle drei Varianten:

uberspace-add-domain -d cross-platform.info -w
uberspace-add-domain -d www.cross-platform.info -w
uberspace-add-domain -d *.cross-platform.info -w

Die Option -w steht für Webspace, wenn auch Emails verwendet werden sollen, müsste das -w am Ende durch ein -m ersetzt werden.

Installation von node.js

Das ist zumindest bei mir nicht notwendig, da bereits die aktuellste Version von node zur Verfügung steht. Die Node-Version lässt sich jedoch einfach checken mit dem Kommando:

node -v

Temp-Verzeichnis einrichten (wg. möglicher Probleme mit sqlite)

Die Anleitung bei uberspace empfiehlt, eine Pfadvariable für das Tempverzeichnis einzurichten, da es sonst zu Konflikten kommen kann, wenn andere User auch sqlite istalliert haben und die Binaries im tmp-Verzeichnis liegen.

export TMPDIR=`mktemp -d /tmp/XXXXXX`

Die XXXXXX sind so gewollt und müssen so eingegeben werden. Diese werden beim der Benamung des Verzeichnisses mit beliebigen, zufälligen Zeichen ersetzt.

Ghost downloaden und installieren

Die folgenden Kommandos laden die Version 0.5.8, also die gerade (Stand Januar 2015) aktuelle Version herunter, entpacken diese in einen /ghost Ordner, wechseln in den Ordner und installieren alle Abhängigkeiten für die Produktivversion:

curl -L https://ghost.org/zip/ghost-0.5.8.zip -o ghost-0.5.7.zip
unzip ghost-0.5.8.zip -d ghost && cd ghost
npm install --production

Port einrichten

Zuerst wird ein freier Port benötigt, möglich sind die Bereiche zwischen 61000 und 65535. Hier kann man sich grundsätzlich einen beliebigen aussuchen, sollte jedoch überprüfen, dass dieser noch nicht in Gebrauch ist. Wenn man also z.B. den Port 61234 benutzen möchte, kann man das mit dem folgenden Kommando überprüfen:

/usr/sbin/ss -ln | fgrep 61234

Wird nichts ausgegeben, ist der Port noch frei und kann verwendet werden.

Jetzt bietet es sich an, diesen Port in eine Umgebungsvariable zu schreiben:

GHOSTPORT=61234

Damit ist es leichter, den Port für die Konfigurationsdateien zu verwenden, zumindest auf der uberspace-Umgebung, die dafür spezielle Skripte bzw. commands anbietet.

Ghost konfigurieren

Zuerst eine eigene Konfiguration auf Grundlage der mitgelieferten Beispielskonfiguration anlegen:

cp config.example.js config.js

Die Konfigurationsdatei muss dann noch angepasst werden, zumindest die URL und evtl. auch der Port, wobei es dafür auch eine einfachere Möglichkeit gibt, dazu später mehr.

Die Konfigurationsdatei mit vi öffnen:

vi config.js

Zu editieren ist der production-Abschnitt, es müssen nur die Domäne (zweite Zeile) und der Port (hier in der letzten Zeile) angepasst werden, als Domäne entweder die uberpace-Domain (z.B. nach dem Schema MEIN_NAME.diphda.uberspace.de) oder die eigene Top Level Url und als Port der weiter oben gewählte freie Port:

production: {
    url: 'http://www.cross-platform.info',
    mail: {},
    database: {
        client: 'sqlite3',
        connection: {
            filename: path.join(__dirname, '/content/data/ghost.db')
        },
        debug: false
    },
    server: {
        // Host to be passed to node's `net.Server#listen()`
        host: '127.0.0.1',
        // Port to be passed to node's `net.Server#listen()`, for iisnode set this to `process.env.PORT`
        port: '61234'
    }
},

Arbeiten mit dem Editor vi

Für alle, die noch keine Erfahrung mit dem Editor haben (also in erster Linie für mich selbst), folgt hier eine kurze Beschreibung, um zumindest die Änderungen der Konfigurationsdatei durchführen zu können. Die Arbeit ist etwas gewöhnungsbedürftig: der vi-Editor unterscheidet grundsätzlich zwischen Kommandomodus (command mode) und Einfügenmodus (insert mode) und startet erstmal im Kommandomodus, in dem der Text nicht editiert werden kann.

Mit den Cursortasten kann durch den Text navigiert werden.

Mit I gelangt man (unter anderem) in den Einfügemodus, in dem das Dokument editiert werden kann. Um den Einfügemodus zu verlassen ESC drücken und dann :, um ein Kommando einzugeben.

Um die Datei ohne Speichern zu Verlassen, :q! eingeben. Nach Betätigen der Entertaste wird der Texteditor geschlossen und alle Änderungen verworfen. Wenn die Änderungen gespeichert werden sollen, ist :wq das richtige Kommando.

Um mehr über den Editor zu erfahren, einfach das Kommando vimtutor starten, dadurch wird ein Tutorium gestartet, das in ca. 25-30 Minuten in die grundlegendsten Kommandos einführt.

Ghost von außen erreichbar machen

Damit ghost auch im großen weiten Web erreicht werden kann, muss noch eine .htaccess-Datei im ghost-Verzeichnis angelegt werden, für den Port wird hier auf die weiter oben angelegt Pfadvariable zurückgegriffen:

cat <<__EOF__ >> ~/html/.htaccess
RewriteEngine On
RewriteRule ^(.*) http://localhost:$GHOSTPORT/\$1 [P]
__EOF__

Ghost als Dienst einrichten

Dieser letzte Schritt ist notwendig, damit ghost auch wieder gestartet werden kann, wenn der Server neu gestartet werden muss oder falls ghost aus welchen Gründen auch immer einmal abstürzen sollte.

Bei uberspace wird das mit Hilfe der daemontools erledigt. Dazu muss das eigene Service-Verzeichnis aktiviert werden:

test -d ~/service || uberspace-setup-svscan

Dann kann ein Service für den ghost-Blog eingerichtet werden:

uberspace-setup-service ghost env NODE_ENV=production node ~/ghost/index.js 2>&1

Die angelegte Service-Datei ~/service/ghost/run muss angepasst werden, und zwar muss vor dem eigentlichen exec in das Verzeichnis von ghost gewechselt werden, also cd ~/ghost/, was manuell in die Datei eingefügt werden kann oder aber auch einfacher über das folgende Kommando erledigt werden kann:

sed -i -e 's/exec/cd ~\/ghost\/\nexec/' ~/etc/run-ghost/run

Ghost starten und Benutzer festlegen

Wenn soweit alles geklappt hat, kann Ghost jetzt zum erstenmal gestartet werden. Über www.my-domain.com/ghost/signup kann ein Benutzer mit Kennwort festgelegt werden und anschließend können die Grundeinstellungen wie Titel und Beschreibung des Blogs eingegeben werden. Damit ist genau der Punkt erreicht, an dem ich diesen Artikel begonnen habe, und die Zeit ist reif für den ersten Blogeintrag.

Das Fazit nach einer (gefühlten) Stunde

Ging doch ganz gut und leichter als erwartet!

Auch wenn ich als Windows-Entwickler gewohnt bin, eher mit visuellen Komponenten und Oberflächen und Mouseclicks zu arbeiten und meine Linux- und Kommandozeilenerfahrungen schon ziemlich lange (während des Studiums) zurückliegen, ging der ganze Installationsprozess doch recht reibungslos und schnell vonstatten.

Als Fazit bleit, dass ich dringend meine Kenntnisse der Bash Shell etwas ausbauen sollte, um im Unix/MacOS Umfeld effektiver arbeiten zu können.

Die Arbeit mit Ghost selbst gestaltet sich recht angenehm, insbesondere die Auszeichnung mit Markdown in der linken Spalte und gleichzeitige Vorschau in der rechten Spalte ermöglicht ein schnelles Arbeiten.

Ach ja, und dazu kann ich folgende Musik empfehlen: