最近のアップグレード後のCORSエラーにより、すべてのプラグインが機能していない

先週から、コアプラグインおよびインストール済みのすべてのプラグインが、フォーラム上で有効化されていても機能しなくなっています。当初は、以前に報告されたバグ(https://meta.discourse.org/t/fix-compile-missing-rollup-plugin-bundles-on-demand-in-development/398864/8)に関連していると考えましたが、その後も複数の更新を実行しましたが、問題は解決していません。以前使用していなかったプラグイン、つまりプリインストールされている「User Notes」を有効化しようとしましたが、どのユーザーに対してもメモを追加するオプションが表示されません。さらに、Docker Manager も停止しているため、すべての更新をサーバーレベルで実行する必要があり、管理者チームではなく1人の担当者しか適用できなくなっています。

この問題の解決策を探しましたが、見つかった情報は「プラグインが自動的に無効化される」といった一般的なものであり、今回のような具体的な状況には対応していません。

何か考えられる解決策や検討すべき対応策をご教示いただけないでしょうか?ロールバックは極力避けたいと考えていますが、現状ではそれが最後の手段となる可能性もあります。

いつも皆様のご支援に感謝しております。:smiley:

ふむ、これはあなたのCDNに問題があるようです:


CORS無視プラグインを有効にしたところ、スクリプトは正常に読み込まれましたが、プラグインによる視覚的な変化は確認できませんでした。これを試してみることをお勧めします。もし動作すれば、CDNでエラーを引き起こしている原因を特定できるはずです。

ご多忙の折、本件をご確認いただき、誠にありがとうございます。週末にいくつかのテストを実施し、可能な範囲で更新いたします。

bunnyCDN でも同様の問題が発生しています。最近のアップデートまでは正常に動作していました。

bunny.net の CORS ヘッダーに .js を追加しましたが、ここにある通りです:

先週 6800ad3adf3ef9c3caeb9a4d849997c7a3dc98d7 にアップグレードした際に、なぜこの問題が発生したのか理解できません。

ジェイ、ありがとう。バニーとあなたが言及した修正ですべての問題が解決しました!今回の件でのご支援とサポートに、あなたと皆様方に感謝いたします。フォーラムは通常通り(できる限り通常通り)に戻りました。 :smiley:

整理できてよかったです!

新しいプラグインシステムでは、正しい CORS ヘッダーの設定が必須となる script type="module" を使用しています。従来の script type="text/javascript" では、そのようなヘッダーは必要ありません。

ここ数年、さまざまなシステムを type="module" へ徐々に移行してきました。テーマもすでにこれを使用しており、highlightjs(別のトピックで言及されたもの)も同様です。CDN からフォントを読み込む際にも CORS の要件があります。

したがって、最近のプラグインシステムの変更以前から、他のいくつかの要素が微妙に破損していた可能性があります。CORS 設定を適用したことで、すべてが正常に動作するはずです :chefs_kiss:

ああ、それは予想していませんでした。

なおしごとの一報です。Azure Classic CDN をご利用の場合、この問題が発生し始めています。CDN 側で修正を試みていますが、Classic CDN ではなく、本格的な Front Door への移行が必要になるかもしれません。

はい、Azure Classic CDN でもこの問題を確認しました。

ルールエンジンに新しいルールを追加する必要があります。以下に例を示します:

"rules": [

                        {

                            "name": "JSCORS",

                            "order": 1,

                            "conditions": [

                                {

                                    "name": "RequestUri",

                                    "parameters": {

                                        "typeName": "DeliveryRuleRequestUriConditionParameters",

                                        "operator": "Contains",

                                        "negateCondition": false,

                                        "matchValues": [

                                            "/assets/js/plugins/"

                                        ],

                                        "transforms": []

                                    }

                                }

                            ],

                            "actions": [

                                {

                                    "name": "ModifyResponseHeader",

                                    "parameters": {

                                        "typeName": "DeliveryRuleHeaderActionParameters",

                                        "headerAction": "Overwrite",

                                        "headerName": "Access-Control-Allow-Origin",

                                        "value": "https://forums.mycoolforum.com"

                                    }

                                },

                                {

                                    "name": "ModifyResponseHeader",

                                    "parameters": {

                                        "typeName": "DeliveryRuleHeaderActionParameters",

                                        "headerAction": "Overwrite",

                                        "headerName": "Content-Type",

                                        "value": "application/javascript"

                                    }

                                },

                                {

                                    "name": "CacheExpiration",

                                    "parameters": {

                                        "typeName": "DeliveryRuleCacheExpirationActionParameters",

                                        "cacheBehavior": "BypassCache",

                                        "cacheType": "All"

                                    }

                                }

                            ]

奇妙なことに、この問題はテーマには影響せず、当社の場合はプラグインのみが影響を受けています。

Cloudflare を利用している方にとって、これらの最近の CORS に関する変更について、どこかで手順やガイダンスを見つけることはできますか?

@pfaffman @TomoftheFog @tanya_byrne @denvergeeks アセットの構成について確認をお願いできますでしょうか。CDN とアプリケーションサーバーのみを設定されていますか?それとも S3 または S3 互換のストレージにもアセットを保存されていますか?

S3 または S3 互換のストレージを使用されている場合、残念ながら信頼性のある方法は CDN 固有の設定を追加することのみです。このトピックは S3 アセットに関するものだと想定していましたが、今は確信が持てません。

アプリケーションサーバーに対して単純な CDN を使用している方々にとっては、追加の設定作業は必要なかったはずです。テーマの JavaScript や highlightjs バンドルと同様に、「そのまま動作する」べきでした。しかし、どうやらデフォルトの NGINX 設定でヘッダーが不足していたようです。申し訳ありません!

これで動作が回復するはずです:

これがマージされた後、反映させるには ./launcher rebuild app の実行が必要です。NGINX 設定の変更は UI アップデート時には適用されません。

この情報をメイントピックに追加しました:

ご迷惑をおかけして申し訳ありません!異なる CDN 構成でのより包括的なテストを行うべきでした。ビルド後にも引き続き問題が発生する場合は、お知らせください。

S3 を使用していないことを確認しました。

問題が発生しているサイトは、私の知る限りすべて S3 上にあります。一部の CDN はすでに JS がリストに含まれていましたが、含まれていないものもありました。なぜそうなるのかはわかりません。もしかすると、年々デフォルト設定が変更されたのでしょうか?

返信が遅くなり申し訳ありません。確かに S3 を使用しています。

カスタムドメインで Cloudflare R2 の CORS 設定を機能させるのに苦労していました。最終的には、CDN ドメインに対して正しいヘッダーを常に挿入するヘッダー変換ルールを使用して、強引に解決しました。もし誰かの参考になれば幸いです。

この問題に遭遇して以降、別の問題も発見しました。『プリフォーマットテキスト』の Markdown ボタンを使用している場合、一部のユーザーがアバター画像を表示できないのです。highlight-js の読み込みを試みると「CORS 失敗」というエラーが発生します。

これは私たちの環境だけの問題なのかはわかりませんが、関連している可能性もあるため、皆様に共有しておきます。

f.insertcred.it は S3 CDN でしょうか?HighlightJS は S3 CDN ではなく「アプリケーション CDN」から読み込むべきですので、これは意外な問題です。私の知る限り、ここ数ヶ月で HighlightJS に関連する変更はありませんでした。

アプリケーション CDN はお持ちですか?それとも S3 と S3 CDN のみでしょうか?

フォーラムのヘッド管理者から更新情報を受け取りました:


私の認識では、CDN アプリは存在しません。app.yml 内の DISCOURSE_CDN_URL のコメントアウトを解除していません。

私たちは DISCOURSE_S3_ENDPOINT や DISCOURSE_S3_CDN_URL などの S3 変数のみを使用しています。

以下は機密情報を削除した当社の app.yml です。

## これはオールインワン、スタンドアロンの Discourse Docker コンテナテンプレートです
##
## このファイルを修正した後、必ず再ビルドしてください
## /var/discourse/launcher rebuild app
##
## 編集時は *非常に* 注意してください!
## YAML ファイルは空白やアライメントの誤りに極めて敏感です!
## 必要に応じて http://www.yamllint.com/ でこのファイルを検証してください

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  ## 次の行のコメントアウトを解除すると IPv6 リスナーを有効化できます
  #- "templates/web.ipv6.template.yml"
  - "templates/web.ratelimited.template.yml"
  ## Lets Encrypt (https) を追加したい場合は、以下の 2 行のコメントアウトを解除してください
  - "templates/web.ssl.template.yml"
  - "templates/web.letsencrypt.ssl.template.yml"

## このコンテナが公開する TCP/IP ポートはどれですか?
## Discourse を Apache や nginx などの他の Web サーバーとポートを共有したい場合は、
## https://meta.discourse.org/t/17247 を参照してください
expose:
  - "80:80"   # http
  - "443:443" # https

params:
  db_default_text_search_config: "pg_catalog.english"

  ## db_shared_buffers を総メモリの最大 25% に設定します。
  ## 検出された RAM に基づいてブートストラップが自動的に設定するか、上書きできます
  db_shared_buffers: "256MB"

  ## ソートパフォーマンスを向上させる可能性がありますが、接続ごとのメモリ使用量が増加します
  #db_work_mem: "40MB"

  ## このコンテナで使用する Git リビジョンはどれですか?(デフォルト: tests-passed)
  #version: tests-passed

  ## 最大アップロードサイズ(デフォルト: 10m)
  upload_size: 20m

env:
  LC_ALL: en_US.UTF-8
  LANG: en_US.UTF-8
  LANGUAGE: en_US.UTF-8
  # DISCOURSE_DEFAULT_LOCALE: en

  ## 同時にサポートされる Web リクエスト数です。メモリと CPU コア数に依存します。
  ## 検出された CPU に基づいてブートストラップが自動的に設定するか、上書きできます
  UNICORN_WORKERS: 4

  ## TODO: この Discourse インスタンスが応答するドメイン名
  ## 必須です。Discourse は IP アドレスのみでは動作しません。
  DISCOURSE_HOSTNAME: forums.insertcredit.com

  ## コンテナを上記で指定した同じホスト名(-h オプション)で起動したい場合は、
  ## 以下のコメントアウトを解除してください(デフォルト "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: 初期登録時に管理者および開発者として登録されるメールアドレスのリスト(カンマ区切り)
  ## 例: 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'EMAIL'
  
  ## TODO: 新規アカウントの検証と通知の送信に使用する SMTP メーラー
  # SMTP アドレス、ユーザー名、パスワードは必須です
  # 警告:SMTP パスワードに '#' 文字が含まれていると問題が発生する可能性があります!
  DISCOURSE_SMTP_ADDRESS: smtp.mailgun.org
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: USERNAME
  DISCOURSE_SMTP_PASSWORD: "PASSWORD"
  DISCOURSE_SMTP_ENABLE_START_TLS: true           # (オプション、デフォルト true)
  DISCOURSE_SMTP_DOMAIN: forums.insertcredit.com
  DISCOURSE_NOTIFICATION_EMAIL: noreply@forum.insertcred.it
  DISCOURSE_USE_S3: true
  DISCOURSE_S3_REGION: nyc3
  DISCOURSE_S3_ENDPOINT: https://nyc3.digitaloceanspaces.com
  DISCOURSE_S3_ACCESS_KEY_ID: KEY_ID
  DISCOURSE_S3_SECRET_ACCESS_KEY: ACCESS_KEY_VALYE
  DISCOURSE_S3_CDN_URL: https://f.insertcred.it
  DISCOURSE_S3_BUCKET: insertcredit-forum
  DISCOURSE_S3_BACKUP_BUCKET: insertcredit-forum-backup
  DISCOURSE_BACKUP_LOCATION: s3
  DISCOURSE_S3_INSTALL_CORS_RULE: false

  DISCOURSE_CAN_PERMANENTLY_DELETE: true

  ## Lets Encrypt テンプレートを追加した場合は、以下をコメントアウト解除して無料の SSL 証明書を取得してください
  LETSENCRYPT_ACCOUNT_EMAIL: EMAIL

  ## この Discourse インスタンスの http または https CDN アドレス(プルするように設定)
  ## 詳細は https://meta.discourse.org/t/14857 を参照してください
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com

  ## IP アドレスの照会に使用する Maxmind のジオロケーション IP アドレスキー
  ## 詳細は https://meta.discourse.org/t/-/137387/23 を参照してください
  #DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456

## Docker コンテナはステートレスです。すべてのデータは /shared に保存されます
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## プラグインはここに記述します
## 詳細は https://meta.discourse.org/t/19157 を参照してください
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/discourse/discourse-bbcode-color.git
          - git clone https://github.com/discourse/discourse-signatures.git
          - git clone https://github.com/discourse/discourse-chart.git
  after_assets_precompile:
    - exec:
        cd: $home
        cmd:
          - sudo -E -u discourse bundle exec rake s3:upload_assets
          - sudo -E -u discourse bundle exec rake s3:expire_missing_assets

## ビルド後に実行するカスタムコマンド
run:
  - exec: echo "Beginning of custom commands"
  ## 最初の登録時の 'From' メールアドレスを設定したい場合は、以下のコメントアウトを解除して変更してください:
  ## 最初の登録メールを受け取った後、再度コメントアウトしてください。1 回だけ実行すれば十分です。
  #- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
  - exec: echo "End of custom commands"

この情報がご質問への回答にお役に立てば幸いです。一点注意点として、数日前に発生したアバターが消えるという問題に関する報告は、現在は一切受けておりません。私の知る限り、変更は行われていないため、この問題は単に一部のユーザーに限定されたもので、以前の問題が解決された後に、時間の経過とともに自然に解消されたものではないかと推測しています。

引き続きご調査いただき、ありがとうございます。