By NASA - http://spaceflight.nasa.gov/gallery/images/shuttle/sts-129/html/iss021e029824.html, Public Domain, https://commons.wikimedia.org/w/index.php?curid=8513049

Abgedockt: Discourse ohne Docker auf einem Strato vServer installieren

Vorgeschichte

Anmerkung: wer nur an der Installation interessiert ist, kann diesen Teil überspringen und gleich hier weiterleisen.

Ich betreiben seit langem einige private und ehrenamtliche Webprojekte, viele Jahre in einem Hosting-Paket von Strato und seit einiger Zeit über einen vServer unter Debian ebenda. Unter den Projekten ist auch ein kleines Diskussionsforum für unsere Nachbarschaft, betrieben mit phpBB. Und obwohl dies eine wirklich gute Softwarelösung für den Forenbetrieb ist, wuchs doch in letzter Zeit meine Unzufriedeheit mit phpBB. Vor allem das fehlende Responsive-Design wurde immer mehr zum Manko. Ich setzte viele Hoffnungen in die Version 3.1, empfand es aber nach der langen Wartezeit nicht wirklich als den großen Wurf. Zu viele alte Zöpfe wurden mitgeschleppt und es gibt zwar nun die Möglichkeit von responsive Themes, aber im Großen und Ganzen blieb doch die Oberfläche altbacken und von einer modernen Webanwendung meilenweit entfernt.

Meine ersten Versuche mit der phpBB 3.1 zeigten zudem sehr schnell, dass mein bisher benutztes Theme nicht mit der neuen Version lief. Ich hätte also größeren Aufwand für das Update betreiben müssen. All dies brachte mich dazu, nach einer komplett neuen, moderneren Forensoftware Ausschau zu halten. Schnell stieß ich dabei auf Discourse, welches von Grund auf responisve designt ist und auch sonst viele interessante Ansätze für ein Communityforum bietet.

Discourse kommt als installationsfreundlicher Docker-Container daher, der alles vorkonfiguriert mitbringt, was die Software benötigt (und dies ist schon einiges). Kein Problem, dachte ich, ich habe ja root-Zugriff bei meinem vServer. Doch ich irrte…

Installation ohne Docker

Wer sich schon einmal an der Installation vom Docker-Daemon auf einem Strato vServer versucht hat, der wird schnell festgestellt haben, dass sich der Daemon zwar problemlos installieren läßt, beim Start jedoch mit verschiedenen Fehlermeldungen abbricht. Eine zeitlang habe ich mich daran probiert, wobei sich mein Verdacht immer mehr erhärtete, dass hier die grundliegende Ursache im vServer selbst liegen könnte. Eine Anfrage beim Strato-Support bestätigte meinen Verdacht:

Ein für den Betrieb notwendiges Kernel Modul steht auf den Virtual Server Kerneln leider nicht zur Verfügung und wird nach aktueller Planung in Zukunft auch nicht nachinstalliert werden. Daher ist für den Betrieb von Docker ein Dedicated Root Server notwendig.

(Nebenbemerkung: Strato nutzt für die vServer als Virtualisierungslösug Virtuozzo / OpenVZ, also eine Virtualisierug auf Betriebssystembasis, bei dem alle virtuelle Instanzen eines Server den jeweiligen Kernel gemeinsam nutzen. Deswegen können auch keine eigenen Kernelmodule genutzt werden, womit Docker ein Problem hat. Prinzipiell läßt sich die Virtualisierung zwar für die Nutzung von Docker konfigurieren, aber offenbar will Strato dies mometan nicht.)

So schnell wollte ich die Installation von Discourse aber nicht aufgeben. Immerhin ist es OpenSource, und da sollte sich doch ein Weg finden lassen, die Software trotzdem auf dem vServer zum Laufen zu bekommen.

Schritt 1: Automatisierung statt Container

Hinweis: mein vServer läuft unter Debian 8, dementsprechend beschreibt dieser Artikel auch die Installation unter dieser Linux-Distribution. Es sollte aber kein Problem sei, diese auch z.B. unter Ubuntu durchzuführen.

Zum Glück war ich nicht der erste, der Discourse ohne Docker auf seinem Server installieren wollte oder dies nicht konnte. Jamie Nguyen hat sich die Mühe gemacht, ein Ansible Playbook für die Discourse-Installation zu erstellen und auf GitHub zur Verfügung gestellt. Dazu gleich der Hinweis, dass dieser Installationsweg von Discourse nicht supported wird – wer Discourse also in dieser Weise betreibt, ist auf sich alleine gestellt.

