ランチャーは Docker Compose が登場する前に構築されたものだと信じています。
Docker Composeは、必要な機能を提供していません。DiscourseのDockerfileのテンプレート作成機能は、柔軟なDockerの結果を可能にします。Composeでは、固定されたDockerfileのセットしかなく、それが多数のコンテナにつながる可能性があります。
私のDiscourseセットアップでは、UNIXソケットを使用して、Discourseとnginxを含む単一のコンテナを使用しています。PostgreSQLとRedisはホスト上のサービスです。それはデフォルトのセットアップからかなり逸脱していますが、標準で可能です。
Composeでは、おそらくあまりうまく設計されていないプロファイル機能を使用することで、部分的に可能です。しかし、それでもかなり厄介です。あるいは、バリエーションごとに異なるComposeファイルを提供する必要があります。
あなたは問題を移動させているだけです。
DiscourseのためのクリーンなComposeセットアップは、別々のコンテナで以下のサービスを持つことになります:
- Discourse
- nginx
- PostgreSQL
- Redis
Discourseとnginxはボリュームを共有する必要がありますが、大したことではありません。
PostgreSQLとRedis…これらは、別の場所にホストしたいものであり、それ専用のDiscourseコンテナを持たないようにしたいものです。そして今、docker composeが問題になります。docker compose up -d は、望まないPostgreSQLを起動します。OK、そこで docker compose --profile postgresql up -d とすることで、基本的なDiscourseセットアップとPostgreSQLコンテナを起動します。docker compose --profile postgresql --profile redis up -d で「フル」セルフコンテナDiscourseコンテナセットアップとなります。--profile ... 引数を忘れない方が良いでしょう。そうしないと、さらに問題が発生します。
そのため、より良いUXのために、目的のdocker composeコマンドを作成するためのランチャーを作成します。これで、私たちはある意味元に戻りました。nginxコンテナへの変更がまだできないという点を除いては。
つまり、nginx-httpコンテナとnginx-unixコンテナが必要で、これらは相互に排他的であるべきでしょうか?
確かにプラグイン管理は改善される可能性がありますが、これをdocker composeで行うのは地獄でしょう。
要約すると、適切なDockerイメージはないということですね。
Dockerとは何か、どのように機能するかについての信じられないほど不正確な知識については、こちらをご覧ください: What is Docker? | Docker Docs
コンテナを共有して作業することができ、共有する誰もが同じように機能する同じコンテナを取得できることを確認できます。
また、「ランチャー」についてですが、消費してデプロイできるDockerイメージがない場合、k8sクラスターでDiscourseを実行するにはどうすればよいですか?
なるほど…
このスクリプトはrootとして実行する必要があります。まずsudoするか、rootとしてログインしてください。
いいえ、結構です。インターネットからランダムなスクリプトを実行するのは好きではありません。安全に分離して実行できる、素敵なDockerイメージが欲しいだけです ![]()
Docker Compose を使用して Discourse を本番環境に正常にデプロイしました。公開されているイメージを使用し、クライアントも同様です。
ただし、確かに、それは煩雑で、かなりのカスタム作業が必要です。
独自の意見、特定のアーキテクチャ、またはその他の特別な要件があるため、どうしても別の方法を使用する必要がない限り、CDCK ランチャーを使用した標準インストールにとどめる方がはるかに簡単です。
ウィザードのような手取り足取りのアプローチを使用しないことが、「opiniated、specific、またはspecial」ではない ![]()
いずれにせよ、手がかりはDiscourseのオリジナルのDockerイメージを持っていることです。それだけです。
公式ガイドと「ランチャー」を使用してセットアップを試しましたが、うまくいきませんでした(ユーザーがrootであるかどうかを確認する非常に単純なチェックは別として、それは問題を引き起こすだけです)。
その後、Bitnamiイメージ(および彼らが提案するComposeファイル)をhttps://hub.docker.com/r/bitnami/discourse から使用し、1回のdocker compose up(およびいくつかのSQLエラー[これは良い兆候ではありません]とRubyからの警告[同じ注意点])の後、Discourseの実行インスタンスを取得しました。
純粋に複雑で「標準外の魔法」…
では、なぜ通常のイメージがないのでしょうか?
ソースとリポジトリを調べたところ、ベースイメージが使用されていること(https://hub.docker.com/r/discourse/base/)を発見しましたが、そのバージョン管理/タグ付けに驚きました(https://hub.docker.com/r/discourse/base/tags)…まともなバージョンがないのはなぜだろうか?そして確かに、メインリポジトリを見ると、リリースがないように見えましたが、少なくとも適切にタグ付けされたバージョンはあります(https://github.com/discourse/discourse/tags)。
では、なぜメインのDocker Hubに一致するイメージがないのでしょうか?
ですから、物事がどのように整理されているかを見て、同意します。
![]()
一方で(またはむしろ:「物事がどうあるべきか」)、例のプロジェクト(スコープは小さいですが、理由は同じです):https://github.com/miniflux/v2。
まともなリリースがあります:Releases · miniflux/v2 · GitHub
対応するイメージが正しくタグ付けされています:https://hub.docker.com/r/miniflux/miniflux/tags
そして、アップグレードは単にバージョンをxからyに切り替えるだけです(またはlatestタグを使用して、単純なstop/pull/startで更新されたバージョンを取得します(これにより、必要なすべてのマイグレーションが自動的に実行されます))。
(ああ、そしてイメージは約70倍小さいですが、それはまた別の話です)
よくできました!
質問は2つだけです… SQL エラーと ruby の警告とは何ですか? それらについてよく知りません。しかし、おそらく私が docker やその他のものを完全に間違った方法で使用したからでしょうか ![]()
次のようなことを行います。
./launcher bootstrap myimage
# そのイメージを、イメージを起動したい場所にプッシュするコマンド
./launcher start-cmd
これにより、イメージを起動するために設定する必要のある環境変数が取得できます。
実際、それほど難しくありません。GitHubアクションに統合して、イメージをビルドしてDockerリポジトリにプッシュすることもできます。docker_composeへのコミットを見ると、ブートストラップを必要としないイメージを作成するための動きがあるか、少なくとも必要なこと(データベースの移行、アセットのプリコンパイル、S3へのプッシュなど)の一部を実行しやすくするための動きがあるようです。私は、k8sやAWSイメージランチャー(名前は覚えていません)を使用したいクライアントのためにこれを実行しました。
以前、このような事前構築済みイメージをサービスとして提供することを検討したことがありますが、それにお金を払いたいという人はいませんでした。
しかし、いくつかの小さな部分があります。私の知る限り、CDCKはイメージをビルドするためにランチャーを使用していますが、あなたが望むように、他のツールでそれらを起動および管理しています。そして、彼らが開始したとき、docker-composeはまだそれを実行するための適切な方法ではなく、それが可能になったときには、すでにランチャーを機能させていたため、ランチャーから他のものに移行する方法を見つけることは実際には選択肢ではありませんでした。
Bitnamiイメージが機能する場合は、それを使用してください。機能しない場合は、それらを使用している誰かから助けを得る必要があります。ここではほとんど誰もいません。
Eh… I already deleted the file and whole setup as I found NodeBB which feels less user hostile when it comes to deployment (guide: Docker - NodeBB Documentation; simple docker-compose file with 3 services: nodebb, postgres and redis: NodeBB/docker-compose-pgsql.yml at master · NodeBB/NodeBB · GitHub; and nicely tagged images: Package nodebb · GitHub)
However, I got the image and here are the relevant errors:
- seems like sql schema issue:
postgresql-1 | 2025-07-06 17:15:40.518 GMT [155] ERROR: relation "translation_overrides" does not exist at character 523
postgresql-1 | 2025-07-06 17:15:40.518 GMT [155] STATEMENT: SELECT a.attname, format_type(a.atttypid, a.atttypmod),
postgresql-1 | pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod,
postgresql-1 | c.collname, col_description(a.attrelid, a.attnum) AS comment,
postgresql-1 | attidentity AS identity,
postgresql-1 | attgenerated as attgenerated
postgresql-1 | FROM pg_attribute a
postgresql-1 | LEFT JOIN pg_attrdef d ON a.attrelid = d.adrelid AND a.attnum = d.adnum
postgresql-1 | LEFT JOIN pg_type t ON a.atttypid = t.oid
postgresql-1 | LEFT JOIN pg_collation c ON a.attcollation = c.oid AND a.attcollation <> t.typcollation
postgresql-1 | WHERE a.attrelid = '"translation_overrides"'::regclass
postgresql-1 | AND a.attnum > 0 AND NOT a.attisdropped
postgresql-1 | ORDER BY a.attnum
postgresql-1 |
postgresql-1 | 2025-07-06 17:15:40.616 GMT [156] ERROR: relation "translation_overrides" does not exist at character 523
postgresql-1 | 2025-07-06 17:15:40.616 GMT [156] STATEMENT: SELECT a.attname, format_type(a.atttypid, a.atttypmod),
postgresql-1 | pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod,
postgresql-1 | c.collname, col_description(a.attrelid, a.attnum) AS comment,
postgresql-1 | attidentity AS identity,
postgresql-1 | attgenerated as attgenerated
postgresql-1 | FROM pg_attribute a
postgresql-1 | LEFT JOIN pg_attrdef d ON a.attrelid = d.adrelid AND a.attnum = d.adnum
postgresql-1 | LEFT JOIN pg_type t ON a.atttypid = t.oid
postgresql-1 | LEFT JOIN pg_collation c ON a.attcollation = c.oid AND a.attcollation <> t.typcollation
postgresql-1 | WHERE a.attrelid = '"translation_overrides"'::regclass
postgresql-1 | AND a.attnum > 0 AND NOT a.attisdropped
postgresql-1 | ORDER BY a.attnum
- ruby warnings (both in discourse as well as sidekiq containers, which kinda makes sense as they use same image :D):
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:5: warning: already initialized constant DiscourseAutomation::Scripts::ADD_USER_TO_GROUP_THROUGH_CUSTOM_FIELD
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:5: warning: previous definition of ADD_USER_TO_GROUP_THROUGH_CUSTOM_FIELD was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:6: warning: already initialized constant DiscourseAutomation::Scripts::APPEND_LAST_CHECKED_BY
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:6: warning: previous definition of APPEND_LAST_CHECKED_BY was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:7: warning: already initialized constant DiscourseAutomation::Scripts::APPEND_LAST_EDITED_BY
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:7: warning: previous definition of APPEND_LAST_EDITED_BY was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:8: warning: already initialized constant DiscourseAutomation::Scripts::AUTO_RESPONDER
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:8: warning: previous definition of AUTO_RESPONDER was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:9: warning: already initialized constant DiscourseAutomation::Scripts::AUTO_TAG_TOPIC
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:9: warning: previous definition of AUTO_TAG_TOPIC was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:10: warning: already initialized constant DiscourseAutomation::Scripts::BANNER_TOPIC
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:10: warning: previous definition of BANNER_TOPIC was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:11: warning: already initialized constant DiscourseAutomation::Scripts::CLOSE_TOPIC
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:11: warning: previous definition of CLOSE_TOPIC was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:12: warning: already initialized constant DiscourseAutomation::Scripts::FLAG_POST_ON_WORDS
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:12: warning: previous definition of FLAG_POST_ON_WORDS was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:13: warning: already initialized constant DiscourseAutomation::Scripts::GIFT_EXCHANGE
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:13: warning: previous definition of GIFT_EXCHANGE was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:14: warning: already initialized constant DiscourseAutomation::Scripts::GROUP_CATEGORY_NOTIFICATION_DEFAULT
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:14: warning: previous definition of GROUP_CATEGORY_NOTIFICATION_DEFAULT was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:15: warning: already initialized constant DiscourseAutomation::Scripts::PIN_TOPIC
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:15: warning: previous definition of PIN_TOPIC was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:16: warning: already initialized constant DiscourseAutomation::Scripts::POST
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:16: warning: previous definition of POST was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:17: warning: already initialized constant DiscourseAutomation::Scripts::SEND_PMS
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:17: warning: previous definition of SEND_PMS was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:18: warning: already initialized constant DiscourseAutomation::Scripts::SUSPEND_USER_BY_EMAIL
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:18: warning: previous definition of SUSPEND_USER_BY_EMAIL was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:19: warning: already initialized constant DiscourseAutomation::Scripts::TOPIC
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:19: warning: previous definition of TOPIC was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:20: warning: already initialized constant DiscourseAutomation::Scripts::TOPIC_REQUIRED_WORDS
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:20: warning: previous definition of TOPIC_REQUIRED_WORDS was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:21: warning: already initialized constant DiscourseAutomation::Scripts::USER_GLOBAL_NOTICE
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:21: warning: previous definition of USER_GLOBAL_NOTICE was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:22: warning: already initialized constant DiscourseAutomation::Scripts::USER_GROUP_MEMBERSHIP_THROUGH_BADGE
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:22: warning: previous definition of USER_GROUP_MEMBERSHIP_THROUGH_BADGE was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:23: warning: already initialized constant DiscourseAutomation::Scripts::ZAPIER_WEBHOOK
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/scripts.rb:23: warning: previous definition of ZAPIER_WEBHOOK was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:5: warning: already initialized constant DiscourseAutomation::Triggers::AFTER_POST_COOK
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:5: warning: previous definition of AFTER_POST_COOK was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:6: warning: already initialized constant DiscourseAutomation::Triggers::API_CALL
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:6: warning: previous definition of API_CALL was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:7: warning: already initialized constant DiscourseAutomation::Triggers::CATEGORY_CREATED_EDITED
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:7: warning: previous definition of CATEGORY_CREATED_EDITED was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:8: warning: already initialized constant DiscourseAutomation::Triggers::PM_CREATED
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:8: warning: previous definition of PM_CREATED was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:9: warning: already initialized constant DiscourseAutomation::Triggers::TOPIC_TAGS_CHANGED
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:9: warning: previous definition of TOPIC_TAGS_CHANGED was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:10: warning: already initialized constant DiscourseAutomation::Triggers::POINT_IN_TIME
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:10: warning: previous definition of POINT_IN_TIME was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:11: warning: already initialized constant DiscourseAutomation::Triggers::POST_CREATED_EDITED
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:11: warning: previous definition of POST_CREATED_EDITED was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:12: warning: already initialized constant DiscourseAutomation::Triggers::RECURRING
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:12: warning: previous definition of RECURRING was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:13: warning: already initialized constant DiscourseAutomation::Triggers::STALLED_TOPIC
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:13: warning: previous definition of STALLED_TOPIC was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:14: warning: already initialized constant DiscourseAutomation::Triggers::STALLED_WIKI
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:14: warning: previous definition of STALLED_WIKI was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:15: warning: already initialized constant DiscourseAutomation::Triggers::TOPIC
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:15: warning: previous definition of TOPIC was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:16: warning: already initialized constant DiscourseAutomation::Triggers::USER_ADDED_TO_GROUP
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:16: warning: previous definition of USER_ADDED_TO_GROUP was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:17: warning: already initialized constant DiscourseAutomation::Triggers::USER_BADGE_GRANTED
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:17: warning: previous definition of USER_BADGE_GRANTED was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:18: warning: already initialized constant DiscourseAutomation::Triggers::USER_FIRST_LOGGED_IN
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:18: warning: previous definition of USER_FIRST_LOGGED_IN was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:19: warning: already initialized constant DiscourseAutomation::Triggers::USER_PROMOTED
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:19: warning: previous definition of USER_PROMOTED was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:20: warning: already initialized constant DiscourseAutomation::Triggers::USER_REMOVED_FROM_GROUP
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:20: warning: previous definition of USER_REMOVED_FROM_GROUP was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:21: warning: already initialized constant DiscourseAutomation::Triggers::USER_UPDATED
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers.rb:21: warning: previous definition of USER_UPDATED was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers/recurring.rb:6: warning: already initialized constant DiscourseAutomation::Triggers::Recurring::RECURRENCE_CHOICES
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers/recurring.rb:6: warning: previous definition of RECURRENCE_CHOICES was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers/stalled_wiki.rb:6: warning: already initialized constant DiscourseAutomation::Triggers::StalledWiki::DURATION_CHOICES
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers/stalled_wiki.rb:6: warning: previous definition of DURATION_CHOICES was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers/topic_tags_changed.rb:7: warning: already initialized constant DiscourseAutomation::Triggers::TopicTagsChanged::TriggerOn::TAGS_ADDED_OR_REMOVED
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers/topic_tags_changed.rb:7: warning: previous definition of TAGS_ADDED_OR_REMOVED was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers/topic_tags_changed.rb:8: warning: already initialized constant DiscourseAutomation::Triggers::TopicTagsChanged::TriggerOn::TAGS_ADDED
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers/topic_tags_changed.rb:8: warning: previous definition of TAGS_ADDED was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers/topic_tags_changed.rb:9: warning: already initialized constant DiscourseAutomation::Triggers::TopicTagsChanged::TriggerOn::TAGS_REMOVED
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers/topic_tags_changed.rb:9: warning: previous definition of TAGS_REMOVED was here
sidekiq-1 | /opt/bitnami/discourse/plugins/automation/lib/discourse_automation/triggers/topic_tags_changed.rb:11: warning: already initialized constant DiscourseAutomation::Triggers::TopicTagsChanged::TriggerOn::MODES
sidekiq-1 | /bitnami/discourse/plugins/automation/lib/discourse_automation/triggers/topic_tags_changed.rb:11: warning: previous definition of MODES was here
sidekiq-1 | 2025-07-06T17:15:52.699Z pid=1 tid=4ox INFO: Booted Rails 7.2.2.1 application in production environment
それは素晴らしい点です。このスクリプトがroot権限なしで実行できないような、本当に良い理由はありません。
セットアップスクリプトだけが、インターネットからDockerインストールスクリプトを実行するように促すという恐ろしい部分のためにroot権限を必要とします。ですから、それさえもroot権限なしで実行するように変更できます。
ランチャースクリプトはroot権限を必要としません。/var/discourseへの書き込みアクセスと、Dockerコンテナを管理する権限があれば十分です。
えー… ![]()
スクリプトは /var/discourse にアクセスする必要すらありません(なぜ必要なのか?)。
問題全体は、いくつかのことから生じています。
- Dockerが何であるか、どのように機能するか、そして何が可能になるかについての大きな誤解
- Docker = docker-compose という考え方を結びつけている(そうではありません!)
ホスト環境にほとんど触れない、完全に分離されたセットアップを持つことができます…
かなりの調査を行った結果、この「セットアップ」スクリプト全体は、技術に詳しくない人にとって可能な限り簡単なインストールを行うために作成されたようです。ユーザーをチェックし、ガイドし、すべてをセットアップします。それは良いことかもしれませんが、想定されたパスからわずかでも外れようとすると、完全に壊れてしまいます。
最も基本的なセットアップでは、ホストディレクトリにアクセスする必要さえありません。すべてが限られた環境内に含まれます(イメージはコンテナを作成するために使用され、必要なすべてのストレージはDockerボリュームを介して処理されます [移行したい場合やファイルにアクセスしたい場合に問題がありますが、ここでは基本的なことを話しています])。
また、DNSが正しいことを確認し、証明書、リバースプロキシ、SMTPなどをセットアップしようとします。これも、この簡単なセットアップを提供するには完全に問題ありません。
しかし!
問題は、それを破棄することではなく、加えて、プレーンなDockerイメージ(すでに存在し、スクリプトやスクリプトで使用されるテンプレートによって使用されています!discourse_docker/templates/postgres.template.yml at main · discourse/discourse_docker · GitHub & discourse_docker/launcher at main · discourse/discourse_docker · GitHub
- 正しいバージョン管理:イメージをリリースされたDiscourseバージョン(3.4.5など)でタグ付けします。
- 環境変数(データベース/Redisなどの接続を駆動する)と、ホストにマウントできる可能性のあるパス/ボリュームに関する、合理的で簡単なドキュメント。
それだけです…
前述のMinifluxガイドをご覧ください:Miniflux Installation with Docker - イメージ(およびそれを提供するリポジトリ)と設定可能な環境変数に関する詳細が記載されています。
またはMySQL Dockerイメージ:https://hub.docker.com/_/mysql - 同じことです - 設定可能なこと(特に「環境変数」セクションを参照)を説明するガイド。
誰も「MySQLイメージをビルドするためにMySQLランチャーを使用しなければならない」とか、Redisについても同様に言いません。この場合、既存のイメージを使用するだけで、これがDockerを使用する上での手がかりであり、要点です。しかし、Discourseの場合、突然これが「悪い」解決策になり、誰もが「独自のイメージをビルドしなければならない!」と叫びます。なぜですか!?
いいえ。プラグインのためです。
うーん…プラグインについて少し掘り下げる必要があり、再び言わなければならない/引用しなければならないことがあります。
![]()
そこで、プラグインセクションに移動し、指示とインストールガイドを探している最初のプラグインをクリックしました(Plugin directory | Discourse - Civilized Discussion → Sign in with Apple | Discourse - Civilized Discussion → Discourse Apple Authentication → https://meta.discourse.org/t/install-plugins-on-a-self-hosted-site/19157)そして…神よ – なんて複雑な「混乱」でしょう。
プラグインを持つためだけに新しいイメージが必要なのはなぜですか?Dockerを使用すると、プラグインのマウントディレクトリを指定してそこに配置するだけで済みます…
私はRubyの人間ではないので、物事はここでより奇妙かもしれませんが、例えばJavaの世界では、プラグインを含むjarをドロップするだけでロードされ、完了です – 実行できます。そして、誰もが同じイメージを使用しています…
(散らかっているとは言っていない、ただ物事がそうなっている理由を説明しているだけです)
Emberのアセットパイプラインのためです。
それもまた散らかるでしょう。なぜなら、それらの依存関係を外部に置きたくないからです。
これですか? GitHub - ember-engines/ember-asset-loader: Asset loading support for Ember applications?
なぜダメなのですか?
プラグインはオン・ザ・フライで処理でき、これはプラグインのアップグレード時にも行われます。ちょっとした工夫で、コンテナを再構築せずに実行中のインスタンスに新しいプラグインを追加することもできます。したがって、プラグインボリュームをコンテナにマウントすることも可能であるはずです(多くの変更が必要ですが)。
私が主な問題と見ているのは、Discourseのアップグレードです。これは現在、実行中のインスタンスで行うことができます。アップグレードは基本的にDiscourseを再構築します。もしDiscourseが実際に事前構築済みイメージから提供されていた場合、それらのファイルを変更することはできません。なので、ゼロダウンタイムまたはダウンタイムがほとんどないアップグレードには、かなり多くの作業が必要になるでしょう。
これは私が理解できない点です(おそらくRubyの文脈で何かを見落としているのでしょう…)。
一般的に、Docker/コンテナ/オーケストレーションでは、新しいバージョンで新しいコンテナを準備し、準備ができたらトラフィックを切り替えるブルーグリーン/レッドブラックデプロイメントが可能です。しかし、一般的に小規模なデプロイメントでは、ほとんどの場合、サービスの起動(コンテナ)はわずか数秒で済むため、バージョンの切り替えによるダウンタイムは最小限で済むはずです(最大の課題はスキーマアップグレードを実行する必要があることですが、これはイメージを再ビルドするかどうかにかかわらず適用されます)。
はい、しかし、それは現在の仕組みではなく、作業が必要な部分です。Discourseの管理インターフェース内からこれをどのように行うのですか。グリーンコンテナを起動しながらブルーコンテナをスケールダウンするにはどうすればよいですか(システムには無限のリソースがないため、ブルーを起動する前にグリーンでユニコーンワーカーを減らしたい場合があります)。あるいは、グリーンをダウンさせて、ブルーをアップさせることもできます。
技術的な観点からも、管理者としての観点からも、多くのことを理解し、解決する必要があります。管理インターフェース内からのワンクリックアップグレードは価値のある機能です。
プラグインとカスタムイメージはまだ構築が必要ですが、バニラビルドに関しては、Composeでの構築が現実的になってきています。興味のある方は、こちらに小さな概念実証の実験を作成しました。
明らかに、これらはすべて私のリポジトリ(Discourseの™ではありません)であり、公式のものではないため、結果は保証されず、公式サポートは期待しないでください
Bitnamiやその他の非公式な方法で既に実行している人がいると聞いたので、ここに投稿します。
市販のPostgres(またはpgvector)イメージはDiscourseでは機能しません。Discourseはデフォルト設定を変更する必要があり、スーパーユーザー経由で接続せず、ロケールをサポートし、Discourse管理者がダンプ/リストアを必要とせずにPostgresのアップグレードをサポートする必要があります。
うーん、これが重要な違いだと思います。「管理インターフェースからのアップデート」というのは、PHPインタープリターを備えた「ウェブホスティング」しかなかった昔を彷彿とさせ、すべてがその概念を中心に構築されていました。そして、これがDiscourseの仕組みや管理方法の期待に引き継がれていると思います。
さて、それは私が気づいたもう一つのことです。Discourseはかなり重い(コンテナは起動中に恐ろしいレベルでリソースを消費し始めました)ので、はい、問題になる可能性があります。
Ruby(主にインタープリター言語であり、コンパイル言語ではない)の文脈で、それらはどのように「ビルド」されるのですか?
市販のソリューションを使おうとするのはどうでしょうか?Postgresの設定でさえ、カスタムpostgresql.confファイルを単純に提供/マウントすることで簡単に変更できます。完全にカスタムイメージをビルドして設定を焼き込む必要はありません…そしてそれでも、もしそれが要求されるなら、Discourseは毎回再ビルドする代わりにプルするだけの、そのような事前ビルドイメージを提供できるのではないでしょうか…
この「管理インターフェースからのアップデート」はプラグイン(「docker manager」と呼ばれる)です。オンラインアップデートの別の方法がある場合は、含める必要はありません。
