O localhostly é uma alternativa grátis ao localtunnel
Se você sai do localtunnel, é isto que você recebe: a mesma instalação pelo npm, uma URL HTTPS pública e um nome que volta após uma queda curta. Rode npx localhostly 3000 e a porta 3000 responde em https://brave-amber-fox.localhostly.iblabs.io, atrás de NAT. A conta grátis só pede um e-mail: 2 túneis, 1000 requisições por minuto e 25 GiB por mês.
Pegue seu token Instale o localhostly
$ npx localhostly 3000 https://brave-amber-fox.localhostly.iblabs.io → http://127.0.0.1:3000 Ctrl+C to stop. Requests: 21:14:03 GET / 200 12ms 21:14:05 POST /api/webhook 201 31ms
A conta grátis em números
A conta grátis é a única conta, sem plano pago nem cartão por trás. Os limites dela são os cinco números abaixo: o limite de tráfego soma os dois sentidos e o mês vira no dia 1, em UTC. Passado um limite, o visitante recebe uma página 429 que diz qual limite estourou e quando o túnel volta.
- 2 túneis abertos ao mesmo tempo
- 1000 requisições por minuto, numa janela deslizante de 60 segundos
- 25 GiB de tráfego por mês, nos dois sentidos
- R$ 0 por mês: sem plano pago e sem cartão
- 429 ao passar de um limite, com o cabeçalho
Retry-After
Um comando, uma URL pública
O agente localhostly roda no seu computador e mantém uma conexão WebSocket de saída com o servidor do localhostly, então nada é aberto no seu roteador nem no firewall. Um visitante abre a sua URL, o servidor lê o nome nela, passa a requisição por essa conexão, e o agente a reproduz na sua porta local e devolve a resposta em stream. Passam requisições HTTP e conexões WebSocket.
- Pegue um token. Digite seu e-mail no formulário de cadastro; o token aparece na página, sem e-mail de confirmação.
- Salve o token.
localhostly login <token>o grava em~/.localhostly/config.json, legível só pelo seu usuário. - Abra o túnel.
npx localhostly 3000sem instalar nada, oulocalhostly 3000depois denpm i -g localhostly. O terminal mostra a URL pública e uma linha por requisição: hora, método, caminho, status e milissegundos.
O seu app vê o método, o caminho, os cabeçalhos e o corpo do visitante, com X-Forwarded-For, X-Forwarded-Proto: https e X-Forwarded-Host acrescentados. --host meuapp.test:3000 manda outro endereço e outro Host a ele. O nome é sorteado entre 3 palavras em inglês, adjetivo, cor e animal; ninguém o escolhe.
A URL volta depois da queda
Quando a conexão cai, o agente reconecta sozinho: espera 1 segundo, dobra a espera a cada tentativa até 60 segundos e pede o mesmo nome. O nome fica reservado por 10 minutos depois da queda, então nesse prazo a mesma URL volta a responder e nada que foi cadastrado nela precisa mudar.
Depois de uma queda mais longa o nome é solto: o agente volta com um nome novo e escreve name changed. A reserva mora no banco do servidor e sobrevive a uma publicação nova dele, então um deploy do nosso lado não troca a sua URL.
Webhooks e clientes de API chegam direto ao seu app
Uma chamada de webhook ou um cliente de API não é um navegador, então não recebe página de aviso: a requisição vai direto ao seu app. Cole https://<nome>.localhostly.iblabs.io/<seu caminho> nas configurações de webhook do provedor; cada chamada aparece no seu terminal com método, caminho, status e tempo. Se o seu app local estiver parado, o visitante recebe uma página 502 que diz isso.
O navegador vê uma página de aviso na primeira visita, dizendo que o site roda no computador de alguém; o botão dela grava um cookie que a dispensa por 24 horas. Um cliente que não consegue clicar pode mandar o cabeçalho X-Localhostly-Skip-Warning, e um túnel aberto com --allow não mostra página de aviso nenhuma.
Respostas em stream e uploads grandes passam
O corpo viaja em pedaços de até 64 KiB nos dois sentidos e nunca fica inteiro na memória: na medição, um upload de 20 MiB passou com o pico de memória abaixo de 100 MiB, e um download de 20 MiB chegou a um visitante lento do mesmo jeito.
O seu app tem 60 segundos para começar a responder; depois do primeiro byte não há prazo, por isso downloads longos e Server-Sent Events passam. Num stream medido, eventos escritos em 0, 3 e 6 segundos chegaram ao visitante em 0,6 s, 3,6 s e 6,6 s. O WebSocket do visitante também chega ao seu app, e o upgrade só completa depois que o seu app o aceita, com o subprotocolo que ele escolheu.
Tranque o túnel com senha ou lista de IPs
--password faz todo visitante digitar uma senha na caixa de login do navegador; sem valor, o localhostly gera uma senha de 12 caracteres e a escreve só no seu terminal. O cabeçalho Authorization do visitante nunca chega ao seu app.
--allow 203.0.113.7,10.0.0.0/8 deixa entrar só esses endereços IP ou faixas, IPv4 ou IPv6, até 64 entradas; todo o resto recebe uma página 403 que mostra o endereço, e o upgrade de WebSocket dele também recebe 403. Com as duas opções, o visitante precisa do endereço certo e da senha.
- O servidor registra método, caminho sem a query, status, tempo, nome do túnel e conta, e nunca o corpo da requisição nem os cookies.
- Do nosso lado, o seu token fica guardado só como hash SHA-256.
- O HTTPS termina no balanceador do localhostly, então o servidor do localhostly vê e repassa o seu tráfego: não é criptografia de ponta a ponta.
Deixe o túnel como serviço do sistema
localhostly service install 3000 transforma o túnel em serviço do sistema: systemd no Linux, launchd no macOS, serviço do Windows. O serviço reconecta sozinho, guarda o nome que recebeu e o pede de novo depois de reiniciar, e não desiste se o servidor recusar. localhostly service status diz se ele está rodando e localhostly service uninstall o remove.
Instalar
O localhostly roda no Node.js 24 ou mais novo.
-
Teste sem instalar:
npx localhostly 3000 -
Instale de vez:
npm i -g localhostly
O pacote do npm leva só o agente, não o servidor. Salve o token com localhostly login <token> e localhostly 3000 abre o túnel.
Pegue seu token
O cadastro pede um e-mail e nada mais; o token aparece na página de cadastro, sem e-mail de confirmação. localhostly login <token> o salva no seu computador; depois, localhostly 3000 abre o túnel.