... и отказ от Disqus.
Много лет для комментариев в блоге я использовал Disqus. В те времена, когда я начал его использовать, выбор был не большой: Disqus, IntenseDebate, встроенные системы комментирования и еще пара аналогов, названия которых я уже не вспомню.
Это была середина двухтысячных годов, сервисы которые загружались через javascript, позволяли писать комментарии, автоматически боролись со спамом, имели сквозную авторизацию, а еще и строили внутри себя подобие социальной сети - казались фантастикой.
Я уже точно не помню почему я начал использовать Disqus, вероятно из-за того что это казалось удобным, а еще он был жутко модным и устанавливался почти везде.
Альтернативой ему была стандартная форма от WP, которая пропускала спам и предлагала регистрироваться в каждом блоге чтобы писать комментарии.
С тех пор Disqus так и жил, заменять его на стандартные комментарии от WP мне не хотелось, а после того как блог переехал на генерацию статических файлов, то внешние системы комментариев остались единственным вариантом, кроме того чтобы убрать комментарии полностью.
Альтернативы
Желание избавить от Disqus было всегда, но не было альтернатив на которые его можно заменить. Я периодически искал на что его можно заменить: большой список доступен на Alternativeto.net, иногда что-нибудь появляется на Producthunt.com, раз в полгода проверял Google, там тоже иногда выдача меняется.
Те системы которые выглядели красиво и функционально просили много денег за свое использование, а я не готов платить за это по 50 и более долларов в год. Бесплатные не внушали доверия, либо не отличались качеством.
Есть ряд систем которые можно отнести к self-hosted решениям, но для меня они оказались не подходящими, т.к. требовали много времени на поддержку и адаптацию, либо были теми еще костылями, по сравнению с которыми даже Disqus кажется быстрым и удобным.
Когда-то я смотрел на remark42, он по функциональности на голову выше аналогов, но в момент нашего знакомства у него не работал импорт из Disqus и не было половины документации. Я потратил несколько вечеров чтобы найти ошибки и попытаться их устранить, в итоге это ничем не закончилось и я забил на него.
Во время последнего поиска альтернатив, я, в очередной раз, наткнулся на utterances. Я точно видел его несколько лет назад, но тогда не стал рассматривать как возможный вариант. Хотя, возможно, я его путаю с Gitalk?
Utterances
Это скрипт который делает обвязку вокруг системы комментариев которая используется на GitHub для Issues. Благодаря этому можно использовать весь функционал комментариев на сторонних сайтах.
Для каждого поста заводится свой issue. Бот делает это автоматически после написания первого комментария к посту.
Посты связываются с issue через название issue, поэтому их заголовок должен как-нибудь сопоставляться с постом в блоге, на выбор есть несколько правил:
- Issue title contains page pathname
- Issue title contains page URL
- Issue title contains page title
- Issue title contains page og:title
- Specific issue number
- Issue title contains specific term
Делая экспорт старых комментариев, я выбрал дефолтное сопоставление через page title
, но уже сейчас понимаю что это будет создавать проблемы. Как только title
у поста изменится, то придется не забыть сразу же его обновить в заголовке issue.
Если бы начинал заново, то выбрал бы Specific issue number
, но сейчас уже не хочется все переделывать.
Когда-нибудь я соберусь и проведу дополнительную миграцию, в которой каждому посту присвою уникальный идентификатор и после этого обновлю все issue.
Перенос данных
Первый же запрос вида "utterances disqus import" ведет на issue, в котором ссылаются на программу, которая может обработать файл экспорта и через API создать все issue и запостить комментарии в них.
К сожалению, все комментарии будут добавлены от одного аккаунта, я локализовал предупредительный текст, который сопровождает каждый перенесенный комментарий. Думаю что этого будет достаточно.
Архивный комментарий. Был написан alice2k (18.03.2020 07:01:41)
Второй сложностью оказалось что программа импорта написана на dotnet, с которым я никогда в жизни не сталкивался. Просидев несколько часов на stackoverflow я разобрался что нужно установить и как это запустить в macOS, а в последствие упаковал её в docker контейнер.
Во время переноса комментариев нашел занятный баг: после обработки приблизительно 200 поста все остальные отказывались обрабатываться и не могли пройти проверку доступности оригинального поста.
В программе есть проверка, которая делает запрос к оригинальной странице с комментариями и проверяет код ответа, если он 200, то значит все хорошо, если отличается, то, значит, это комментарии к какому-то удаленному посту и импортировать их не нужно.
В какой-то момент я подумал что это на сервере включается защита и пытался исправить проблему выставлением таймаутов. Когда я проверял посты с которых начинались ошибки, то они обрабатывались правильно.
В итоге, оказалось, что в коде допущена ошибка и при обработке каждого поста, в свойство запроса добавляется заголовок User-Agent
, но добавляя новый, старые не удаляются и таким образом размер запроса начинает превышать размер который готов переварить сервер.
client.DefaultRequestHeaders.Add("User-Agent", ".NET Disqus to GitHub Issue Importer");
Странно что Nginx возвращал 400 Bad Request
, а не 413 Entity Too Large
.
Алгоритм работы мигратора:
- Разбирает файл экспорта из Disqus
- Собирает все посты и комментарии из него
- Проверяет что они не помечены как спам и не удалены
- Проверяет что они относятся к нужному домену
- Проверяет что оригинальные страницы существуют и отдают код 200
- Через API GitHub создают issue и комментарии к ним, по выбранному формату
Я запускал мигратор несколько раз. В первые разы я замечал какие-то мелочи которые мне не нравились и уходил их переделывать. Раза с пятого получилось нормально. Все свои правки я оформил в виде PR в оригинальный репозиторий.
Поправил баг, добавил пару мелочей, добавил Dockerfile и описал в README как запускать и на что обратить внимание при запуске.
Сейчас, чтобы провести миграцию, нужно клонировать к себе репозиторий, внести правки которые описаны в README и запустить мигратор
$ docker run --rm \
-v <path to Disqus XML file on host machine>:/app/disqus.xml \
disqus-to-github-issues:latest \
run \
/app/disqus.xml \
<GitHub username> \
<GitHub repo name> \
<GitHub personal access token>
Результат
Все имеющиеся комментарии я перенес на GitHub.
Увы, они потеряли свою ветвистость и связь со своими изначальными авторами. Избежать этого было нельзя, но их не так много, чтобы сильно из-за этого переживать.
Отказ от Disqus я считаю правильным шагом, который надо было сделать еще лет десять назад.