Fehlerbehebung bei Bootstrap-Fehlern in Discourse

Ich habe immer noch Schwierigkeiten mit dem neuen „Pre-Bundling“-Prozess. Der Bootstrap-Vorgang schlägt auf meiner Testinstanz fehl, und ich weiß nicht warum. Beachten Sie, dass dies eine Einrichtung mit einer externen PostgreSQL-Datenbank ist. Die Container laufen hinter einem HAProxy als SSL-Beschleuniger. Ich bootstrappe hier nur den web_only-Container. Die aktuelle Build-Version (vor dem Bootstrap) ist 3.5.0.beta8-dev, Commits · discourse/discourse · GitHub

Dies ist die aktuell fehlerhafte YAML-Datei:

# WICHTIG: Setzen Sie ein GEHEIMES PASSWORT in Postgres für den Discourse-Benutzer
# TODO: Ändern Sie SOME_SECRET in dieser Vorlage

templates:
  - "templates/web.template.yml"
  ## Kommentieren Sie die nächste Zeile aus, um den IPv6-Listener zu aktivieren
  #- "templates/web.ipv6.template.yml"
  - "templates/web.ratelimited.template.yml"
  - "templates/web.socketed.template.yml"
  ## Kommentieren Sie diese beiden Zeilen aus, wenn Sie Lets Encrypt (https) hinzufügen möchten
  #- "templates/web.ssl.template.yml"
  #- "templates/web.letsencrypt.ssl.template.yml"

## Welche TCP/IP-Ports soll dieser Container exponieren?
## Wenn Sie möchten, dass Discourse einen Port mit einem anderen Webserver wie Apache oder nginx teilt,
## siehe https://meta.discourse.org/t/17247 für Details
expose:
  - "80:80"   # http
  - "443:443" # https

# Verwenden Sie den 'links'-Schlüssel, um Container miteinander zu verknüpfen, also den Docker --link-Flag.
links:
  - link:
      name: redis
      alias: data

# Zusätzliche Argumente für Docker?
# docker_args:

params:
  ## Welche Git-Revision soll dieser Container verwenden? (Standard: tests-passed)
  #version: tests-passed

env:
  LC_ALL: en_US.UTF-8
  LANG: en_US.UTF-8
  LANGUAGE: en_US.UTF-8
  DISCOURSE_DEFAULT_LOCALE: de

  ## Wie viele gleichzeitige Webanfragen werden unterstützt? Hängt vom Speicher und den CPU-Kernen ab.
  ## Wird automatisch vom Bootstrap basierend auf den erkannten CPUs festgelegt, oder Sie können es überschreiben
  UNICORN_WORKERS: 4

  ## TODO: Der Domainname, auf den diese Discourse-Instanz antworten wird
  DISCOURSE_HOSTNAME: 'forum2.netzwissen.de'

  ## Kommentieren Sie dies aus, wenn Sie möchten, dass der Container mit demselben
  ## Hostnamen (-h-Option) wie oben angegeben gestartet wird (Standard "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: Liste der durch Kommas getrennten E-Mails, die bei der ersten Anmeldung zu Admin und Entwickler werden
  ## Beispiel 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'admin@netzwissen.de'

  ## TODO: Der SMTP-Mailserver, der zur Validierung neuer Konten und zum Senden von Benachrichtigungen verwendet wird
  # SMTP-Adresse, Benutzername und Passwort sind erforderlich
  # WARNUNG: Das Zeichen '#' im SMTP-Passwort kann Probleme verursachen!
  DISCOURSE_SMTP_ADDRESS: mail.netzwissen.de
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: discourse@netzwissen.de
  DISCOURSE_SMTP_PASSWORD: [xxxxxxxxxxxxxxxxx}
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (optional, Standard true)
  #DISCOURSE_SMTP_DOMAIN: discourse.example.com    # (von einigen Anbietern erforderlich)
  DISCOURSE_NOTIFICATION_EMAIL: discourse@netzwissen.de    # (Adresse, von der Benachrichtigungen gesendet werden)

  ## Wenn Sie die Lets Encrypt-Vorlage hinzugefügt haben, kommentieren Sie unten aus, um ein kostenloses SSL-Zertifikat zu erhalten
  #LETSENCRYPT_ACCOUNT_EMAIL: me@example.com

