Перейти к содержанию

Триал запущен

Ещё в прошлый раз я торжественно объявил о своей «довольно простой, но от того не менее гениальной» идее — триал-доступе через Telegram-бота. Потом написал самого бота. А потом долго думал, как сделать так, чтобы механика работала без костылей и лишних зависимостей — без базы данных, без файлов состояния, вообще без всего.

Присел. Подумал. Реализовал.

Говорю себе «сделано» — это редкое и сладкое чувство.

Как это раБОТает #

Незарегистрированный пользователь пишет боту /trial — и через несколько секунд получает:

  • VLESS-ссылку для подключения к сети Sigil Gate
  • QR-код — чтобы отсканировать телефоном, если настраиваешь другое устройство
  • Кнопку «Скопировать ссылку» — потому что вручную выделять 300-символьную строку это уже клиническое

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

Хитрость внутри #

Больше всего мне нравится то, как устроено отслеживание лимита — без единой дополнительной таблицы. Все состояние закодировано прямо в имени устройства.

Каждое триал-устройство называется {telegram_id}{цифра} — и цифра на конце и есть оставшийся лимит. Первое устройство пользователя с ID 123456789 получает имя 1234567899. Следующее — 1234567898. Добрались до нуля — лимит исчерпан. Бот в любой момент узнает состояние одним запросом к реестру — ищет устройства по префиксу и смотрит на минимальную цифру. Реестр и есть единственная «база данных».

Такие вещи доставляют непропорционально большое удовольствие относительно своей технической сложности.

Уборка за собой #

Час прошел — устройство надо деактивировать и снять с Entry-нод. На Core-ноде крутится systemd-таймер, каждый час запускающий скрипт очистки. Тот находит все просроченные триал-устройства — через mtime файлов в реестре, поскольку поле created хранит только дату без времени — деактивирует их и убирает с нод. Параллельно прореживает архивные записи, оставляя только ту, что нужна для счетчика.

Бот при этом тоже не ждет таймера: при каждом вызове /trial он лениво проверяет активные устройства пользователя и отправляет просроченные на деактивацию прямо в фоне.

QR-код. Просто QR-код. #

Я обязан остановиться на этом отдельно.

Когда я добавлял кнопку «Скопировать ссылку», мелькнула мысль: «А QR-код был бы вообще роскошью». Роскошь была реализована примерно за пятнадцать минут. Библиотека qrcode делает все сама, а aiogram умеет принять изображение прямо из буфера в памяти — даже файл на диске не нужен. Отсканировал телефоном — подключился. Это настолько удобно, что мне теперь немного стыдно, что я не сделал это сразу.

Да, мы притащили в проект еще одну зависимость. Но оно того стоило.

Теперь у нас есть удобный интерфейс, который позволяет любому пользователю (даже не зарегистрированному) подключиться к сети Sigil Gate и получить доступ в свободный Интернет.