Discourse installieren

Aus Hostsharing Wiki
Wechseln zu: Navigation, Suche

Für Managed Server

Ein funktionierender Discourse-Server erfordert mehrere laufende Server-Dienste. Für den Betrieb ist ein Managed Server sinnvoll.


Support von der Discourse-Community

Die Discourse-Entwickler haben sich entschieden, nur eine mehr oder weniger genormte Installationsmethode (via docker) zu unterstützen. Dies ist so auf der hostsharing-Architektur aufgrund mehrerer Bedenken und Überlegungen nicht möglich. Die Community ist durchaus hilfreich, geht aber davon aus, dass quasi alle Nutzer* eine "supported"e Installation durchgeführt haben. Wenn man in entsprechenden Kanälen nach Hilfe fragt, sollte man unbedingt erwähnen, dass man discourse selber anhand dieser hier lesbaren Anleitung installiert hat, um bereits entsprechenden Kommentaren und Nachfragen vorzugreifen.


Über

In diesem Artikel wird die Installation von discourse, Version 2.1.0 (September 2018) beschrieben.

Vorbereitungen

Mit Hilfe von HSAdmin wird angelegt:

  1. Ein User als Service-User mit /bin/bash als Shell, zum Beispiel Beispiel: xyz00-discourse
  2. Eine Domain mit xyz00-discourse' als Domain-Administrator, zum Beispiel beispiel.discussion
  3. Einen Postgresql-User xyz00_discourseuser mit Passwort meinPasswort
  4. Eine Postgresql-Datenbank xyz00_discoursedb mit Datenbank-Owner xyz00_discourseuser

Verwendete IP-Ports der Server-Dienste:

  1. Redis: localhost:32002
  2. Discourse-Web: localhost:13000

Konfiguration der PostgreSQL Datenbank

PostgreSQL Extensions

Die PostgreSQL-Datenbank braucht die extensions ``hstore`` und ``pg_trm``. Diese müssen vom hostsharing-support installiert werden.


Ansonsten liefe die Erstellung der Datenbank so:

 su - postgres -c psql
 CREATE DATABASE discourse;
 CREATE USER discourse;
 ALTER USER discourse WITH ENCRYPTED PASSWORD 'password';
 ALTER DATABASE discourse OWNER TO discourse;
 \connect discourse
 CREATE EXTENSION hstore;
 CREATE EXTENSION pg_trgm;

Entsprechende Funktionalität (von den extensions abgesehen) ist auch über den HSAdmin verfügbar.

Konfiguration des Redis Server

Firewall/Redis Port

Leider unterstützt discourse nicht die Kommunikation mit Redis über Unix-Sockets. Dementsprechend muss der für Redis konfigurierte Port von dem hostsharing-Support in der Firewall freigegeben werden.


   cd
   mkdir redis/etc redis/lib redis/log redis/run

Anlegen einer Datei /home/pacs/xyz00/users/discourse/redis/etc/redis.conf mit folgendem Inhalt:

   daemonize no
   pidfile /home/pacs/xyz00/users/discourse/redis/run/redis-server.pid
   port 32002
   tcp-backlog 128
   bind 127.0.0.1
   timeout 300
   loglevel notice
   logfile /home/pacs/xyz00/users/discourse/redis/log/redis.log
   databases 16
   save 900 1
   save 300 10
   save 60 10000
   slave-serve-stale-data yes
   appendonly no
   dbfilename dump.rdb
   dir /home/pacs/xyz00/users/discourse/redis/lib

Installation von Ruby

Als User xyz00-discourse: Installation von Ruby mit rbenv mit folgenden Befehlen:

Zunächst rbenv and ruby-build:

   git clone https://github.com/rbenv/rbenv.git ~/.rbenv
   cd ~/.rbenv && src/configure && make -C src
   echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.profile
   echo 'eval "$(rbenv init -)"' >> ~/.profile

starte neue Shell:

   exec bash

Überprüfe rbenv-Installation

   type rbenv

Installiere ruby-build als rbenv-Plugin

   git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build

Nun kann die benötigte Ruby-Version installiert werden:

   rbenv install 2.4

Installation von Discourse selber

Weiterhin Als User xyz00-discourse:

   cd ~
   git clone https://github.com/discourse/discourse.git discourse
   cd ~/discourse

