Использование Discourse с Cloudflare: лучшие практики

Использование Discourse с Cloudflare

:bookmark: В этом руководстве объясняется, как настроить и использовать Discourse с Cloudflare, включая лучшие практики безопасности и советы по устранению неполадок.

:person_raising_hand: Требуемый уровень пользователя: Администратор

:information_source: Для самостоятельной установки требуется доступ к консоли

Краткое содержание

Cloudflare может улучшить ваш экземпляр Discourse, обеспечив повышенную производительность благодаря CDN, дополнительные уровни защиты, такие как защита от DDoS-атак, и поддержку HTTPS. Это руководство охватывает процесс настройки и лучшие практики для оптимальной конфигурации.

Зачем использовать Cloudflare с Discourse

Использование Cloudflare с вашим экземпляром Discourse дает несколько ключевых преимуществ:

  • Производительность: CDN Cloudflare может улучшить глобальный доступ к общим ресурсам, улучшая пользовательский опыт по всему миру (источник)
  • Безопасность: Дополнительные уровни защиты, включая:

:warning: Для самостоятельных установок, хотя Cloudflare предлагает эти преимущества, он добавляет сложности в вашу настройку.

Настройка Cloudflare

  1. Ознакомьтесь с основами Cloudflare
  2. Следуйте инструкциям по настройке, чтобы настроить Cloudflare для вашего домена и получить преимущества в области безопасности, производительности и надежности

Лучшие практики конфигурации

Настройки DNS

  • Убедитесь, что записи DNS, указывающие на ваш экземпляр Discourse, проксируются
  • Доступ к настройкам DNS осуществляется по адресу dash.cloudflare.com/?to=/:account/:zone/dns

Конфигурация SSL/TLS

  • Установите режим шифрования в значение “Full (strict)”
  • Доступ к настройкам SSL/TLS осуществляется по адресу dash.cloudflare.com/?to=/:account/:zone/ssl-tls

:warning: Неправильная конфигурация SSL/TLS может вызвать циклы перенаправления

Настройки кэширования

  • Установите уровень кэширования в значение “Standard”
  • Доступ к настройкам кэширования осуществляется по адресу dash.cloudflare.com/?to=/:account/:zone/caching/configuration

Правила кэширования

