Проект: Tuna — как мы делаем аналог Ngrok  Публичный пост
12 июля 2024  1564
Tuna - как мы делаем аналог Ngrok
https://tuna.am

Привет!

Наверное сложно найти человека, ну или хотя бы разработчика, который не знает что такое Ngrok. Это поистине незаменимый инструмент, который стал именем нарицательным. Он помогает ускорить разработку или ревью сайта который есть у вас локально и сделать это без публикации. Так вот, мы делаем тоже самое только с регионом в России и оплатой в рублях, ну и ещё некоторыми фичами которых нет даже у бати 🤗

Как это работает?

Да также и работает. Скачиваете клиент, устанавливаете токен из личного кабинета, запускаете в консоли команду:

tuna http 8080
INFO[11:14:39] Welcome to Tuna                              
INFO[11:14:39] Account: Женя (Paid till 09.06.2043)         
INFO[11:14:39] Web Interface: http://127.0.0.1:4040         
INFO[11:14:40] Forwarding https://34mfdk-54-23-44-230.ru.tuna.am -> 127.0.0.1:8080

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

Сколько бы ни было конкурентов, если они есть и их много, значит есть повод сделать ещё 1 продукт, лучший 😄

Почему мы решили этим заняться?

Понятнее всего объясняет вот эта картинка:

Вообще у нас есть ещё 1 проект, он появился раньше - Yucca, я писал о нём на VC и тут. Коротко, Yucca - это видеорегистратор. И изначально мы хотели интегрировать в Yucca фичу, чтобы люди которые используют её на даче или ещё где могли открывать к ней доступ в интернет, без белого IP и прочего (в итоге мы это встроили). Но в процессе написания прототипа оказалось, что ещё чуть чуть и у нас есть готовый сервис. А так как процесс принятия платежей и ИП у нас уже были, и вот, бах! бах! бах! запускаем простенький личный кабинет, прикручиваем оплату юкассой, делаем пару постов на VC и у нас уже на больше 1000 пользователей. Да это не много, но и маркетинга толком не было, реально 2 поста на VC и всё.

Прототип, что в основе?

Естественно мы не писали свой протокол, это было бы глупо, так как готовых и отлаженых решений уже масса, по этому пошли смотреть опенсорс, как это сделано у других. По сути есть пара подходов:

  1. Использовать свой траспорт (писать свой протокол, как в Ngrok)
  2. Использовать существующий траспорт (например SSH туннели)

И вот, что у нас было уже в 1 рабочей версии:

  1. HTTP(s) туннели с динамическим или статическим поддоменом
  2. Инспектор HTTP запросов
  3. Базовая аутентификация, рейт лимиты, вайт листы и прочее
  4. Встроенный файловый сервер
  5. TCP туннели с динамическим портом
  6. SSH туннели - удаленный доступ по SSH без необходимости запускать SSH сервер и какой-либо конфигурации со стороны пользователя (этого к стати нет даже в Ngrok).
  7. Триггер туннели (HTTP или SMTP) - команды, выполняемые по получени уведомления (этого тоже нет в Ngrok).

Общая схема работы выглядит так:

  1. API, оно же личный кабинет (ЛК). Тут мы храним пользователей и выдаём им туннели в зависимости от подписки.
  2. Node, это как лопата, сюда подключаются клиенты и собственно через ноду и стороится туннель в интернет. Тут терминируется SSL, тут открываются на прослушивание TCP порты. Также нода немного общается с API, что бы синхронизировать состояние туннелей, и прочая рутина.
  3. Cli, клиент идёт в API, получает туннель, с туннелем идёт в ноду.

Между клиентом и нодой поднимается внимание, SSH туннель. Да, это оказалось супер просто, надёжно, протокол отлаженный, в GO есть нативная имплементация, полное шифрование всего внутритуннельного трафика из коробки, в общем одни плюсы.

Первые пользователи

Мы не ожидали резкого роста интереса пользователей, больше думали, что это просто проект в стол. Делать проекты в стол мы эксперты, думаю как и многие. Но вопреки всему лиды пошли и какого было наше удивление, когда пользователи начали покупать сразу годовые подписки. Особенно учитывая то, как выглядел наш сайт (ЛК) и отсутствие документации. Но видимо 2990 рублей не такая большая сумма да и то, что оплата построена через редерект на доверительную Юкассу, все эти мелочи не особо парили пользователей, а сам иструмент тем не менее работал и нам писали на почту вопросы и благодарности.

