Должен ли Discourse прилагать усилия, чтобы стать жизнеспособной платформой для комментариев?

Я только что вник в эту тему, но, безусловно, считаю, что ответ — да :slight_smile:

Благодаря успеху нашего корпоративного сообщества (как среди пользователей, так и внутри компании) команда документации обратилась к нам с просьбой создать систему комментариев для всего сайта documentation.sailpoint.com. Судя по всему, мы сможем реализовать почти всё, что необходимо как минимум:

  • Встраивание комментариев (функция встраивания)
    • Также мы хотим использовать разных пользователей для публикаций и применять различные наборы тегов в зависимости от контекста встраивания. Эта функция появится очень скоро:

После этого всё остальное, что хотели команда документации (и моя команда), уже есть в Discourse. Это позволит нам эффективно отделить этот опыт от остального повседневного использования форума, сохраняя при этом возможность для пользователей оставлять комментарии, получать уведомления о ответах и т.д.

  • Возможность определить, какие пользователи могут и не могут комментировать
  • Назначение модераторов категорий для соответствующих тем
  • Скрытие этого множества категорий документации с нашего основного сайта
    • категория не индексируется поиском
    • используется компонент темы для скрытия из основного списка категорий
    • исключено из дайджестов
    • добавлено в список категорий по умолчанию с отключенными уведомлениями
  • Удаление комментариев через N дней
  • Несколько других настроек…

Мне бы очень хотелось увидеть реализацию многих функций, упомянутых здесь!

3 лайка

Цель состоит в том, чтобы позволить пользователям оставлять комментарии на https://documentation.sailpoint.com/, или вас устроит просто встроить комментарии на сайт документации, а пользователям предлагать посещать ваш сайт на Discourse для комментирования статей?

3 лайка

Первое — это функция, которую я с радостью приветствовал бы и очень хотел бы видеть (читай: пожалуйста, реализуйте, CDCK), но второе, по крайней мере, удовлетворяет нашим минимальным требованиям.

На самом деле в ближайшем будущем я планирую изучить идею, при которой Discourse будет предоставлять нашу документацию в формате Markdown (нет, не в темах, а в виде традиционных документов в стиле Markdown). В таком случае комментарии и регистрация для их оставления были бы включены в один пакет. Однако это исследование ещё не началось.

3 лайка

С подходом, над которым я сейчас работаю, технически возможно разрешить генерацию комментариев Discourse прямо на страницах MkDocs, но для этого потребуется использовать серверный фреймворк (Remix, Rails и т. д.) для обслуживания страниц MkDocs. Это позволило бы аутентифицировать пользователей (с помощью DiscourseConnect) на сайте документации, а также использовать базу данных в оперативной памяти для кэширования ранее возвращённых комментариев.

(Редактирование: просто для ясности, я говорю об использовании Discourse в качестве провайдера идентификации для веб-сайта, а не веб-сайта в качестве провайдера идентификации для Discourse. Последний подход работает, но он слишком негибкий для большинства случаев использования.)

Однако это было бы значительным изменением, которое потребовалось бы предложить вашей команде.

Уверен, что с вашей точки зрения было бы проще, если бы это было реализовано полностью внутри Discourse, но также возможно использовать Discourse как систему управления контентом. В этом случае документация в формате Markdown будет генерироваться как обычные темы Discourse. Веб-хуки Discourse будут использоваться для запуска генерации страницы документации на внешнем сайте. На самом деле это основа демонстрационного сайта комментариев Discourse, который я настраиваю.

5 лайков

В этом-то и заключается то, что мне так нравится в этой платформе: у неё есть все основы для того, чтобы (или даже для обоих!) этих вариантов были возможны.

5 лайков

Поскольку эту тему сегодня упомянули, я решил обновить её, добавив выводы, к которым пришёл после работы над этой идеей.

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

Что касается реализации, я думаю, что работа должна проводиться на стороне Discourse — в идеале путём улучшения скрипта встраивания комментариев Discourse. Это можно делать поэтапно.

Технически возможно использовать Discourse в качестве сервера для платформы комментариев, выполняя всю работу на клиенте Discourse (например, плагин WP Discourse), но из-за необходимости синхронизировать состояние между клиентом и Discourse, а также обходить ограничения по частоте запросов, задача становится слишком сложной. Это определённо сложнее, чем то, чем я хотел бы заниматься и поддерживать.

