Hallo Team,
ich melde einen Fehler im offiziellen Docker/runit-Setup, der Sidekiq (und damit KI/Hintergrundjobs) stillschweigend beenden kann, ohne dass ein Rebuild oder Upgrade erforderlich ist.
Umgebung
- Offizielle Discourse Docker-Installation (Standard-Container + runit-Dienste).
- Kein Rebuild/Upgrade unmittelbar vor Auftreten des Problems.
- Discourse AI-Plugin aktiviert, aber KI antwortet nicht mehr.
Symptome
- KI wird in der Admin-UI als aktiviert angezeigt, aber es erscheinen keine KI-Antworten.
- Hintergrundjobs (KI/Embeddings/Auto-Reply) scheinen festzustecken.
sv status sidekiqzeigt, dass Sidekiq unmittelbar nach dem Start wiederholt abstürzt:
down: sidekiq: 1s, normally up, want up
- Manuelles Starten von Sidekiq funktioniert einwandfrei, die Anwendung selbst ist also in Ordnung:
bundle exec sidekiq -C config/sidekiq.yml
# bleibt aktiv, verbindet sich mit Redis, verarbeitet Jobs
Was wir herausgefunden haben
Das standardmäßige runit-Skript war:
exec chpst -u discourse:www-data \
bash -lc 'cd /var/www/discourse && ... bundle exec sidekiq -e production -L log/sidekiq.log'
Zwei Schwachstellen:
- Primäre Gruppe www-data In meinem Container gehören typische beschreibbare Pfade
discourse:discourse. Jede Abweichung beitmp/pidsoder gemeinsam genutzten Pfaden kann dazu führen, dass Sidekiq beim Booten unterwww-databeendet wird, obwohl der manuelle Start alsdiscoursefunktioniert. - Erzwungenes -L log/sidekiq.log Schreiben in gemeinsame Logs Der Protokollpfad ist ein Symlink nach
/shared/log/rails/sidekiq.log. Wenn diese Datei/dieses Verzeichnis mit anderer Eigentümerschaft/Berechtigungen neu erstellt wird, kann Sidekiq sofort beendet werden, bevor nützliche Protokolle erstellt werden.
Zugehöriger Auslöser: logrotate schlägt täglich fehl
Unabhängig davon schlug logrotate jeden Tag fehl mit:
error: skipping "...log" because parent directory has insecure permissions
Set "su" directive in config file ...
Ursache waren Standard-Debian/Ubuntu-Berechtigungen:
/var/loggehörtroot:admmit0775(gruppenschreibbar).logrotateverweigert die Rotation, es sei denn, eine globalesu-Direktive wird festgelegt. Dies ist das erwartete Upstream-Verhalten.
Genau in dem Moment, als der tägliche logrotate-Job fehlschlug, wurden auch Dateien unter /shared/log/rails/ (einschließlich sidekiq.log) neu erstellt, was wahrscheinlich mit der erzwungenen -L-Protokollierung interagierte und zur Sidekiq „1s Crash“-Schleife beitrug.
Fix (kein Rebuild erforderlich)
- Logrotate korrigieren, damit es aufhört, gemeinsame Logs in einem fehlerhaften Zustand zu berühren Eine globale
su-Direktive hinzufügen:
# /etc/logrotate.conf (oben)
su root adm
Danach beendet sich logrotate -v mit 0 und meldet keine unsicheren übergeordneten Berechtigungen mehr.
- Sidekiq runit-Skript durch eine robustere Standardeinstellung ersetzen Der Wechsel zu
discourse:discourseund der Standardsidekiq.ymlund das Nicht-Erzwingen von-L log/sidekiq.logstabilisiert Sidekiq:
#!/bin/bash
exec 2>&1
cd /var/www/discourse
mkdir -p tmp/pids
chown discourse:discourse tmp/pids || true
exec chpst -u discourse:discourse \
bash -lc 'cd /var/www/discourse && rm -f tmp/pids/sidekiq*.pid; exec bundle exec sidekiq -C config/sidekiq.yml'
Danach:
sv status sidekiqbleibtrun.- KI/Hintergrundjobs werden wieder aufgenommen.
Anfrage / Vorschlag
Könnten wir in Betracht ziehen, den offiziellen Docker/runit Sidekiq-Dienst standardmäßig robuster zu gestalten?
Zum Beispiel:
- Sidekiq unter
discourse:discourseausführen (entsprechend der typischen Eigentümerschaft innerhalb des Containers). - Bevorzugen Sie
bundle exec sidekiq -C config/sidekiq.yml. - Vermeiden Sie das Erzwingen einer gemeinsamen Protokolldatei über
-L log/sidekiq.logoder machen Sie diese widerstandsfähig gegen Berechtigungsabweichungen vonlogrotate/gemeinsam genutztem Volume.
Selbst ein Dokumentationshinweis („Wenn Sidekiq down: 1s anzeigt, aber der manuelle Start funktioniert, überprüfen Sie /etc/service/sidekiq/run und vermeiden Sie erzwungene gemeinsame Protokollierung“) würde Self-Hostern sehr helfen.
Gerne stelle ich weitere Protokolle zur Verfügung, falls erforderlich. Danke!