Так с обращения пользователей мы поправили поддержку Websockets , прокси к https ресурсам, проблемы с дистрибуцией и много других мелких проблем. А ещё очень быстро выяснилось, что всем нужны статичные TCP порты ✍️, и основные пользователи на Windows, это вообще стало шоком для меня 😄

Оказывается современные фронтендеры сидят в основном на Венде и вообще не парятся ибо WSL + Docker desktop закрывает все потребности.

Разбираем тех. долг и планы на будущий функционал

Мы зафиксировали, что надо сделать в первую очередь и начали понемногу всё пилить.

И вот, что уже готово:

  • Оформили понятную документацию
  • Добавили ещё 1 регион NL (Нидерланды)
  • Написали с нуля красивый личный кабинет
  • Статичные TCP порты - до этого при рестарте клиента порт всегда был новый, сейчас можно резервировать
  • Парковка своего домена - теперь вастрик может сервить dev.vas3k.club прям со своего локалхоста ))
  • Запись действий клиента SSH сессии - лично для меня это киллер фича. Думаю полезна для онбординга джунов в распределённых командах или когда вам оказывают сапорт на сервере. Запускаете tuna ssh тимлид или тех. поддержка подключается, что-то делает, помогает настроить окружение или чинит серверный софт. А вы потом можете посмотретьк какие магические команды выполнял ваш помошник.

Ну и множество улучшений и доработок которые не аффектят на пользователей, но требуют переделок и работы за кулисами. Тут ресёрч, инфраструктура и прочая рутина типа отправки ошибок в sentry. Так например статичные порты к которым мы не знали как подойти сделали за пару дней, а вот собственные домены, которые изначально не планировали даже и решили делать спонтанно, заняли пару недель исследований и прототипов. Вот так выглядел наш штурм по своим доменам:

Что планируем в ближайшее время:

  • Команды. Это первое, что мы хотим сделать, что бы продавать сервис организациям. И оно уже почти готово.
  • Оплата по счёту. Снова для организаций )
  • Многофакторная аутентификация, вход через социальные сети и прочии улучшайзинги UX и безопсности.
  • Оплата с международных карт. Да, пока мы принимаем оплату только в России, но мы видим интерес пользователей из KZ и других стран. Да и регион присутствия добавить не сложно. А согласиитесь, что куда приятнее, когда задержка 3ms, а не 130ms 😉

Сделаем если будет интерес и спрос:

Тариф для Enterprise, с собственным wildcard доменом, on-premise инсталяцией ноды, аудит логами и прочими плюшками 🙂.

Сколько потратили и заработали?

Нас 3 человека, естественно доходы пока смешные и если не придут компании, то разработка окупится в следующем тысячилетии, но мы верим, что интерес будет, а дальше посмотрим. Да и пивотить всегда есть куда, как показала практика.

Какой совет вы бы сами могли дать идущим по вашим стопам?

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

Связанные посты
31 комментарий 👇

Прикиньте, я не знаю что такое ngork👀
Жду когда Его Айтишество укажет мне на дверь

  Развернуть 1 комментарий
🕵️ Юзер скрыл свои комментарии от публичного просмотра...
Alex Polosin Черствый Душнила 13 июля в 08:09

Смотрели https://pinggy.io/ ?

Киллер-фича, что не требует установки клиента

  Развернуть 1 комментарий
🕵️ Юзер скрыл свои комментарии от публичного просмотра...
  Развернуть 1 комментарий

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

Мы уже пообщались в почте по поводу wildcard для личных доменов, хотелось бы, но не самое критичное.

Еще заметил что при моргании интернета, tuna сбрасывает соединение, например если я VPN переключаю. Было бы здорово если клиент не будет отваливаться, а попробует сам переподключиться по timeout.

  Развернуть 1 комментарий

Молодцы, приятно видеть доведёный до готовности проект.
Желаю вам не 1000 пользователей, а хотя бы 10.000 :-) Тогда вообще должен быть неплохой индихакинг

  Развернуть 1 комментарий
Alex Polosin Черствый Душнила 13 июля в 08:15

Что не хватает в подобных сервисах, так это разовой покупки "N туннелей на M дней"

для случая когда тебе надо что-то продемить, скажем, недельку, а потом все

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

  Развернуть 1 комментарий
🕵️ Юзер скрыл свои комментарии от публичного просмотра...
🕵️ Юзер скрыл свои комментарии от публичного просмотра...

😎

Автор поста открыл его для большого интернета, но комментирование и движухи доступны только участникам Клуба

Что вообще здесь происходит?


Войти  или  Вступить в Клуб