Все плагины не работают из-за ошибки CORS после недавнего обновления

С прошлой недели все плагины — как встроенные, так и установленные — перестали работать на нашем форуме, даже когда они включены. Сначала я подумал, что это связано с упомянутой ранее ошибкой FIX: Compile missing rollup plugin bundles on demand in development - #8, но с тех пор мы выполнили несколько обновлений, и ничего не помогло. Я попытался включить ранее неиспользуемый плагин — предустановленный «User Notes» — но теперь нет возможности добавлять заметки для каких-либо пользователей. Даже менеджер Docker перестал работать, поэтому все обновления теперь нужно запускать на уровне сервера, что позволяет применять их только одному человеку вместо команды администраторов.

Я искал решение этой проблемы, но наткнулся лишь на сообщения о том, что плагины автоматически отключаются или что-то в этом роде, что не совсем соответствует нашей ситуации.

Не могли бы вы подсказать возможные решения или направления, в которых стоит искать? Мы очень хотим избежать отката, но пока это может оказаться единственным вариантом.

Как всегда, спасибо всем здесь за вашу постоянную поддержку :smiley:

2 лайка

Хм. Похоже, проблема связана с вашим CDN:


Я включил плагин для игнорирования CORS, и скрипты успешно загрузились, но визуально никаких изменений от плагинов я не заметил. Рекомендую попробовать то же самое; если это сработает, вам стоит выяснить, что вызывает ошибку в вашем CDN.

7 лайков

Большое спасибо за то, что нашли время разобраться в этом для нас. Мы проведем несколько тестов в выходные и обновим информацию, как только сможем.

3 лайка

У меня та же проблема с BunnyCDN. Всё работало нормально до недавнего обновления.

Я попытался добавить .js в заголовки CORS на bunny.net, как описано здесь:

Как и в тот раз, я не понимаю, почему эта проблема возникла после обновления до версии 6800ad3adf3ef9c3caeb9a4d849997c7a3dc98d7 на прошлой неделе.

4 лайка

Спасибо, Джей! У нас теперь есть Bunny, и упомянутое вами исправление устранило все проблемы! Благодарю вас и всех за помощь и поддержку в этом вопросе — наш форум снова в норме. Ну, насколько это вообще возможно :smiley:

1 лайк

Рад слышать, что вы всё решили!

В новой системе плагинов мы используем script type="module", что требует настройки правильных заголовков CORS. Старые script type="text/javascript" не требуют таких заголовков.

В последние несколько лет мы постепенно переводим различные системы на type="module". Темы уже использовали его, как и highlightjs (о котором шла речь в другой теме). Загрузка шрифтов с CDN также требует настройки CORS.

Поэтому, вероятно, некоторые другие вещи уже были незаметно сломаны ещё до недавних изменений в системе плагинов. Теперь, когда вы настроили CORS, всё должно работать снова :chefs_kiss:

5 лайков

Ага. Это я бы точно не предположил.

1 лайк

Важное предупреждение для пользователей: если вы используете Azure Classic CDN, эта проблема начала возникать. Я пытаюсь применить исправление на стороне CDN, но, возможно, мне придется мигрировать на полноценный Front Door вместо Classic CDN.

1 лайк

Да, проблема подтверждена и на 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"

                                    }

                                }

                            ]

Странно, но эта проблема затронула только плагины, а не темы.

Не подскажете, где можно найти инструкции или рекомендации по этим недавним изменениям в настройках CORS для тех, кто использует Cloudflare?

@pfaffman @TomoftheFog @tanya_byrne @denvergeeks, пожалуйста, подтвердите, как настроены ваши ресурсы. У вас только CDN + сервер приложения? Или вы также храните ресурсы на S3 или совместимом с S3 хранилище?

Если вы используете S3 или совместимое с S3 хранилище, то, к сожалению, единственный надёжный способ — добавить специфичную для CDN конфигурацию. Я предполагал, что речь шла об ресурсах S3, но теперь я не так уверен?

Для тех, кто использует простой CDN против сервера приложения, не должно было потребоваться никакой дополнительной работы по конфигурации. Это должно работать «из коробки», точно так же, как пакеты theme-javascripts и hightlightjs. Но похоже, что в нашей конфигурации NGINX по умолчанию действительно отсутствовал заголовок. Приносим извинения!

