所有插件因最近升级后的 CORS 错误而无法运行

自上周起,所有插件(包括核心插件和已安装的插件)在启用状态下也无法在我们的论坛中正常运行。起初,我以为这与之前提到的 bug 有关(https://meta.discourse.org/t/fix-compile-missing-rollup-plugin-bundles-on-demand-in-development/398864/8),但此后我们已多次执行更新,问题仍未解决。我尝试启用一个此前未使用过的插件(预装的“用户笔记”插件),但发现无法为任何用户添加笔记。甚至连 Docker 管理器也已停止工作,导致所有更新都必须在服务器层面执行,这意味着只能由一人来应用更新,而无法由管理员团队共同协作。

我尝试寻找解决方案,但所找到的内容大多仅涉及“插件被自动禁用”等类似问题,与我们的具体情况并不完全吻合。

能否请各位提供可能的解决方案或建议我们应尝试的方向?我们希望能避免回滚操作,但目前看来这可能成为最后的选择。

一如既往感谢大家的支持!:smiley:

嗯。这看起来是您的 CDN 的问题:


我启用了我的 CORS 忽略插件,脚本成功加载了,但我没有从插件中看到任何可见的变化。我建议您尝试一下,如果有效,您应该能找到导致 CDN 错误的原因。

非常感谢您抽出时间为我们调查此事。我们将在本周末进行一些测试,并在有进展时更新。

我在 BunnyCDN 上也遇到了同样的问题。在最近一次更新之前,一切运行正常。

我尝试按照此处描述的方法,在 bunny.net 的 CORS 头中添加 .js

与当时的情况一样,我不明白为什么在我上周升级到 6800ad3adf3ef9c3caeb9a4d849997c7a3dc98d7 后会出现这个问题。

谢谢 Jay,我们已经解决了 Bunny 的问题,您提到的修复方案也彻底解决了所有问题!感谢您和所有人在此事上提供的帮助与支持,我们的论坛已恢复正常。至少是尽可能正常了 :smiley:

很高兴听到您已经解决了问题!

在新的插件系统中,我们使用 script type="module",这需要设置正确的 CORS 头。旧式的 script type="text/javascript" 不需要这些头。

过去几年里,我们一直在逐步将不同系统迁移到 type="module"。主题早已在使用它,highlightjs 也是如此(另一个主题中提到的那个)。从 CDN 加载字体也有 CORS 要求。

因此,在最近的插件系统更改之前,可能已经有一些其他问题被微妙地破坏了。现在您已经设置了 CORS 配置,一切应该都能正常工作了:chefs_kiss:

啊哈。这确实是我没想到的。

温馨提示各位,如果您使用的是 Azure Classic CDN,该问题已开始出现。我正在尝试在 CDN 端进行修复,但可能需要迁移到标准的 Front Door,而非 Classic CDN。

是的,我在 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 对接应用服务器的用户,按理说不应该需要任何额外的配置工作。它应该“自动生效”,与 theme-javascripts 和 hightlightjs 捆绑包完全一样。但看起来我们的默认 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 应该从“应用 CDN

我收到了论坛首席管理员的更新:


据我所知,我们并没有使用 CDN 应用。我们尚未在 app.yml 中取消注释 DISCOURSE_CDN_URL。

我们仅使用 S3 相关的变量,例如 DISCOURSE_S3_ENDPOINT 和 DISCOURSE_S3_CDN_URL 等。

以下是我们移除了敏感信息的 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),请取消注释以下两行
  - "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 由 bootstrap 自动设置,您也可以覆盖
  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 由 bootstrap 自动设置,您也可以覆盖
  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

  ## 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 "开始自定义命令"
  ## 如果您想设置首次注册时的“发件人”邮箱地址,请取消注释并修改:
  ## 收到首次注册邮件后,请重新注释该行。该行只需运行一次。
  #- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
  - exec: echo "自定义命令结束"

希望这些信息对您有所帮助。需要说明的一点是,我们尚未收到关于头像消失问题的任何报告,而该问题在几天前确实出现过。据我们所知,没有任何更改,因此我们不确定该问题是否只是影响了一小部分用户,并且随着之前的问题得到解决,该问题也随时间自行得到了修复。

再次感谢您对此事的关注。