Um das Playbook nutzen zu können, müssen wir als erstes als Ansible auf unserem Server installieren. Das ist bei Ansible gut dokumentiert und wir können auf die Anleitung für die Installation via Apt unter Ubuntu zurückgreifen:

$ sudo apt-get install software-properties-common
$ sudo apt-add-repository ppa:ansible/ansible
$ sudo apt-get update
$ sudo apt-get install ansible

Wenn Ansible installiert ist, können wir uns dem Playbook zuwenden.

Schritt 2: Das Drehbuch besorgen und ein paar Szenen umschreiben

Das Playbook können wir uns recht einfach via git herunterladen. Zunächst legen wir uns nach persönlichem Geschmack bzw. Koventionen ein neues Verzeichnis dafür an, in meinem Falle

$ sudo mkdir /var/ansible-discourse

Wir wechseln in das Verzeichnis und führen aus

$ sudo git clone https://github.com/jamielinux/ansible-discourse

Gemäß der Anleitung von Jamie erstellen wir uns eine eigene YAML-Datei und passen Sie für uns an:

$ cd ansible-discourse
$ sudo cp vars_example.yml group_vars/all/main.yml
$ sudo vim group_vars/all/main.yml

Als erstes tragen wir wie beschrieben Hostname, Developer-Mailadresse, ein eigenes Passwort für PostgreSQL und die Daten für die Mailing-Funktion von Discourse ein. Dies ist sehr wichtig, da Mail ein zentrales Element von Discourse ist – wenn dies nicht funktioniert, ist die Installation de facto unbrauchbar. Ich nutze hier die Mailserver ebenfalls von Strato. Die richtige Konfiguration ist leider nirgends dokumentiert, aber nach einigem Probieren und Kombinieren verschiedener Strato-FAQs haben sich diese Einstellungen als brauchbar erwiesen:

discourse_smtp_address:       "smtp.strato.de"
discourse_smtp_port:          "587"
discourse_smtp_username:      "[Mailaccount für Discourse]"
discourse_smtp_password:      "[zugehöriges Passwort]"
discourse_smtp_auth:          "login"
discourse_smtp_start_tls:     "true"

Laut Anleitung könnten wir jetzt loslegen. Das Ansible-Playbook vom Jamie ist allerdings auf einen dedizierten Server mit vollen Zugriffsmöglichkeiten auch auf die Kernel-Module ausgelegt. Wie bereits oben beschrieben, haben wir diese bei einem Strato vServer jedoch nicht. Darum muss das Playbook an einigen Stellen geändert werden, damit das Deployen auch auf dem vServer klappt.

Als erstes sind i.d.R. die Standard-Spracheinstellungen auf dem vServer nicht ausreichend und Perl bricht mit einer Warnung ab, weil die US-locale nicht installiert ist. Dies läßt sich leicht beheben:

$ sudo localedef -i en_US -f UTF-8 en_US.utf8

Das zweite Problem besteht darin, dass Discourse mit Redis für das Caching einherkommt und auch die Installation von Redis ein paar Eingriffe in Kernel-Parameter erfordert, welche auf einem Strato vServer nicht möglich sind. Leider gibt es keine andere Möglichkeit, als diese Features zu deaktivieren – auch wenn Redis stark davon abrät, weil die Performance doch arg leidet. Für mein Forum mit eher wenig Traffic ist dies nicht das Problem, aber eine Discourse-Installation für hohe gleichzeitige Nutzung sollte man so sicher nicht betreiben (dann hat man aber auch wahrscheinlich etwas Größeres als einen vServer zur Verfügung).

Wir öffnen also im heruntergeladenen Playbook die Datei

./roles/redis/tasks/optimize.yml

im Editor und kommentieren mit # folgende Zeilen aus:

#net.core.somaxconn
#net.ipv4.tcp_max_syn_backlog

Nach dem Speichern öffnen wir

./roles/redis/defaults/main.yml

im Editor und setzen folgende Einstellung:

disable_transparent_huge_pages: False

Schritt 3: Das Drehbuch verfilmen

Damit sind alle Vorbereitungen für ein erfolgreiches Deployment auf dem vServer getroffen und wir können das Playbook abspielen. Dazu wechseln wir in das Verzeichnis, in welches wir das Playbook vom git geclont haben und starten

$ sudo ./deploy-local.sh

