Install Discourse for development using Docker

Ой, команда d/cleanup опасна. Это отличный способ потерять много работы с Docker, которая вообще не связана с Discourse…

Я начал применять такие ручные исправления, как ниже, которые работали, но всё чаще возникали проблемы с правами доступа, поэтому я решил перестать тушить пожары.

mkdir app/assets/javascripts/plugins
mkdir tmp
sudo chown 1000:1000 tmp
sudo chown 1000:1000 app/assets/javascripts/plugins

Я планирую использовать пользователя хоста с UID 1000 и уверен, что теперь всё заработает как надо, но это, похоже, вскрывает недостаток в том, как осуществляется разработка Discourse.

…и да, это сработало.

В случае с папкой “tmp” она может находиться в именованном или анонимном томе Docker. Для плагинов может быть полезно иметь смонтированный том, но права доступа в файловой системе хоста необходимо изменить, чтобы разрешить запись.

Я не думаю, что можно безопасно предполагать, что каждый разработчик будет использовать UID 1000.

3 лайка

Привет, ребята! Подскажите, пожалуйста, как запустить разработку на старой версии Discourse? Я знаю, что в продакшн-среде версию можно указать в файле app.yml, но не уверен, как это сделать в режиме разработки с использованием Docker. Мне нужно запустить разработку на последней стабильной версии v2.7.10. Спасибо за помощь!

