Jak udostępnić lokalny port w internecie bez zbędnych komplikacji
Znana sytuacja: uruchamiasz backend na swojej maszynie lokalnej, konfigurujesz integrację z zewnętrzną usługą jak Stripe czy Telegram, a potem musisz przetestować webhook. Nie ma zewnętrznego dostępu do twojego localhost:8000, zamawianie statycznego adresu IP wydaje się zbyt kłopotliwe, a wdrażanie środowiska staging tylko dla kilku żądań trwa zbyt długo.
Zazwyczaj w takich momentach instynktownie sięgasz po ngrok lub podobne usługi. Ale komercyjne alternatywy zawsze mają irytujące ograniczenia: limity transferu, adresy URL zmieniające się przy każdym restarcie lub płatne subskrypcje za podstawowe funkcje. Ostatnio natknąłem się na tunnelto — narzędzie open source napisane w Rust, które robi dokładnie to, co obiecuje, bez zbędnych komplikacji.
Co to za narzędzie
Projekt tunnelto pozwala udostępnić lokalny serwer WWW w publicznym internecie poprzez tunel. Uruchamiasz jedno polecenie w terminalu, otrzymujesz prawidłowy publiczny adres URL i przekazujesz go zewnętrznym usługom lub klientom do celów demonstracyjnych.
Główną zaletą jest to, że zarówno klient, jak i serwer są napisane w Rust z wykorzystaniem asynchronicznej tokio. Przekłada się to na niewielkie zużycie pamięci i szybkie przetwarzanie przychodzących połączeń. Żadnych ciężkich środowisk uruchomieniowych ani procesów w tle pochłaniających gigabajty RAM.
Repozytorium projektu jest dostępne pod adresem https://github.com/tunneltodev/tunnelto.
Jak to działa w praktyce
Instalacja zajmuje kilka minut. Jeśli używasz macOS, narzędzie instaluje się przez Homebrew:
brew install agrinman/tap/tunnelto
Jeśli masz już toolchain Rust, możesz zbudować pakiet przez Cargo:
cargo install tunnelto
Dla innych systemów autor przygotował skompilowane pliki binarne w sekcji Releases na GitHub.
Szybki start
Załóżmy, że masz aplikację webową działającą lokalnie na porcie 8000. Możesz udostępnić ją światu zewnętrznemu tym poleceniem:
tunnelto --port 8000
Po wykonaniu narzędzie otwiera tunel i natychmiast podaje działający adres. Wszystkie żądania przychodzące na ten adres z internetu są błyskawicznie przekazywane do twojego lokalnego portu.
Przydatne parametry
W codziennej pracy często potrzebujesz dodatkowej konfiguracji. Oto flagi, które oszczędzają czas:
--subdomainustawia stałą subdomenę, dzięki czemu nie musisz zmieniać adresu URL w ustawieniach webhooka po każdym restarcie--schemeprzełącza protokół między http a https, jeśli twoja lokalna usługa wymaga bezpiecznego połączenia--dashboard-addressuruchamia lokalny interfejs do inspekcji i przeglądania przychodzących żądań--keyakceptuje klucz API do autoryzacji tunelu
Przykładowe polecenie z określoną subdomeną:
tunnelto --port 3000 --subdomain my-test-app
Do czego to się przydaje
Podczas developmentu istnieje kilka scenariuszy, w których tunelowanie oszczędza godziny pracy:
- Debugowanie przychodzących webhooków od systemów płatności, komunikatorów czy dostawców OAuth bezpośrednio w lokalnym debugerze z punktami przerwania.
- Testowanie aplikacji mobilnej na prawdziwym smartfonie połączonym z siecią komórkową, bez konfigurowania routera Wi-Fi.
- Szybkie pokazywanie układów lub prototypów kolegom, podczas gdy kod nie został jeszcze wypchnięty do repozytorium ani wdrożony na serwer testowy.
- Weryfikacja certyfikatów HTTPS i nagłówków bezpieczeństwa przed wydaniem.
Osobiste wrażenia
W README wspomniano o możliwości samodzielnego hostowania komponentu serwera, choć dokumentacja nie zawiera szczegółowych instrukcji. Jeśli pełna prywatność ruchu jest dla ciebie ważna, będziesz musiał zagłębić się w kod źródłowy i wdrożyć relay na własnym VPS.
Projekt nie ma zbyt wielu gwiazdek (około 400), a commity nie pojawiają się codziennie, ale w podstawowych zadaniach narzędzie działa niezawodnie. Szybko się uruchamia, nie wymaga rejestracji do podstawowego tunelowania i robi dokładnie jedną rzecz. Jeśli szukasz prostej alternatywy open source dla ngrok, warto zajrzeć do repozytorium i wypróbować.
Powiązane projekty