Installa Discourse per lo sviluppo usando Docker

La causa principale potrebbe essere che pg15 ha modificato le regole di autenticazione predefinite.

Percorso del file di configurazione: /etc/postgresql/15/main/pg_hba.conf

Contenuto del file:

# 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

Il comando di backup eseguito è:

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

Il comando sopra fallisce a causa della regola local all postgres peer: Peer authentication failed for user "postgres"

Idea di soluzione: cambiare peer in trust, consentendo tutti i comandi nell’ambiente locale. Ciò significa che tutti i comandi non richiederanno più l’autenticazione (né l’inserimento della password).

Passaggi specifici:

  1. Copiare /etc/postgresql/15/main/pg_hba.conf dal container in locale

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

Dare i permessi 644

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

Modificare la configurazione in data/pg_hba.conf

# Database administrative login by Unix domain socket
local   all   postgres   trust
  1. Modificare il file d/boot_dev per montare data/pg_hba.conf nel container, sovrascrivendo il file di configurazione predefinito di pg.
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" \
    # La riga seguente è aggiunta, monta il file di configurazione nel container, e dà al container permessi di sola lettura
    -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. Spegnere ed eliminare il container corrente, quindi ricreare il nuovo container
d/shotdown_dev
d/boot_dev
  1. Dopo la ricreazione, avviare le applicazioni frontend e backend e testare se il backup funziona correttamente
d/rails s

# Eseguire in un altro terminale
d/ember-cli

Nella pagina di backup, fare clic su backup, attendere qualche secondo e quindi visualizzare l’elenco dei file di backup.

1 Mi Piace

Sulla base dell’esperienza precedente, il desiderio di connettersi al database PostgreSQL all’interno di Docker utilizzando un client di database locale è ora realizzabile.

Modificare la configurazione nel file d/boot_dev come segue:

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 \
    # Mappatura della porta aggiunta
    -p $local_publish:55432:5432 \
    -v "$DATA_DIR:/shared/postgres_data:delegated" \
    # Mantenere il mapping del file di configurazione
    -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

Consentire tutte le richieste di connessione a pg:

Nel file data/pg_hba.conf, modificare la configurazione come segue:

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

Ricostruire

d/shutdown_dev
d/boot_dev

Ora è possibile connettersi utilizzando un client di database locale

Sto usando DBeaver qui

  1. La porta del database è 55432, coerente con d/boot_dev, qui è 55432 per evitare conflitti con quelli locali esistenti.
  2. Nome del database
  3. Si consiglia di spuntare “Mostra tutti i database”
  4. Nome utente
  5. Testare la connessione
  6. Fare clic su OK per salvare

Finalmente posso visualizzare felicemente i dati nel database localmente.

1 Mi Piace

È normale che questa installazione non visualizzi correttamente il menu?

Ciao, anche se tutto sembra funzionare dopo aver seguito questo tutorial su una macchina Ubuntu 26.04, nessun’email sembra essere inviata.

Ho avviato correttamente d/mailhog in un terminale dedicato e vedo il codice HTML/CSS dell’email inviata dopo la registrazione di un utente di prova, ma questa non riceve nulla all’indirizzo email che ho fornito…

Cosa ho sbagliato e come posso risolvere il problema? :folded_hands:

La mail dovrebbe apparire in http://localhost:8025, credo (porta di Mailhog).

Questa non è un’installazione di produzione, quindi nessuna email verrà inviata su Internet: per farlo è necessaria un’installazione completa di produzione e un servizio di posta compatibile (che al giorno d’oggi di solito costa denaro vero, dato che gestire la fiducia ha un costo :money_bag:)

1 Mi Piace

Grazie @merefield, avevo notato localhost:8025, ma per una ragione che non conosco non funzionava, e ora va tutto bene.

1 Mi Piace

Questa soluzione funziona? Non sono riuscito ad andare oltre d/boot_dev --init.

Aggiornamento:
Capisco, se il tuo UID da sviluppatore non è 1000, come l’utente discourse nel container discourse_dev, sembra che tutto si rompa.

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

Una serie di problemi che ho incontrato
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.

Grazie a: 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

Ho impostato quel file a 777 (che schifo), l’ho fatto, e ora almeno i Gem vengono installati, ma il successivo processo docker exec tenta di scrivere nella directory sorgente e non può farlo poiché non viene eseguito come il mio utente, quindi ottengo:

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

Ok, perché no, sudo chmod 4777 . dove . è la directory sorgente clonata da cui sto eseguendo d/

Il che mi porta a:

 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'

dopo aver incontrato un altro problema di permessi e aver semplicemente ceduto a chmod 777 -R .

che culmina infine in:

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