Foren zeitgemäß und in Eigenregie: Discourse via Docker installieren

Erster Aufruf von Discourse per Browser nach erfolgreicher Installation
Erster Aufruf von Discourse per Browser nach erfolgreicher Installation

Foren, Boards und Mailinglisten gehören seit vielen Jahren zu den Standard-Anwendungen für Diskussionen im Internet – lange bevor die sogenannten sozialen Medien auftauchten. Die Open-Source-Software Discourse verspricht eine neue, zeitgemäße Interpretation des alten Themas und bietet sich als Alternative zu kommerziellen Lösungen wie Disqus an. Dank moderner Features wie responsivem Design und dynamischem Nachladen von Inhalten verhält sich Discourse wie eine App – egal ob auf dem Desktop oder im Smartphone. Traditionelle Foren-Software wie PHP BB sieht dagegen buchstäblich alt aus. Und was spricht dagegen, einen gepflegten Diskurs in eigener Regie zu führen, statt das Outsourcing zu einem externen Dienst mit allen Risiken und Nebenwirkungen zu betreiben?

Discourse lässt sich entweder auf dem eigenen Server installieren oder über einen kostenpflichtigen Hosting-Service nutzen. Um Discourse selbst zu hosten, wird ein Server mit Ruby on Rails samt Unicorn als Webserver, PostgreSQL als relationaler Datenbank und Redis als NoSQL-Speicher/Cache benötigt. Nein, das ist nicht die typische LAMP-Umgebung. Als Installations-Alternative empfehlen und dokumentieren die Entwickler deshalb ein schlüsselfertiges Docker-Image:

Set up Discourse in the cloud in under 30 minutes with zero knowledge of Rails or Linux shell using our Discourse Docker image.

Nun, das kommt im Normalfall durchaus hin. Natürlich muss es nicht die „Cloud“ sein, ein eigener Server reicht völlig – selbst der eigene Notebook/PC macht’s. Dort müssen Docker und das Versionskontrollsystem Git installiert sein – einen Einzeiler habe ich in meinem Verzeichnis nützlicher Ubuntu-Software gepostet. Und ja, Docker läuft auch unter Windows.

Discourse installieren. Anschließend schafft man auf dem Rechner Platz für Discourse – ich übernehme hier das empfohlene Installationsverzeichnis /var/discourse -, holt sich mit Git das aktuelle Image und startet das Setup-Script. All das bitte mit Root-Rechten:

$ mkdir /var/discourse
$ git clone https://github.com/discourse/discourse_docker.git /var/discourse
$ cd /var/discourse/
$ discourse-setup

Der letzte Befehl startet des Setup-Skript für Discourse. Aber einen Moment noch: Es spricht zwar fast alles dafür, dieses Bash-Skript zu nutzen, erzeugt es doch automatisch das Konfigurations-Template, auf dessen Basis dann die automatisierte Installation von Discourse angestoßen wird. Es gibt aber leider auch Situationen, in denen man selbst Hand anlegen muss:

  • Auch wenn ein deutschsprachiges Forum aufgesetzt werden soll – Discourse wird erst einmal auf Englisch konfiguriert. Zwar ist die Software von Natur aus multilingual, und die Sprache lässt sich später ändern: Jeder Nutzer kann seine eigene Sprache wählen bzw. Discourse berücksichtigt die vom Browser mitgeteilte Sprachpräferenz; zudem lassen sich alle Sprachvorlagen im Admin-Bereich unter Customize ändern. Jedoch wird eine überschaubare Zahl von Texten wie das Willkommens-Posting für neue Benutzerbeim Erst-Setup auf Englisch in die Datenbank geschrieben, ohne dass eine Besucher-seitige Sprach-Einstellung dies ändern würde – die Texte stehen ja schon auf Englisch in der Datenbank. Wer das nicht will, muss die Sprache vor der Erstinstallation selbst konfigurieren oder die Texte eben nach der Installation im Admin-Bereich ändern. Letzteres stellt auch kein großes Problem dar, da es sich wie gesagt um eine überschaubare Zahl von Texten handelt, die ohnehin noch vom Admin an die Zwecke des eigenen Forums angepasst werden müssen. Die Sprachvorlagen finden sich in der deutschen Sprachdatei (Link führt auf Github, natürlich existiert die Datei nach Installation auch auf dem eigenen Server).
  • Ein echter Showstopper für das Setup, das dann auch prompt abgebrochen wird, ist diese Fehlermeldung:

    If you are trying to run Discourse simultaneously with another web server like Apache or nginx, you will need to bind to a different port

    Das passiert, wenn bei Ihnen bereits einen Webserver läuft; da Discourse seinen eigenen Webserver mitbringt, machen sich beide nun den Standardport 80 streitig. Aus den 30 Minuten Blitzinstallation wird nun nichts mehr. Um eine friedliche Koexistenz zu erreichen, müssen Sie auf Ihrem Hostsystem einen Proxy aufsetzen, der alle für die Discourse-Website gedachten Anfragen auf einen anderen Port (gerne genommen: 8080) umleitet; damit Discourse dort lauscht, müssen Sie den neuen Port selbst in das Konfigurations-Template eintragen.