Это должно снова всё исправить:

После слияния потребуется выполнить ./launcher rebuild app, чтобы изменения вступили в силу. Изменения конфигурации NGINX не применяются при обновлениях интерфейса.

3 лайка

Добавил эту информацию в основную тему:

Приносим извинения за возникшие неудобства! Мы должны были провести более тщательное тестирование с различными конфигурациями CDN. Пожалуйста, сообщите нам, если после пересборки у вас всё ещё возникают проблемы.

2 лайка

Подтверждаем, что мы не используем S3

1 лайк

Все сайты, о которых мне известно и на которых наблюдается эта проблема, используют S3. У некоторых CDN JS уже был в списке, у других — нет. Не знаю, почему это могло произойти; возможно, настройки по умолчанию менялись с годами?

3 лайка

Извините за поздний ответ, мы действительно используем S3.

2 лайка

У меня возникли трудности с настройкой CORS в Cloudflare R2 для работы с пользовательским доменом. В итоге я решил проблему методом перебора, используя правило трансформации заголовков, чтобы всегда добавлять нужный заголовок для моего CDN-домена. На случай, если это кому-то ещё пригодится.

Мы также обнаружили ещё одну проблему после столкновения с этой: некоторые пользователи не могут видеть изображения аватаров при использовании кнопки «Преформатированный текст» в Markdown. Система пытается загрузить highlight-js и выдаёт ошибку с сообщением о сбое CORS:

Не уверены, что проблема только на нашей стороне, но хотели предупредить всех на случай, если это связано.

1 лайк

Я предполагаю, что f.insertcred.it — это ваш S3 CDN? HighlightJS должен загружаться с «CDN приложения», а не с S3 CDN, поэтому эта проблема удивительна. Насколько мне известно, за последние несколько месяцев ничего, связанного с highlightjs, не менялось.

У вас есть CDN приложения? Или только S3 + S3 CDN?

2 лайка

Я получил обновление от главного администратора форума:


Насколько мне известно, у нас нет приложения CDN. Мы не раскомментировали DISCOURSE_CDN_URL в app.yml.

Мы используем только переменные S3, такие как DISCOURSE_S3_ENDPOINT и DISCOURSE_S3_CDN_URL и т. д.

Вот наш файл app.yml с удалённой конфиденциальной информацией

## это шаблон контейнера Docker Discourse «всё в одном», автономный
##
## После внесения изменений в этот файл вы ОБЯЗАНЫ выполнить пересборку
## /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,
## см. 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% от общего объёма памяти.
  ## будет установлено автоматически при загрузке на основе обнаруженной оперативной памяти, либо вы можете переопределить
  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

  ## Сколько одновременных веб-запросов поддерживается? Зависит от памяти и ядер CPU.
  ## будет установлено автоматически при загрузке на основе обнаруженных процессоров, либо вы можете переопределить
  UNICORN_WORKERS: 4

  ## TODO: Доменное имя, на которое будет отвечать этот экземпляр Discourse
  ## Обязательно. Discourse не будет работать с чистым IP-адресом.
  DISCOURSE_HOSTNAME: forums.insertcredit.com

  ## Раскомментируйте, если хотите, чтобы контейнер запускался с тем же
  ## именем хоста (опция -h), как указано выше (по умолчанию "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: Список email-адресов через запятую, которые станут администраторами и разработчиками
  ## при первоначальной регистрации, например '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

  ## Адрес CDN http или https для этого экземпляра Discourse (настроен на подгрузку)
  ## см. 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 "Начало пользовательских команд"
  ## Если вы хотите установить адрес email в поле 'От' для первой регистрации, раскомментируйте и измените:
  ## После получения первого письма о регистрации закомментируйте строку обратно. Она должна выполниться только один раз.
  #- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
  - exec: echo "Конец пользовательских команд"

Надеюсь, это хоть как-то поможет в решении вопроса. Одно замечание: у нас не было никаких сообщений о проблемах с исчезновением аватаров, которые наблюдались несколько дней назад. Насколько мне известно, ничего не менялось, поэтому мы не уверены, была ли проблема просто у небольшой группы пользователей, и после решения предыдущей проблемы она со временем сама собой разрешилась.

Спасибо ещё раз за то, что разобрались в этом.

1 лайк