Установка Discourse на домашнем интернете с помощью Cloudflare Tunnel

Поскольку Discourse теперь поддерживает запуск на Raspberry Pi, развёртывание небольшого экземпляра в домашней лаборатории станет распространённым сценарием. Однако многие провайдеры домашнего интернета блокируют входящий трафик на порты 80/443, которые необходимы для работы Discourse.

Для нашего демонстрационного сайта по адресу https://discourse-on-a-pi.falco.dev/ мы использовали Cloudflare Tunnel для обхода этой проблемы, и вы тоже можете это сделать!

Настройка туннеля

Сначала следуйте следующей инструкции:

Единственное изменение, которое вам потребуется — заменить URL с url: http://localhost:8000 на url: http://localhost:80. Оставьте туннель запущенным в фоновом режиме.

Отключение Rocket Loader

Для корректной работы Discourse необходимо отключить Rocket Loader от Cloudflare.

https://community.cloudflare.com/t/how-can-i-remove-the-rocket-loader-script-from-the-header-tag-on-my-website/4229/2

Установка Discourse

Следуйте руководству Как установить Discourse в продакшн, но нажмите CTRL+C после создания файла app.yml, когда начнётся обратный отсчёт в 5 секунд.

Теперь отредактируйте первые несколько строк файла, чтобы они выглядели следующим образом:

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/cloudflare.template.yml"
#  - "templates/web.ratelimited.template.yml"
## Раскомментируйте эти две строки, если хотите добавить Lets Encrypt (https)
#  - "templates/web.ssl.template.yml"
#  - "templates/web.letsencrypt.ssl.template.yml"

и добавьте следующую строку в секцию env::

DISCOURSE_FORCE_HTTPS: true

Затем выполните команду ./launcher rebuild app.

Пока вы ждёте, настройте правило перенаправления страницы, чтобы всегда использовать HTTPS, как показано ниже:

Через несколько минут ваш новый экземпляр Discourse станет доступен по домену, который вы использовали в конфигурации туннеля/Discourse :tada:.

38 лайков

Я думаю, лучше упомянуть порт. Если пользователь решит использовать Argo Tunnel, ему нужно настроить порт так же, как в настройках туннеля. Например:

-80:80
#-443:443

тогда ему нужно разрешить туннелю прослушивать:
http://localhost:80

Я использую Unix-сокет для их соединения.

5 лайков

Разве я не упоминал об этом здесь:

?

7 лайков

Привет, Рафаэль,

Спасибо за урок.

Я выполнил все инструкции из вашего руководства выше, и всё работает нормально, однако:

При нажатии на ссылку в письме для активации аккаунта меня перекидывает на правильную веб-страницу с кнопкой активации, но эта кнопка не работает. Я поискал рекомендации на этом форуме, и похоже, что это проблема домена и IP?

Я подтвердил, что в конфигурации параметр force_https установлен в true.

Есть ли у вас какие-либо мысли / сталкивались ли вы с этой проблемой (скриншот прикреплен) с кнопкой, которая ничего не делает?

3 лайка

Всё, мне удалось это исправить.

Просто убедитесь, что Rocket Loader отключён :wink:

Удачи!

6 лайков

Наконец, установил Discourse на Raspberry Pi. Но у меня возникли проблемы с Cloudflare Tunnels.

Я не могу получить доступ к сайту Discourse через домен. Возможно, что-то не так в конфигурации config.yml?

url: http://localhost:80
tunnel: 371dd57c-************
credentials-file: /home/pi/.cloudflared/371dd57c-*********.json
3 лайка

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

3 лайка

cloudflared tunnel info <ИМЯ> вывод:

cloudflared tunnel info ******
2022-01-24T04:55:47Z INF Не удалось определить путь к сертификату по умолчанию. Файл cert.pem отсутствует в [~/.cloudflared ~/.cloudflare-warp ~/cloudflare-warp /etc/cloudflared /usr/local/etc/cloudflared] originCertPath=
2022-01-24T04:55:47Z ERR Необходимо указать путь к сертификату origin с помощью опции --origincert или установить переменную окружения TUNNEL_ORIGIN_CERT. Дополнительную информацию см. по адресу https://developers.cloudflare.com/argo-tunnel/reference/arguments/. originCertPath=
ошибка при парсинге ID туннеля: ошибка поиска сертификата origin: клиент не указал путь к origincert при запуске из терминала
2 лайка

Похоже, вы перепутали расположение файла сертификата? Если вы работаете от имени root, файл должен находиться в

/root/.cloudflared/

а не там, где вы его разместили, как указано ниже:

2 лайка

У меня уже есть файл cert.pem.

2 лайка

И вы пытаетесь запустить туннель от имени пользователя pi или от root?

3 лайка

Я использую эту команду от имени пользователя pi

cloudflared tunnel run <UUID или NAME>

2 лайка

Привет @bekircem,

Похоже, ваш Cloudflared смог установить соединение с граничным узлом Cloudflare.

