Здравствуйте! Я пытаюсь внедрить комментарии Discourse на свой сайт, следуя руководству по внедрению, но уперся в тупик ![]()
Симптомы
Я пробовал в Firefox и Chrome. В обоих случаях загружается iframe Discourse с надписью «Загрузка обсуждения…», но процесс зависает, и в консоли разработчика постоянно появляются ошибки JavaScript.
В Firefox я получаю ошибку, связанную с заголовком X-Frame-Options:
При загрузке «https://discourse.29th.local/embed/comments?embed_url=https%3A%2F%2Fpersonnel.29th.local%2F%23enlistments%2F11927» обнаружен недопустимый заголовок X-Frame-Options: «ALLOWALL» не является допустимой директивой.
За ней следует ошибка DOMException в embed-application.js:7:
Uncaught DOMException: Указана недопустимая или некорректная строка
Эти две ошибки повторяются примерно каждые 30 секунд. В вкладке «Сеть» (Network) нет неудачных запросов.
В Chrome я не получаю ошибку X-Frame-Options. Через несколько секунд появляется ошибка о том, что целевой источник не совпадает с источником окна-получателя:
Не удалось выполнить 'postMessage' на 'DOMWindow': Указанный целевой источник ('https://discourse.29th.local') не совпадает с источником окна-получателя ('https://personnel.29th.local').
Я видел множество тем на meta, посвященных этой ошибке, и пробовал все шаги по устранению неполадок, но безрезультатно.
Моя конфигурация
Я следовал руководству по установке Discourse на Mac с одним небольшим исключением: вместо глобальной установки postgres, redis и mailcatcher на свой ноутбук я запускаю их в контейнерах Docker с открытыми портами. Discourse не знает, что они работают в контейнерах Docker, а не на «голом железе». Rails/Discourse установлен глобально и не работает в контейнере Docker.
Отдельно от этого мое пользовательское веб-приложение работает в стеке Docker Compose. Часть этого стека включает сервер nginx, который маршрутизирует personnel.29th.local в соответствующий контейнер-источник, а discourse.29th.local — на host.docker.internal:3000 (это магическое имя хоста, которое контейнеры Docker могут использовать для доступа к localhost хоста).
(Как я упоминаю ниже, я убрал слой nginx из уравнения, но получил ту же ошибку)
Возможная проблема здесь заключается в том, что мое веб-приложение является одностраничным приложением (SPA) на JavaScript. Страница, на которую внедряются комментарии Discourse, — это https://personnel.29th.local/#enlistments/1234, и серверного рендеринга нет. Если бы это была проблема, я бы ожидал ошибку при работе с краулером, и тогда я бы согласился на то, чтобы Discourse просто ссылался на мое приложение, а не пытался его сканировать. Но ошибки, которые он показывает, похоже, не связаны с неудачами сканирования.
Устранение неполадок
Я установил хост для внедрения в разделе Администрирование > Настройка > Внедрение как personnel.29th.local. Сначала в примере кода внедрения для discourseUrl отображался адрес http://localhost:3000/, поэтому я запустил rails console и выполнил:
SiteSetting.force_hostname = "discourse.29th.local"
SiteSetting.port = 443
И включил опцию «Принудительно использовать https» в панели администратора. Это исправило URL в примере кода внедрения.
Я также добавил https://personnel.29th.local в качестве домена CORS в разделе cors origins настроек.
Сейчас я запускаю Discourse со следующей командой:
DISCOURSE_DEV_HOSTS=discourse.29th.local,host.docker.internal DISCOURSE_ENABLE_CORS=true bundle exec rails server
Я также пробовал отключить политику безопасности контента (Content Security Policy) в панели настроек.
Я посмотрел логи на https://discourse.29th.local/logs/, но не нашел никаких ошибок и ничего о Sidekiq.
Кстати о Sidekiq: у меня есть сообщение на панели администратора об обновлениях:
Проверка обновлений не выполнялась. Убедитесь, что Sidekiq запущен.
Поэтому я выполнил Sidekiq.redis { |r| puts r.flushall } в консоли Rails, получил OK, перезапустил сервер Rails, но сообщение и общая проблема не изменились. Я покопался в кэше Redis и не нашел ничего, связанного с этой страницей.
Я также попытался упростить задачу, убрав слой nginx из уравнения: вернул SiteSetting.force_hostname и SiteSetting.port к значению nil, отключил принудительный https, получил доступ к моему веб-приложению и Discourse через localhost, добавил мое веб-приложение в список хостов для внедрения и хостов CORS в Discourse (http://localhost:8080), но получил ту же ошибку, только с другими хостами:
Не удалось выполнить 'postMessage' на 'DOMWindow': Указанный целевой источник ('http://localhost:3000') не совпадает с источником окна-получателя ('http://localhost:8080').
Я использую версию 2.6.0.beta6 ( 60bc38e6a8 ), которую получил, клонировав ветку master согласно руководству по установке Discourse на Mac пару недель назад и выполнив git pull origin master сегодня.
Я также удалил директорию tmp и перезапустил сервер.
Я также пошел на прогулку, кричал в подушку и плакал под столом.
Надеюсь, я охватил все возможные варианты. Надеюсь, кто-то сможет помочь!