In beiden Fällen muss man also selbst Hand anlegen, und zwar vor Ausführung des Setup-Skriptes, welches beim Erstellen des Konfigurations-Templates auf eine Vorlage unter samples/standalone.yml zurückgreift; wenn man in dieser Datei vorab einen anderen Port und/oder eine andere Sprache konfiguriert, dann wird das Setup-Skript diese Einstellungen übernehmen. Alles weitere steht weiter unten unter Konfigurations-Tweaks.

Läuft das Setup-Programm wie gewünscht durch, erfragt es zunächst ein paar Angaben:

  • Die Domain (Hostname) für Discourse
  • Die E-Mail-Adresse des Administrators und die Zugangsdaten zu dem Mailserver, den Discourse nutzen soll
  • Außerdem bietet das Setup an, automatisch über Let’s Encrypt ein SSL-Zertifikat für die Domain zu erzeugen; das ist empfehlenswert, wenn man noch kein Zertifikat hat, lässt sich aber auch später noch erledigen.

Nach diesem kurzen Frage-und-Antwort-Spiel geht das Bootstrapping los: Das Docker-Image wird heruntergeladen, dann Software und Plattform im Container eingerichtet; nicht wundern, die Protokollierung im Terminal ist sehr ausführlich. Nach erfolgreicher Installation meldet das Setup-Programm:

Successfully bootstrapped, to startup use ./launcher start app

Nun, das Setup-Skript hat die Anwendung bereits gestartet; die Discourse-Website sollte also über den Browser erreichbar sein. Beim ersten Aufruf werden Sie eine Seite wie oben im Bild erblicken. Nun gilt es, mit der beim Setup angegebenen E-Mail-Adresse das Admin-Konto zu registrieren; sollten Sie keine E-Mail bekommen, dann haben Sie wahrscheinlich beim Setup die Mailserver-Daten nicht korrekt ausgefüllt. Sie müssen also noch einmal ran an die Konfiguration.

Konfigurations-Tweaks. Das Konfigurations-Template zum Bau des Discourse-Containers findet sich unter containers/app.yml – zum Bearbeiten nehmen Sie Ihren favorisierten Texteditor. Aber Vorsicht: Die Templates benutzen das Auszeichnungsformat YAML: Einrückungen und andere Leerzeichen dürfen beim Editieren nicht unter den Tisch fallen, sonst funktioniert das Parsen nicht. Damit die Konfigurations-Änderungen wirksam werden, muss der Container anschließend gestoppt, auf der Basis des modifizierten Templates erneut gebaut und gestartet werden. Dabei gehen – Docker sei Dank – keine Anwendungsdaten verloren. Eine einzige Befehlszeile erledigt den Job:

