движок Регистр

Движок сайта: бессерверные боты

Я мало рассказываю о своём движке сайта. Всё обещаю себе, что закончу и тогда напишу большую обзорную статью, но на деле очень страшусь объёма работы: он уже очень многое умеет, а то ли ещё будет — планов громадьё!

Поэтому лучше рассказывать потихоньку.

Со сменой движка многие обратили внимание, что комментарии из моей группы в «Телеграме» теперь транслируются на сайт. Ну как «транслируются» — приходилось руками экспортировать их в клиенте, потом загружать к себе. Конечно, логичнее было бы делать это через бота, да вот незадача — его надо было бы где-то хостить, а с учётом ограничений «Телеграма» в нашей стране искать хостинг пришлось бы за границей.

Выход на самом деле есть — так называемые «бессерверные боты», недавно появившаяся у «Телеграма» возможность. Небольшая цитата из руководства Telegram Serverless:

Telegram Serverless позволяет запускать серверный код бота и мини-приложения прямо на инфраструктуре «Телеграма» — не нужно настраивать серверы, поддерживать контейнеры в рабочем состоянии и думать о масштабировании.

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

Технически это набор обычных джаваскриптовых модулей. Для каждого события — свой обработчик: handlers/message.js получает сообщения, handlers/edited_message.js — правки. «Телеграм» вызывает функцию, она выполняет работу и завершается. Код работает в изолированной среде V8; полноценной Node.js со всеми npm-пакетами там нет.

Подключение начинается в мини-приложении BotFather: создаёшь бота, встаёшь в очередь, когда она подошла, выбираешь бота, включаешь Serverless и получаешь отдельный ключ для командной строки. На компьютере нужен Node.js 18 или новее:

npm create @tgcloud/bot my-bot
cd my-bot
npx tgcloud login
npx tgcloud push

login связывает проект с ботом, push загружает код. В комплекте есть SQLite, Bot API и fetch для внешних HTTP-запросов. База сохраняется между вызовами, поэтому можно хранить пользователей, настройки, очередь заданий.

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

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

Связь со статьёй определяется по ссылке в исходном посте канала — я всегда ставлю её в заголовке. Ответы сохраняют структуру обсуждения, а мой Telegram ID связан с моей учётной записью на сайте, чтобы собственные комментарии узнавались как авторские. Так же из комментариев переносятся картинки, видео, стикеры и реакции, включая их снятие.

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

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

Оставить комментарий

Движок сайта: боты

График показывает загрузку CPU, достигшую пика в 138% около 01.10, с общим средним значением 19.26%.
Очередной бот нашёл кое-какие урлы, в которые ему не надо. Наверное надо даже спасибо сказать ботам за нагрузочное тестирование сайта

В «Регистре» (так называется мой новый движок для сайта), меня, помимо редактора, постоянно донимают боты поисковых систем, нейросетей и так далее. Я даже не подозревал сколько их развелось и с какой страшной силой они молотят весь интернет. К сожалению, некоторые из них игнорируют robots.txt и заходят даже туда, куда просишь их не ходить.

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

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

Кеш у меня, кстати, сейчас устроен довольно сложно — если доступен модуль APC, либо есть /dev/shm, то горячие пути кешируются туда, если недоступно, используется общий кеш на файловой системе. Кеш без необходимости не сбрасывается, за этим я слежу отдельно. Инвалидация делается довольно топорно, надо — сносим, примерно как было в «Эгее», но, с другой стороны, я не делаю высоконагруженный проект, чтобы с этим отдельно заморачиваться.

Оставить комментарий

Движок сайта: редактор

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

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

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

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

4 комментария

Эмодзи в MySQL

Вчера при импорте на сайт реакций из «Телеграма» заметил какой-то странный баг — количество реакций совпало, а их состав — нет. В «Телеграме» две пары «глаз» и «палец вниз», а у меня на сайте — только глаза.

Сол» оценил общение с «Элизой» всего на три из десяти.
Заметил, что реации из «Телеграма» импортируются неправильно

Пошёл разбираться, выяснилось, что в базе всё лежит отдельно, как положено. Нейросеть «Сол» обнаружила странное — несмотря на то, что эмодзи «глаз» и «палец» имеют разные коды, «МайЭсКьюЭль» считает их одним значением и объединяет при группировке.

Вот тут «Сол» меня сильно расстроил. Сначала он предложил группировать через функцию HEX() . Решение само по себе плохое, но проблема ещё и в том, что движок сайта поддерживает три СУБД, и в «Постгресе» такой функции нет, а генерировать разные запросы под базы не очень хочется.

Тогда он решил считать хеш через PHP, чтобы группировать по нему. К сожалению, в этот момент я не следил за окном, где он копался, и он успел это реализовать и даже задеплоить.

Меня такая реализация категорически не устроила. Мне в целом понятно, что проблема связана с тем, что называется «collate» — в СУБД это набор правил, по которым сравниваются строки. У «МайЭсКьюЭля» много особенностей при работе с Юникодом, с которыми я уже сталкивался, поэтому был уверен, что дело именно в одной из них.

Готовый рецепт нашёлся безо всяких проблем. Чтобы эмодзи сравнивались правильно, нужно установить «collate» для этого столбца как utf8mb4_bin, что мы и сделали. Не думаю, что это необходимо, тем не менее для остальных баз мы выставили в этом месте бинарный «collate» — С для «Постгреса» и BINARY для «ЭскуэльЛайта».

11 комментариев

Как идёт разработка движка блога

Ожидания у меня, конечно, были примерно такие: за неделю-две выпущу первую версию движка блога, перееду на него и буду доделывать мелкие детали.

Реальность оказалась совсем другой. Каждый элемент на экране приходится многократно передвигать туда-сюда, пока не найдётся идеальное расположение. Хотя сам движок уже постепенно формируется и пользоваться им уже вполне приятно, фасад выглядит гораздо лучше внутреннего устройства — в административной панели до сих пор «строительные леса», куча технических блоков с информацией, нужной лишь на этапе разработки, типа профилирования запросов к базе.

Очень сильно помогает, что я его себе поставил — так гораздо проще понять что нужно доделывать сразу, а на что можно обратить внимание когда основное будет сделано. Например, оказалось, что вопросы кеширования и производительности надо решать не откладывая. Я-то думал, что займусь ими ближе к концу, но приоритеты пришлось изменить — на хостингах довольно жёсткие ограничения по расходу процессорного времени.

Решил, что торопиться не буду, пусть идёт в своём темпе, так что когда будет выпуск первой версии, пока не скажу. Думаю, через 2—4 недели, примерно так.

8 комментариев

Начинаю выздоравливать

Начинаю выздоравливать — с каждым днём потихоньку чувствую себя чуть лучше. Сегодня первый день, когда под вечер не свалился от усталости. Не скажу, разумеется, что идеально себя чувствую, но достаточно пришёл в себя, чтобы заменить у себя движок сайта с «Эгеи» на «Регистр», так теперь называется мой движок, написанный поверх «Эс-2» Романа Парпалака. Именно его решение я выбрал как основу.

Давно руки чешутся попробовать то, что получается в реальной жизни. Я вижу вещи, которые получились не очень, но сложно сделать лучше, не тестируя разные варианты. Буду тестировать сам на себе, мне кажется, это лучший способ.

13 комментариев