Я просто хотел поделиться шагами, которые я выполнил при настройке подпапки вместе с 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 и т.д.