$ ./launcher rebuild app
  • Um die Daten des Mailservers zu ändern, gehen sie zu dem entsprechenden Absatz. Das sollte im Regelfall etwa so aussehen, wobei Sie Adresse, Username und Passwort in jedem Fall anpassen müssen:
    ## TODO: The SMTP mail server used to validate new accounts and send notifications
    DISCOURSE_SMTP_ADDRESS: smtp.domain.de
    DISCOURSE_SMTP_PORT: 25
    DISCOURSE_SMTP_USER_NAME: username
    DISCOURSE_SMTP_PASSWORD: "geheim"
    DISCOURSE_SMTP_ENABLE_START_TLS: true           # (optional, default true)
  • Damit Discourse Deutsch spricht, muss im Konfigurations-Template an zwei Stellen eingegriffen werden. Damit PostgreSQL richtig sortiert:
    params:
      db_default_text_search_config: "pg_catalog.german"

    Weiter unten stellt man den deutschen Zeichensatz ein:

    env:
      LANG: de_DE.UTF-8
      DISCOURSE_DEFAULT_LOCALE: de

    Ändert man die Default locale auf „de“ und entfernt das Kommentarzeichen, so wird Discourse deutsche Texte für die Willkommens-Nachricht und andere Standard-Postings in die Datenbank schreiben – aber nur, wenn Sie diese Einstellung vor dem initialen Setup vornehmen. Legen Sie im Forums-Betrieb Wert darauf, die Default locale per Browser im Admin-Bereich zu ändern, können Sie diesen Eintrag später wieder im Konfigurations-Template auskommentieren.

  • Um Ihre Discourse-Website über HTTPS erreichbar zu machen, können Sie die eingebaute Unterstützung für Let’s Encrypt nutzen. Entfernen Sie dazu im Konfigurations-Template das Kommentarzeichen in den beiden relevanten Zeilen wie folgt:
    ## Uncomment these two lines if you wish to add Lets Encrypt (https)
      - "templates/web.ssl.template.yml"
      - "templates/web.letsencrypt.ssl.template.yml"

    Anschließend müssen Sie noch eine funktionierende E-Mail-Adresse eintragen, die Let’s Encrypt als Webmaster-Adresse nutzt, und auch hier das Kommentarzeichen entfernen:

      ## If you added the Lets Encrypt template, uncomment below to get a free SSL certificate
      LETSENCRYPT_ACCOUNT_EMAIL: webmastername@domain.com
  • Um den Port, auf dem der Discourse-Webserver lauscht, zu ändern, modifizieren Sie das Port-Mapping im Konfigurations-Template. Im folgenden Beispiel werden Aufrufe über den Port 8080 im Container an den Port 80 weitergeleitet:
    ## which TCP/IP ports should this container expose?
    ## If you want Discourse to share a port with another webserver like Apache or nginx,
    ## see https://meta.discourse.org/t/17247 for details
    expose:
      - "8080:80"   # http

    Discourse ist anschließend im Browser nur noch über eine Adresse wie http://discourse.domain.de:8080 erreichbar. Wenn Sie im Hostsystem einen Proxy konfigurieren, dann kann dieser alle auf Port 80 eingehenden Anfragen für http://discourse.domain.de an einem bereits vorhandenen Webserver vorbei auf Port 8080 umleiten, so dass sie im Docker-Container wieder auf Port 80 ankommen. Wenn der Webserver nginx heißt, ist das recht einfach zu realisieren. Ansonsten sollte man einen Spezialisten wie HAProxy nutzen.

Das bekommt der Admin nach dem ersten erfolgreichen Login zu sehen
Das bekommt der Admin nach dem ersten erfolgreichen Login zu sehen

Erste Schritte. Hat sich der Admin das erste Mal auf der frischen Website eingeloggt, werden ihm gleich lauter Betätigungsfelder aufgezeigt. Der Admin Quick Start Guide wartet darauf, durchgearbeitet zu werden; verschiedene Themen wie eine Willkommens-Botschaft oder die Datenschutz-Mitteilung sind bereits angelegt und sollten inhaltlich überarbeitet werden. Auf dem Admin-Dashboard (erreichbar über den Menü-Button oben rechts) findet man nicht nur viele nützliche Statistiken, sondern auch eine To-Do-Liste („Some problems have been found with your installation of Discourse“), die man eher früher als später abarbeiten sollte.

Überhaupt macht Discourse einen guten Job, das komplexe Admin-Leben so übersichtlich wie möglich zu gestalten. Na denn: Fröhliches Diskutieren.

Schreibe einen Kommentar