Überschriften für eher technische Blogeinträge zu finden ist gar nicht so einfach. In diesem Blogeintrag soll es nochmal um das Discourse Forum gehen, dessen Installation ich hier neulich als Docker Container vorgestellt habe. Ich habe ein paar positive Rückmeldungen erhalten und eine wichtige Frage beantworten, die immer wieder auftauchte:
Wie installiere ich das Discourse Forum als Docker Container neben einem bereits auf Port 80 laufenden Apache Webserver in einer Subdomain, also so etwas wie http://forum.serverblogger.ch?
Ja, und nun machen Sie mal eine Überschrift daraus 🙂
Aber zurück zur Frage. Die einfachste Variante ist das Discourse Forum auf einem anderen Port laufen zu lassen, beispielsweise 85, und dann das Proxy Modul des Apache Webservers innerhalb eines Virtual Hosts zu nutzen um die Anfragen von Port 80 (Apache) nach Port 85 (Discourse) weiterzuleiten.
Konfiguration Discourse Forum
Wenn Sie Ihr Discourse Forum so wie in „Discourse – das bessere Forum“ beschrieben installieren, läuft es auf Port 80. Um es auf Port 85 laufen zu lassen, müssen Sie in der Datei containers/app.yml die entsprechende Zeile ändern.
cd /var/discourse
sudo nano containers/app.yml
## which TCP/IP ports should this container expose?
expose:
- "85:80" # fwd host port 85 to container port 80 (http)
Danach müssen Sie die das Paket neu aufbauen
sudo ./launcher rebuild app
Der Container wird automatisch gestartet. Danach können Sie den Discourse Container mit diesen Befehlen stoppen und starten:
Falls Sie das das Apache Proxy Modul noch nicht aktiviert haben, so wird es jetzt Zeit:
sudo a2enmod proxy_http
sudo a2enmod proxy
Starten Sie danach den Apache2 Server neu
sudo service apache2 restart
Leiten Sie die Anfragen mit den folgenden Befehlen weiter
<VirtualHost forum.serverblogger.ch:80>
ProxyPreserveHost On
ProxyRequests Off
ServerName forum.serverblogger.ch
ProxyPass / http://46.232.178.78:85/
ProxyPassReverse / http://46.232.178.78:85/
</VirtualHost>
Aktivieren Sie die die vhost Konfiguration und starten Sie den Apache neu
sudo a2ensite forum.serverblogger.ch.conf
sudo service apache2 reload
Wenn Sie nun das Discourse Forum unter der neuen URL http://forum.serverblogger.ch aufrufen, ist das Ziel erreicht. Discourse – auf Port 80 in Subdomain
tl;dr: Docker Container verstehen sich auch mit einem bereits konventionell installierten Apache Webserver sehr gut
Das Motto von Discourse ist schon eine echte Herausforderung!
Civilized Discussion. On the Internet.
Die Idee hinter diesem Projekt ist eine Verbesserung der Diskussionskultur in Internetforen. Discourse ist eine Mischung aus einer mailing Liste, einem Diskussionsforum und einem Chatroom.
Aus Benutzersicht gibt es viele Features, die in sozialen Netzwerken heute Standard sind, wie beispielsweise „unendliches Scrollen“, Updates ohne die Seite aktualisieren zu müssen und Drag und Drop Dateianhänge. Discourse basiert auf JavaScript, Ruby on Rails, Redis und PresgreSQL und ist nicht ganz einfach auf gängigen LAMP Hosting Umgebungen zu installieren.
Die Technik allein führt ebenfalls kaum zu einer Verbesserung der Diskussionskultur und so wird grosser Wert auf soziale Prozesse gelegt. Themen können zusammengefasst werden, Nutzer können sich Vertrauen „erarbeiten“ auf der Basis verschiedener Parameter. Ein Moderationsystem versucht SPAM, schräge Inhalte und Auseinandersetzungen zu minimieren. Nutzer können interessante Beiträge „liken“ und hervorheben. Innerhalb der Beiträge können Zitate des vorhergehenden Beitrags auf- und zugeklappt werden. Es ist geeignet für Touch-Geräte und wechselt automatisch Layouts.
Discourse ist in 17 Sprachen verfügbar und hat eine beeindruckende Zahl von Plugins. Sie können Discourse beispielsweise in einer statischen Website einbinden um Kommentare zur ermöglichen. Auch in WordPress ist eine Einbindung möglich. Es gibt Anmeldemöglichkeiten über gängige Social Networks und natürlich Emojis und Avatare.
Alles wirkt sehr flauschig und gut und das meine ich ehrlich und nicht zynisch.
Es ist schade, dass Discourse durch die Software-Anforderungen nicht so verbreitet ist und daher dachte ich nach der Docker Vorstellung (Testumgebungen mit Docker), dass das geändert werden muss.
Ich beschreibe in diesem Post die Installation von Discourse aus einem Docker Image.
Um Discourse starten zu können, müssen Sie noch die Konfigurationsdatei anpassen
sudo nano containers/app.yml
Sie müssen dort den Domainnamen, den Port, den SMTP Server, Benutzer und Passwort eintragen. Der Mail Server ist wichtig. Ohne einen funktionierenden Mailserver können Sie kein Administrator- und keine Benutzerkonten anlegen.
Falls Sie keinen Mail-Server eingerichtet haben, könnten Sie sich auch kostenlos einen bei MailGun erstellen.
Der folgende Befehl richtet die komplette Umgebung für und das Forum selbst ein. Die Einrichtung kann durchaus ein paar Minuten dauern.
sudo ./launcher bootstrap app
Danach können Sie den Discourse Container mit diesen Befehlen starten und stoppen
Falls der E-Mail Versand nicht funktioniert und Sie etwas in der Konfigurationsdatei ändern müssen, müssen Sie anschliessend die App neu aufbauen
sudo ./launcher rebuild app
Forum einrichten
Nachdem Discourse gestartet wurde, können Sie es im Browser aufrufen
Discourse
Die E-Mail, die Sie nach dem Sign Up erhalten, enthält einen Bestätigungslink.
Bestätigungsemail von Discourse
Nach der Bestätigung sollten Sie ihr Forum mit öffentliche Themen und öffentliche Beiträge starten um eine Diskussion in Gang zu bringen.
Discourse – Einrichtung
Discourse gibt sinnvolle Ratschläge bei der Erstellung von Topics und die Einrichtung ist weitgehend selbsterklärend.
Sie sollten sich Gedanken um die Ziele dieses Forums machen und vermutlich merken Sie sehr schnell, dass dieses Projekt sehr durchdacht ist 🙂
Discourse – Neues Topic
Benutzeranmeldungen
Benutzer erhalten nach Ihrer Registrierung eine übersichtliche E-Mail in der die Software erklärt wird und deutlich gemacht wird, dass es um „zivilisierte“ Diskussionkultur geht. Discourse – Willkommen E-MailDiscourse – Willkommen E-Mail
Fazit
Mit Docker ist es wirklich einfach, Anwendungen wie Discourse auf dem eigenen Server zu erforschen. Ob Sie bei einem produktiven Einsatz die Docker Variante oder einen eigenen Server für Ihr Forum nutzen ist auch einfacher zu entscheiden, wenn man erstmal ausführlich ausprobieren konnte.
Wenn Sie einen eigenen Root-Server nutzen, haben Sie oft das Problem, dass die Installation verschiedener Programmpakete wirklich komplex werden kann. Stellen Sie sich vor, sie benötigen „mal eben“ 15 WordPress Instanzen für eine Schulung oder wollen ein Programm ausprobieren, das nicht so wirklich zu Ihrem LAMP Stack passt wie beispielsweise die Blogsoftware Ghost oder das Diskussionsforum Discourse.
Docker bietet dafür eine Lösung.
Sie installieren die Docker Software auf Ihrem Betriebssystem und können dann sogenannte Images vom Docker Hub herunterladen.
Diese Images sind in etwa mit Legosteinen vergleichbar. Für die 15 WordPress Installationen benötigen Sie beispielsweise das WordPress und das MySQL Image. Danach können Sie beliebig viele MySQL und WordPress Container auf verschiedenen Ports starten. Variablenwerte wie MySQL Passworte werden beim Containeraufruf mitgegeben, so dass die beiden Images gut zusammenspielen können.
Die Container und die darin enthaltenen Daten können verwaltet werden. In unserem einfachen Fall können Sie beispielsweise nach Kursende gelöscht werden.
Docker ist natürlich viel mehr und erheblich komplexer, als ich das eben dargestellt habe, nichtsdestotrotz ist die Kernidee hinter Docker Installations- und Verteilungsprozesse zu vereinfachen. Es gibt Docker für Ubuntu, Mac OS X, Microsoft Windows, Amazon EC2, Arch Linux, CentOS, CRUX Linux, Debian, Fedora, FrugalWare, Google Cloud Platform, Gentoo, IBM Softlayer, Joyent Compute Service, Microsoft Azure, Rackspace Cloud, Red Hat Enterprise Linux, Oracle Linux und SUSE, und das ganze Projekt ist natürlich ein Startup und es geht um viel Geld und überhaupt …
Schauen Sie sich die beiden Videos und diese Link-Übersicht an, wenn Sie sich für die ganze Story interessieren.
Installation
Zunächst muss die Docker Software auf unserem Testserver installiert werden. Wir benutzen Ubuntu 14.04 LTS und aktualisieren zunächst mal.
sudo apt-get update
sudo apt-get upgrade
Docker orientiert sich am Kernel. Die Version Ihres Kernel erfahren Sie über den Befehl
$ uname -r
3.13.0-49-generic
Um Docker zu installieren, benötigen Sie nur einen Befehl (und natürlich das Paket wget -> apt-get install wget)
wget -qO- https://get.docker.com/ | sh
Sie werden nach dem Root Passwort gefragt und Docker wird installiert. Damit alles funktioniert, müssen Sie sich einmal ab- und wieder anmelden. Testen Sie dann, ob Docker korrekt installiert ist mit dem Befehl docker run hello-world. Der run Befehl versucht einen Container aus einem lokalen Image zu starten. Findet er kein Image, versucht er das entsprechende Image herunterzuladen, so wie hier in meinem Fall.
$ sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from hello-world
a8219747be10: Pull complete
91c95931e552: Already exists
hello-world:latest: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security.
Digest: sha256:aa03e5d0d5553b4c3473e89c8619cf79df368babd18681cf5daeb82aab55838d
Status: Downloaded newer image for hello-world:latest
Hello from Docker.
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(Assuming it was not already locally available.)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
Das funktioniert also schon mal gut. Mit dem Befehl docker ps -a können Sie sich alle laufenden Container anzeigen lassen
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2f6ab4eba9b0 hello-world:latest "/hello" 4 minutes ago Exited (0) 4 minutes ago insane_elion
Sie können den Container stoppen mit dem Befehl
sudo docker stop insane_elion
insane_elion ist der Name, der für diesen Container vergeben wurden. Falls kein Name zur Verfügung steht, können Sie auch die ersten Ziffern der Container-ID nehmen.
Löschen können Sie einen Container mit dem Befehl
sudo docker rm insane_elion
Viele WordPress Installationen
Lassen Sie uns das Beispiel mit den 15 WordPress Installationen kurz durchspielen.
Sie müssen die Images WordPress und MySQL laden
sudo docker pull wordpress
sudo docker pull mysql
Sie müssen einen MySQL Container pro WordPress Instanz anlegen und ihm ein Passwort mitgeben, damit der WordPress Installer eine Datenbank anlegen kann.
sudo docker run --name mysql-wp1 -e MYSQL_ROOT_PASSWORD=8k6lgg35aq1 -d mysql
sudo docker run --name mysql-wp2 -e MYSQL_ROOT_PASSWORD=8k6lgg35aq2 -d mysql
sudo docker run --name mysql-wp3 -e MYSQL_ROOT_PASSWORD=8k6lgg35aq3 -d mysql
usw.
sudo docker run --name mysql-wpx -e MYSQL_ROOT_PASSWORD=xxxxxxxxxxx -d mysql
Nun brauchen Sie jeweils eine WordPress Instanz, die mit dem MySQL Container verlinkt wird und auf einem bestimmten Port läuft
können Sie nachsehen, ob alles passt und wenn Sie nun im Browser den entsprechenden Port aufrufen, in meinem Fall http://serverblogger.ch:8081 und weitere, so erscheint jeweils der Web-Installer von WordPress. WordPress Installation
An diesem Punkt werden Sie beginnen, fasziniert zu sein 🙂
Ausser den offiziellen Images von Docker gibt es auch von Benutzern zur Verfügung gestellte Images. Ich möchte Ihnen ein Beispiel für Joomla zeigen. Sie müssen sich beim Docker Hub registrieren, um die zur Verfügung stehen Images durchsuchen zu können. Der Benutzer gjong hat beispielsweise ein Joomla Image gebaut, das alles enthält, was man so braucht. Sie installieren es mit dem Befehl
sudo docker pull gjong/apache-joomla
Das MySQL Passwort ist in diesem Fall leer und gjong empfiehlt diesen Startbefehl
sudo docker run -d -p 80:80 gjong/apache-joomla
Ich würde noch einen Namen mitgeben und ihn auf einem freien Port starten (nach der WordPress Apokalypse 🙂 ), sagen wir mal 8099
sudo docker run --name joomla1 -d -p 8099:80 gjong/apache-joomla
Rufen Sie mal den Port im Browser auf Joomla Installer