Мы с другом учимся в Китае. В апреле, в очередной раз меняя умерший VPN, решили собрать свой, заточенный под Great Firewall, на протоколе Reality: VPN‑трафик в нём выглядит для системы фильтрации как обычная HTTPS‑сессия с каким‑нибудь сторонним сайтом. Я взял на себя бэкенд, бота и Mini App. Друг отвечал за серверную часть и ноды.
Ниже — про два месяца разработки, три версии интерфейса и отказ от целой механики из‑за банков.
1. Интерфейс
Версия 1. Чат‑бот с конфигом
Первая версия была максимально простой: юзер пишет боту, оплачивает тариф, в ответ получает QR‑код с конфигом — копируй, импортируй, готово.
Проблема была в другом. Если посмотреть на большинство VPN‑сервисов в Telegram — это ровно такие же чат‑боты. Текст, кнопка «купить»,конфиг. Всё. Хочется сделать что‑то грандиознее, и выделиться.
Версия 2. Mini App с балансом и тарифами
Поэтому я взялся переделывать всё на Mini App. Mini App у VPN‑сервисов в Telegram почти нет, большинство ограничивается ботом. Решил, что вот тут можно нормально выделиться.
Что в итоге собралось во второй версии:
баланс и тарифы внутри одного экрана,
реферальный турнир с недельным топом,
ачивки за разные действия,
и бесплатный «барабан удачи» (про это чуть ниже).
Казалось, всё готово. Mini app есть, логика прописана. Но...
Версия 3. Mini App с bridge‑страницей и deeplink
Я показал бота знакомому — обычному пользователю никак не связанному с IT. Он оплатил тариф, получил конфиг, и дальше застрял. Куда выйти, что куда вставить, какой клиент скачать — всё это требовало отдельных объяснений.
Тут до меня дошло, что вся идея с «вот тебе конфиг, импортируй сам» — сама по себе неудобная. Юзеру не должно требоваться никаких знаний про subscription URL, форматы, клиенты. Должен быть один тап.
Так появилась третья версия Mini App — с кнопкой «Подключить», которая запускает deeplink‑флоу через bridge‑страницу. Работает это так:
Юзер выбирает любимый клиент (Happ, v2box или Hiddify) и тапает «Открыть».
Mini App открывает HTTPS‑страницу на нашем домене — это bridge. Зачем она нужна: Telegram WebView блокирует кастомные схемы вроде
happ://, поэтому напрямую из Mini App запустить клиент нельзя. Bridge открывается черезtg.openLink()во внешнем браузере (Safari / Chrome), а там кастомные схемы уже работают.На bridge‑странице две кнопки: «Открыть в Happ» (запускает deeplink, который импортирует подписку прямо в приложение) и «Установить» (ведёт в App Store / Google Play, если приложения ещё нет).
Юзер ставит клиент, возвращается на bridge, тапает «Открыть» — приложение подхватывает подписку автоматически. На bridge ещё лежит копия URL в clipboard на случай, если автоимпорт не сработал и нужно вставить руками.