Несколько постов в этой теме указывали, что люди были бы заинтересованы просто в возможности создавать комментарии в Discourse на сайте блога. С моей точки зрения, это не лучшее решение, но это уже можно реализовать с помощью API Discourse. Сложности возникают при попытке создать полноценную систему комментариев, где пользователи могли бы взаимодействовать с комментариями в Discourse на веб-сайте так же, как они ожидают взаимодействовать с комментариями на типичном новостном портале.

8 лайков

Здесь разрабатывается модуль интеграции с Drupal, который позволяет писать комментарии Discourse на стороне Drupal через API.
https://www.drupal.org/project/discourse_comments_plus

4 лайка

Исходя из моего опыта работы с ActivityPub и WP Discourse, я считаю, что двусторонняя комментация через встроенный JavaScript достижима. Скрипт встраивания будет включать следующее:

  1. Неаутентифицированное «чтение», работающее аналогично текущему JS-встраиванию (с некоторыми оптимизациями).
  2. Удалённый клиент (то есть браузер пользователя) регистрирует клиент API-ключа пользователя, специфичный для сессии пользователя, и сохраняет соответствующие данные в локальном хранилище браузера.
  3. Пользователю предлагается «Войти, чтобы комментировать».
  4. Пользователь проходит аутентификацию (через Discourse), чтобы получить ключ API сессии пользователя, который сохраняется в локальном хранилище браузера.
  5. Каждое действие (комментарий, лайк и т. д.) напрямую отправляется на выделенную конечную точку с соответствующими мерами безопасности, обработкой и управлением задачами.

При правильном бюджете я думаю, что смогу подготовить v1 к производству и интегрировать его с discourse/discourse за 6–8 месяцев. После первоначального релиза я мог бы сделать следующее:

  1. Добавить явную поддержку WordPress, Ghost и других выбранных платформ.
  2. Написать документацию.
  3. Обеспечить поддержку.

cc @pmusaraj @mcwumbly

6 лайков

Постарайтесь реализовать это так, чтобы это было понятно и удобно для нетехнических пользователей. Существующие платформы, такие как Disqus и комментарии Facebook, вероятно, могут служить хорошими примерами.

Дополнительные варианты аутентификации:

  • сайт-клиент становится клиентом DiscourseConnect. Это относительно просто реализовать, но требует добавления кода на стороне сервера на сайт-клиент.
  • пользователи аутентифицируются на клиенте, а их статус аутентификации передаётся в iframe с помощью API postMessage: Window: postMessage() method - Web APIs | MDN
  • пользователи входят напрямую в Discourse через iframe

Моя неохота разрабатывать это исключительно на стороне клиента была связана с опасениями относительно масштабируемости системы. По сути, мне приходилось выстраивать запросы к API в очередь и обрабатывать ответы от этих запросов. Это не казалось достаточно надёжным решением для работы, например, с 1000 одновременными пользователями. У меня были бы аналогичные опасения и при использовании подхода с JavaScript-виджетом, но по другим причинам. Однако я полагаю, что с этим будет гораздо проще справиться, чем пытаться синхронизировать всё на стороне клиента.

3 лайка

Спасибо за обратную связь :slight_smile:

Вчера я ещё раз глубоко обдумал этот вопрос, так как тема была поднята (поэтому я в итоге написал здесь). Я считаю, что решение только на стороне клиента (т.е. JavaScript-виджет) — единственное, которое действительно имеет смысл в данном случае. В противном случае мы фактически говорим о множестве реализаций, специфичных для каждой платформы, у каждой из которых есть свои проблемы.

Вы правы, что проблемы с конкурентностью и нагрузкой существуют. С ActivityPub есть значительные проблемы с нагрузкой и конкурентностью, поскольку один пост ActivityPub может открыть вас для множества входящих и исходящих запросов к Федиверсу и от него. В этом контексте это может быть даже немного проще, так как удалённые клиенты контролируются. Более того, в данном случае проблемы с конкурентностью и нагрузкой возникают в основном на стороне сервера (т.е. на стороне Discourse), и, хотя они существуют, я думаю, их можно решить с помощью фоновых задач, кэширования и мьютексов. Но да, это важные вопросы, которые необходимо учитывать.

