Триал запущен
Содержание
Ещё в прошлый раз я торжественно объявил о своей «довольно простой, но от того не менее гениальной» идее — триал-доступе через 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 и получить доступ в свободный Интернет.