Cloudflare или плагины ломают мой экземпляр Discourse?

На моём форуме Discourse при нажатии на значок колокольчика для уведомлений постоянно отображается индикатор загрузки. В меню загрузки указано: «Замедлитесь, слишком много запросов с этого IP-адреса». Я использую Cloudflare.

Как именно вы используете Cloudflare?

Вот очень актуальная тема:

Вы выполнили три шага, описанные там?

Да, я выполнил, и всё работало нормально до последнего бета-обновления.
В целом всё работает исправно, но уведомления вызывают проблемы: они отправляют бесконечное количество запросов каждые несколько секунд.

А вот консоль:

А вот открытый файл:

Отключите Cloudflare, это ломает ваш сайт.

Я использую бесплатный тариф Cloudflare и SSL-сертификат Cloudflare за 5 долларов. Ни одна функция Cloudflare не включена: Rocket Loader отключён, все остальные оптимизации (например, минификация и т. п.) выключены, а такие функции, как Railgun, вообще недоступны на бесплатном тарифе. Кэширование настроено на соблюдение заголовков origin-сервера. Всё работало нормально, но я только что осознал, что обновился до ветки master через /admin/upgrade, что, возможно, всё сломало. Позже я удалил скрипты и упоминания, но система продолжает постоянно проверять уведомления. Проблема возникает только из-за уведомлений — всё остальное работает.

Я использую Cloudflare для раздачи файлов, хранящихся в Amazon S3 через CloudFront. Если я откажусь от Cloudflare, мои расходы возрастут. Cloudflare выполняет только функции DNS-провайдера и провайдера SSL; большинство его оптимизаций и функций отключены, а многие вообще недоступны на бесплатном тарифе. Как вы думаете, в моём случае Cloudflare всё ещё может быть виновником проблемы?

Стоит ли мне попробовать пересобрать проект, чтобы решить проблему?

P.S.: Я фанат StackOverflow, блога CodingHorror и Discourse. С уважением :vulcan_salute:

Сначала попробуйте отключить CloudFlare (кроме базового DNS) в качестве эксперимента. Если проблема исчезнет, это даст вам подсказку.

Я отключил оранжевое облако Cloudflare, дождался, пока браузер покажет SSL-сертификат Let’s Encrypt вместо Cloudflare, чтобы убедиться, что контент загружается напрямую с сервера, а не через Cloudflare, затем выполнил пересборку. Однако при переходе в меню пользователя и нажатии на значок уведомлений я всё ещё получаю следующую ошибку:

Uncaught (in promise) DOMException: Quota exceeded.
_application-977ce16935600e0a620c1ea565154ab68e46f60a9fe0f207139e0f2128dd9474.js:77250 Uncaught TypeError: Cannot read property 'dasherize' of undefined
    at s.itemHtml (_application-977ce16935600e0a620c1ea565154ab68e46f60a9fe0f207139e0f2128dd9474.js:77250)
    at _application-977ce16935600e0a620c1ea565154ab68e46f60a9fe0f207139e0f2128dd9474.js:77390
    at _ember_jquery-d1d89874d5f08a664c68007c6c2eef5e3bb1cbd8058291fce7818d8ef4ded8ca.js:39008
    at t.u.Mixin.create.c.forEach (_ember_jquery-d1d89874d5f08a664c68007c6c2eef5e3bb1cbd8058291fce7818d8ef4ded8ca.js:38995)
    at t.u.Mixin.create.c.map (_ember_jquery-d1d89874d5f08a664c68007c6c2eef5e3bb1cbd8058291fce7818d8ef4ded8ca.js:39007)
    at s.html (_application-977ce16935600e0a620c1ea565154ab68e46f60a9fe0f207139e0f2128dd9474.js:77389)
    at s.value (_application-977ce16935600e0a620c1ea565154ab68e46f60a9fe0f207139e0f2128dd9474.js:80621)
    at s.value (_application-977ce16935600e0a620c1ea565154ab68e46f60a9fe0f207139e0f2128dd9474.js:80371)
    at s (_vendor-7fd29296ee54f8a7ced9508b106a09ec4aae4912ed1cf10eceb7eb2acca03309.js:20669)
    at t.exports (_vendor-7fd29296ee54f8a7ced9508b106a09ec4aae4912ed1cf10eceb7eb2acca03309.js:20652)

