Комментарии в Discourse зависли на «Загрузка...»

Здравствуйте,

За последние несколько дней в нашем Discourse мы заметили, что кнопка «Просмотреть полный пост» остаётся на значении «Загрузка…» после нажатия:

Кроме того, новые комментарии Discourse перестали отображаться в нашем виджете на сайте Drupal. Мы успешно использовали приведённые ниже инструкции по внедрению через JavaScript в течение многих лет:

Однако, по какой-то причине это перестало работать в последнее время. Я полагаю, что последний рабочий пост был примерно 1-го числа этого месяца. Старые посты отображаются как в Discourse, так и в модуле внедрения, но в новых недавних статьях блок Discourse зависает на тексте «Загрузка…».

Наш модуль Discourse для Drupal загружается с помощью следующего кода:

<div id="discourse-comments">
 <script type="text/javascript">
            var discourseUrl = "https://discourse.sitename.com/",
            discourseEmbedUrl = "http://sitename.com/node/' . $nid . '";

            (function() {
              var d = document.createElement("script"); d.type = "text/javascript"; d.async = true;
              d.src = discourseUrl + "javascripts/embed.js";
              (document.getElementsByTagName("head")[0] || document.getElementsByTagName("body")[0]).appendChild(d);
            })();
          </script>
 </div>

Я подтвердил, что файл «javascripts/embed.js» всё ещё существует по тому же пути.
Это блок, который отображается на страницах статей; однако в последнее время в нём показывается только текст «Загрузка обсуждения…»:
image

Мы не вносили никаких изменений в наш механизм внедрения Discourse или его настройку за последние несколько лет. Были ли какие-либо недавние изменения в функциональности Discourse, которые могли нарушить эту работу? Любая помощь в решении этой проблемы будет очень благодарна!

Мы используем ту же функциональность встраивания на нашем сайте. Я предполагаю, что discourseUrl и discourseEmbedUrl — это не те значения, которые вы указали выше, а соответствующие URL вашего форума?

В остальном код выглядит нормально. Я знаю, что функциональность встраивания работает в актуальной бета-версии Discourse. На прошлой неделе у нас было огромное количество встроенных постов. Странно, что встраивается только начало поста, но кнопка «Показать весь пост» не работает. У нас они загружаются мгновенно :thinking:

Проверяли ли вы консоль на наличие ошибок?

Вы всегда можете попробовать отключить настройку embed_truncate, просто чтобы проверить, выводится ли весь текст. Это может помочь сузить круг причин проблемы.

Вы недавно обновили или изменили какие-либо темы? Или вы действительно имеете в виду, что не обновляли систему уже несколько лет?

Да, всё верно, я использовал плейсхолдер sitename просто для наглядности. Эх, ну, по крайней мере, это облегчает ситуацию: похоже, что функционал встраивания Discourse не сломан! Значит, проблема на нашей стороне.

Я проверил логи Discourse (discourse.sitename.com/logs) и вижу там много уведомлений об устаревании, например, таких:

Уведомление об устаревании: SiteSetting.enable_personal_messages устарел.

Я определённо могу попробовать также отключить embed_truncate, поищу эту настройку следующим шагом. Но эта функция работала годами без проблем, поэтому я не понимаю, почему она могла сломаться…

Попробуйте проверить консоль инструментов разработчика на наличие ошибок при нажатии кнопки «Показать полный пост». Инструменты разработчика можно открыть, щёлкнув правой кнопкой мыши и выбрав «Просмотреть код» (Inspect). Ошибки будут отображаться красным цветом справа.

Да, функция встраивания точно не сломана. На моём сайте она работает несколько раз в день.

Последняя бета-версия — Discourse 3.1.0.beta4, стабильный релиз — 3.0.3: Security and bug fix release

Я полагаю, что наш сервер управляется администраторами; я не вносил в него никаких изменений, однако в панели управления Discourse указана дата последнего обновления от 18 апреля. Судя по последнему объявлению, связанному с этой датой, это версия 3.0.3.

Убедитесь, что у вас также установлена последняя версия Discourse. Возможно, стоит также проверить, происходит ли то же самое в безопасном режиме.

Хорошее замечание, спасибо! Я только что проверил и вижу эту ошибку:

Uncaught DOMException: An invalid or illegal string was specified

postUp embed-application.js:6

onload embed-application.js:36

EventHandlerNonNull* embed-application.js:25

<anonymous> embed-application.js:66

