Gitpod からこんにちは!(Google Cloud へのインストールと自動化された開発環境セットアップ)

Discourse コミュニティの皆様、こんにちは! :wave:

私は GitHub 向けの無料ワンクリック IDE である gitpod.io で働いています。現在は Spectrum をコミュニティに利用していますが、いくつか問題があり、Discourse インスタンスを立ち上げて試してみたり、将来的に移行したりしたいと考えています。

可能であれば、Google Cloud アカウントを活用したいと考えています。適切な方向性を教えていただけないでしょうか?例えば、新しい Google Cloud Run は Discourse インスタンスのホストに適していますか?

また、私たちのミッションはすべての開発環境(少なくともオープンソースプロジェクト向け)を完全に自動化することです。そのため、コントリビューターが長いセットアップ手順を読み込んだり、現在のデバイスで多数の依存関係を手動でインストール・設定したりするのではなく、ワンクリックでオンライン上でコード作成可能な Discourse 環境を即座に開始できる、完全自動化された Discourse セットアップを貢献したいと考えています。すでに、@notriddle 氏(こんにちは!)の優れた Janitor 向けの自動化された Discourse セットアップ に基づいて作業を始めています。

ただし、現在問題に直面しています。最近、セットアップ手順が「polls」というテーブルが見つからないというエラーで失敗しています。どのように修正すればよいかはまだわかりませんが、引き続き調査を進めます。ここで一言触れておきたかったので、ご連絡いたしました。

可能性はありますが、それほど簡単ではありません。Discourse はステートレスなコンテナではなく、Google Cloud Run が対象としているのはステートレスなコンテナです。そのため、Discourse に保持されるデータ(アップロード、アバター、データベースなど)を保存するための永続ボリュームを追加する方法が必要になります。

私は通常の Google Compute インスタンスを使用することをお勧めします。何らかのスクリプトやインフラストラクチャ管理ツールを使えば、新しい Discourse インスタンスのデプロイを自動化できるはずです。このガイドも参考になるかもしれません:Install Discourse on Ubuntu or Debian for Development

どのセットアップ手順を使用されていますか?「polls」テーブルが存在しない場合、プラグインのマイグレーションを実行していない可能性があります。開発モードでは自動的に実行されるはずです。テストモードの場合は、rake db:migrate コマンドの前に LOAD_PLUGINS=1 を追加してください。

@marianord@david、ご返信ありがとうございます!

Discourse コンテナからすべての状態を抽出するには時間がかかる可能性があるため、Cloud Run を使うよりもこちらのほうが理にかなっているように思えます。ガイドを紹介してくださりありがとうございます!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

しかし、効果はありませんでした。

貴重なアドバイスありがとうございます!試してみて、こちらも結果を報告します。(1 つの投稿で 2 つの質問をしてしまい申し訳ありません。議論が混乱しないことを願っています。)

開発者向けのインストールは非常に遅く、開発用に設計されています。そのため、標準的なインストール手順に従うことをお勧めします。自動化もそれほど難しくありません。私のインストールサービスは、Mailgun が必要な DNS 設定(クライアントの DNS を管理していないため)を除き、完全に自動化されています。

インストールで最も難しい部分はメールの設定です。

また、インストールとメンテナンスは別物です。

@pfaffman さん、ありがとうございます!混乱させてしまい申し訳ありません。元のメッセージで 2 つのことを混同していました:1) Gitpod コミュニティ向けの Discourse のインストール、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")
 
     # Automatically include migrations
-    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 コンテナが含まれており、何もインストールせずにそれを利用できると想像してみてください。

マルチサイト移行でこのエラーを確認しました。開発/テスト環境のデータベースでは問題ありません。本日、慎重にデバッグします。

参考:

これでガイドに従った際の開発環境が正しく動作するはずです。

@kris.kotlarek さん、そのコミットをご覧いただけますか… なぜ Rails 6 ではプラグインを伴う schema dump → load が機能しなくなったのでしょうか?

はい、今夜確認します

ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR: relation "polls" does not exist という問題の原因が見つかったと思います。
データベース作成時に load_config が評価されると、migrations_paths が上書きされてしまいます。

つまり、db:createdb:migrate を同時に評価しようとしたときに、以下のようなことが起こっています:

ただし、別々に実行すればパスは問題ありません:

ここで考えられる選択肢は 2 つあります:

  1. ガイドを変更し、2 つのコマンドを別々に実行することを推奨する
  2. モンキーパッチを適用して ||= を使用する

どう思いますか?

それで大丈夫でしょうか?

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

これにより、Hello from Gitpod! (installing on google cloud + automated dev setup) - #4 by jankeromnes で言及されている polls テーブルが欠落しているという元の問題が解決します。
同じ問題が以下のトピックでも言及されています:Install Discourse on Ubuntu or Debian for Development - #320

テスト DB をpopulateするコードのデバッグを開始しましたが、行き詰まりました。何らかの理由で、スキーマが読み込まれた後、db:migrate を呼び出すと、Rails はまだマイグレーションを評価しようとし、テーブルが既に存在するというエラーが発生します。現時点では、その理由を見つけることができませんでした。

わかりました、現時点では OP 向けにガイドを調整しましょう

このバグを調査してくださり、本当にありがとうございます!:+1: 当面は、更新された手順を使って回避策を講じます。

なるほど、興味深いですね、ありがとうございます!既存の開発用 Dockerfile を確認して、Gitpod でワンクリックで起動できるかどうか見てみます。:smile: それは素敵ですね。

興味深いことに、Install Discourse on Ubuntu or Debian for Development - #321 で提案されているように、db:createdb:migrate を 2 つの別々のコマンドに分割することも「機能」しました。

(ただし、現在、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)

また、Web サーバーが再び Gitpod プレビュー URL をブロックし始めています:

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

その問題の修正を含むプルリクエストを作成しました: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

こんにちは、Janさん。もしお時間があれば、Spectrumでどのような問題が発生したり、期待通りに機能しなかったのか教えていただけないでしょうか?

私はSpectrumについて少し追跡しており、時折その情報を読んでいます。

(これについてあなたにプライベートメッセージを送ろうとしましたが、何らかの理由でプロフィールをクリックしても「プライベートメッセージを送信」ボタンが表示されませんでした。)