Как я создал PortPlay: история разработки альтернативы Hamachi для геймеров

Привет, SE7EN! В годы моего детства интернет-провайдеры по умолчанию выдавали «серые» IP-адреса. Да, они динамически менялись, но это не мешало нам «прокидывать» порты и собираться с друзьями в CS 1.6 или Minecraft. Сегодня ситуация изменилась: получение «белого» IP превратилось в настоящий квест, который либо требует внушительной доплаты, либо вовсе невозможен. Но сейчас речь пойдет не о провайдерских ограничениях.

От концепции до MVP

История началась с желания поиграть в CS 1.6 с коллегами. Взрослая жизнь раскидала нас по разным локациям, и собрать всех в одной комнате стало невозможно. Тогда родилась идея: создать софт, который позволит запускать игровой сервер в пару кликов, без возни с Hamachi, ngrok и утомительной настройки портов, пока остывает чай.

Спустя полгода я сменил жилье, где у провайдера отсутствовала возможность выдачи статических IP. Так я начал работу над проектом для проброса портов. Концепция была прозрачной: арендовать недорогой VPS, развернуть на нем серверную часть и через туннель пробрасывать нужные порты клиенту.

Кто-то спросит: «Зачем изобретать велосипед, если есть WireGuard?». Ответ прост:

  • VPN-протоколы сейчас активно блокируются.

  • Настройка правил iptables на каждом VPS противоречит моей цели — «запуск сервера за минуту».

Прототип на Go

Благодаря тесной работе с ChatGPT, за несколько дней я написал на Go серверную и клиентскую части. Решение получилось эффективным, с поддержкой TCP/UDP и пробросом нескольких портов одновременно.

Однако консольный интерфейс выглядел архаично: нужно было постоянно помнить порты, IP и команды, создавая отдельные скрипты под каждую игру. Тогда пришла мысль: почему бы не автоматизировать весь процесс до одной кнопки?

Так на свет появился PortPlay.

Эволюция от CLI к полноценному GUI

Следом началась разработка бэкенда для управления сессиями, авторизацией и мониторинга прокси. Для GUI-клиента я снова выбрал Go. Поскольку нативной графики в языке нет, я остановился на фреймворке Wails: он позволяет создать удобный интерфейс на базе React, что дает отличную гибкость.

Первая версия выглядела довольно скромно:

Как я создал PortPlay: история разработки альтернативы Hamachi для геймеров
Прототип приложения

Впрочем, итерация за итерацией, и интерфейс стал напоминать качественный десктопный продукт.

Принцип работы

Техническая составляющая подключения выглядит так:

  1. Пользователь нажимает «Подключиться», и клиент отправляет запрос на наш бэкенд.

  2. Бэкенд генерирует уникальный токен сессии, привязанный к конкретному прокси-узлу. Выбор сервера происходит автоматически: клиент получает список с метриками (пинг и загруженность) и выбирает оптимальный вариант, избегая перегруженных нод.

  3. Клиент соединяется с выбранным прокси-сервером, передавая токен.

  4. Прокси верифицирует токен (через API бэкенда или проверку JWT).

  5. В случае успеха устанавливается туннель для TCP/UDP-трафика; иначе — соединение моментально сбрасывается.

Вызов: автоматическое обнаружение Minecraft

Первая версия поддерживала только Minecraft, что добавило головной боли при детектировании:

  • Порты динамические.

  • Множество процессов java.exe невозможно различить по имени.

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

Версия 1.0.0
Версия 1.0.0

Первый кризис: сетевые блокировки

После релиза первый же пользователь столкнулся с тем, что сервер недоступен. Анализ трафика через Wireshark показал классическую картину: соединение рвется после обмена парой пакетов, что типично для DPI-систем.

Это стало серьезным испытанием для проекта.

Решение

Я пересмотрел архитектуру, разделив прокси-узлы по региональному принципу:

  • /en — зарубежные серверы.

  • /ru — серверы внутри СНГ.

Это помогло решить проблему доступности для большинства пользователей.

Масштабирование и новые игры

За первые две недели количество регистраций достигло 150. Окрыленный успехом, я добавил поддержку CS 1.6, CS2 и Terraria.

Выбор игры
Выбор игры

Распределение аудитории оказалось предсказуемым: 80% — Minecraft, по 10% — CS и Terraria. Раздел с гайдами на сайте помог привлечь органический трафик, и база пользователей выросла до 500 человек.

Запуск серверов «из коробки»

Следующим логичным шагом стала возможность развертывания выделенного сервера прямо через интерфейс программы, чтобы не держать игру запущенной. Для Minecraft я остановился на высокопроизводительном форке Paper, добавив удобный менеджер плагинов.

Создание сервера Minecraft
Создание сервера Minecraft

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

Экономика проекта

Инфраструктура оказалась весьма доступной:

  • Core-система (API, БД, учет): $20/мес.

  • Прокси-ноды: СНГ — ~$4, зарубеж — ~$7. Сейчас 10 узлов обходятся в ~$60/мес.

Итого: ~$80 в месяц для обслуживания 1500 пользователей и более 13 500 сессий. Написанные на Go прокси показывают феноменальную легкость — менее 20 МБ RAM на каждый узел даже при длительном аптайме.

Планы на будущее

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

 

Источник

Читайте также