lehnen uns zurück und schauen die nächsten 20-30 Minuten dabei zu, wie alle Komponenten für Discourse installiert, konfiguriert und gestartet werden. Dann läßt sich Discourse im Browser aufrufen und die Installation durch das Anlegen eines Discourse-Admins abschließen.

Nachbemerkung

Ein letzter Punkt: Discourse bringt mit Nginx einen eigenen Webserver mit, der sowohl in der Docker-basierten wie auch in der Ansible-Installation auf Port 80 konfiguriert ist. Wer wie ich auf seinem Server schon einen Webserver wie Apache httpd laufen hat, möchte vielleicht Discourse auf einen anderen Port konfigurieren, auch damit das Ansible-Playbook durchläuft. Dazu vor dem Deployen des Playbooks in der Datei

./roles/nginx-discourse/templates/discourse.conf.j2

alle Einträge von Port 80 auf den gewünschten neuen Port ändern.

Beitragsbild By NASA – http://spaceflight.nasa.gov/gallery/images/shuttle/sts-129/html/iss021e029824.html, Public Domain, https://commons.wikimedia.org/w/index.php?curid=8513049

WordPress : Menu-Verweis auf alle Beiträge im Blog

WordPress hat sich im Laufe der Jahre von einem reinen Blogger-System zu einem ansehbaren Content-Management-System entwickelt. Gerade für kleine und mittlere Webseiten eignet es sich sehr gut, weil jeder mit recht wenig Aufwand und dank vielfältiger Plugins und (frei verfügbarer) Themes schnell zu einem ansehnlichen Ergebnis gelangt. Auch diese Webseite wird mit WordPress betrieben.

Vielfach ist es jedoch so, dass gar kein Blog betrieben werden soll bzw. das der Blog nur ein Bestandteil unter vielen einer Webseite sein soll und ansonsten weitere Informationen auf statischen Seiten vermittelt werden sollen. Auch das ist kein Problem, kann man doch mittlerweile bei den Lese-Einstellungen von WordPress auch eine statische Seite als Startseite angeben.

Auch auf meiner Website sollten die Blogbeiträge nicht sofort angezeigt werden, sondern sich in die anderen Seiten einreihen. Darum war die Idee, eine statische Startseite zu haben und auf die Blogbeiträge dann über das Menu zu verweisen. Auch das geht einfach in WordPress, ist allerdings nicht ganz einleuchtend und ich musste etwas suchen, bis ich die Lösung gefunden hatte (darum hier eine kurze Beschreibung):

Unter den Einstellungen > Lesen findet sich die eben erwähnte Möglichkeit auszuwählen, ob die Blogbeiträge oder eine statische Seite zum Start angezeigt werden sollen. Die gewünschte Startseite kann über das Pull-Down aus den existierenden Seiten ausgewählt werden. Darunter befindet sich ein weiteres Pull-Down „Beitragsseite“, aus dem man ebenfalls die existierenden Seiten auswählen kann. Dies ist etwas verwirrend, das sind ja eigentlich statische Seiten, die ich aus gutem Grund so erstellt habe. Wie verlinke ich aus dem Menu also auf die Blogbeiträge?

Die Lösung: ich erstelle eine neue statische Seite (in meinem Fall mit dem Titel „Blog“) ohne jeglichen Inhalt. Diese wähle ich dann im Pull-Down für die Beitragsseite aus.

scrs-wp-einstellungen-lesen

Nun kann ich einen neuen Menueintrag z.B. unter Design > Menu erstellen und dabei auf die Seite „Blog“ verweisen. Beim Aufruf finden sich dort alle Beiträge des Blogs nach Datum absteigend sortiert, wie man es von WordPress gewohnt ist.

scrs-wp-einstellungen-menu

Yet another Blog

Im Rahmen meiner beruflichen Tätigkeit oder meines Lehrauftrags am Institut für Informations- und Bibliothekswissenschaft stosse ich immer wieder auf interessante Themen, Fragestellungen und Probleme aus der Bibliothekswelt, die für eine nähere Betrachtung lohnenswert erscheinen.

Darum möchte ich in diesem Blog – wenn auch sicher nur sporadisch – diese Dinge aus dem Bereich des IT-Einsatzes in Bibliotheken mit Fokus auf die Digitale Bibliothek näher beleuchten. Schwerpunkte werden dabei sein elektronische Ressourcen mit all ihren technischen Facetten, Technologien für Dokumentenspeicher und Repositorien, Digitalisierung und Langzeitarchivierung.