Cloudflare устарел Page Rules в пользу своей современной системы Rules. Создайте следующие правила, используя Cache Rules по адресу dash.cloudflare.com/?to=/:account/:zone/rules:

  • Установите уровень кэширования в значение “Bypass” для community.example.com/session/*
  • Настройте параметры нормализации URL для нормализации входящих URL-адресов

Настройки сети

Настройки сети по адресу dash.cloudflare.com/?to=/:account/:zone/network обычно не влияют на функциональность Discourse. Discourse не использует WebSockets, gRPC или заголовки CF-IPCountry / True-Client-IP. Эти настройки можно оставить по умолчанию, если другое программное обеспечение на том же домене не требует специальной конфигурации.

Настройки WAF (брандмауэр веб-приложений)

Если ваш тарифный план Cloudflare поддерживает управляемые правила, создайте следующие:

  1. Пропустить WAF при создании/редактировании постов:
(starts_with(http.request.uri.path, "/posts") and http.request.method in {"POST" "PUT"})
  1. Для пользователей плагина Data Explorer пропустите WAF при административных запросах:
((http.request.uri.path contains "/admin/plugins/explorer/queries/" or http.request.uri.path contains "/admin/plugins/discourse-data-explorer/queries/") and http.request.method eq "PUT")

Для обоих правил:

  • Выберите “Skip all remaining rules”
  • Включите “Log matching requests”

:information_source: Если у вас тарифный план Business или выше, вы можете использовать оператор регулярных выражений matches для более точного сопоставления. Операторы starts_with и contains, использованные выше, работают во всех тарифных планах, включая Free и Pro.

Доступ к настройкам WAF осуществляется по адресу dash.cloudflare.com/?to=/:account/:zone/firewall/managed-rules

Оптимизация контента

Настройте следующее по адресу dash.cloudflare.com/?to=/:account/:zone/speed/optimization:

  • Включите Brotli
  • Отключите Rocket Loader™

:warning: Discourse часто получает отчеты о неработоспособности сайта из-за включенного Rocket Loader™

Дополнительная конфигурация для самостоятельных установок

Чтобы обеспечить правильную пересылку IP-адресов, добавьте следующее в раздел шаблонов в вашем файле containers/app.yml:

- "templates/cloudflare.template.yml"

:warning: После добавления шаблона необходимо пересобрать контейнер с помощью команды ./launcher rebuild app, чтобы изменения вступили в силу.

Связанное: Как настроить Cloudflare?

Ресурсы поддержки

Устранение неполадок

Проблемы с политикой безопасности контента (CSP)

Если вы столкнулись с ошибками CSP:

  • Убедитесь, что Rocket Loader отключен
  • Проверьте, что скрипты правильно добавлены в настройку сайта content security policy script src

Функциональность OneBox

Если OneBox блокируется:

  • Проверьте, включен ли режим борьбы с ботами Super Bot Fight Mode
  • Отрегулируйте настройку “Definitely automated”, если она установлена в “Managed” или “Block”
  • Рассмотрите возможность создания пользовательского правила WAF для пользовательского агента OneBox
29 лайков

Доброе утро,

Спасибо за это руководство, которому я следовал буквально, но столкнулся с проблемой: каждый раз при активации Cloudflare в консоли возникает ошибка CSP, которая сообщает: «Отказано в выполнении встроенного скрипта, так как это нарушает следующую директиву Content Security Policy: “script-src”». После этого указывается, что для включения выполнения встроенных скриптов требуется либо ключ «unsafe-inline», либо хеш («sha256-VCiGKEA…=»), либо nonce («nonce-…»).

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

СПАСИБО.

Можете проверить, отключен ли Rocket Loader?

Также стоит убедиться, что скрипты корректно добавлены в настройку «Content Security Policy script src».

Если ни один из этих способов не поможет, рекомендую обратиться в поддержку Cloudflare по адресу: https://community.cloudflare.com/t/using-discourse-with-cloudflare-best-practices/602890.

1 лайк

Спасибо за это, @nat и @tcloonan

Это уже год или два висит у меня в списке дел, но меня отпугивал возраст некоторых старых тем по этой теме :smiley:

Есть ли какие-либо проблемы или особые моменты для тех, кто использует AWS S3 для хранения и резервного копирования? :thinking:

Вам всё ещё нужен шаблон Cloudflare в app.yml для получения реальных IP-адресов, или это изменилось за годы?

1 лайк

Да. Шаблон Cloudflare необходим. Без него весь трафик будет выглядеть так, будто исходит от серверов Cloudflare, а не с IP-адреса браузера пользователя.

Я не вижу этого упоминания в исходном посте, что кажется вопиющим упущением. Откуда вы узнали, что он нужен?

2 лайка

Привет! Я здесь с 2014 года (несколько лет в основном молчал), но с 2020 года мы работаем над миграцией нашего сообщества, используя собственный импортер, и сейчас занимаемся второй версией нашего внутреннего плагина для внедрения и включения bbcode в качестве движка разметки в Discourse. Вы можете следить за нашим прогрессом здесь: GitHub - RpNation/bbcode: RpNation's Official BBCode Implementation for Discourse · GitHub

Я уже какое-то время глубоко погружён в этот софт. Мы используем Cloudflare, поэтому я снова изучаю, есть ли какие-либо проблемы с его совместимостью с Discourse, так как мы теперь на том этапе, когда могу начать беспокоиться о менее важных вещах, которые не являются критическими препятствиями.

@nat Не могли бы вы добавить правку о шаблоне для саморазмещённых экземпляров!

4 лайка

Готово, спасибо вам обоим за указание на это!

4 лайка

Огромное спасибо! Вероятно, именно поэтому мой сайт внезапно стал недоступен. Я, наверное, слишком много экспериментировал с настройками Cloudflare.

Так как мой старый провайдер доменов поддерживал DNSSec неадекватно и некорректно, мне пришлось искать нового. Тогда я вспомнил о Cloudflare. Бесплатного тарифа мне вполне хватает. Жаль, что тарифы не масштабируются разумно в соответствии с требованиями.

2 лайка

Это добавляется в это место?

1 лайк

Только для точности, запрос для исключения WAF выглядит так:

(http.request.uri.path eq "/posts(/[0-9]+)?" and http.request.method in {"POST" "PUT"})

Вы можете скопировать и вставить его, если нажмёте на Edit expression слева, вместо использования выбора из формы.

Заметил это сегодня, когда обновлял систему, и внезапно половина форума перестала работать из-за Auto Minify :weary:

Редактирование: только что заметил, что это пост в вики. Глупый я, я уже отредактировал исходный пост.

4 лайка

Режим шифрования SSL/TLS: Полная (строгая). Возникнет ли проблема, если он не отключен? Разве автоматический SSL не будет установлен автоматически?

Добавлю ещё: похоже, что функциональность OneBox блокируется, когда включён режим Super Bot Fight Mode и параметр «Определённо автоматизировано» установлен в значение «Управляемый» или «Блокировать».

Это можно обойти, настроив собственное правило WAF для пользовательского агента Onebox, но, возможно, существует более безопасный способ сделать это?

Связано с

Эту часть, возможно, стоит сформулировать лучше:

Предложение от @supermathie:

вы должны добавить следующую строку в конец раздела шаблонов в файле containers/app.yml.

как показано на Using Discourse with Cloudflare: Best Practices - #11 by shawa

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

Я рекомендую отключить AI-ботов в Cloudflare. Это можно сделать в разделе «Безопасность» → «Боты» → «Блокировать AI-ботов».

AI-боты ежедневно нагружали мой сайт, генерируя от 30 до 40 тысяч просмотров страниц. После включения этого фильтра трафик от AI-ботов значительно снизился.

5 лайков

Приведённый выше код следует изменить на:

 - "templates/cloudflare.template.yml"

спасибо,
Major

2 лайка

Действительно ли необходимо включать поддержку WebSockets в Cloudflare?

У нас всё работало отлично без этого в течение многих лет, и, насколько я мог найти информации на этом форуме, Discourse не использует WebSockets.

Я не понимаю, нужно ли мне это делать

Вы правы. Я не думаю, что мы используем Websockets.

Я удалил это и также обновил фрагмент шаблона от пользователя выше.

2 лайка

Пока мы об этом говорю, я считаю, что весь раздел «Настройки сети» не имеет значения для Discourse:

  • Совместимость с IPv6 больше нельзя отключить, и, конечно же, Discourse не зависит от неё, но может работать на системе только с IPv4.
  • Геолокация по IP добавляет заголовок CF-IPCountry к запросам, однако Discourse его не использует. У него есть собственная (опциональная) функция MaxMind.
  • Логирование ошибок сети добавляет заголовок ответа Report-To, который браузеры могут использовать для отправки отчётов об ошибках. Однако эта функция устарела, и хотя её можно включить во всех тарифных планах Cloudflare, элемент панели управления для просмотра отчётов доступен только в тарифе Enterprise. Таким образом, в данном случае для некоторых старых браузеров это может стать регрессией в области конфиденциальности и создать лишнюю нагрузку на сеть.
  • Маршрутизация через Onion улучшает конфиденциальность запросов из сети Tor. Discourse не будет ни интересоваться этим, ни даже знать об этом.
  • Функция псевдо-IPv4 может даже понадобиться, если на хосте работает какое-либо программное обеспечение, например устаревшая аналитика или подобное, которое поддерживает только IPv4-адреса. Прокси-заголовки Cloudflare, такие как Cf-Connecting-IP (или другие, в зависимости от конфигурации), можно настроить так, чтобы они содержали более-менее уникальный IPv4-адрес вместо реального IPv6-адреса клиента. Это позволяет обойти ограничение, что поддержка IPv6 для запросов от клиента к Cloudflare больше не может быть отключена. Опять же, Discourse не будет этого замечать. Я имею в виду, что это может стать проблемой, например, для обнаружения местоположения по IP (GeoIP), но эта функция отключена по умолчанию, и администраторы, конечно, должны включать её только в том случае, если это строго необходимо для используемого ими программного обеспечения, принимая на себя недостаток в виде неточных IP-адресов клиентов. Её также можно настроить так, чтобы она добавляла только новый заголовок с псевдо-IPv4-адресом, и тогда аналитика (или что-то ещё) могла бы переписывать заголовки IP-адресов клиентов там, где это нужно, в то время как запросы к Discourse не пострадали бы. В любом случае, для общей функциональности Discourse эта функция не имеет значения.
  • Заголовок True-Client-IP добавляет только этот заголовок в дополнение к CF-Connecting-IP и X-Forwarded-For. Discourse не использует его; кроме того, шаблон конфигурации Discourse использует CF-Connecting-IP. Поэтому он не оказывает никакого эффекта.
  • gRPC не используется Discourse, но включение Cloudflare для пересылки запросов gRPC не навредит, как и в случае с WebSockets. Оба могут потребоваться для другого программного обеспечения, работающего на том же домене Cloudflare.
  • Максимальный размер загрузки 100 МБ — это значение по умолчанию и минимальное. Большие размеры загрузки требуют тарифов Business или Enterprise, и Discourse не сломается, если Cloudflare разрешит загрузку файлов большего размера.

Единственное, в чём я не уверен, может ли это иметь эффект, — это буферизация ответов. И я не могу это проверить, так как это функция только для тарифа Enterprise. Но я не могу представить, чтобы клиенту было важно, передаются ли пакеты от граничного узла Cloudflare по мере их поступления или отправляются одним блоком после завершения на граничном узле. Для кэшируемых данных (кэшируемых в Cloudflare, я имею в виду) это делается в любом случае всегда, и по крайней мере это не вызывает проблем. Эта функция влияет только на некэшируемые данные.

Таким образом, я бы в целом удалил весь раздел «Настройки сети», так как он не имеет значения для функциональности Cloudflare, но другое программное обеспечение может требовать определённых настроек, или администраторы могут предпочитать их определённый вид, и они должны знать, что Discourse будет работать в любом случае.

1 лайк