Discourse mit Docker für die Entwicklung installieren

Die Grundursache könnte darin liegen, dass pg15 die Standard-Authentifizierungsregeln geändert hat.

Konfigurationsdateipfad: /etc/postgresql/15/main/pg_hba.conf

Inhalt der Datei:

# Database administrative login by Unix domain socket
local   all             postgres                                peer

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
host all all 0.0.0.0/0 md5
# IPv6 local connections:
host all all ::/0 md5
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     peer
host    replication     all             127.0.0.1/32            scram-sha-256
host    replication     all             ::1/128                 scram-sha-256

Der Befehl, der für das Backup ausgeführt wurde:

pg_dump --schema=public -T public.pg_* --file=‘/src/tmp/backups/default/2026-02-02-063003/dump.sql.gz’ --no-owner --no-privileges --verbose --compress=4 --username=postgres discourse_development

Aufgrund der Regel local all postgres peer schlägt der obige Befehl mit dem Fehler fehl: Peer authentication failed for user "postgres"

Lösungsansatz: Ändern Sie peer in trust, um alle Befehle in der lokalen Umgebung zuzulassen. Das bedeutet, dass für alle Befehle keine Authentifizierung mehr erforderlich ist (und auch kein Passwort eingegeben werden muss).

Konkrete Schritte:

  1. Kopieren Sie /etc/postgresql/15/main/pg_hba.conf aus dem Container auf Ihren lokalen Rechner

sudo docker cp discourse_dev:/etc/postgresql/15/main/pg_hba.conf ~/discourse/data/pg_hba.conf

Berechtigungen auf 644 setzen

sudo chmod 644 ~/discourse/data/pg_hba.conf

Konfiguration in data/pg_hba.conf ändern

# Database administrative login by Unix domain socket
local   all   postgres   trust
  1. Ändern Sie die Datei d/boot_dev, um data/pg_hba.conf in den Container einzubinden und so die Standardkonfigurationsdatei von pg zu überschreiben.
docker run -d \
    -p $local_publish:8025:8025 \
    -p $local_publish:3000:3000 \
    -p $local_publish:4200:4200 \
    -p $local_publish:9292:9292 \
    -p $local_publish:9405:9405 \
    -v "$DATA_DIR:/shared/postgres_data:delegated" \
    # Die folgende Zeile ist neu, sie bindet die Konfigurationsdatei in den Container ein und gibt dem Container nur Lesezugriff
    -v "$SOURCE_DIR/data/pg_hba.conf:/etc/postgresql/15/main/pg_hba.conf:ro" \
    -v "$SOURCE_DIR:/src:delegated" \
    -e UNICORN_BIND_ALL=true \
    $mount_plugin_symlinks \
    $ENV_ARGS \
    --hostname=discourse \
    --name=discourse_dev \
    --restart=always \
    discourse/discourse_dev:release /sbin/boot
  1. Stoppen und löschen Sie den aktuellen Container und erstellen Sie dann den neuen Container neu
d/shotdown_dev
d/boot_dev
  1. Nach der Neuerstellung starten Sie die Frontend- und Backend-Anwendungen und testen Sie, ob das Backup normal funktioniert
d/rails s

# In einem anderen Terminal ausführen
d/ember-cli

Klicken Sie auf der Backup-Seite auf Sichern, warten Sie einige Sekunden und überprüfen Sie dann die Liste der Sicherungsdateien.

1 „Gefällt mir“

Basierend auf den obigen Erfahrungen besteht nun die Möglichkeit, sich mit einem lokalen Datenbankclient mit der postgreSQL-Datenbank in Docker zu verbinden.

Konfiguration in der Datei d/boot_dev wie folgt ändern:

docker run -d \
    -p $local_publish:8025:8025 \
    -p $local_publish:3000:3000 \
    -p $local_publish:4200:4200 \
    -p $local_publish:9292:9292 \
    -p $local_publish:9405:9405 \
    # Neuen Port mappen
    -p $local_publish:55432:5432 \
    -v "$DATA_DIR:/shared/postgres_data:delegated" \
    # Konfigurationsdateizuordnung beibehalten
    -v "$SOURCE_DIR/data/pg_hba.conf:/etc/postgresql/15/main/pg_hba.conf:ro" \
    -v "$SOURCE_DIR:/src:delegated" \
    -e UNICORN_BIND_ALL=true \
    $mount_plugin_symlinks \
    $ENV_ARGS \
    --hostname=discourse \
    --name=discourse_dev \
    --restart=always \
    discourse/discourse_dev:release /sbin/boot

Alle Anfragen zum Verbinden mit pg zulassen:

In der Datei data/pg_hba.conf die Konfiguration wie folgt ändern:

# IPv4 local connections:
host all all 0.0.0.0/0 trust
# IPv6 local connections:
host all all ::/0 trust

Erneut bauen

d/shutdown_dev
d/boot_dev

Jetzt kann eine Verbindung mit einem lokalen Datenbankclient hergestellt werden

Ich verwende hier DBeaver

  1. Der Datenbankport ist 55432, was mit dem in d/boot_dev übereinstimmt. Hier ist es 55432, um Konflikte mit bereits lokalen Instanzen zu vermeiden.
  2. Datenbankname
  3. Es wird empfohlen, „Alle Datenbanken anzeigen“ anzuklicken
  4. Benutzername
  5. Testen Sie, ob die Verbindung hergestellt werden kann
  6. Klicken Sie auf OK, um zu speichern

Endlich kann ich die Daten in der Datenbank bequem lokal einsehen.

1 „Gefällt mir“

Ist es normal, dass diese Installation das Menü nicht korrekt anzeigt?

Hallo, obwohl nach Befolgen dieses Tutorials auf einer Ubuntu 26.04-Maschine alles funktioniert zu scheinen, scheint keine E-Mail versendet zu werden.

Ich habe d/mailhog in einem dedizierten Terminal gestartet und sehe dort den HTML/CSS-Code der E-Mail, die nach der Registrierung eines Testbenutzers gesendet wurde. Der Benutzer erhält jedoch nichts an der angegebenen E-Mail-Adresse.

Was habe ich übersehen und wie kann ich das beheben? :folded_hands:

Die E-Mail sollte unter http://localhost:8025 erscheinen, denke ich (MailHog-Port).

Dies ist keine Produktionsinstallation, daher werden keine E-Mails über das Internet versendet. Dafür benötigen Sie eine vollständige Produktionsinstallation und einen kompatiblen E-Mail-Dienst (der heutzutage meist echtes Geld kostet, da die Verwaltung von Vertrauen Kosten verursacht :money_bag:).

1 „Gefällt mir“

Danke @merefield, ich hatte localhost:8025 zwar richtig gesehen, aber aus irgendeinem Grund hat es nicht funktioniert, und jetzt läuft alles gut.

1 „Gefällt mir“

Funktioniert diese Lösung? Ich kam nicht über d/boot_dev --init hinaus.

Update:
Ich verstehe: Wenn deine Entwickler-UID nicht 1000 ist – wie beim Benutzer discourse im Container discourse_dev – funktioniert das Ganze offenbar nicht.

uid=1000(discourse) gid=1000(discourse) groups=1000(discourse)

Eine Reihe von Problemen, auf die ich gestoßen bin
nastee@station ~/vendsrc/discourse > ./d/boot_dev --init
Using source in: /home/nastee/vendsrc/discourse
Using data in:   /home/nastee/vendsrc/discourse/data/postgres
release: Pulling from discourse/discourse_dev
.....
Digest: sha256:e118af085d4be0486d4d9bfa83ac1c519d9975bed9a08180d10d5ad7c508632c
Status: Downloaded newer image for discourse/discourse_dev:release
docker.io/discourse/discourse_dev:release
f517752802e70b8a9110972bb3ddc0e9343d0c430603e4a9ae3eacc5ec69a2cf
Installing gems...
There was an error while trying to write to `/src/Gemfile.lock`. It is likely that you need to grant write permissions for that path.

Dank an: There was an error while trying to write to `/src/Gemfile.lock`. It is likely that you need to grant write permissions for that path - #2 by jacque006

Ich habe diese Datei auf 777 gesetzt (ekelig). Damit ließ sich zumindest jetzt Gems installieren, aber der nächste docker exec-Prozess versucht, in das Quellverzeichnis zu schreiben und kann dies nicht, da er nicht als mein Benutzer läuft. Daher erhalte ich:

 EACCES  EACCES: permission denied, open '/src/_tmp_82_62be1aeb82e80c1d1054dac8bdbc5923'

Na gut, warum nicht: sudo chmod 4777 ., wobei . das geklonte Quellverzeichnis ist, in dem ich d/ ausführe.

Das führt mich zu:

 EACCES  Error while trying to symlink "../../../node_modules/.pnpm/prettier@3.8.1/node_modules/prettier" to "/src/docs/developer-guides/node_modules/prettier". The error happened while trying to create the parent directory for the symlink target. Details: Error: EACCES: permission denied, mkdir '/src/docs/developer-guides/node_modules'

Nach einem weiteren Berechtigungsproblem habe ich einfach chmod 777 -R . ausgeführt.

Letztendlich lande ich bei:

connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: No such file or directory