Install Discourse for development using Docker

Корневая причина, скорее всего, заключается в том, что в PostgreSQL 15 были изменены правила аутентификации по умолчанию.

Путь к файлу конфигурации: /etc/postgresql/15/main/pg_hba.conf

Содержимое файла:

# 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

Команда, использованная для выполнения резервного копирования:

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

Из-за правила local all postgres peer вышеуказанная команда завершилась ошибкой: Peer authentication failed for user "postgres"

Идея решения: заменить peer на trust, чтобы разрешить все команды в локальной среде. Это означает, что для всех команд больше не потребуется аутентификация (и ввод пароля).

Конкретные шаги:

  1. Скопируйте файл /etc/postgresql/15/main/pg_hba.conf из контейнера на локальную машину:

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

Установите права доступа 644:

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

Измените конфигурацию в файле data/pg_hba.conf:

# Database administrative login by Unix domain socket
local   all   postgres   trust
  1. Измените файл d/boot_dev, чтобы смонтировать data/pg_hba.conf в контейнер, заменив файл конфигурации по умолчанию PostgreSQL.
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" \
    # Ниже приведена новая строка для монтирования файла конфигурации в контейнер с правами только на чтение
    -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. Остановите и удалите текущий контейнер, затем создайте новый.
d/shotdown_dev
d/boot_dev
  1. После пересоздания запустите frontend и backend приложения и проверьте, выполняется ли резервное копирование корректно.
d/rails s

# В другой терминальной сессии выполните:
d/ember-cli

На странице резервного копирования нажмите кнопку «Создать резервную копию», подождите несколько секунд, затем проверьте список файлов резервных копий.

1 лайк

Исходя из предыдущего опыта, теперь можно реализовать подключение к базе данных PostgreSQL в Docker с помощью локального клиента.

Измените конфигурацию в файле d/boot_dev следующим образом:

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 \
    # Добавлено сопоставление портов
    -p $local_publish:55432:5432 \
    -v "$DATA_DIR:/shared/postgres_data:delegated" \
    # Сохранено сопоставление конфигурационного файла
    -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

Разрешите все подключения к PostgreSQL:

В файле data/pg_hba.conf внесите следующие изменения:

# Локальные подключения IPv4:
host all all 0.0.0.0/0 trust
# Локальные подключения IPv6:
host all all ::/0 trust

Пересоберите контейнер

d/shutdown_dev
d/boot_dev

Теперь можно подключиться с помощью локального клиента базы данных

В данном примере используется DBeaver.

  1. Порт базы данных — 55432, как указано в d/boot_dev. Это значение выбрано, чтобы избежать конфликтов с уже используемыми локальными портами.
  2. Имя базы данных
  3. Рекомендуется установить флажок «Показать все базы данных»
  4. Имя пользователя
  5. Проверьте подключение
  6. Нажмите «ОК», чтобы сохранить настройки

Теперь можно с удовольствием просматривать данные базы данных локально.

1 лайк

Нормально ли, что при этой установке меню отображается некорректно?

Здравствуйте! Несмотря на то, что после выполнения этого руководства на машине Ubuntu 26.04 всё, кажется, работает, письма не отправляются.

Я запустил d/mailhog в отдельном терминале и вижу HTML/CSS код письма, отправленного после регистрации тестового пользователя, но сам пользователь ничего не получает на указанный адрес электронной почты…

Что я упустил и как это исправить? :folded_hands:

Письмо должно появиться в http://localhost:8025, я полагаю (порт MailHog).

Это не установка для продакшена, поэтому письма не будут отправляться через интернет. Для этого потребуется полноценная установка для продакшена и совместимый почтовый сервис (который в наши дни обычно стоит реальных денег, так как управление доверием обходится недёшево :money_bag: )

1 лайк

Спасибо @merefield, я действительно видел localhost:8025, но по какой-то причине это не работало, а теперь всё в порядке.

1 лайк

Работает ли это решение? Мне не удалось пройти дальше d/boot_dev --init.

Обновление:
Я понял: если UID разработчика не равен 1000, как у пользователя discourse в контейнере discourse_dev, то всё разваливается.

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

Много проблем, с которыми я столкнулся
nastee@station ~/vendsrc/discourse > ./d/boot_dev --init
Используется исходный код в: /home/nastee/vendsrc/discourse
Используются данные в:      /home/nastee/vendsrc/discourse/data/postgres
release: получение из discourse/discourse_dev
.....
Digest: sha256:e118af085d4be0486d4d9bfa83ac1c519d9975bed9a08180d10d5ad7c508632c
Status: загружен новый образ для discourse/discourse_dev:release
docker.io/discourse/discourse_dev:release
f517752802e70b8a9110972bb3ddc0e9343d0c430603e4a9ae3eacc5ec69a2cf
Установка gems...
Произошла ошибка при попытке записи в `/src/Gemfile.lock`. Вероятно, вам нужно предоставить права на запись для этого пути.

Спасибо за подсказку: 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

Я установил права 777 для этого файла (фу), после чего gems начали устанавливаться. Однако следующий процесс docker exec попытался записать в исходный каталог и не смог, так как он выполняется не от моего пользователя. В результате я получил:

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

Ладно, почему бы нет: sudo chmod 4777 ., где . — это клонированный исходный каталог, в котором я запускаю d/.

Это привело меня к:

 EACCES  Ошибка при попытке создать символическую ссылку "../../../node_modules/.pnpm/prettier@3.8.1/node_modules/prettier" на "/src/docs/developer-guides/node_modules/prettier". Ошибка возникла при попытке создать родительский каталог для цели символической ссылки. Детали: Error: EACCES: permission denied, mkdir '/src/docs/developer-guides/node_modules'

После ещё одной проблемы с правами я просто сдался и выполнил chmod 777 -R ..

В итоге это привело к:

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