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

Ранее, представляя 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-сервисы, например игровые серверы.
Начало работы
- Репозиторий GitHub: https://github.com/gosuda/portalite
- Пакет Go:
go get gosuda.org/portalite