Настройка Cloudflare с подпапкой

Я просто хотел поделиться шагами, которые я выполнил при настройке подпапки вместе с Cloudflare, особенно в случае, когда основной сайт уже работает, и корневой домен нельзя перенаправить на сервер форума (даже временно).

Ключевые моменты

  • Существующий mywebsite.com в настоящее время указывает на 1.1.1.1 и работает.
  • Мы должны перенаправлять mywebsite.com/forum (и его подкаталоги) на 2.2.2.2.
  • Поскольку во время установки Discourse мы не можем пройти проверку Let’s Encrypt (которая проверяет, разрешается ли домен на текущий сервер), мы должны использовать DNS-валидацию.

Изменения в app.yml

Обновления Let’s Encrypt

Создайте новый шаблон Let’s Encrypt и настройте его в app.yml в соответствии с этой темой: LetsEncrypt DNS Validation Template Using Cloudflare

Однако обязательно скопируйте только метод issue_cert из того поста, а остальное содержимое возьмите из оригинального файла web.letsencrypt.ssl.template.yml (так как он был изменен после публикации темы).

LETSENCRYPT_CF_TOKEN: ""
LETSENCRYPT_CF_ACCOUNT_ID: ""
LETSENCRYPT_CF_ZONE_ID: ""
LETSENCRYPT_DNS_PROVIDER: "dns_cf"
  • Токен Cloudflare можно создать на странице “API Tokens” в разделе “Мой профиль” в панели управления CF.
  • Account ID и Zone ID отображаются на странице обзора домена.
  • Оставьте значение dns provider как указано выше.

Обновления для подкаталога

Согласно этой теме Serve Discourse from a subfolder (path prefix) instead of a subdomain установите DISCOURSE_RELATIVE_URL_ROOT: /forum в секции env: и обновите секцию run:.
Обратите внимание на этот пост касательно IP-адресов пользователей: Serve Discourse from a subfolder (path prefix) instead of a subdomain - #111 by varun21

Пересборка

После изменения app.yml для запуска команды пересборки нам нужно пропустить проверку Discourse на разрешение домена на IP-адрес текущего сервера (так как наш mywebsite.com уже указывает на 1.1.1.1, а Discourse проверяет корневой домен). Для этого выполните:

./launcher rebuild app --skip-connection-test

Настройка Cloudflare

Я знаю, что некоторые люди рекомендуют использовать Workers для перенаправления /forum на 2.2.2.2, однако я обнаружил, что гораздо проще сделать это с помощью балансировки нагрузки (Load Balancing). С помощью Workers я не смог решить проблемы, связанные с CSS/JS, даже с отключенным Rocket Loader и другими подобными настройками. Поэтому:

  • Активируйте балансировщик нагрузки (в разделе Traffic).
  • Выберите “Manage Pools” → “Create”.
  • Создайте 2 пула (один для основного сайта и один для форума), каждый из которых должен содержать только одну конечную точку.

  • Создайте балансировщик нагрузки, имя хоста должно быть mywebsite.com.
  • В разделе endpoints выберите оба пула.
  • Пропустите мониторы (так как нам не нужно отслеживать состояние сервера; основной сайт всегда должен указывать на 1.1.1.1, а форум — на 2.2.2.2). Пропустите управление трафиком (по умолчанию выключено).
  • В разделе Custom Rule создайте правило с условием по пути /forum и укажите конечную точку форума.

  • Сохраните/разверните.

Примечания

  • По какой-то причине копирование образца app.yml и последующая пересборка не сработали для меня (вероятно, я что-то делал неправильно). Поэтому в качестве решения я сначала выполнил discourse-setup с другим доменом, а затем, вместе с другими изменениями в app.yml, указанными выше, изменил имя хоста и выполнил финальную пересборку.
  • Discourse генерирует два сертификата от Let’s Encrypt: RSA cert и ECDSA cert. У Let’s Encrypt есть лимит в 5 сертификатов на точный домен в неделю. Если вы ошибетесь дважды подряд, третья попытка выдаст только один сертификат, и форум не будет работать (вы можете проверить текущий лимит с помощью этого скрипта: GitHub - sahsanu/lectl: Script to check issued certificates by Let's Encrypt on CTL (Certificate Transparency Log) using https://crt.sh · GitHub).
  • Балансировщик нагрузки CF не бесплатен, однако, учитывая (на данный момент) стоимость 5 долларов за 500 тысяч DNS-запросов, я считаю, что это того стоит по сравнению с проблемами, связанными с nginx и т.д.