happ://add/<encoded-subscription-url>
Тот же знакомый с этой версии подключился без каких‑либо вопросов.
2. Что под капотом
Архитектурно сервис разнесён на два сервера. Один — под бэкенд (бот, API, Mini App, база данных, админ‑панель). Второй — под VPN‑панель, которая управляет всеми нодами.
Бэкенд написан на Python, FastAPI как основной фреймворк, PostgreSQL для базы данных, Redis для кэша и сессий. Mini App — React, собранный через Vite.
Авторизация юзеров идёт через стандартный механизм Telegram WebApp с проверкой подписи на бэке, дальше JWT‑токены на сессию, чтобы не дёргать Telegram на каждый запрос.
С панелью история была еще длиннее. За два месяца мы прошли через три варианта:
3x‑ui. То, с чего начинают, когда поднимают что‑то для себя и пары друзей. Ставится одной командой, работает прозрачно. Для прода не годится. Нормального API для управления подписками нет, учёта устройств тоже нет, в логи ходишь руками по каждой ноде. Как только пользователей становится несколько десятков, it's over.
Marzban. Следующая остановка. Есть REST API, есть концепция тарифов и лимитов. Но столкнулись с двумя проблемами. Первая: репозиторий толком не обновляется, крупных коммитов давно нет. Для VPN, где блокировки меняются раз в пару месяцев, это критично. Вторая: добавить что‑то нестандартное (новый протокол, HWID‑привязку, кастомный routing) сложно. Архитектура на это не рассчитана.
Remnawave. Где мы остановились. Самая молодая из трёх, но активно развивается: разработчики оперативно реагируют на issues, добавляют протоколы под актуальные реалии. Из коробки есть HWID‑привязка (один конфиг = ограниченное число устройств), возможность ограничивать торренты на стороне ноды.
3. Проблемы
Большую часть из двух месяцев заняли не сами фичи, а вещи, которые я не закладывал в план.
Бесплатные «барабаны удачи» и payment processors
Сначала про игровой раздел, почему его в итоге не стало.
Внутри Mini App у нас был блок с тремя ежедневными бесплатными прокрутами: за активность можно было выиграть неделю Pro‑подписки.
Когда мы пошли подключать платёжных провайдеров для оплат картами, менеджер на той стороне посмотрел Mini App и предупредил: пока в продукте есть любые элементы рандома, даже бесплатные — подключиться к банковской системе будет сильно сложнее. Для банков любая «прокрути и выиграй» механика автоматически попадает в gambling‑категорию, и дальше длинные процедуры, дополнительные вопросы, риск что в какой‑то момент скажут нет.
В итоге раздел пришлось вырезать, а на месте игрового блока осталась карта мира с серверами и счётчиками нагрузки.
Devops, в котором у меня был пробел
Вторая большая история выкатить всё в нормальный прод. Опыта с продакшен проектами у меня до этого было мало, и эта часть забрала по времени больше, чем сам код.
Что в итоге собралось:
Бэкапы в трёх местах — на VPS, в Backblaze B2, и копия у меня на компьютере. У меня паранойя по поводу потери данных пользователей — кто‑то заплатил, у кого‑то активная подписка. Пусть будет на всякий случай.
Sentry для error tracking — алерты летят на почту и в отдельный Telegram‑канал для уведомлений. Любой 500-й ответ, любой необработанный exception — видно сразу, не приходится узнавать от пользователей.
CI/CD через GitHub Actions — push в main триггерит build, тесты и деплой.
Health checks — пингует на основные эндпоинты бота и API каждую минуту.
Прод стоит на VPS в Германии, под доменом, SSL через certbot с автообновлением.
4. Что в итоге
Два месяца, три панели, три версии Mini App, отменённый игровой раздел и переписанный с нуля флоу выдачи конфига. В результате получился Mini App с подпиской, балансом, картой серверов и реферальным турниром. Сейчас порядка десяти серверов в Европе, Азии и Америке, дальше будем расширять под спрос.
Если бы начинали сейчас, пропустили бы 3x‑ui и Marzban и сразу ставили Remnawave. И раньше показывали бы бета‑версию человеку, который не разбирается в VPN. Один такой тест сэкономил бы пару недель.
Комментарии (7)

Misha20062006
29.06.2026 10:08подобный сетап каждый второй школьник раскуривает, в чём интерес-то? поставить ремнавэйв и мини аппку от клауди код (или вообще готовую) много ума не надо. автор пишет о попытке выделиться, только вот таких ботов с миниаппками дофига. просто качественный бот с кнопками и оформлением не от чата гпт — это то, чем можно выделиться.
про доп. механики я тоже посмеялся. если у вас цель продать что-то, то это что-то не должно быть всяким хламом перегружено.
от статьи про впн в Китае ожидаешь конкретных механик обхода, названий хостеров. а тут чисто раскур того, что способен сделать любой школьник, имеющий свободное время

MangoShow
29.06.2026 10:08Согласен с Мишей. Сейчас школота и бс раскурить сможет. А вы 2 месяца занимались тем, что можно за 2 вечера сделать. Ничего нового для себя не увидел

EriIaz
29.06.2026 10:08А чем это, простите, отличается от отечественных реалий? Такую статью, да на таком уровне, можно было лет 10 назад писать, а сейчас какой в этом смысл, если на родине всё в целом ещё веселее? Хотя, может я рано вперёд забегаю - в Китае тоже в разных провинциях по-разному жесткость ограничений настроена. Вы в каких провинциях протестировали свою реализацию? Или вы географию вообще не учли? Почему трафик тянете аж в Германию? Где Европа и где Китай… Почему не Сингапур или США? И я правильно понимаю, что вы вот это продавать пытаетесь?
valera_efremov
Сейчас в России ограничения жестче чем в Китае?
В Китае еще нет белых списков? Лет 10 назад я кидал ссылки на российские сайты одному китайцу, ни один сайт он тогда не смог открыть. Как ваш трафик к зарубежному серверу не режется по тому факту, что ip сервера не китайский?
SarmatKuricin
Не знаю как сейчас. Но в 2013 году ни один иностранный сайт нормально не грузился. Ждать загрузки поисковой выдачи гугла можно было минуту, при стабильном соединении и скорости под 100 мбит. Тоже самое было и с Яндексом и любой не китайской соц. сетью.
Смотрел я тогда один сериал на пиратских русскоязычных сайтах. Так блокировки буквально на глазах вводили. Сайт который стабильно открывался ещё вчера, сегодня не грузился вовсе, приходилось искать другой. И в итоге, всё таки пришлось включать VPN, под строшилки коллег, что за мной приедет китайская полиция.
Из забавного. Подключившись к сети, через ethernet в отеле аэропорта Пудун (Шанхай), почти все заблокированные сайты заработали нормально. При этом с публичного wifi того же аэропорта блокировки были.
rimashi
Сейчас Россия ближе к Ирану, чем у Китаю. В Китае по сравнению с нами свобода..