Die stabile Version auschecken:

   git checkout stable

Ruby Pakete installieren:

   gem install bundler
   bundle install -j$(getconf _NPROCESSORS_ONLN) --deployment --without development test

Konfiguration der Discourse Software

Anlegen einer Datei /home/pacs/xyz00/users/discourse/discourse/config/discourse.conf anhand der Beispiel-Datei:

   cd ~/discourse
   cp config/discourse_defaults.conf config/discourse.conf

Anpassen folgender Inhalte:

   db_host = 127.0.0.1
   db_port = 5432
   #db_backup_port = 5432 #(auskommentieren)
   db_name = xyz00_discoursedb
   db_username = xyz00_discourseuser
   db_password = "" #db password
   hostname = "discourse.xyz00" # hostname
   smtp_address = localhost
   smtp_enable_start_tls = false
   smtp_openssl_verify_mode = 'none'
   developer_emails = # your email-address
   redis_host = 127.0.0.1
   redis_port = 32002

TODO: Secrets setzen!

Die Zufallswerte für die Variablen SECRET_KEY_BASE und OTP_SECRET erzeugt man durch zwei Aufrufe des Kommandos

   RAILS_ENV=production bundle exec rake secret

Sidekiq für Hintergrund-Aufgaben konfigurieren

config/sidekiq.conf

Initialisieren der Datenbank

   export SAFETY_ASSURED=1
   # In Version 2.0.4 funktioniert db:migrate noch, ansonsten schema:load und seed nutzen!
   #RAILS_ENV=production bundle exec rails db:schema:load
   #RAILS_ENV=production bundle exec rails db:seed
   RAILS_ENV=production bundle exec rails db:migrate

Kompilieren der Assets

   RAILS_ENV=production bundle exec rails assets:precompile

Konfiguration des Web-Servers (am Beispiel Puma)

Die Datei config/puma.conf anpassen (hier nur Änderungen angezeigt):

 APP_ROOT = '/home/pacs/xyz00/users/discourse/discourse'
 daemonize false

Starten der Dienste

Zum Start aller notwendigen Dienste wird in dieser Anleitung supervisor benutzt. Hier ein Beispiel für eine Datei ~/supervisor/etc/supervisord.conf (überlange Zeilen werden hier im Wiki umgebrochen)

[supervisord]
logfile=/home/pacs/xyz00/users/discourse/supervisor/log/supervisord.log
logfile_maxbytes=50MB
logfile_backups=10
loglevel=error
pidfile=/home/pacs/xyz00/users/discourse/supervisor/run/supervisord.pid
minfds=1024
minprocs=200
childlogdir=/home/pacs/xyz00/users/discourse/supervisor/log/

[unix_http_server]
file=/home/pacs/xyz00/users/discourse/supervisor/run/supervisord.sock

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///home/pacs/xyz00/users/discourse/supervisor/run/supervisord.sock

[program:redis]
command=/usr/bin/redis-server /home/pacs/xyz00/users/discourse/redis/etc/redis.conf
stderr_logfile = /home/pacs/xyz00/users/discourse/supervisor/log/redis-stderr.log
stdout_logfile = /home/pacs/xyz00/users/discourse/supervisor/log/redis-stdout.log

[program:discourse-web]
directory=/home/pacs/xyz00/users/discourse/discourse
environment=RAILS_ENV="production"
command=/home/pacs/xyz00/users/discourse/.rbenv/shims/bundle exec puma -C config/puma.rb -b tcp://127.0.0.1:13000
stderr_logfile = /home/pacs/xyz00/users/discourse/supervisor/log/discourse-web-stderr.log
stdout_logfile = /home/pacs/xyz00/users/discourse/supervisor/log/discourse-web-stdout.log

[program:discourse-sidekiq]
directory=/home/pacs/xyz00/users/discourse/discourse
environment=RAILS_ENV="production"
command=/home/pacs/xyz00/users/discourse/.rbenv/shims/bundle exec sidekiq -C /home/pacs/xyz00/users/discourse/discourse/config/sidekiq.yml
stderr_logfile = /home/pacs/xyz00/users/discourse/supervisor/log/discourse-sidekiq-stderr.log
stdout_logfile = /home/pacs/xyz00/users/discourse/supervisor/log/discourse-sidekiq-stdout.log