Просто переключитесь на эту ветку или коммит в Git. (Я делаю это так: гуглю

Вам потребуется удалить, создать и выполнить миграцию базы данных после понижения версии.

Привет, спасибо, @pfaffman,

Я сделал свежий git pull репозитория discourse и переключился на ветку “stable” (которая использует тег discourse v2.7.10).

Я выполнил dev init и настроил email и пароль для пользователя администратора:

d/boot_dev --init

затем запустил rails server, который слушает порт 3000:

d/rails s

после этого запустил ember-cli:

cd app/assets/javascripts/discourse
yarn
yarn run ember serve --proxy "http://localhost:3000"

теперь среду разработки discourse можно открыть по адресу “http://localhost:4200

Однако у меня возникла проблема при входе под пользователем администратора (тем, которого я создал при выполнении “d/boot_dev --init”).

На экране появилось всплывающее окно с сообщением “Unkown error”, а в логах (/logs) отображается следующая ошибка:

ActiveRecord::StatementInvalid (PG::UndefinedFunction: ERROR:  function max(boolean) does not exist
LINE 1: ..._rank, MAX(user_badges.created_at) AS created_at, MAX(user_b...
                                                             ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
)
lib/freedom_patches/ams_include_without_root.rb:49:in `include!'
app/controllers/application_controller.rb:495:in `serialize_data'
app/controllers/application_controller.rb:504:in `render_serialized'
app/controllers/session_controller.rb:611:in `login'
app/controllers/session_controller.rb:337:in `create'
app/controllers/application_controller.rb:395:in `block in with_resolved_locale'
app/controllers/application_controller.rb:395:in `with_resolved_locale'
lib/middleware/omniauth_bypass_middleware.rb:71:in `call'
lib/content_security_policy/middleware.rb:12:in `call'
config/initializers/100-quiet_logger.rb:23:in `call'
config/initializers/100-silence_logger.rb:31:in `call'
lib/middleware/missing_avatars.rb:23:in `call'
lib/middleware/turbo_dev.rb:34:in `call'

У вас есть опыт работы с такой ошибкой? Или, возможно, я неправильно выполнил шаги по запуску разработки в предыдущей версии?

Думаю, вам нужно удалить базу данных командой rm -r. Не уверен, где она находится, но, скорее всего, это в первом сообщении темы.

1 лайк

Всем привет,

Снова начал с чистого листа. Всё прошло хорошо, получил чистую среду разработки, в которую могу войти.

Затем установил несколько плагинов, чтобы соответствовать производственной среде, и загрузил последнюю резервную копию.

Загрузил её, попытался восстановить в среде разработки и снова получил ошибку аутентификации Peer. Подал баг-репорт, но пока ответа нет. Кто-нибудь может попробовать воспроизвести проблему? Я видел похожие проблемы чуть ниже в комментариях к этому посту, так что, думаю, я не одинок в этом?

[2021-11-29 19:43:39] 'koen' запустил восстановление!
[2021-11-29 19:43:39] Помечаем восстановление как запущенное...
[2021-11-29 19:43:39] Проверяем существование /src/tmp/restores/default/2021-11-29-194339...
[2021-11-29 19:43:39] Копируем архив во временную директорию...
[2021-11-29 19:43:39] Извлекаем файл дампа...
[2021-11-29 19:43:40] Проверяем метаданные...
[2021-11-29 19:43:40]   Текущая версия: 20211124161346
[2021-11-29 19:43:40]   Версия для восстановления: 20211123033311
[2021-11-29 19:43:40] Включаем режим только для чтения...
[2021-11-29 19:43:40] Приостанавливаем Sidekiq...
[2021-11-29 19:43:40] Ждём до 60 секунд завершения выполнения задач Sidekiq...
[2021-11-29 19:43:46] Создаём отсутствующие функции в схеме discourse_functions...
[2021-11-29 19:43:46] Восстанавливаем файл дампа... (это может занять некоторое время)
[2021-11-29 19:43:47] psql: ошибка: подключение к серверу через сокет "/var/run/postgresql/.s.PGSQL.5432" не удалось: FATAL:  Ошибка аутентификации Peer для пользователя "postgres"
[2021-11-29 19:43:47] ИСКЛЮЧЕНИЕ: psql не удался: psql: ошибка: подключение к серверу через сокет "/var/run/postgresql/.s.PGSQL.5432" не удалось: FATAL:  Ошибка аутентификации Peer для пользователя "postgres"

[2021-11-29 19:43:47] /src/lib/backup_restore/database_restorer.rb:92:in `restore_dump'
/src/lib/backup_restore/database_restorer.rb:26:in `restore'
/src/lib/backup_restore/restorer.rb:51:in `run'
/src/script/spawn_backup_restore.rb:23:in `restore'
/src/script/spawn_backup_restore.rb:36:in `block in <main>'
/src/script/spawn_backup_restore.rb:4:in `fork'
/src/script/spawn_backup_restore.rb:4:in `<main>'
[2021-11-29 19:43:47] Пытаемся выполнить откат...
[2021-11-29 19:43:47] Откат не требуется
[2021-11-29 19:43:47] Очищаем временные файлы...
[2021-11-29 19:43:47] Удаляем функции из схемы discourse_functions...
[2021-11-29 19:43:47] Удаляем временную директорию '/src/tmp/restores/default/2021-11-29-194339'...
[2021-11-29 19:43:47] Возобновляем работу Sidekiq...
[2021-11-29 19:43:47] Помечаем восстановление как завершённое...
[2021-11-29 19:43:47] Уведомляем 'koen' об окончании восстановления...
[2021-11-29 19:43:51] Готово!

Здравствуйте,

У меня возникла проблема, которая, похоже, связана с разделением портов 3000 и 4200. Я не до конца понимаю, как они связаны между собой, но, насколько я знаю, порт 3000 — это сервер, а порт 4200 — прокси к нему от Ember CLI. Порт 4200 работает нормально, за исключением того, что иногда, особенно при ответе с кодом 302, в заголовках ответа содержатся URI, использующие порт 3000 вместо 4200. Я конкретно пытался настроить OAuth2 с использованием собственного провайдера, как описано здесь, но наличие порта 3000 в некоторых ответах нарушает рабочий процесс OAuth2. В моей конфигурации OAuth2 порт 3000 не указан, он, должно быть, поступает изнутри сервера.

Сталкивался ли кто-нибудь с подобной проблемой ранее? Знаете ли вы, как настроить среду, которая более точно имитирует релиз для продакшена?

Кстати, я также пытался настроить локальный релиз для продакшена, но для этого требуется полноценный домен и регистрация email, что кажется не очень удобным для локальных сред.

Спасибо.

1 лайк

Обновление: Я снова попытался пойти по пути чистой установки, но на этот раз на другом компьютере. Теперь я застрял, потому что у меня нет UID 1000, о котором упоминалось выше в этой теме, в посте №100 от @dcook. Я согласен с тем, что предположение о том, что UID=1000, является ошибкой и должно считаться багом. Вы сообщили об этом как о баге?

На моем основном компьютере сохраняется ошибка с правами доступа пользователя Postgres, о которой я уже сообщал здесь: Backup restore failing on clean dev docker env: FATAL: Peer authentication failed for user “postgres”.

@rishabh, каково ваше мнение по обоим этим вопросам? Мне очень понравился переход на метод на основе Docker — быстро и чисто. Но теперь на двух разных компьютерах это кажется тупиком, и я задумываюсь, что еще я могу сделать, чтобы помочь решить проблему. Также меня интересует жизненный цикл багов: они принимаются, проверяются, отклоняются или принимаются, откладываются, исправляются и т.д.?

Пока я займусь настройкой нативной среды разработки, чтобы посмотреть, получится ли у меня её запустить.

2 лайка

Привет. Это мой первый раз, когда я устанавливаю Discourse с помощью Docker на Mac.

Сначала прошу прощения за мой английский.. :sob:

Я уже выполнил

d/boot_dev --init

затем получил ошибку, что порт 3000 уже занят. Поэтому я изменил сопоставление портов на 30030:3000 (файл: bin/docker/boot_dev).

После этого я запустил следующие команды:

d/boot_dev --init

# В одном терминале:
d/rails s

# А в другом терминале
d/ember-cli

Мои вопросы:

  1. Когда я запускаю команду d/rails s, я могу открыть стартовую страницу Discourse по адресу ‘localhost:30030’. Если я просто хочу открыть Discourse и использовать порт 30030 (перенаправление портов), могу ли я завершить процесс установки? Я не знаю, что такое d/rails s и d/ember-cli

  2. Процесс d/rails s занимает очень много времени. Я волнуюсь, всё ли в порядке? Это нормально? Или d/rails s и d/ember-cli — это фоновые процессы при запуске Discourse?

Спасибо. :bowing_man:

Здравствуйте,

В среде разработки можно ли редактировать настройки конфигурации, которые должны находиться в app.yml?

Вопрос касается в основном изменения DISCOURSE_ENABLE_CORS; простое добавление CORS-источников в административном интерфейсе не помогло устранить ошибку CORS.

Спасибо.

Похоже, что создание файла discourse.conf в директории /config решило проблему:
enable_cors = true

Информация взята из файла конфигурации по умолчанию: discourse/config/discourse_defaults.conf at main · discourse/discourse · GitHub

2 лайка

Привет, ребята, у меня возникла проблема при инициализации разработки Discourse с использованием Docker.

Моя производственная версия Discourse использует тег v2.8.0, поэтому мне нужно запустить локальную разработку также на версии v2.8.0.

Для настройки разработки я использую Docker, работающий на macOS.
Команды, которые я выполнил:

git clone https://github.com/discourse/discourse.git
cd discourse
git checkout v2.8.0
d/boot_dev --init

После того как процесс инициализации дошёл до этапа миграции базы данных, я получил следующую ошибку:

Migrating database...
== 20220104053343 AddBookmarkPolymorphicColumns: migrating ====================
-- add_column(:bookmarks, :bookmarkable_id, :integer)
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:

PG::DuplicateColumn: ERROR:  column "bookmarkable_id" of relation "bookmarks" already exists
/src/lib/migration/safe_migrate.rb:92:in `async_exec'
/src/db/migrate/20220104053343_add_bookmark_polymorphic_columns.rb:5:in `change'
/src/lib/freedom_patches/schema_migration_details.rb:9:in `block in exec_migration'
/src/lib/freedom_patches/schema_migration_details.rb:8:in `exec_migration'
/src/lib/migration/safe_migrate.rb:28:in `migrate'
/src/lib/migration/safe_migrate.rb:55:in `migrate'
/src/lib/tasks/db.rake:218:in `block (2 levels) in <main>'
/src/lib/distributed_mutex.rb:33:in `block in synchronize'
/src/lib/distributed_mutex.rb:29:in `synchronize'
/src/lib/distributed_mutex.rb:29:in `synchronize'
/src/lib/distributed_mutex.rb:14:in `synchronize'
/src/lib/tasks/db.rake:210:in `block in <main>'

Caused by:
ActiveRecord::StatementInvalid: PG::DuplicateColumn: ERROR:  column "bookmarkable_id" of relation "bookmarks" already exists
/src/lib/migration/safe_migrate.rb:92:in `async_exec'
/src/db/migrate/20220104053343_add_bookmark_polymorphic_columns.rb:5:in `change'
/src/lib/freedom_patches/schema_migration_details.rb:9:in `block in exec_migration'
/src/lib/freedom_patches/schema_migration_details.rb:8:in `exec_migration'
/src/lib/migration/safe_migrate.rb:28:in `migrate'
/src/lib/migration/safe_migrate.rb:55:in `migrate'
/src/lib/tasks/db.rake:218:in `block (2 levels) in <main>'
/src/lib/distributed_mutex.rb:33:in `block in synchronize'
/src/lib/distributed_mutex.rb:29:in `synchronize'
/src/lib/distributed_mutex.rb:29:in `synchronize'
/src/lib/distributed_mutex.rb:14:in `synchronize'
/src/lib/tasks/db.rake:210:in `block in <main>'

Два месяца назад я запускал разработку на версии 2.8.0, и проблем не было, но несколько дней назад эта ошибка начала появляться.

У кого-нибудь из вас была похожая проблема?

Если вы перенесли базу данных с помощью более поздней версии Discourse, вам потребуется удалить и создать новую базу данных, чтобы получить более раннюю миграцию.

1 лайк

Я сделал свежий клон и инициализировал разработку с версией 2.8.0. Данные пока должны отсутствовать.

1 лайк

Я ошибся во время установки. Подскажите, пожалуйста, можно ли полностью удалить всё и начать заново?

Привет, эта ошибка кажется мне странной. Кто-нибудь сталкивался с подобной проблемой и успешно её решал? Заранее спасибо!

Она появляется при запуске команды d/boot_dev --init.

Migrating database...
rake aborted!
LoadError: cannot load such file -- /usr/local/lib/ruby/gems/2.7.0/gems/mail-2.8.0.rc1/lib/mail/indifferent_hash.rb
/src/lib/email.rb:3:in `<main>'
/src/app/jobs/scheduled/poll_mailbox.rb:10:in `<class:PollMailbox>'
/src/app/jobs/scheduled/poll_mailbox.rb:6:in `<module:Jobs>'
/src/app/jobs/scheduled/poll_mailbox.rb:5:in `<main>'
/src/config/initializers/100-sidekiq.rb:74:in `block (2 levels) in <main>'
/src/config/initializers/100-sidekiq.rb:73:in `glob'
/src/config/initializers/100-sidekiq.rb:73:in `block in <main>'
/src/config/environment.rb:7:in `<main>'
Tasks: TOP => db:migrate => db:load_config => environment
(See full trace by running task with --trace)
1 лайк

У меня появилась та же ошибка при выполнении d/boot_dev --init. Попробовал d/rake db:migrate RAILS_ENV=development — ошибка повторяется:

rake aborted!
LoadError: cannot load such file -- /usr/local/lib/ruby/gems/2.7.0/gems/mail-2.8.0.rc1/lib/mail/indifferent_hash.rb
/src/lib/email.rb:3:in `<main>'
/src/app/jobs/scheduled/poll_mailbox.rb:10:in `<class:PollMailbox>'
/src/app/jobs/scheduled/poll_mailbox.rb:6:in `<module:Jobs>'
/src/app/jobs/scheduled/poll_mailbox.rb:5:in `<main>'
/src/config/initializers/100-sidekiq.rb:74:in `block (2 levels) in <main>'
/src/config/initializers/100-sidekiq.rb:73:in `glob'
/src/config/initializers/100-sidekiq.rb:73:in `block in <main>'
/src/config/environment.rb:7:in `<main>'
Tasks: TOP => db:migrate => db:load_config => environment
(See full trace by running task with --trace)

Я тоже столкнулся с этой проблемой. Я исправил её, отменив этот коммит

2 лайка

У меня работает отлично. Спасибо.