## Konfigurieren Sie die Konnektivität zu den Datenbanken
  DISCOURSE_DB_SOCKET: ''
  DISCOURSE_DB_USERNAME: [xxxxxxxxxxx]
  DISCOURSE_DB_NAME: [xxxxxxxxxxxxxxx]
  DISCOURSE_DB_HOST: [xxxxxxxxxxxxxxx]
  DISCOURSE_DB_PASSWORD: [xxxxxxxxxxxxxxx]
  ## Redis-Caching im benachbarten Container
  DISCOURSE_REDIS_HOST: redis

  ## Die http- oder https-CDN-Adresse für diese Discourse-Instanz (konfiguriert zum Abrufen)
  ## siehe https://meta.discourse.org/t/14857 für Details
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com

  ## Die Maxmind-Geolocation-IP-Konten-ID und der Lizenzschlüssel für IP-Adressen-Lookups
  ## siehe https://meta.discourse.org/t/-/173941 für Details
  #DISCOURSE_MAXMIND_ACCOUNT_ID: 123456
  #DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456

volumes:
  - volume:
      host: /mnt/data/discourse/shared/web-only
      guest: /shared
  - volume:
      host: /mnt/data/discourse/shared/web-only/log/var-log
      guest: /var/log

## Plugins gehen hier
## siehe https://meta.discourse.org/t/19157 für Details
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/discourse/discourse-shared-edits.git
# Einige Plugins wurden entfernt, da sie jetzt mit dem Core gebündelt sind
# https://meta.discourse.org/t/bundling-more-popular-plugins-with-discourse-core/373574
## = jetzt gebündelt
##          - git clone https://github.com/discourse/discourse-chat-integration.git
##          - git clone https://github.com/discourse/discourse-openid-connect.git
##          - git clone https://github.com/discourse/discourse-calendar.git
##          - git clone https://github.com/angusmcleod/discourse-events.git
##          - git clone https://github.com/discourse/discourse-data-explorer.git
##          - git clone https://github.com/discourse/discourse-reactions.git
##          - git clone https://github.com/discourse/discourse-chat.git
##          - git clone https://github.com/discourse/discourse-ai.git
##          - git clone https://github.com/discourse/discourse-topic-voting.git
##          - git clone https://github.com/discourse/discourse-post-voting.git
##          - git clone https://github.com/discourse/discourse-user-notes.git
##          - git clone https://github.com/discourse/discourse-solved.git
          - git clone https://github.com/discourse/discourse-docs-card-filter.git
          - git clone https://github.com/discourse/discourse-doc-categories.git
##          - git clone https://github.com/discourse/discourse-assign.git
##          - git clone https://github.com/discourse/discourse-templates.git
          - git clone https://github.com/discourse/discourse-saved-searches.git
          - git clone https://github.com/discourse/discourse-tooltips.git
          - git clone https://github.com/discourse/discourse-category-experts.git
          - git clone https://github.com/discourse/discourse-activity-pub.git
          - git clone https://github.com/discourse/discourse-follow.git
          - git clone https://github.com/nathan-nz/discourse-wikified-posts.git
          - git clone https://github.com/discourse/discourse-whos-online.git
          - git clone https://github.com/merefield/discourse-workflow.git

## Denken Sie daran, dies ist YAML-Syntax – Sie können nur einen Block mit einem Namen haben
run:
  - exec: echo "Beginn der benutzerdefinierten Befehle"

  ## Wenn Sie die Passwortanmeldung für root konfigurieren möchten, kommentieren Sie dies aus und ändern Sie:
  ## Verwenden Sie nur eine der folgenden Zeilen:
  #- exec: /usr/sbin/usermod -p 'PASSWORD_HASH' root
  - exec: /usr/sbin/usermod -p "$(mkpasswd -m sha-256 'xxxxxxxxxxxxxxx')" root