Einrichten des Apache VHost

   cd ~/doms/beispiel.discuss
   rm -rf htdocs-ssl subs/www subs-ssl/www
   ln -s ~/live/public htdocs-ssl
   touch htdocs-ssl/.htaccess

Dann die htdocs-ssl/.htaccess (durch das gelinkte Verzeichnis entspricht das dem Pfad /home/pacs/xyz00/users/discourse/discourse/public/.htaccess ) mit dem Editor der Wahl öffnen und folgende Konfiguration einfügen:

 DirectoryIndex disabled
 
 RequestHeader set X-Forwarded-Proto "https"
 
 RewriteEngine On
 RewriteBase /
 RewriteCond %{REQUEST_FILENAME} !-f
 RewriteCond %{REQUEST_FILENAME} !-l
 RewriteRule .* http://127.0.0.1:13000%{REQUEST_URI} [proxy,last]

Cronjobs

Cron wird für genutzt, um nach dem Server reboot supervisord zu starten.

Einrichten der crontab mit cronttab -e

   HOME=/home/pacs/xyz00/users/discourse
   MAILTO=discourse@beispiel.discuss
   RAILS_ENV=production
   NUM_DAYS=31
   
 @reboot         /usr/bin/supervisord -c /home/pacs/xyz00/users/discourse/supervisor/etc/supervisord.conf

Wartung

Backup

Discourse macht selbstätig backups und legt diese unter 'public/backups' ab. Enthalten ist ein Datenbank-Dump und die hochgeladenen Dateien.

Im Admin-Bereich lassen sich backups auch manuell antreten.

Updates

Discourse wird über update via mail informieren (dies kann man m.W. abschalten).

Am Beispiel von 2.0.4 auf 2.1.0

  1. Im Web-Backend unter Administration->Backups-> Read-Only Mouds setzen (oder Web Server so konfigurieren, dass keine Zugriffe mehr stattfinden können)
  2. Backup
  3. Die lokalen Änderungen sichern (git diff > /tmp/discourse.diff)
  4. Schauen, ob discourse (endlich :) ) eine neue Ruby-Version nutzt (z.B. in discourse_docker: image/discourse_fast_switch/Dockerfile , discourse: .rubocop
  5. git pull
  6. (Zur Sicherheit: git checkout stable)
  7. bundle
  8. RAILS_ENV=production bundle exec rake db:migrate
  9. RAILS_ENV=production bundle exec rake assets:precompile
  10. Services neu starten (Holzhammer: sv restart all)

Am Beispiel von 2.1.0 auf 2.2.0

  1. Im Web-Backend unter Administration->Backups-> Read-Only Mouds setzen (oder Web Server so konfigurieren, dass keine Zugriffe mehr stattfinden können)
  2. Backup
  3. Die lokalen Änderungen sichern (cd discourse; git diff > /tmp/discourse.diff)
  4. git pull (ggfs konflikte beheben)
  5. (Zur Sicherheit: git checkout stable)
  6. Schauen, ob discourse (endlich :) ) eine neue Ruby-Version nutzt (z.B. in discourse_docker: image/discourse_fast_switch/Dockerfile , discourse: .rubocop
  7. Dies ist der Fall, also
  8. rbenv install 2.5
  9. rbenv rehash
  10. echo "2.5.2" > .ruby-version
  11. gem update --system
  12. bundle
  13. RAILS_ENV=production bundle exec rake db:migrate
  14. RAILS_ENV=production bundle exec rake assets:precompile
  15. Services neu starten (Holzhammer: sv restart all)

ToDos

  • Ein Patch, um Discourse auch via Unix-Socket mit Redis sprechen lassen zu können dürfte relativ einfach sein (es wird ein Wrapper um das redis-gem genutzt).
  • Konfiguration von discourse, um mit postgresql via Unix-Socket zu kommunizieren (DISCOURSE_DB_SOCKET environment variable)
  • Performance-tuning an diversen Stellen, anhand der discourse_docker-Vorgaben (https://github.com/discourse/discourse_docker), z.B.
    • thpoff (huge page settings)
    • unicorn (hat eine wesentlich ausgefeiltere Konfigurations-Vorlage, wahrscheinlich bereits ordentlich optimiert)

Links

Historie

  • 2018, 14 . September: Initiale Fassung
  • 2019, Januar: Update-Informationen ergänzt