При открытии файла отображается следующее:

define("discourse/widgets/quick-access-notifications", ["discourse/lib/ajax", "discourse/widgets/widget", "discourse/widgets/quick-access-panel"], function (_ajax, _widget, _quickAccessPanel) {
  "use strict";

  (0, _widget.createWidgetFrom)(_quickAccessPanel.default, "quick-access-notifications", {
    buildKey: function buildKey() {
      return "quick-access-notifications";
    },
    emptyStatePlaceholderItemKey: "notifications.empty",

    markReadRequest: function markReadRequest() {
      return (0, _ajax.ajax)("/notifications/mark-read", { type: "PUT" });
    },
    newItemsLoaded: function newItemsLoaded() {
      if (!this.currentUser.enforcedSecondFactor) {
        this.currentUser.set("unread_notifications", 0);
      }
    },
    itemHtml: function itemHtml(notification) {
      var notificationName = this.site.notificationLookup[notification.notification_type];

      return this.attach(notificationName.dasherize() + "-notification-item", notification, {}, { fallbackWidgetName: "default-notification-item" });
    },
    findNewItems: function findNewItems() {
      return this._findStaleItemsInStore().refresh();
    },
    showAllHref: function showAllHref() {
      return this.attrs.path + "/notifications";
    },
    hasUnread: function hasUnread() {
      return this.getItems().filterBy("read", false).length > 0;
    },
    _findStaleItemsInStore: function _findStaleItemsInStore() {
      return this.store.findStale("notification", {
        recent: true,
        silent: this.currentUser.enforcedSecondFactor,
        limit: this.estimateItemLimit()
      }, { cacheKey: "recent-notifications" });
    }
  });
});

Только что заметил, что эта проблема возникает только тогда, когда я вошел как администратор и отображается mini_profiler. Я вошел как обычный пользователь, и всё работает как положено.

См.:

Попробуйте очистить всё локальное хранилище.

Я очистил хранилище, и теперь ошибка квоты не отображается. Однако приложение продолжает делать множество запросов, и я получаю ответ 429 с просьбой замедлиться. Сейчас я не использую Cloudflare (Стоит ли также закомментировать шаблон Cloudflare в app.yml?). Ошибка остаётся той же в dasherize. Эти ошибки возникают только у администратора, и я очень быстро попадаю под ограничение скорости.

Какие неофициальные плагины и темы вы используете? Возможно, один из них генерирует высокую нагрузку на запросы.

Я использую следующие плагины

Для начала я бы закомментировал все плагины, которые вы не используете. Даже установленные, но отключенные, они всё равно нагружают вашу систему.

Начните с отключения всех сторонних плагинов (тех, у которых нет зеленой галочки). Скорее всего, проблема именно в них.

Я удалил Cloudflare, удалил множество плагинов и сторонних плагинов, но проблема так и не решена.

Удалите всё, что не отмечено зелёной галочкой, и выполните повторную сборку.

Проверьте, повторяется ли та же ошибка на другом компьютере — возможно, у вас закончилось место на диске или есть другая локальная проблема.

На мобильном браузере всё работает :slight_smile: Я разберусь, в чём локальная проблема. Скорее всего, дело в месте на диске и медленном диске. В любом случае, хорошо, что я избавился от нескольких ненужных плагинов :laughing:

Оказывается, я всё ещё сталкиваюсь с этой проблемой у некоторых пользователей.

Думаю, моя проблема связана с issue, упомянутым ниже, и я наблюдаю её после обновления до этой версии:

Мне не удаётся понять, что вызывает эту проблему. У новых пользователей всё работает, а у остальных — нет. Я использовал плагин Discourse Follow, а затем закомментировал его. Теперь я вижу эту проблему. Возможно ли, что она возникла из-за того, что я удалил этот плагин? Я предполагаю, что это происходит с теми пользователями, у которых, вероятно, были подписчики или которые использовали этот плагин. Это довольно смелое предположение. Может ли этот плагин быть причиной проблемы?

Да, это возможно. Поскольку мы не являемся разработчиками этого плагина, мы не можем знать наверняка, так ли это. Вы можете попробовать снова включить его и проверить. Если проблема исчезнет, сообщите об этом в теме плагина.

@Falco Да, это решает проблему. Я снова добавил плагин discourse-follow, и проблема была решена. Спасибо :slight_smile: