自上周起,所有插件(包括核心插件和已安装的插件)在启用状态下也无法在我们的论坛中正常运行。起初,我以为这与之前提到的 bug 有关(https://meta.discourse.org/t/fix-compile-missing-rollup-plugin-bundles-on-demand-in-development/398864/8),但此后我们已多次执行更新,问题仍未解决。我尝试启用一个此前未使用过的插件(预装的“用户笔记”插件),但发现无法为任何用户添加笔记。甚至连 Docker 管理器也已停止工作,导致所有更新都必须在服务器层面执行,这意味着只能由一人来应用更新,而无法由管理员团队共同协作。
我尝试寻找解决方案,但所找到的内容大多仅涉及“插件被自动禁用”等类似问题,与我们的具体情况并不完全吻合。
能否请各位提供可能的解决方案或建议我们应尝试的方向?我们希望能避免回滚操作,但目前看来这可能成为最后的选择。
一如既往感谢大家的支持!
嗯。这看起来是您的 CDN 的问题:
我启用了我的 CORS 忽略插件,脚本成功加载了,但我没有从插件中看到任何可见的变化。我建议您尝试一下,如果有效,您应该能找到导致 CDN 错误的原因。
非常感谢您抽出时间为我们调查此事。我们将在本周末进行一些测试,并在有进展时更新。
pfaffman
(Jay Pfaffman)
4
我在 BunnyCDN 上也遇到了同样的问题。在最近一次更新之前,一切运行正常。
我尝试按照此处描述的方法,在 bunny.net 的 CORS 头中添加 .js:
与当时的情况一样,我不明白为什么在我上周升级到 6800ad3adf3ef9c3caeb9a4d849997c7a3dc98d7 后会出现这个问题。
谢谢 Jay,我们已经解决了 Bunny 的问题,您提到的修复方案也彻底解决了所有问题!感谢您和所有人在此事上提供的帮助与支持,我们的论坛已恢复正常。至少是尽可能正常了 
david
(David Taylor)
6
很高兴听到您已经解决了问题!
在新的插件系统中,我们使用 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 变更的说明或指导?
david
(David Taylor)
12
@pfaffman @TomoftheFog @tanya_byrne @denvergeeks 能否请你们确认一下资源是如何配置的?你们是否仅使用了 CDN 加应用服务器?还是也将资源存储在 S3 或兼容 S3 的存储中?
如果您使用的是 S3 或兼容 S3 的存储,那么不幸的是,唯一可靠的方法是添加一些特定于 CDN 的配置。我原本以为这个议题是关于 S3 资源的,但现在我不太确定了?
对于使用简单 CDN 对接应用服务器的用户,按理说不应该需要任何额外的配置工作。它应该“自动生效”,与 theme-javascripts 和 hightlightjs 捆绑包完全一样。但看起来我们的默认 NGINX 配置中确实缺少了某个请求头。对此我们深表歉意!
以下内容应能使功能恢复正常:
合并此更改后,需要执行 ./launcher rebuild app 才能生效。NGINX 配置的更改不会在 UI 更新期间自动应用。
david
(David Taylor)
13
已将此信息添加到主主题中:
对此造成的不便深表歉意!我们本应针对不同 CDN 配置进行更全面的测试。如果您在重建后仍遇到任何问题,请随时告知我们。
pfaffman
(Jay Pfaffman)
15
据我所知,出现该问题的所有网站都使用了 S3。一些 CDN 的列表中已经包含了 JS,而另一些则没有。我不清楚其中的原因;也许是多年来默认设置发生了变化?
amiantos
(Brad Root)
17
我在尝试让 Cloudflare R2 的 CORS 设置配合自定义域名生效时遇到了困难。最后,我通过添加一个标头转换规则,强制为我的 CDN 域名插入正确的标头,从而“暴力”解决了这个问题。万一这对其他人有帮助,特此分享。
自从遇到这个问题后,我们还发现了另一个问题:部分用户在使用“预格式化文本”Markdown 按钮时无法查看头像图片。系统尝试加载 highlight-js 时出错,提示 CORS 失败:
不确定这是否仅存在于我们这边,但想告知大家,以防与此相关。
david
(David Taylor)
19
我假设 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 "自定义命令结束"
希望这些信息对您有所帮助。需要说明的一点是,我们尚未收到关于头像消失问题的任何报告,而该问题在几天前确实出现过。据我们所知,没有任何更改,因此我们不确定该问题是否只是影响了一小部分用户,并且随着之前的问题得到解决,该问题也随时间自行得到了修复。
再次感谢您对此事的关注。