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.