
Язык 🇷🇺 Русский
Установка Val Town
Добавьте живой комментарий в приложения Val Town
Val Town запускает TypeScript на Deno, поэтому val — это настоящий сервер. Это делает его хорошим выбором для FastComments: виджет — это тег script на странице, а всё, что требует секрета, например Secure SSO или проверка вебхука, может выполняться на сервере в том же val.
В этом руководстве рассматривается добавление виджета комментариев в HTTP‑val, отображение количества комментариев на главной странице, вход пользователей с помощью уже существующей учётной записи Val Town и получение вебхуков комментариев.
Для попытки не требуется учётная запись. В примерах используется tenantId: "demo", общий песочничный сервер, а Шаг 2 описывает переход к вашему собственному.
Шаг 1: Добавить виджет 
The widget is a script tag and a container element, so it drops into whatever your val already renders. This example uses Hono JSX, which is what Val Town's HTTP templates use.
Run 
Выберите urlId перед публикацией
urlId decides which thread a comment lands in. Leave it unset and it defaults to a cleaned version of the current page URL, which is exactly the thing that changes on Val Town: a val has a long *.web.val.run hostname until you claim a subdomain, branches get their own URLs, and renaming a page changes the path. Each variation silently becomes a separate, empty thread, and the symptom reads as "my comments disappeared".
Set it to something stable that you control, like the post slug or a database id, as above. Pass url too, so notification emails and the moderation tools can link back to the real page.
Сохранение комментариев без JavaScript
FastComments renders a full thread server-side, which a val can drop into a <noscript> block:
Run 
URL-encode the parameters. The server-side version supports anonymous and logged-in commenting, SSO, and nested replies.
Шаг 2: Использовать свой аккаунт 
tenantId: "demo" — это общедоступный публичный песочница. Она работает без регистрации, поэтому примеры используют её, но все остальные, использующие FastComments, пишут в одних и тех же ветках, и любой может их модерировать. Переключите её перед публикацией чего‑то важного.
Ваш tenant ID находится на странице API‑секрета.
Tenant ID является публичным и должен находиться в коде браузера. API‑секрет — нет, и ничего на этой странице не требует его.
Считать из переменной окружения
Val Town vals публичны в бесплатном тарифе, поэтому их исходный код доступен всем. Храните любые конфиденциальные данные в переменных окружения, считывайте их с помощью Deno.env.get:
Run 
Это имеет большее значение на Val Town по второй причине: при ремиксе val копируются ключи переменных окружения, но не их значения. Секрет, хранящийся в переменной окружения, не переходит вместе с вашим val в аккаунт другого пользователя. Секрет, записанный в файл, переходит.
Возврат к значению "demo" позволяет val работать для любого, кто ремиксит его до установки собственного tenant.
EU‑аккаунты
Аккаунт, его данные и ключи находятся в одном регионе. Если ваш аккаунт был создан на eu.fastcomments.com, каждая конфигурация виджета также должна содержать region: "eu", а скрипты загружаются с cdn-eu.fastcomments.com. В противном случае оставьте оба параметра без изменений.
Количество комментариев на странице индекса 
На странице индекса не рендерьте один виджет подсчёта комментариев на каждую строку. Это приводит к одному запросу на каждый пост. Используйте массовый подсчёт, который делает один запрос для всей страницы.
Отметьте каждую строку с помощью urlId, который использует её ветка, затем загрузите массовый виджет один раз:
Run 
Скрипт ищет каждый элемент .fast-comments-count на странице и заполняет его счётчиком.
data-fast-comments-url-id должен соответствовать urlId, который использует виджет комментариев поста. Если виджет использует slug, маркер использует slug. Несоответствие приводит к отображению нуля в ветке, где есть комментарии.
Скрипт опрашивает window.FastCommentsBulkCountConfig, поэтому не имеет значения, задаёте вы конфигурацию до или после тега script.
Защищенный SSO с std/oauth 
Если ваш val уже знает, кто посетитель, Secure SSO передаёт эту идентификацию виджету, чтобы они никогда не видели второй вход. Не требуется создавать конечные точки и ничего вызывать во время выполнения: вы вычисляете три значения на сервере и передаёте их в конфигурацию виджета.
Val Town поставляет вход без конфигурации с std/oauth, поэтому посетитель может войти с учётной записью Val Town, которую он уже имеет. Замените это на то, что использует ваше приложение; часть FastComments не меняется.
Создание полезной нагрузки на сервере
Секрет API подписывает полезную нагрузку и никогда не должен попадать в код браузера. Установите SDK из npm, который работает в среде Deno от Val Town без изменений:
Run 
getPayload() возвращает { userDataJSONBase64, verificationHash, timestamp }. Эти три значения — всё, что попадает в браузер. Секрет подписывает их и затем отбрасывается, поэтому ничего на странице не позволяет читателю подделать другого пользователя.
Передача в виджет
Run 
oauthMiddleware добавляет GET /auth/login, GET /auth/callback и POST /auth/logout за вас. Обратите внимание, что выход (logout) — это POST, в то время как виджет переходит к logoutURL с помощью GET, поэтому укажите logoutURL на небольшой маршрут вашего приложения, который выполняет POST.
Когда посетитель вышел из системы, передайте sso только с loginURL. Виджет тогда покажет запрос входа вместо анонимного поля комментария.
Возможные проблемы
timestamp — это эпоха в миллисекундах, не должна быть в будущем и не должна быть старше двух дней. Генерируйте её на сервере в том же запросе, где вычисляется хеш. Генерация в браузере — классическая ошибка: значение отличается от того, которое было захешировано, и каждый комментарий отклоняется.
Никогда не устанавливайте isAdmin или isModerator из провайдера идентификации. Вход с учётной записью Val Town ничего не говорит о том, кто должен модерировать ваш сайт.
Смотрите руководство по SSO для полного списка полей, потоков с групповыми ограничениями и значков.
Получение вебхуков 
A val — это естественный получатель веб‑хуков: у него стабильный URL, он может проверять подпись и имеет встроенные SQLite и блоб‑хранилище.
FastComments подписывает ${timestamp}.${body} с помощью API‑секрета вашего аккаунта и отправляет два заголовка:
Run 
Метод передаёт событие: PUT для созданного или обновлённого комментария, DELETE для удалённого.
Run 
Два момента, которые могут вызвать проблемы
Проверяйте сырые байты. Парсинг JSON и повторная сериализация меняют порядок ключей и пробелы, поэтому хеш отличается и каждая доставка завершается ошибкой без очевидной причины. Это обычная причина, почему получатель веб‑хука «просто не работает».
Сравнивайте за постоянное время. Обычное === по подписи раскрывает, сколько байтов совпало, чего достаточно, чтобы подделать один байт за раз.
Обработка событий
Отвечайте быстро. FastComments повторяет запрос при ответе, не являющемся 2xx, и конечная точка, постоянно вызывающая ошибки, в конце концов автоматически отключается, поэтому выполняйте реальную работу после отправки ответа, а не внутри него.
Сделайте работу идемпотентной по ID комментария. При повторе запрос подписывается заново с новым timestamp, и тот же ID комментария приходит снова при редактировании и удалении, поэтому нет стабильного признака для дедупликации.
Примеры Vals 
Четыре публичных vals, которые вы можете ремиксить, каждая охватывает одну часть этого руководства.
Блог с комментариями (вживую) — это Markdown‑блог с веткой комментариев под каждой записью и массовыми подсчётами комментариев в индексе. Он работает сразу после ремикса, и одна переменная окружения указывает его на ваш собственный аккаунт.
Демонстрация SSO (вживую) регистрирует посетителя с помощью их аккаунта Val Town и передаёт эту идентичность виджету, так что вторичный вход не требуется.
Получатель вебхуков (вживую) проверяет HMAC‑подпись каждой доставки и сохраняет события в SQLite. Он имеет кнопку, которая подписывает тестовый payload и отправляет его себе, так что вы можете увидеть успешную проверку перед настройкой реального вебхука.
Навыки агента (вживую) — это библиотека навыков агента FastComments, охватывающая виджет, SSO, REST API, модерацию и миграцию с Disqus. Ремикните её, и агент Val Town, Townie, автоматически подхватывает навыки из skills/, так что ваш агент знает, как подключить комментарии без вставки документации в чат.
Те же навыки можно установить где угодно с помощью npx skills add fastcomments/skills.
Ошибки домена 
Как только вы отключите арендатора demo, виджет может отказаться загружаться с ошибкой авторизации. Это происходит потому, что FastComments не знает, что ему следует разрешить использование вашей учётной записи на этом домене.
Перейдите сюда, чтобы добавить ваш сайт в ваш аккаунт.
Val Town стоит рассмотреть более внимательно, потому что val может быть доступен по более чем одному имени хоста:
- Каждый HTTP val имеет длинный конечный адрес по умолчанию,
<org>--<id>.web.val.run. - Заявка на пользовательский поддомен добавляет
<name>.val.run. - Пользовательский домен (custom domain) добавляет третий.
- Ветки получают свои собственные URL-адреса.
Добавьте любые имена хостов, с которых вы действительно обслуживаете виджет. Если вы заявите поддомен после настройки, добавьте его тоже, иначе виджет будет работать по старому URL и не будет работать по новому.