Привет от Gitpod! (установка в Google Cloud + автоматическая настройка разработки)

Привет, сообщество Discourse! :wave:

Я работаю в gitpod.io — бесплатной IDE с одним кликом для GitHub. В настоящее время мы используем Spectrum для нашего сообщества, но у нас возникли с ним некоторые проблемы, и мы хотели бы развернуть экземпляр Discourse, чтобы протестировать его и, возможно, мигрировать.

Если возможно, мы хотели бы использовать наш аккаунт Google Cloud для этой цели. Не могли бы вы подсказать, в каком направлении двигаться? Например, подходит ли новый Google Cloud Run для запуска экземпляра Discourse?

Кроме того, поскольку наша миссия — полностью автоматизировать все настройки для разработчиков (по крайней мере, для проектов с открытым исходным кодом), я хотел бы создать полностью автоматизированный сценарий настройки для Discourse. Это позволит участникам в один клик запустить готовую к работе среду Discourse онлайн (вместо того чтобы читать длинные списки инструкций по настройке и вручную устанавливать/настраивать множество зависимостей на своём устройстве). Я уже начал работу над этим, основываясь на отличном автоматизированном сценарии настройки Discourse от @notriddle для Janitor (привет!).

Однако сейчас я столкнулся с проблемой: недавно инструкции по настройке перестали работать из-за отсутствия таблицы «polls». Пока не уверен, как это исправить, но продолжу расследование. Решил просто упомянуть об этом здесь.

Может быть, но это не так просто. Discourse не является stateless-контейнером, а именно для таких контейнеров создан Google Cloud Run. Поэтому вам понадобится способ добавить какой-либо постоянный том (Persistent Volume) для данных, которые хранятся в Discourse (загрузки, аватары, база данных).

Я бы использовал обычный экземпляр Google Compute, и всё. С помощью какого-либо скрипта или инструментов управления инфраструктурой вы сможете автоматизировать развёртывание новых экземпляров Discourse. Также вам может помочь это руководство: Install Discourse on Ubuntu or Debian for Development.

Какие именно инструкции по настройке вы используете? Если таблица «polls» отсутствует, это означает, что миграции плагинов не были выполнены. В режиме разработки они должны запускаться автоматически. В тестовом режиме вам нужно добавить LOAD_PLUGINS=1 перед командой rake db:migrate.

Спасибо за ваши ответы, @marianord и @david!

Это звучит более разумно, чем использование Cloud Run, так как извлечение всего состояния из контейнеров Discourse может занять некоторое время. Спасибо за ссылку на руководство! Я попробую следовать ему, чтобы настроить экземпляр Compute, и сообщу здесь о результатах.

Я следую инструкции по адресу https://github.com/discourse/discourse/blob/master/docs/DEVELOPER-ADVANCED.md.

Точная ошибка, которую я увидел, была следующей:

== Seed from /workspace/discourse/db/fixtures/990_settings.rb
Discourse hostname: localhost is not a valid domain for emails!

== Seed from /workspace/discourse/db/fixtures/990_topics.rb
rake aborted!
ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR:  relation "polls" does not exist
LINE 8:  WHERE a.attrelid = '"polls"'::regclass
                            ^

При попытке выполнить:

bundle exec rake db:create db:migrate &&
RAILS_ENV=test bundle exec rake db:create db:migrate

Я также пробовал добавить эту строку:

RAILS_ENV=development bundle exec rake db:create db:migrate

но безрезультатно.

Огромное спасибо за подсказку! Я попробую это сделать и также сообщу здесь. (Извините, что задал два вопроса в одном! Надеюсь, это не сделает обсуждение слишком запутанным.)

Установка для разработчиков гораздо медленнее и предназначена для… разработки. Поэтому вам стоит следовать инструкциям по стандартной установке. Её вполне легко автоматизировать. Мой сервис установки теперь полностью автоматизирован (за исключением настроек DNS, требуемых Mailgun, так как у меня нет контроля над DNS клиента).

Самая сложная часть установки — это настройка почты.

Кроме того, установка и обслуживание — это разные вещи.

Спасибо, @pfaffman! Извините за путаницу: в моём первоначальном сообщении я перепутал два момента: 1) установку Discourse для сообщества Gitpod и 2) автоматизацию настройки окружения для разработчиков и контрибьюторов Discourse. К счастью, я следую руководству для разработчиков именно для пункта 2), а не для 1). :sweat_smile:

@david Хм, к сожалению, при выполнении:

bundle exec rake db:create db:migrate &&
RAILS_ENV=test LOAD_PLUGINS=1 bundle exec rake db:create db:migrate

ошибка всё равно возникает:

== Seed from /workspace/discourse/db/fixtures/990_settings.rb
Discourse hostname: localhost is not a valid domain for emails!

== Seed from /workspace/discourse/db/fixtures/990_topics.rb
rake aborted!
ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR:  relation "polls" does not exist
LINE 8:  WHERE a.attrelid = '"polls"'::regclass
                            ^

Правильно ли я понял ваше предложение? Есть ли у вас другие идеи, как это исправить? (Я пытался предварительно удалить таблицы, но это привело к другой ошибке, которую я уже не помню. Хотя готов попробовать снова.)

