Блог умеет публиковаться, но он молчит. Статью можно прочитать, а сказать что-то в ответ — некуда. Письма и Telegram — это личное, а комментарии хочется держать рядом с текстом. Значит, нужны комментарии.

Что я перебрал

Первым делом я посмотрел, как это решают другие.

  • giscus — комментарии живут в GitHub Discussions, на страницу вставляется

скрипт. Ноль сервера, но писать можно только с GitHub-аккаунтом, а данные — не у меня.

  • Свой модуль — я уже так делал с блогом и каталогом данных. Максимальный

контроль, но это форма для ввода, БД, модерация, антиспам, вложенность и вся защита с нуля.

  • Isso, Cusdis, Schnack — лёгкие, но либо стагнируют, либо просят

Postgres/Node.

  • Remark42 — зрелый self-hosted сервер на Go, один контейнер, хранит всё у

меня, есть модерация, антиспам и вебхуки.

Я выбрал Remark42. Он не требует ни внешней БД, ни обязательных OAuth — достаточно анонимного входа, а данные лежат в обычном файле на моём сервере.

Подпапка вместо поддомена

С ntfy вышло так, что сервис потребовал отдельный поддомен. С Remark42 повезло: он умеет жить прямо под путём. Я отдал ему /comments/ — новый поддомен и сертификат не понадобились.

Конфигурация оказалась простой: серверу сообщается его базовый адрес, а nginx срезает префикс пути перед проксированием.

REMARK_URL = https://bagilov.tech/comments/
ALLOWED_HOSTS = 'self'
AUTH_SAME_SITE = strict

И в nginx:

location /comments/ {
    rewrite /comments/(.*) /$1 break;
    proxy_pass http://remark42:8080/;
}

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

Вход без барьеров

Я включил анонимный вход. Читателю не нужно регистрироваться или иметь GitHub-аккаунт, чтобы оставить пару слов. Это сознательный размен: меньше трения для честных людей, но выше риск спама — поэтому модерация и вебхук на новые комментарии.

Под мой стиль

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

var remark_config = {
    host: 'https://bagilov.tech/comments',
    site_id: 'bagilov',
    theme: currentTheme,
    locale: 'ru'
};

Уведомления

Новые комментарии не должны ждать, пока я сам загляну на страницу. Remark42 умеет дёргать вебхук на каждый комментарий — я направил его в свой же relay, который уже умеет отправлять сообщения в ntfy. Теперь новый комментарий прилетает пуш-уведомлением на телефон, как и алерты Grafana.

Что понял

Комментарии — это не «добавить форму». Это выбор: чужой сервис против своего, логин против анонимности, простой скрипт против данных у себя. Здесь я снова выбрал «у себя» — и снова не пожалел: один контейнер, подпапка, свой вид и прямая связка с уведомлениями, которые у меня уже были.