3 лайка

Честно говоря, моя главная забота здесь — это сроки.

Composer v2 вот-вот выйдет. Было бы безумием начинать это приключение и не использовать наш новый Composer, но нам предстоит огромная работа, чтобы сделать его применение в легковесном приложении реалистичным.

Я считаю, что правильным решением будет понаблюдать за развитием нового Composer в течение 2–3 месяцев, а затем вернуться к этому вопросу.

7 лайков

Я думаю, это можно сделать параллельно. Вам нужно внести 2 изменения в Discourse.
Кнопка «Ответить» должна быть видна незарегистрированным пользователям.
reply

А когда незарегистрированные пользователи нажмут на эту кнопку, должно отобразиться следующее:
login
Далее вам нужно разобраться, как использовать вставку комментариев. Скорее всего, это потребует небольших изменений в коде, а не значительных усилий.

2 лайка

Интересно, есть ли ещё интерес к разработке этой функции, теперь, когда вышел Composer v2. Голосую за то, что это всё ещё то, что я бы хотел увидеть и использовать.

Я создал доказательство концепции для этого по адресу Discourse Full App Embed Test

14 лайков

При нажатии на кнопки «Ответить» или «Нравится» возникает (как мне кажется) ошибка CSP.

1 лайк

Для демонстрации концепции посетите https://discourse-on-a-pi5.falco.dev и войдите в систему перед запуском демо.

7 лайков

Возможно ли скрыть первый пост, чтобы это выглядело так?

Также, должен ли iframe иметь фиксированную высоту, или возможно настроить его адаптацию под количество комментариев, как это делает текущий встраиваемый элемент?

Ещё один вопрос: будет ли код GTM/Analytics загружаться или блокироваться внутри этого встраиваемого элемента? Идеальный вариант — не загружать его, иначе статистика будет дублироваться (блог и Discourse будут одновременно вызывать два просмотра страницы).

3 лайка

Я бы с радостью это сделал.

Моя конечная цель — скрыть заголовок и пост автора (OP), чтобы первым отображался второй пост.

Создание механизма обмена сообщениями с родительским окном возможно, но я пока это не исследовал.

Это тоже ещё одна вещь, которую легко добавить.

7 лайков

Я объединил свою экспериментальную работу по встраиванию полных страниц, поэтому теперь её можно протестировать, если вы хотите попробовать.

Вам нужно:

  1. Обновиться до последней версии
  2. Включить скрытую настройку embed_full_app
  3. Добавить fullApp: true в фрагмент JS-кода, который настраивает встраивание на вашей странице

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

Дайте знать, как всё прошло — это поможет нам определить дальнейшие шаги.

10 лайков

Привет, @Falco!

Спасибо за всю твою работу :slight_smile:

Я пытаюсь использовать виджет fullApp на своём хостинге Discourse (через Communiteq/discoursehosting.net), но сталкиваюсь с проблемами.

Вот что я сделал:

  • Попросил Communiteq включить скрытую настройку embed_full_app
  • Добавил fullApp: true в JS-сниппет
  • Мой хостинг для встраивания добавлен в список разрешённых хостов

Вот что происходит:

Без discourseEmbedUrl:

DiscourseEmbed = {
  discourseUrl: 'https://my-forum-url/',
  fullApp: true
};

→ Появляется ошибка «Error Embedding»

С discourseEmbedUrl:

DiscourseEmbed = {
  discourseUrl: 'https://my-forum-url/',
  discourseEmbedUrl: 'https://my-platform-url/page-where-I-want-discourse-embedded',
  fullApp: true
};

→ Вместо загрузки полного форума происходит переход по адресу embedUrl, затем перенаправление (на моей платформе требуется вход), и создаётся мусор-тема с URL перенаправления в качестве заголовка.

Поведение как у обычного виджета комментариев — параметр fullApp: true полностью игнорируется.

Обязательно ли указывать discourseEmbedUrl даже в режиме fullApp?

Если да, то можно ли предотвратить создание тем и просто отрендерить полный форум?

Буду очень признателен за любую помощь.

Готов предоставить дополнительные детали или протестировать что угодно.

Спасибо!

2 лайка