GoSuda

Portalite: легковесный Go SDK для Portal с привязкой к нескольким ретрансляторам и поддержкой стандартного net.Listener

By Lemon Mint views ...

Ранее, представляя Portal, мы говорили о проблемах современной сети. С появлением инструментов ИИ для программирования каждый может создать веб-сайт, однако сам процесс его публикации по-прежнему остаётся монополией крупных платформ и облачных сервисов. Portal представляет собой проект, который отделяет хостинг веба от создания контента и, соединяя локальные сервисы отдельных людей с миром через сквозное шифрованные релеи, возвращает право на публикацию самим пользователям.

Представляем Portalite

Сегодня я представляю Portalite. Portalite является сверхлёгким клиентом Portal и Go SDK, построенным с минимальным количеством зависимостей.

Если Portal воплощает философию о том, как изменить веб, то Portalite является тонким связующим звеном, которое переносит эту философию в приложения разработчиков. Разработчику не нужны сложные настройки облака или конвейеры развёртывания: достаточно подключить SDK, добавить несколько строк кода, и в приложение можно будет встроить портальный ingress. Как только приложение запускается, сервер, который существовал только локально, становится публичным сервисом, доступным из любой точки интернета.

1. Публичный Ingress, настраиваемый в два строки кода

Portalite поддерживает net.Listener, стандартный интерфейс Go. Достаточно заменить listener в существующем веб-фреймворке или серверном коде, и всё начинает работать сразу.

1identity, err := portalite.GenerateIdentity("my-service")
2
3listener, err := portalite.Expose(ctx, portalite.ExposeConfig{
4    Relays:   portalite.DefaultRelays(),
5    Identity: identity,
6})
7
8http.Serve(listener, handler)
  • Нулевая конфигурация (Zero-config): не требуются проброс портов, статический IP или настройка правил входящего трафика на брандмауэре.
  • Стандартная совместимость: полная совместимость с http.Server, grpc.Server, Gin, Echo, Chi и любыми другими библиотеками Go, которые используют стандартный net.Listener.

2. Ключевая особенность: одновременная привязка к нескольким релеям (Multi-Relay Binding)

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

  • Бесперебойная изоляция сбоев (Failover): если часть релеев выходит из строя или возникает сетевая задержка, оставшиеся работающие релеи продолжают принимать трафик через тот же виртуальный listener.
  • Устранение единой точки отказа (SPOF): цикл Accept() приложения не прерывается, пока все релейные сессии одновременно не разорваны.
  • Сквозное шифрование (E2EE): трафик передаётся в зашифрованном виде, поэтому релейные серверы не могут просматривать или изменять данные.
  • Автоматическое переподключение и самовосстановление (Self-Healing): даже при временных сетевых разрывах или перезагрузке релея сессии и токены в фоновом режиме автоматически пересогласовываются, восстанавливая соединение.

3. Немедленное использование одной командой CLI

Если вам не нужен Go-код или требуется быстрое тестирование, достаточно передать CLI номер порта.

1$ go install gosuda.org/portalite/cmd/portalite@latest && portalite expose --name "my-service" 3000
2URL https://my-service.rly.best
3URL https://my-service.s-h.day
4

Сразу после выполнения команды выдаются URL нескольких релеев, и сервис становится доступен извне.

4. Лёгкость и мощь

  • Минимум зависимостей: отказ от сторонних зависимостей делает бинарный файл лёгким, а сборку быстрой.
  • Поддержка TLS и UDP: помимо TLS-трафика, такого как HTTP и gRPC, через туннелирование датаграмм QUIC можно легко публиковать UDP-сервисы, например игровые серверы.

Начало работы