Berechtigungsfehler mit "./launcher rebuild app" bei Neuinstallation

Ich habe Folgendes ausgeführt:

git clone https://github.com/discourse/discourse_docker.git /var/discourse
cd /var/discourse
chmod 700 containers

Dann habe ich meine alte app.yml in containers kopiert und versucht, die App neu zu erstellen:


[root@two discourse]# ./launcher rebuild app
x86_64 arch erkannt.
Stelle sicher, dass der Launcher auf dem neuesten Stand ist
Launcher ist auf dem neuesten Stand
Stoppe alten Container
+ /usr/bin/docker stop -t 600 app
app
2.0.20250722-0020: Ziehe von discourse/base
Digest: sha256:3b975c30ef85e9742e2d7f6093450867e67dae204c93d22cc38d043dcbf530b3
Status: Image ist auf dem neuesten Stand für discourse/base:2.0.20250722-0020
docker.io/discourse/base:2.0.20250722-0020
/usr/local/lib/ruby/gems/3.3.0/gems/pups-1.3.0/lib/pups.rb
/usr/local/bin/pups --stdin
I, [2025-09-12T19:05:09.283821 #1]  INFO -- : Lesen von stdin
I, [2025-09-12T19:05:09.296585 #1]  INFO -- : Datei > /etc/service/postgres/run  chmod: +x  chown: 
I, [2025-09-12T19:05:09.301579 #1]  INFO -- : Datei > /etc/service/postgres/log/run  chmod: +x  chown: 
I, [2025-09-12T19:05:09.307391 #1]  INFO -- : Datei > /etc/runit/3.d/99-postgres  chmod: +x  chown: 
I, [2025-09-12T19:05:09.313597 #1]  INFO -- : Datei > /root/install_postgres  chmod: +x  chown: 
I, [2025-09-12T19:05:09.319914 #1]  INFO -- : Datei > /root/upgrade_postgres  chmod: +x  chown: 
I, [2025-09-12T19:05:09.320255 #1]  INFO -- : Ersetze data_directory = '/var/lib/postgresql/15/main' durch data_directory = '/shared/postgres_data' in /etc/postgresql/15/main/postgresql.conf
I, [2025-09-12T19:05:09.323526 #1]  INFO -- : Ersetze (?-mix:#?listen_addresses *=.*) durch listen_addresses = '*' in /etc/postgresql/15/main/postgresql.conf
I, [2025-09-12T19:05:09.324153 #1]  INFO -- : Ersetze (?-mix:#?synchronous_commit *=.*) durch synchronous_commit = $db_synchronous_commit in /etc/postgresql/15/main/postgresql.conf
I, [2025-09-12T19:05:09.324577 #1]  INFO -- : Ersetze (?-mix:#?shared_buffers *=.*) durch shared_buffers = $db_shared_buffers in /etc/postgresql/15/main/postgresql.conf
I, [2025-09-12T19:05:09.324945 #1]  INFO -- : Ersetze (?-mix:#?work_mem *=.*) durch work_mem = $db_work_mem in /etc/postgresql/15/main/postgresql.conf
I, [2025-09-12T19:05:09.325369 #1]  INFO -- : Ersetze (?-mix:#?default_text_search_config *=.*) durch default_text_search_config = '$db_default_text_search_config' in /etc/postgresql/15/main/postgresql.conf
I, [2025-09-12T19:05:09.325759 #1]  INFO -- : Ersetze (?-mix:#?checkpoint_segments *=.*) durch checkpoint_segments = $db_checkpoint_segments in /etc/postgresql/15/main/postgresql.conf
I, [2025-09-12T19:05:09.329467 #1]  INFO -- : Ersetze (?-mix:#?logging_collector *=.*) durch logging_collector = $db_logging_collector in /etc/postgresql/15/main/postgresql.conf
I, [2025-09-12T19:05:09.330304 #1]  INFO -- : Ersetze (?-mix:#?log_min_duration_statement *=.*) durch log_min_duration_statement = $db_log_min_duration_statement in /etc/postgresql/15/main/postgresql.conf
I, [2025-09-12T19:05:09.330761 #1]  INFO -- : Ersetze (?-mix:^#local +replication +postgres +peer$) durch local replication postgres  peer in /etc/postgresql/15/main/pg_hba.conf
I, [2025-09-12T19:05:09.331823 #1]  INFO -- : Ersetze (?-mix:^host.*all.*all.*127.*$) durch host all all 0.0.0.0/0 md5 in /etc/postgresql/15/main/pg_hba.conf
I, [2025-09-12T19:05:09.332230 #1]  INFO -- : Ersetze (?-mix:^host.*all.*all.*::1\\/128.*$) durch host all all ::/0 md5 in /etc/postgresql/15/main/pg_hba.conf
I, [2025-09-12T19:05:09.332621 #1]  INFO -- : > if [ -f /root/install_postgres ]; then
  /root/install_postgres & && rm -f /root/install_postgres
elif [ -e /shared/postgres_run/.s.PGSQL.5432 ]; then
  socat /dev/null UNIX-CONNECT:/shared/postgres_run/.s.PGSQL.5432 || exit 0 && echo postgres already running stop container ; exit 1
fi

mkdir: Verzeichnis „/shared/postgres_run“ kann nicht erstellt werden: Berechtigung verweigert
chown: „/shared/postgres_run“ kann nicht zugegriffen werden: Datei oder Verzeichnis nicht gefunden
chmod: „/shared/postgres_run“ kann nicht zugegriffen werden: Datei oder Verzeichnis nicht gefunden
mkdir: Verzeichnis „/shared/postgres_run“ kann nicht erstellt werden: Berechtigung verweigert
chown: „/shared/postgres_run/15-main.pg_stat_tmp“ kann nicht zugegriffen werden: Datei oder Verzeichnis nicht gefunden
install: Besitzer und Berechtigungen von „/shared/postgres_data“ können nicht geändert werden: Datei oder Verzeichnis nicht gefunden
initdb: Fehler: Verzeichnis „/shared/postgres_data“ konnte nicht erstellt werden: Berechtigung verweigert
find: „/shared/postgres_data“: Datei oder Verzeichnis nicht gefunden
chown: „/var/run/postgresql“ kann nicht dereferenziert werden: Datei oder Verzeichnis nicht gefunden
cat: /shared/postgres_data/PG_VERSION: Datei oder Verzeichnis nicht gefunden
du: Zugriff auf „/shared/postgres_data“ nicht möglich: Datei oder Verzeichnis nicht gefunden
/root/upgrade_postgres: Zeile 7: * 2: Syntaxfehler: Operand erwartet (Fehler-Token ist „* 2“)
I, [2025-09-12T19:05:12.122891 #1]  INFO -- : Lokalisierungen werden generiert (dies kann eine Weile dauern)...
  en_US.UTF-8... erledigt
Generierung abgeschlossen.
Die Dateien, die zu diesem Datenbanksystem gehören, werden dem Benutzer „postgres“ gehören.
Dieser Benutzer muss auch den Serverprozess besitzen.

Der Datenbankcluster wird mit der Lokalisierung „en_US.UTF-8“ initialisiert.
Die Standard-Datenbankkodierung wurde entsprechend auf „UTF8“ gesetzt.
Die Standard-Textsuchkonfiguration wird auf „english“ gesetzt.

Daten-Page-Prüfsummen sind deaktiviert.

Verzeichnis /shared/postgres_data wird erstellt ... PostgreSQL von Version auf 15 aktualisieren


FAILED
--------------------
Pups::ExecError: if [ -f /root/install_postgres ]; then
  /root/install_postgres & && rm -f /root/install_postgres
elif [ -e /shared/postgres_run/.s.PGSQL.5432 ]; then
  socat /dev/null UNIX-CONNECT:/shared/postgres_run/.s.PGSQL.5432 || exit 0 && echo postgres already running stop container ; exit 1
fi
 ist mit Rückgabewert #<Process::Status: pid 18 exit 1> fehlgeschlagen
Ort des Fehlschlags: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.3.0/lib/pups/exec_command.rb:131:in `spawn'
exec fehlgeschlagen mit den Parametern {"tag"=>"db", "cmd"=>"if [ -f /root/install_postgres ]; then\n  /root/install_postgres & && rm -f /root/install_postgres\nelif [ -e /shared/postgres_run/.s.PGSQL.5432 ]; then\n  socat /dev/null UNIX-CONNECT:/shared/postgres_run/.s.PGSQL.5432 || exit 0 && echo postgres already running stop container ; exit 1\nfi\n"}
Bootstrap fehlgeschlagen mit Exit-Code 1
** BOOTSTRAP FEHLGESCHLAGEN ** Bitte scrollen Sie nach oben und suchen Sie nach früheren Fehlermeldungen, es kann mehr als eine geben.
./discourse-doctor kann bei der Diagnose des Problems helfen.
c9c7badf83b119a15b40255ae48a05182f72663cc870ca85e867c1f9a218bb83

Anscheinend gibt es zu Beginn ein Berechtigungsproblem innerhalb des Containers:

mkdir: Verzeichnis „/shared/postgres_run“ kann nicht erstellt werden: Berechtigung verweigert

Was könnte das verursachen?

Anscheinend muss ich Docker mit dem --privileged-Flag ausführen, da dies das Problem löst:

./launcher rebuild app --docker-args '--privileged'

Es ist mir nicht klar, warum das so ist. (Dies ist auf Fedora 42.) Ich würde gerne verstehen, was hier passiert.

Weil in Discourse diese Dateien root gehören (oder das übergeordnete Verzeichnis?).

Vielleicht ist es unter Ubuntu standardmäßig eingestellt. Ich weiß nicht, was unter Ubuntu anders sein könnte.

Könnten Sie versuchen, /var/discourse/shared auf weltweite Schreibrechte zu setzen und zu sehen, ob es funktioniert? Oder vielleicht könnten Sie sehen, ob es ohne ``–privileged` jetzt funktioniert?

Ubuntu wird empfohlen und Debian befindet sich im Container (und ist möglicherweise das, was CDCK jetzt für sein Host-Betriebssystem verwendet?). Fedora hat eine Menge Dinge gesperrt, die Ubuntu nicht hat. Wenn Sie es verstehen möchten, sind Sie wahrscheinlich weitgehend auf sich allein gestellt, obwohl ich mich erinnere, dass zumindest eine Person hier mit einiger Häufigkeit Fedora CentOS mag (was näher an Fedora als an Ubuntu ist!). Dies könnte Hinweise geben: MKJ's Opinionated Discourse Deployment Configuration

Ich frage mich, was die effektive uid an dem Punkt ist, an dem das Bootstrap-Skript versucht, Unterverzeichnisse in /var/discourse/shared zu erstellen. Ich dachte, es wäre root, da Docker als root ausgeführt wird, aber anscheinend nicht?

Ich sehe dort leider nichts über die Verwendung von --privileged, obwohl ich seinen Wunsch teile, dies alles mit Podman anstelle von Docker zu erledigen.

1 „Gefällt mir“

Ja, ich habe noch keinen produktiven Discourse auf Fedora laufen lassen, sondern nur die Discourse-Entwicklung auf Fedora betrieben, und das nicht auf 42. Meine Discourse-Server laufen jetzt auf AlmaLinux 9 und dort benötige ich --privileged nicht. Ich habe Docker auf keinem meiner Fedora-Systeme installiert.

1 „Gefällt mir“

Ich denke, ich werde versuchen herauszufinden, wem diese Verzeichnisse gehören, ohne --privileged, wenn ich Zeit habe.

1 „Gefällt mir“

Wenn ich mir --privileged ansehe, sehe ich, dass es SELinux-Prozessbeschriftungen deaktiviert.

Ich deaktiviere SELinux auf meinem Discourse-Server nicht und habe in meiner Anleitung Anweisungen, wie man SELinux aktiviert lässt und gleichzeitig externen Nginx verwendet. Sie können auch Ihre AVC-Protokolle auf relevante Ablehnungen überprüfen und mit audit2allow eine lokale Richtlinie schreiben. Dies kann jedoch ein langer iterativer Prozess sein. Ich würde von vorne beginnen (alles in /var/discourse löschen), um sicherzustellen, dass es ein gültiger Test ist, und sehen, ob Sie --permissive immer noch benötigen, wenn SELinux deaktiviert ist (z. B. setenforce 0). Wenn das funktioniert, können Sie audit2allow verwenden, da setenforce 0 immer noch AVC-Einträge schreibt, aber nicht mehr am ersten Tor gestoppt wird, sodass Sie schneller zu einer funktionierenden Richtlinie gelangen.

Ich glaube nicht, dass ich --privileged in einem Produktionssystem weiter verwenden würde, wenn ich es vermeiden könnte.

1 „Gefällt mir“