Discourse installieren: Unterschied zwischen den Versionen

Aus Hostsharing Wiki
Zur Navigation springen Zur Suche springen
KKeine Bearbeitungszusammenfassung
 
(25 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt)
Zeile 21: Zeile 21:
== Konfiguration der PostgreSQL Datenbank ==
== Konfiguration der PostgreSQL Datenbank ==


{{Textkasten|gelb|PostgreSQL Extensions|Die PostgreSQL-Datenbank braucht die extensions ``hstore`` und ``pg_trgm``. Diese müssen vom hostsharing-support installiert werden.}}
{{Textkasten|gelb|PostgreSQL Extensions|Die PostgreSQL-Datenbank braucht die extensions <code>hstore</code>, <code>pg_trgm</code> und <code>unaccent</code>. Diese müssen vom hostsharing-support installiert werden.}}


Ansonsten liefe die Erstellung der Datenbank so:
Ansonsten liefe die Erstellung der Datenbank so:
 
<syntaxhighlight lang=sql line>
  su - postgres -c psql
# su - postgres -c psql
  CREATE DATABASE discourse;
CREATE DATABASE discourse;
  CREATE USER discourse;
CREATE USER discourse;
  ALTER USER discourse WITH ENCRYPTED PASSWORD 'password';
ALTER USER discourse WITH ENCRYPTED PASSWORD 'password';
  ALTER DATABASE discourse OWNER TO discourse;
ALTER DATABASE discourse OWNER TO discourse;
  \connect discourse
\connect discourse
  CREATE EXTENSION hstore;
CREATE EXTENSION hstore;
  CREATE EXTENSION pg_trgm;
CREATE EXTENSION pg_trgm;
CREATE EXTENSION unaccent;
</syntaxhighlight>