## für den Betrieb hinter einem HAProxy-Load-Balancer mit lokalem nginx auf dem Container-Host
  - replace:
      filename: /etc/nginx/conf.d/discourse.conf
      from: "types {"
      to: |
        set_real_ip_from 127.0.0.1/24;
        set_real_ip_from 10.0.0.0/24;
        real_ip_header X-Forwarded-For;
        real_ip_recursive on;
        proxy_set_header Host $http_host;
        proxy_set_header X-Request-Start "t=${msec}";
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https; # ersetzt $thescheme;
        proxy_set_header X-Real-IP $remote_addr;
        types {

  ## Wenn Sie zusätzliche Benutzer autorisieren möchten, kommentieren Sie dies aus und ändern Sie:
  #- exec: ssh-import-id username
  #- exec: ssh-import-id anotherusername

  - exec: echo "Ende der benutzerdefinierten Befehle"
  - exec: awk -F\# '{print $1;}' ~/.ssh/authorized_keys | awk 'BEGIN { print "Autorisierte SSH-Schlüssel für diesen Container:"; } NF\u003e=2 {print $NF;}'

Selbst wenn ich einen rm -rf-Block in die YAML-Datei hinzufüge:

- rm -rf discourse-chat-integration  
- rm -rf discourse-openid-connect         
- rm -rf discourse-calendar         
- rm -rf discourse-events         
- rm -rf discourse-data-explorer         
- rm -rf discourse-reactions         
- rm -rf discourse-chat         
- rm -rf discourse-ai         
- rm -rf discourse-topic-voting         
- rm -rf discourse-post-voting         
- rm -rf discourse-user-notes         
- rm -rf discourse-solved         
- rm -rf discourse-assign         
- rm -rf discourse-templates

Schlägt der Bootstrap immer noch mit folgender Fehlermeldung fehl:

/usr/local/lib/ruby/gems/3.3.0/gems/pups-1.3.0/lib/pups.rb
/usr/local/bin/pups --stdin

FAILED
--------------------
Pups::ExecError: cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate' failed with return #<Process::Status: pid 669 exit 1>
Location of failure: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.3.0/lib/pups/exec_command.rb:131:in `spawn'
exec failed with the params {"cd"=>"$home", "tag"=>"migrate", "hook"=>"db_migrate", "cmd"=>["su discourse -c 'bundle exec rake db:migrate'"]}

Ich würde das als Fehler bei der Datenbankmigration bei „bundle exec rake db:migrate“ interpretieren. Aber was ist hier die Grundursache? Die discourse2-Datenbank hat bereits die Vector-Erweiterung, die für das (bereits zuvor installierte) discourse-ai-Plugin erforderlich war:

postgres=# \c discourse2  
psql (15.12 (Ubuntu 15.12-1.pgdg22.04+1), server 13.20 (Ubuntu 13.20-1.pgdg22.04+1))  
You are now connected to database "discourse2" as user "postgres".  
discourse2=# \dx  
                                   List of installed extensions  
  Name   | Version |   Schema   |                            Description                               
----------+---------+------------+-------------------------------------------------------------------  
hstore   | 1.7     | public     | data type for storing sets of (key, value) pairs  
pg_trgm  | 1.5     | public     | text similarity measurement and index searching based on trigrams  
plpgsql  | 1.0     | pg_catalog | PL/pgSQL procedural language  
unaccent | 1.1     | public     | text search dictionary that removes accents  
vector   | 0.8.0   | public     | vector data type and ivfflat and hnsw access methods  
(5 rows)

Später sehe ich auch die Plugin-Hinweise, obwohl die „git clone“-Zeilen in der YAML-Datei alle kommentiert sind:

---
HINT: The plugin 'discourse-openid-connect' is now bundled with Discourse and should not be included in your container configuration.
Remove the line 'git clone https://github.com/discourse/discourse-openid-connect' from your containers/web_only.yml file, then try again.
For more information, see https://meta.discourse.org/t/373574
---

Um ehrlich zu sein, bin ich jetzt etwas ratlos ::sleepy_face:

was gibt free -h zurück?

root@docker3a:/var/discourse/containers# free -h
gesamt benutzt frei gemns. Puffer/Cache verfügbar
Speicher: 3,8Gi 2,0Gi 1,1Gi 3,8Mi 969Mi 1,8Gi

wahrscheinlich 4 GB Swap

Entschuldigung, mein Fehler, die Ausgabe wurde abgeschnitten

root@docker3a:~# free -h
gesamt benutzt frei gemns. Puffer/Cache verfügbar
Speicher: 3,8Gi 2,0Gi 1,1Gi 3,8Mi 971Mi 1,8Gi
Swap: 974Mi 0B 974Mi

Die VM hat bereits 4 GB Speicher. Ich habe 2 GB mehr hinzugefügt und einen weiteren ./launcher rebuild web_only^ gestartet, was zu demselben Fehler führte. Ich bezweifle daher, dass wir hier ein speicherbezogenes Build-Problem haben…

Nun, ich benötigte 2 GB Swap bei 8 GB RAM.

Ich habe es mit 8 GB RAM erneut versucht, mit demselben Fehlerergebnis. Beachten Sie, dass dies eine Kernel-basierte virtuelle Maschine (KVM) auf einem Proxmox-Host ist (Features - Proxmox Virtual Environment).

Ein QEMU/KVM-Gast fordert Speicher vom Host an, wenn das Gast-Betriebssystem ihn benötigt, gibt den Speicher jedoch nicht automatisch an den Host zurück, wenn das Gast-Betriebssystem ihn nicht mehr benötigt. Wenn der Host Speicher benötigt, fordert der Kernel die Prozesse auf, ungenutzten RAM zurückzugeben. QEMU versucht dann, etwas Speicher zurückzugewinnen, aber es hängt davon ab, dass das Gast-Betriebssystem ihn zuerst freigibt.

Ich hatte nie Speicherprobleme mit dem 4 GB RAM und 4 CPU Setup, nicht einmal mit dem discourse-ai Plugin. Bootstrap-Probleme traten erst nach dieser Bündelungsankündigung auf…

Warte, ist dieses discourse-openid-connect-Plugin irgendwo in Ihrer YAML-Datei?

Dies ist ein Problem bei der Migration. Können Sie nach oben scrollen, um zu sehen, was bei der Migration fehlgeschlagen ist?

Ist dieses discourse-openid-connect-Plugin irgendwo in Ihrer YML-Datei aufgeführt?

Dies ist ein Problem bei der Migration. Können Sie nach oben scrollen, um zu sehen, was bei der Migration fehlgeschlagen ist?

Bis jetzt hatte ich discourse-openid-connect in meiner Plugin-Liste. Ich habe es für den „Post-Bundling Build“ entfernt. Jetzt habe ich nur noch diese Plugins in der Build-YML:

## Nicht gebündelte Plugins
- git clone https://github.com/discourse/docker_manager.git\\`

  • git clone https://github.com/discourse/discourse-shared-edits.git
  • git clone https://github.com/discourse/discourse-docs-card-filter.git
  • git clone https://github.com/discourse/discourse-doc-categories.git
  • git clone https://github.com/discourse/discourse-saved-searches.git
  • git clone https://github.com/discourse/discourse-tooltips.git
  • git clone https://github.com/discourse/discourse-category-experts.git
  • git clone https://github.com/discourse/discourse-activity-pub.git
  • git clone https://github.com/discourse/discourse-follow.git
  • git clone ``https://github.com/nathan-nz/discourse-wikified-posts.git
  • git clone https://github.com/discourse/discourse-whos-online.git
  • git clone \`https://github.com/merefield/discourse-workflow.git\`
    `
    Der Build scheint bei „bundle exec rake db:migrate“ abzustürzen. Aber ein paar Zeilen darüber sehe ich eine

Gem::LoadError: can't activate multipart-post-2.4.0, already activated multipart-post-2.4.1 (Gem::LoadError)

[… ]
discourse-wikified-posts ist bereits in der neuesten kompatiblen Version, discourse-workflow ist bereits in der neuesten kompatiblen Version, docker_manager ist bereits in der neuesten kompatiblen Version I,
[2025-07-28T06:34:13.916393 #1] INFO -- : `> cd /var/www/discourse & su discourse -c 'bundle exec rake db:migrate' rake aborted! Gem::LoadError: can't activate multipart-post-2.4.0, already activated multipart-post-2.4.1 (Gem::LoadError) /var/www/discourse/lib/plugin_gem.rb:25:in `load' /var/www/discourse/lib/plugin/instance.rb:861:in `gem' [… ]

Ich habe keine Kenntnisse über Ruby, aber vielleicht handelt es sich um einen Paketkonflikt zwischen multipart-post-2.4.0 und multipart-post-2.4.1?

Danke!
Thommie

Es ist passiert und hat dazu geführt, dass zwei meiner Builds umgefallen sind. Mindestens eines der Plugins von CDCK verwendet eine alte Version.

Dies ist das System, das wie vorgesehen funktioniert.

Wenn wir Gem-Abhängigkeiten mit Gemfile und Gemfile.lock verwalten, scannt dependbot nach Updates, und wir halten uns mit unseren internen Prozessen auf dem Laufenden.

Als Plugin-Designer können Sie sich jetzt auf die Gem-Abhängigkeiten verlassen, die wir im Kern ausliefern.

Das bedeutet, dass Sie multipart-post aus Ihrem Plugin-Plugin.rb löschen und es einfach von dort aus aufrufen sollten, wo Sie es verwenden.

Eine Sorge weniger für Plugin-Autoren.

Nützliches Feedback, danke.

@Thomas_Rother Ich habe die Abhängigkeit aus dem Plugin entfernt. Versuchen Sie es erneut mit dem Build.

@merefield @sam :smiley: - Erfolg!! Mit dem Commit 6be7a44 im Roberts Plugin GitHub - merefield/discourse-workflow: A workflow system for Topics that implements a configurable multi-stage process ist der Build erfolgreich. Danke für die Analyse und die Korrektur!