Включили ли вы маршрутизацию через CNAME, указывающий на ваш идентификатор туннеля Argo в Cloudflare?

С наилучшими пожеланиями,

Алекс.

3 лайка

Привет @Stigin, спасибо за ответ.

Да, я включил маршрутизацию из командной строки

2 лайка

Интересный момент, @bekircem - Хм!!

Какую ошибку вы получаете сейчас при переходе по адресу вашего веб-сайта? Это просто стандартная страница ошибки Cloudflare Argo Tunnel?

Могли бы вы показать нам запущенные контейнеры, выполнив команду: docker ps, и текущие работающие туннели с помощью cloudflared tunnel list? Пожалуйста, закройте размытием ваш маршрут Argo или любые нерелевантные контейнеры! :wink:

Алекс.

3 лайка

Какую ошибку вы получаете сейчас при переходе по адресу вашего веб-сайта? Это просто общая страница ошибки Cloudflare Argo Tunnel?

Нет, страницы ошибки Cloudflare Argo Tunnel нет.

ERR_NAME_NOT_RESOLVED

docker ps

CONTAINER ID   IMAGE                 COMMAND        CREATED        STATUS        PORTS                                                                      NAMES
f1bde9b70f55   local_discourse/app   "/sbin/boot"   11 hours ago   Up 11 hours   0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   app

При выполнении этой команды от имени root-пользователя cloudflared tunnel list

2022-01-24T15:55:03Z INF Cannot determine default origin certificate path. No file cert.pem in [~/.cloudflared ~/.cloudflare-warp ~/cloudflare-warp /etc/cloudflared /usr/local/etc/cloudflared] originCertPath=
2022-01-24T15:55:03Z ERR You need to specify the origin certificate path with --origincert option, or set TUNNEL_ORIGIN_CERT environment variable. See https://developers.cloudflare.com/argo-tunnel/reference/arguments/ for more information. originCertPath=
Error locating origin cert: client didn't specify origincert path when running from terminal

При выполнении этой команды от имени пользователя pi cloudflared tunnel list

You can obtain more detailed information for each tunnel with `cloudflared tunnel info <name/uuid>`
ID                                   NAME      CREATED              CONNECTIONS
371dd57c-**************** ze****2022-01-24T03:35:19Z

Это нормально?

Нам нужно использовать поддомен для DISCOURSE_HOSTNAME в файле config.yml, верно?

Обновление: Я удалил Cloudflared и переустановил его от имени root-пользователя, и теперь всё работает. Всё ещё не понимаю, где именно я ошибся в предыдущей попытке.

2 лайка

Каким-то образом мне наконец удалось запустить сайт на Raspberry Pi, и он работает.

Я сам не до конца понимаю, как это произошло. Я удалил Cloudflared и переустановил его от имени пользователя root. И всё заработало…

У меня два вопроса:

  1. Похоже, мой SSL-сертификат работает некорректно, поэтому я не могу войти в учётную запись администратора на Discourse. (Кажется, это работает только в режиме инкогнито. Возможно, дело в кэше). Вы используете режим full или full(strict)?

  1. У меня есть вопросы по запуску cloudflared как службы. https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/run-tunnel/run-as-service

Я запустил туннель командой cloudflared tunnel run <UUID or NAME>. Но если я закрою окно терминала iTerm, перестанет ли он работать?

Если вы уже вошли в систему и у вас есть файл конфигурации в ~/.cloudflared/, он будет скопирован в /etc/cloudflared/.

Если у вас нет файла конфигурации, вам нужно создать файл config.yml с полями, перечисленными выше. Вы можете передать свой файл, выполнив команду cloudflared --config CONFIG-FILE service install.

Я проверил: у меня нет файла конфигурации в /etc/cloudflared/. В этом случае, что мне нужно сделать, чтобы служба запускалась автоматически?

Спасибо.

2 лайка

Более конкретные вопросы о службе Cloudflare tunnel могут получить лучшие ответы на https://community.cloudflare.com/tag/cloudflaretunnel

3 лайка

Привет, @bekircem,

Кажется, переустановка могла бы решить проблему с тем, что cloudflared не находит сертификат…

Что касается запуска Cloudflare как службы: файл конфигурации, который вы создали при ручном запуске службы, нужно переместить в каталог /etc/cloudflared.

Я не уверен насчёт ссылок на личные сайты здесь, поэтому дайте знать, если мне нужно будет их удалить. Однако я уже освещал эту тему в одном из своих блогов в разделе под названием: ‘Настройка и запуск Cloudflared как службы

Дайте знать, как у вас получится!

Алекс.

4 лайка

Спасибо за ответ.

Отличный пост в блоге, спасибо, что поделились.

Запуск Cloudflared как службы

sudo cloudflared service install

Файл config.yml автоматически скопирован в /etc/cloudflared/.

sudo systemctl start cloudflared

sudo systemctl enable cloudflared

И всё работает отлично. Я ещё не пробовал перезагружать систему, но надеюсь, что это сработает.

4 лайка