Entsprechende Funktionalität (von den extensions abgesehen) ist auch über den HSAdmin verfügbar.
Entsprechende Funktionalität (von den extensions abgesehen) ist auch über den HSAdmin verfügbar.
Zeile 40: Zeile 42:
{{Textkasten|gelb|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.}}
{{Textkasten|gelb|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
<syntaxhighlight lang=shell>
    mkdir redis/etc redis/lib redis/log redis/run
cd
mkdir redis/etc redis/lib redis/log redis/run
</syntaxhighlight>


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


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


Für Discourse 3.x gilt: "Discourse requires Redis 6.2.0 or up"
Für Discourse 3.x gilt: "Discourse requires Redis 6.2.0 or up"
Zeile 73: Zeile 79:
Prüfen der Signatur:
Prüfen der Signatur:


    gpg --verify redis-server-6.2.12-debian-buster.tar.gz.sig redis-server-6.2.12-debian-buster.tar.gz
<syntaxhighlight lang=shell>
gpg --verify redis-server-6.2.12-debian-buster.tar.gz.sig redis-server-6.2.12-debian-buster.tar.gz
</syntaxhighlight>


Das Binary muss nach <code>$HOME/bin</code> verschoben werden, und entsprechend beim Starten des Dienstes eingetragen werden.
Das Binary muss nach <code>$HOME/bin</code> verschoben werden, und entsprechend beim Starten des Dienstes eingetragen werden.
Zeile 83: Zeile 91:
Zunächst ''rbenv'' and ''ruby-build'':
Zunächst ''rbenv'' and ''ruby-build'':


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


starte neue Shell:
starte neue Shell:


    exec bash
<syntaxhighlight lang=shell>
exec bash
</syntaxhighlight>


Überprüfe rbenv-Installation
Überprüfe rbenv-Installation


    type rbenv
<syntaxhighlight lang=shell>
type rbenv
</syntaxhighlight>


Installiere ruby-build als rbenv-Plugin
Installiere ruby-build als rbenv-Plugin


    git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
<syntaxhighlight lang=shell>
git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
</syntaxhighlight>


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


    rbenv install 2.4
<syntaxhighlight lang=shell>
rbenv install 2.4
</syntaxhighlight>


== Installation von Discourse selber ==
== Installation von Discourse selber ==
Zeile 108: Zeile 126:
Weiterhin Als User ''xyz00-discourse'':   
Weiterhin Als User ''xyz00-discourse'':   


    cd ~
<syntaxhighlight lang=shell>
    git clone https://github.com/discourse/discourse.git discourse
cd ~
    cd ~/discourse
git clone https://github.com/discourse/discourse.git discourse
cd ~/discourse
</syntaxhighlight>


Die stabile Version auschecken:
Die stabile Version auschecken:


    git checkout stable
<syntaxhighlight lang=shell>
git checkout stable
</syntaxhighlight>


Ruby Pakete installieren:
Ruby Pakete installieren:


    gem install bundler
<syntaxhighlight lang=shell>
    bundle install -j$(getconf _NPROCESSORS_ONLN) --deployment --without development test
gem install bundler
bundle install -j$(getconf _NPROCESSORS_ONLN) --deployment --without development test
</syntaxhighlight>


== Konfiguration der Discourse Software ==
== Konfiguration der Discourse Software ==
Zeile 125: Zeile 149:
Anlegen einer Datei ''/home/pacs/xyz00/users/discourse/discourse/config/discourse.conf'' anhand der Beispiel-Datei:
Anlegen einer Datei ''/home/pacs/xyz00/users/discourse/discourse/config/discourse.conf'' anhand der Beispiel-Datei:


    cd ~/discourse
<syntaxhighlight lang=shell>
    cp config/discourse_defaults.conf config/discourse.conf
cd ~/discourse
cp config/discourse_defaults.conf config/discourse.conf
</syntaxhighlight>


Anpassen folgender Inhalte:
Anpassen folgender Inhalte:
 
<syntaxhighlight lang=ini line>
    db_host = 127.0.0.1
db_host = 127.0.0.1
    db_port = 5432
db_port = 5432
    #db_backup_port = 5432 #(auskommentieren)
#db_backup_port = 5432 #(auskommentieren)
    db_name = xyz00_discoursedb
db_name = xyz00_discoursedb
    db_username = xyz00_discourseuser
db_username = xyz00_discourseuser
    db_password = "" #db password
db_password = "" #db password
    hostname = "discourse.xyz00" # hostname
hostname = "discourse.xyz00" # hostname
    smtp_address = localhost
smtp_address = localhost
    smtp_enable_start_tls = false
smtp_enable_start_tls = false
    smtp_openssl_verify_mode = 'none'
smtp_openssl_verify_mode = 'none'
    developer_emails = # your email-address
developer_emails = # your email-address
    redis_host = 127.0.0.1
redis_host = 127.0.0.1
    redis_port = 32002
redis_port = 32002
 
</syntaxhighlight>
===TODO: Secrets setzen! ===
===TODO: Secrets setzen! ===
Die Zufallswerte für die Variablen SECRET_KEY_BASE und OTP_SECRET erzeugt man durch zwei Aufrufe des Kommandos
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
<syntaxhighlight lang=shell>
RAILS_ENV=production bundle exec rake secret
</syntaxhighlight>


=== Sidekiq für Hintergrund-Aufgaben konfigurieren ===
=== Sidekiq für Hintergrund-Aufgaben konfigurieren ===
Zeile 160: Zeile 188:


Um ein Problem mit Content Security Policy zu lösen, weil manche Dateien über http nachgeladen werden, muss in der Datei <code>config/site_settings.yml</code> der Default Wert für force_https auf True gesetzt werden:
Um ein Problem mit Content Security Policy zu lösen, weil manche Dateien über http nachgeladen werden, muss in der Datei <code>config/site_settings.yml</code> der Default Wert für force_https auf True gesetzt werden:
<syntaxhighlight lang=yaml line>
force_https:
    default: true
</syntaxhighlight>
=== Problem beim Aufsetzen der Datenbank vermeiden ===


    force_https:
'''→ Notiz Mai 2024:''' dies scheint aktuell nicht aufzutreten.
      default: true
 
=== Problem beim Aufsetzen der Datenbank vermeiden ===


Aus irgendeinem Grund wird beim Initialisieren der Datenbank versucht, den TYPE hotlinked_media_status zweimal in der Datenbank anzulegen. Der Grund ist nicht ersichtlich.
Aus irgendeinem Grund wird beim Initialisieren der Datenbank versucht, den TYPE hotlinked_media_status zweimal in der Datenbank anzulegen. Der Grund ist nicht ersichtlich.


Es kann folgende Änderung an der Datei <code>db/migrate/20220428094026_create_post_hotlinked_media.rb</code> vorgenommen werden:
Es kann folgende Änderung an der Datei <code>db/migrate/20220428094026_create_post_hotlinked_media.rb</code> vorgenommen werden:
 
<syntaxhighlight lang=ruby line>
    reversible do |dir|
reversible do |dir|
      dir.up { execute <<~SQL }
  dir.up { execute <<~SQL }
          DO $$ BEGIN CREATE TYPE hotlinked_media_status AS ENUM('downloaded', 'too_large', 'download_failed', 'upload_create_failed'); EXCEPTION WHEN duplicate_object THEN null; END $$;
      DO $$ BEGIN CREATE TYPE hotlinked_media_status AS ENUM('downloaded', 'too_large', 'download_failed', 'upload_create_failed'); EXCEPTION WHEN duplicate_object THEN null; END $$;
        SQL
    SQL
      dir.down { execute <<~SQL }
  dir.down { execute <<~SQL }
          DROP TYPE hotlinked_media_status
      DROP TYPE hotlinked_media_status
        SQL
    SQL
    end
end
 
</syntaxhighlight>
=== Initialisieren der Datenbank ===
=== Initialisieren der Datenbank ===


    export SAFETY_ASSURED=1
<syntaxhighlight lang=shell>
    # In Version 2.0.4 funktioniert db:migrate noch, ansonsten schema:load und seed nutzen!
export SAFETY_ASSURED=1
    #RAILS_ENV=production bundle exec rails db:schema:load
# In Version 2.0.4 funktioniert db:migrate noch, ansonsten db:schema:load und seed nutzen!
    #RAILS_ENV=production bundle exec rails db:seed
# In Version 3.0.3 funktioniert db:migrate auch noch, db:schema:load ging nicht weil die Datei structure.sql fehlte
    RAILS_ENV=production bundle exec rails db:migrate
#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
</syntaxhighlight>


=== Kompilieren der Assets ===
=== Kompilieren der Assets ===


    RAILS_ENV=production bundle exec rails assets:precompile
<syntaxhighlight lang=shell>
RAILS_ENV=production bundle exec rails assets:precompile
</syntaxhighlight>


=== Konfiguration des Web-Servers (am Beispiel Puma)  ===
=== Konfiguration des Web-Servers (am Beispiel Puma)  ===
Zeile 195: Zeile 230:
Die Datei ''config/puma.conf'' anpassen (hier nur Änderungen angezeigt):
Die Datei ''config/puma.conf'' anpassen (hier nur Änderungen angezeigt):


  APP_ROOT = '/home/pacs/xyz00/users/discourse/discourse'
<syntaxhighlight lang=ini>
  daemonize false
APP_ROOT = '/home/pacs/xyz00/users/discourse/discourse'
daemonize false
</syntaxhighlight>


== Starten der Dienste  ==
== Starten der Dienste  ==
Zeile 206: Zeile 243:
redis.service:
redis.service:


<nowiki>
<syntaxhighlight lang=ini line>
[Unit]
[Unit]
Description=Redis User Service
Description=Redis User Service
Zeile 220: Zeile 257:
[Install]
[Install]
WantedBy=default.target
WantedBy=default.target
</nowiki>
</syntaxhighlight>


sidekiq.service:
sidekiq.service:


<nowiki>
<syntaxhighlight lang=ini line>
[Unit]
[Unit]
Description=Discourse Sidekiq Service
Description=Discourse Sidekiq Service
Zeile 244: Zeile 281:
WantedBy=default.target
WantedBy=default.target
After=redis.service
After=redis.service
</nowiki>
</syntaxhighlight>


discourse.service:
discourse.service:


<nowiki>
<syntaxhighlight lang=ini line>
[Unit]
[Unit]
Description=Discourse Web Service
Description=Discourse Web Service
Zeile 269: Zeile 306:
WantedBy=default.target
WantedBy=default.target
After=redis.service
After=redis.service
</nowiki>
</syntaxhighlight>


== Einrichten des Apache VHost ==
== Einrichten des Apache VHost ==


    cd ~/doms/beispiel.discuss
<syntaxhighlight lang=shell>
    rm -rf htdocs-ssl subs/www subs-ssl/www
cd ~/doms/beispiel.discuss
    ln -s ~/live/public htdocs-ssl
rm -rf htdocs-ssl subs/www subs-ssl/www
    touch htdocs-ssl/.htaccess
ln -s ~/live/public htdocs-ssl
touch htdocs-ssl/.htaccess
</syntaxhighlight>


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:
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
<syntaxhighlight lang=apache line>
DirectoryIndex disabled
    
    
  RequestHeader set X-Forwarded-Proto "https"
RequestHeader set X-Forwarded-Proto "https"
    
    
  RewriteEngine On
RewriteEngine On
  RewriteBase /
RewriteBase /
  RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-l
  RewriteRule .* http://127.0.0.1:13000%{REQUEST_URI} [proxy,last]
RewriteRule .* http://127.0.0.1:13000%{REQUEST_URI} [proxy,last]
 
</syntaxhighlight>
== Wartung ==
== Wartung ==
=== Backup ===
=== Backup ===
Zeile 296: Zeile 336:


Im Admin-Bereich lassen sich backups auch manuell antreten.
Im Admin-Bereich lassen sich backups auch manuell antreten.
=== Admin Benutzer einladen ===
Manchmal brauchen wir einen neuen Admin Benutzer, den wir von der Kommandozeile aus einladen möchten.
<syntaxhighlight lang=shell>
cd /discourse
RAILS_ENV=production rake admin:invite[admin@example.org]
</syntaxhighlight>
=== Import aus mbox Archiven ===
Um zum Beispiel ein Mailman2 Archiv zu importieren, wo die Nachrichten als .mbox Datei vorliegen, sind folgende Schritte nötig:
Vorbereitungen an Discourse:
<syntaxhighlight lang=shell>
source .profile
cd discourse
bundle config set frozen false
IMPORT=1 bundle install
bundle config set frozen true
nano script/import_scripts/mbox/settings.yml
#  dort ändern:
#    data_dir: /home/pacs/xyz00/users/discourse/list-archiv
</syntaxhighlight>
Hochladen der Mailinglisten-Archive:
<syntaxhighlight lang=shell>
mkdir ~/list-archiv
# dort muss es Unterordner mit dem Namen der gewünschten Kategorie geben,
# und die mbox Datei muss auch diesen Namen haben, z.B.:
# ~/list-archiv/beispiel/beispiel.mbox
# ~/list-archiv/example/example.mbox
# um die Beiträge in den entsprechenden Kategorien beispiel und example einzufügen.
</syntaxhighlight>
Durchführen des Imports:
<syntaxhighlight lang=shell>
source .profile
cd discourse
RAILS_ENV=production IMPORT=1 bundle exec rails runner \
    script/import_scripts/mbox.rb script/import_scripts/mbox/settings.yml
</syntaxhighlight>
=== Export ===
* Wenn ein Forum beendet wird, möchte man evtl. eine Sicherung als statische HTML Seiten.
** Das wird hier diskutiert: https://meta.discourse.org/t/how-do-i-export-the-complete-forum-as-static-html-pages/71007/3
* Um ein Forum von Discourse zu Flarum umzuziehen, hat Timotheus ein Skript geschrieben.
** Das Migrations-Skript: https://github.com/SolidCharity/discourse_to_flarum
** siehe auch https://discuss.flarum.org/d/4930-discourse-to-flarum-migration-support/29


=== Updates ===
=== Updates ===
Zeile 301: Zeile 392:
Discourse wird über update via mail informieren (dies kann man m.W. abschalten).
Discourse wird über update via mail informieren (dies kann man m.W. abschalten).


==== Am Beispiel von 2.0.4 auf 2.1.0 ====
Achtung: bei größeren Updates auch immer Änderungen an der Datei site_settings.yml (https://github.com/discourse/discourse/blob/main/config/site_settings.yml) beachten!


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


# Im Web-Backend unter Administration->Backups-> Read-Only Mouds setzen (oder Web Server so konfigurieren, dass keine Zugriffe mehr stattfinden können)
# Im Web-Backend unter Administration->Backups-> Read-Only Mouds setzen (oder Web Server so konfigurieren, dass keine Zugriffe mehr stattfinden können)
# Backup
# Backup
# Die lokalen Änderungen sichern (cd discourse; git diff > /tmp/discourse.diff)
# Die lokalen Änderungen sichern:
# git pull (ggfs konflikte beheben)
# cd discourse
# (Zur Sicherheit: git checkout stable)
# git diff v3.0.3 > diff-3.0.3.txt
# Schauen, ob discourse (endlich :) ) eine neue Ruby-Version nutzt (z.B. in discourse_docker: image/discourse_fast_switch/Dockerfile , discourse: .rubocop
# git fetch
# git checkout -b hostsharing-deployment-v3.0.5 v3.0.5
# evtl. Änderungen aus diff-3.0.3.txt wieder übernehmen und committen
# patch -p1 < diff-3.0.3.txt
# git commit -a -m "spezifische Änderungen für diese Instanz" --no-verify
# Schauen, ob discourse (endlich :) ) eine neue Ruby-Version nutzt (z.B. in https://github.com/discourse/discourse/blob/stable/.ruby-version.sample)
# Dies ist der Fall, also
# Dies ist der Fall, also
# rbenv install 2.5
# rbenv install 3.2.1
# rbenv rehash
# rbenv rehash
# echo "2.5.2" > .ruby-version
# echo "3.2.1" > .ruby-version
# source ~/.profile
# gem update --system
# gem update --system
# bundle
# bundle
# yarn install
# RAILS_ENV=production bundle exec rake db:migrate
# RAILS_ENV=production bundle exec rake db:migrate
# RAILS_ENV=production bundle exec rake assets:precompile
# RAILS_ENV=production bundle exec rake assets:precompile
# Services neu starten (Holzhammer: sv restart all)
# Services neu starten
<syntaxhighlight lang=shell>
systemctl --user restart puma
systemctl --user restart sidekiq
systemctl --user restart redis
</syntaxhighlight>
* Zuletzt: Read-Only Modus wieder deaktivieren
 
=== Debugging ===
 
Es können folgende Einstellungen in der Datei config/environments/production.rb vorgenommen werden. Danach den Puma Dienst neustarten. Fehlermeldungen und Stacktraces werden dann im Browser ausgegeben.
 
<syntaxhighlight lang="ini" line>
config.log_level = :debug
config.action_dispatch.show_exceptions = :all
config.action_dispatch.debug_exception_log_level = :error
 
# Full error reports are enabled and caching is turned off
config.consider_all_requests_local = true
config.action_controller.perform_caching = false
</syntaxhighlight>
 
=== Erforderliche Anpassungen ===
Weil wir bei Debian Bookworm noch mit ImageMagick 6.9 arbeiten, muss dieser [https://github.com/discourse/discourse/commit/17aa831337e352dfd875f1b4ddc4492bd0835119 Patch] rückgängig gemacht werden:
 
<syntaxhighlight lang="bash" line>
wget https://github.com/discourse/discourse/commit/17aa831337e352dfd875f1b4ddc4492bd0835119.patch -O ~/imagemagick.patch
patch -p1 --reverse < ~/imagemagick.patch
git commit -a -m "revert imagemagick patch"  --no-verify
</syntaxhighlight>


== ToDos ==
== ToDos ==

Aktuelle Version vom 30. August 2024, 13:26 Uhr

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, pg_trgm und unaccent. 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;
CREATE EXTENSION unaccent;

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

Für Discourse 3.x gilt: "Discourse requires Redis 6.2.0 or up"

Für Debian Buster und Bullseye ist daher das Installieren eines neueren Binaries erforderlich. Bei Debian Bookwork ist bereits Redis 7.0 enthalten (siehe https://packages.debian.org/search?keywords=redis-server).

Hier steht ein entsprechendes Binary für Debian Buster zur Verfügung, das mit dem Public Key von Timotheus geprüft werden kann:

Prüfen der Signatur:

gpg --verify redis-server-6.2.12-debian-buster.tar.gz.sig redis-server-6.2.12-debian-buster.tar.gz

Das Binary muss nach $HOME/bin verschoben werden, und entsprechend beim Starten des Dienstes eingetragen werden.

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

Wichtig: development auf production ändern.

Mit diesem Dienst werden z.B. die E-Mails zur Aktivierung oder zum Passwort Reset verschickt.

Problem mit Content Security Policy

Um ein Problem mit Content Security Policy zu lösen, weil manche Dateien über http nachgeladen werden, muss in der Datei config/site_settings.yml der Default Wert für force_https auf True gesetzt werden:

force_https:
    default: true

Problem beim Aufsetzen der Datenbank vermeiden

→ Notiz Mai 2024: dies scheint aktuell nicht aufzutreten.

Aus irgendeinem Grund wird beim Initialisieren der Datenbank versucht, den TYPE hotlinked_media_status zweimal in der Datenbank anzulegen. Der Grund ist nicht ersichtlich.

Es kann folgende Änderung an der Datei db/migrate/20220428094026_create_post_hotlinked_media.rb vorgenommen werden:

reversible do |dir|
  dir.up { execute <<~SQL }
      DO $$ BEGIN CREATE TYPE hotlinked_media_status AS ENUM('downloaded', 'too_large', 'download_failed', 'upload_create_failed'); EXCEPTION WHEN duplicate_object THEN null; END $$;
    SQL
  dir.down { execute <<~SQL }
      DROP TYPE hotlinked_media_status
    SQL
end

Initialisieren der Datenbank

export SAFETY_ASSURED=1
# In Version 2.0.4 funktioniert db:migrate noch, ansonsten db:schema:load und seed nutzen!
# In Version 3.0.3 funktioniert db:migrate auch noch, db:schema:load ging nicht weil die Datei structure.sql fehlte
#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 sollte systemd benutzt werden.

Die folgenden Dateien müssen nach .config/systemd/user/ kopiert werden (überlange Zeilen werden hier im Wiki umgebrochen)

redis.service:

[Unit]
Description=Redis User Service

[Service]
WorkingDirectory=%h/var/redis
Environment="PATH=/usr/local/bin:/usr/bin:/bin"
ExecStart=%h/bin/redis-server %h/etc/redis.conf
Restart=always
PrivateTmp=true
NoNewPrivileges=true

[Install]
WantedBy=default.target

sidekiq.service:

[Unit]
Description=Discourse Sidekiq Service

[Service]
WorkingDirectory=%h/discourse
Environment="PATH=/usr/local/bin:/usr/bin:/bin"
Environment="RAILS_ENV=production"
Environment="DB_POOL=8"
Environment="MALLOC_ARENA_MAX=2"
ExecStart=%h/.rbenv/shims/bundle exec sidekiq -C %h/discourse/config/sidekiq.yml
StandardOutput=file:%h/var/log/sidekiq.out.log
StandardError=inherit
Restart=always
PrivateTmp=true
NoNewPrivileges=true

[Install]
WantedBy=default.target
After=redis.service

discourse.service:

[Unit]
Description=Discourse Web Service

[Service]
WorkingDirectory=%h/discourse
Environment="PATH=/usr/local/bin:/usr/bin:/bin"
Environment="RAILS_ENV=production"
Environment="WEB_CONCURRENCY=2"
Environment="MAX_THREADS=5"
Environment="MALLOC_ARENA_MAX=2"
ExecStart=%h/.rbenv/shims/bundle exec puma -C config/puma.rb -e production -b tcp://127.0.0.1:13000
StandardOutput=file:%h/var/log/puma.out.log
StandardError=inherit
Restart=always
PrivateTmp=true
NoNewPrivileges=true

[Install]
WantedBy=default.target
After=redis.service

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]

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.

Admin Benutzer einladen

Manchmal brauchen wir einen neuen Admin Benutzer, den wir von der Kommandozeile aus einladen möchten.

cd /discourse
RAILS_ENV=production rake admin:invite[admin@example.org]

Import aus mbox Archiven

Um zum Beispiel ein Mailman2 Archiv zu importieren, wo die Nachrichten als .mbox Datei vorliegen, sind folgende Schritte nötig:

Vorbereitungen an Discourse:

source .profile
cd discourse
bundle config set frozen false
IMPORT=1 bundle install
bundle config set frozen true
nano script/import_scripts/mbox/settings.yml
#  dort ändern:
#    data_dir: /home/pacs/xyz00/users/discourse/list-archiv

Hochladen der Mailinglisten-Archive:

mkdir ~/list-archiv
# dort muss es Unterordner mit dem Namen der gewünschten Kategorie geben,
# und die mbox Datei muss auch diesen Namen haben, z.B.:
# ~/list-archiv/beispiel/beispiel.mbox
# ~/list-archiv/example/example.mbox
# um die Beiträge in den entsprechenden Kategorien beispiel und example einzufügen.

Durchführen des Imports:

source .profile
cd discourse
RAILS_ENV=production IMPORT=1 bundle exec rails runner \
    script/import_scripts/mbox.rb script/import_scripts/mbox/settings.yml

Export

Updates

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

Achtung: bei größeren Updates auch immer Änderungen an der Datei site_settings.yml (https://github.com/discourse/discourse/blob/main/config/site_settings.yml) beachten!

Am Beispiel von 3.0.3 auf 3.0.5

  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:
  4. cd discourse
  5. git diff v3.0.3 > diff-3.0.3.txt
  6. git fetch
  7. git checkout -b hostsharing-deployment-v3.0.5 v3.0.5
  8. evtl. Änderungen aus diff-3.0.3.txt wieder übernehmen und committen
  9. patch -p1 < diff-3.0.3.txt
  10. git commit -a -m "spezifische Änderungen für diese Instanz" --no-verify
  11. Schauen, ob discourse (endlich :) ) eine neue Ruby-Version nutzt (z.B. in https://github.com/discourse/discourse/blob/stable/.ruby-version.sample)
  12. Dies ist der Fall, also
  13. rbenv install 3.2.1
  14. rbenv rehash
  15. echo "3.2.1" > .ruby-version
  16. source ~/.profile
  17. gem update --system
  18. bundle
  19. yarn install
  20. RAILS_ENV=production bundle exec rake db:migrate
  21. RAILS_ENV=production bundle exec rake assets:precompile
  22. Services neu starten
systemctl --user restart puma
systemctl --user restart sidekiq
systemctl --user restart redis
  • Zuletzt: Read-Only Modus wieder deaktivieren

Debugging

Es können folgende Einstellungen in der Datei config/environments/production.rb vorgenommen werden. Danach den Puma Dienst neustarten. Fehlermeldungen und Stacktraces werden dann im Browser ausgegeben.

config.log_level = :debug
config.action_dispatch.show_exceptions = :all
config.action_dispatch.debug_exception_log_level = :error

# Full error reports are enabled and caching is turned off
config.consider_all_requests_local = true
config.action_controller.perform_caching = false

Erforderliche Anpassungen

Weil wir bei Debian Bookworm noch mit ImageMagick 6.9 arbeiten, muss dieser Patch rückgängig gemacht werden:

wget https://github.com/discourse/discourse/commit/17aa831337e352dfd875f1b4ddc4492bd0835119.patch -O ~/imagemagick.patch
patch -p1 --reverse < ~/imagemagick.patch
git commit -a -m "revert imagemagick patch"  --no-verify

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
  • 2022, Juni: systemd Dienste, Discourse 3.0