[embed-application-4e18c443be26cb7c50c56d1a8f39fcf176af9b4ae8e42243648f33c23d9b7eb9.js:5](https://conversation.spectrummagazine.org/assets/embed-application-4e18c443be26cb7c50c56d1a8f39fcf176af9b4ae8e42243648f33c23d9b7eb9.js)

postUp embed-application.js:6

onload embed-application.js:36

(Async: EventHandlerNonNull)
<anonymous> embed-application.js:25

<anonymous> embed-application.js:66

Это очень странно, потому что я недавно не вносил никаких изменений в код или что-либо ещё. Однако я помню, что 2-го числа этого месяца использовал Cloudflare для усиления безопасности; возможно, мне стоит проверить, нет ли там настроек, которые могут блокировать скрипты.

В прошлый раз, когда я проверял это, в консоли инструментов разработчика я видел ошибку CSP, так что, возможно, проблема именно в этом, потенциально на стороне Cloudflare.

Я подозреваю, что дело в этом.

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

О, отличное решение! Вы случайно не знаете, какое именно настройку безопасности пришлось изменить, чтобы это исправить? Я внес несколько изменений, поэтому не уверен, какую из них конкретно нужно откатить.

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

Да, что-то явно не в восторге от того, что на эту кнопку нажали.

Мне удалось точно определить проблему! Я связался с нашей управляемой поддержкой Discourse, и они предоставили IP-адрес, который ранее был добавлен в блок-список нашего WAF из-за большого объема трафика с этого адреса. Оказалось, что для корректной работы коммуникации Discourse этот IP-адрес необходимо было разрешить. Я так рад, что проблема не на стороне Discourse!

Да, звучит немного похоже на проблему, с которой я столкнулся. Рад, что вы её исправили :slight_smile:

Кажется, у меня та же проблема. В консоли разработчика браузера я вижу ошибки DOMException. Однако я не использую Cloudflare. Мой блог, в который встроен iframe Discourse, размещён на Netlify, а сам Discourse — на Communiteq.

Сначала я подумал, что проблема вызвана этим изменением:

Но теперь мне кажется, что дело в чём-то другом? Буду благодарен за любую помощь.

Имеете ли вы доступ к настройкам безопасности и/или сети с вашего сервера на Netlify? Исходя из моего недавнего опыта, на вашем месте я бы проверил настройки безопасности, чтобы убедиться, не заблокированы ли какие-либо IP-адреса. Также рекомендую связаться со службой поддержки Communiteq, так как они могут подтвердить IP-адреса, необходимые для того, чтобы ваш сервер Netlify мог взаимодействовать с Communiteq и успешно выполнять скрипты, нужные для отображения ресурсов Discourse.

Привет! Спасибо за попытку помочь!

Я связался с Communiteq.

Не уверен, что я могу сделать со стороны Netlify, но я разберусь. Хотя я сомневаюсь, что проблема там, потому что технически запросы поступают из браузеров посетителей моего сайта, верно? Если я правильно понимаю, как это работает (и, пожалуйста, поправьте меня, если я ошибаюсь), это клиентский JavaScript, выполняемый в браузере посетителя сайта. Discourse видит в запросе имя хоста сервера, но не IP-адрес. Мой сервер блога не общается с сервером форума. В любом случае это статическая установка блога. Это просто HTML с клиентским JavaScript. Он использует скрипт для отправки данных поста блога в Discourse и загрузки контента с форума во фрейме.

Действительно, проблема заключалась в ошибке в последней версии Discourse. Communiteq исправляет её на моем экземпляре форума. Подробнее см. здесь:

Обратите внимание, что эта проблема отличается от предыдущей.

Проблема в этой теме касалась неспособности Discourse «показать полный пост» на платформе Discourse, поскольку встроенный сайт отказывался передавать содержимое поста в блог Discourse.

Проблема в теме от @fabsh является результатом более свежего патча безопасности в Discourse, который содержит ошибку.

Привет! Я обновляю этот пост, так как в ходе моего расследования этой проблемы кое-что изменилось. Проблема сохраняется после обновления до версии 3.0.4: все недавно созданные статьи имеют проблемы с отображением встроенного кода Discourse. Статьи, созданные до этого обновления, работают без сбоев, поэтому дело не в блокировке IP-адресов.

Похоже, что в последней версии Discourse изменилась логика автоматического создания постов через код встраивания: теперь новый код требует канонический URL. См. ранее упомянутую тему:

Однако это полностью нарушает функциональность встраивания на сайтах вроде моего. Ранее я использовал Node ID в Drupal для встраивания, как показано в коде ниже:

discourseEmbedUrl = "http://sitename.com/node/' . $nid . '";

Теперь новый код Discourse требует использования канонического URL, что приводит к созданию дубликатов тем, если кто-то просто изменит заголовок статьи. Именно поэтому я использовал Node ID, так как он не меняется.

Возможно ли сделать этот новый канонический URL необязательным? Я попробовал изменить код встраивания, чтобы использовать его, но проблема с загрузкой вернулась для всех постов, созданных со старым кодом встраивания.

Итак, сейчас, с новым кодом Discourse, работающим на моём продакшн-сайте, у меня есть только два варианта:

  • Недавно созданные статьи в Drupal показывают «Загрузка…», но блок комментариев никогда не загружается; старые статьи, созданные до версии Discourse 3.0.4, работают нормально.

Или

  • Недавно созданные статьи в Drupal загружают блок комментариев без проблем, но все старые статьи, созданные до версии Discourse 3.0.4, показывают «Загрузка…», но блок комментариев никогда не загружается.

Есть ли способ сделать эту новую функцию опциональной? Необходимость выбирать между этими двумя вариантами ставит меня в безвыходное положение.