Также я забыл упомянуть, что мои инструкции по настройке работали до прошлой недели или около того, поэтому ошибка появилась недавно после ребейза Discourse. Думаю, это связано с переходом на Rails 6? DEV: Upgrade Discourse to Rails 6 (#8083) · discourse/discourse@32b8a2c · GitHub

К сведению: вы можете легко воспроизвести ошибку, попробовав открыть мой форк Discourse в Gitpod: Dashboard. Вы увидите, что автоматизированная настройка завершится ошибкой, и получите интерактивную среду, где можно будет выполнять различные команды Discourse в терминале.

@sam Похоже, что FIX: Rails 6 multisite migrations and plugin migrations · discourse/discourse@025d4ee · GitHub что-то сломал.

В отличие от сообщения коммита, я считаю, что миграции плагинов работали до этого коммита. Теперь они не работают. Неважно, передан ли LOAD_PLUGINS=1 или нет — миграции плагинов не выполняются в моей среде разработки.

Я думаю, что это из-за этого:

--- a/lib/plugin/instance.rb
+++ b/lib/plugin/instance.rb
@@ -516,7 +516,7 @@ class Plugin::Instance
     Rake.add_rakelib(File.dirname(path) + "/lib/tasks")
 
     # Автоматически включать миграции
-    migration_paths = Rails.configuration.paths["db/migrate"]
+    migration_paths = ActiveRecord::Migrator.migrations_paths
     migration_paths << File.dirname(path) + "/db/migrate"
 
     unless Discourse.skip_post_deployment_migrations?

Таким образом, это INSTALL-cloud.

Представьте, что в комплект Discourse входит контейнер Docker, который можно использовать сразу, без необходимости чего-либо устанавливать.

Я видел эту ошибку при миграции мультисайта, на dev/test-базе всё в порядке, сегодня буду тщательно отлаживать.

По адресу:

Это должно исправить поведение dev-окружений при следовании руководствам.

@kris.kotlarek, не могли бы вы посмотреть этот коммит… почему остановка работы команды schema dump → load в Rails 6 с нашими плагинами?

Конечно, я проверю это сегодня вечером.

Кажется, я нашел проблему для ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR: relation "polls" does not exist
Когда load_config выполняется при создании базы данных, он перезаписывает migrations_paths.

Вот что происходит, когда мы пытаемся выполнить db:create и db:migrate одновременно:

Однако, если запускать их по отдельности, пути корректны:

Кажется, у нас есть два варианта:

  1. Обновить руководства и рекомендовать использовать две команды по отдельности.
  2. Использовать мономорфизацию (monkey patch) и применять ||=.

Что вы думаете?

Подойдёт такой вариант?

RAILS_ENV=test bin/rake db:migrate
RAILS_ENV=test bin/rake db:schema:dump
dropdb discourse_test
createdb discourse_test
RAILS_ENV=test bin/rake db:schema:load
RAILS_ENV=test bin/rake db:migrate

Это решило бы исходную проблему с отсутствующей таблицей polls, упомянутой здесь: Hello from Gitpod! (installing on google cloud + automated dev setup) - #4 by jankeromnes
Та же проблема была описана в этой теме: Install Discourse on Ubuntu or Debian for Development - #320

Я начал отладку кода, отвечающего за заполнение тестовой базы данных, но запутался. По каким-то причинам после загрузки схемы при вызове db:migrate Rails всё ещё пытается выполнить миграции, и возникает ошибка о том, что таблица уже существует. Пока мне не удалось найти причину.

Понял, давайте пока скорректируем руководства для оп-персонажа.

Огромное спасибо за проверку этой ошибки! :+1: Пока я буду использовать обновлённые инструкции, чтобы обойти её.

Ага, интересно, спасибо! Я посмотрю на существующие Dockerfile для разработки, чтобы узнать, можно ли их просто запускать в один клик через Gitpod. :smile: Это было бы здорово.

Интересно, что разделение команд db:create и db:migrate на две отдельные команды, как предложено в Install Discourse on Ubuntu or Debian for Development - #321, тоже «сработало».

(Но теперь команда DISCOURSE_DEV_HOST=.gitpod.io bundle exec rails s -b 0.0.0.0 начинает зацикливаться с ошибкой:

/workspace/.rvm/gems/activesupport-6.0.0/lib/active_support/dependencies.rb:551:in `load_missing_constant': Unable to autoload constant Version, expected /workspace/discourse/lib/version.rb to define it (LoadError)

и веб-сервер снова блокирует URL предпросмотра Gitpod:

Blocked host: 3000-a8a71720-4c30-466b-aea5-5344c97c4e94.ws-eu0.gitpod.io

)

Я создал pull request с исправлением этой проблемы: FIX: Remove Versions from Active Record warm up by KrisKotlarek · Pull Request #8105 · discourse/discourse · GitHub

Не могли бы вы проверить, решает ли это проблему на вашем компьютере? (У меня на локальной машине сейчас всё работает)

Я только что добавил букву s в конец этой переменной окружения

https://review.discourse.org/t/dev-support-multiple-hosts-in-dev/5713

Привет, Ян! Если у тебя есть время, мне интересно узнать, какие именно проблемы возникли с Spectrum или что не сработало так, как ты надеялся?

Я немного слежу за развитием Spectrum, время от времени читаю о нём.

(Я пытался отправить тебе личное сообщение об этом, но, по какой-то причине, когда я нажимаю на твой профиль, кнопки «Отправить личное сообщение» нет.)