O localhostly é uma alternativa ao Cloudflare Tunnel sem DNS
Se você está saindo do Cloudflare Tunnel, é isto que você recebe no lugar: um e-mail para a conta e um comando para a URL HTTPS pública, sem domínio para apontar. Rode localhostly 3000 e a porta 3000 responde em https://brave-amber-fox.localhostly.iblabs.io, atrás de NAT. A conta vem com 2 túneis, 1000 requisições por minuto e 25 GiB por mês.
Pegue seu token Instale o localhostly
$ 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
Os números da conta
Cinco números delimitam toda conta, listados abaixo; o tráfego soma os dois sentidos, e o mês recomeça no dia 1, em UTC. Passado um limite, o visitante vê uma página 429 que nomeia o limite e a hora em que ele acaba.
- 2 túneis abertos de uma vez; um nome guardado em reserva não conta
- 1000 requisições por minuto, numa janela deslizante de 60 segundos
- 25 GiB por mês de tráfego, nos dois sentidos
- 1 e-mail, o cadastro inteiro
- 429 ao passar de um limite, com
Retry-After
Um comando, uma URL pública
O agente no seu computador abre uma conexão WebSocket de saída para o servidor do localhostly e a segura; o seu roteador e o seu firewall ficam como estão. Um visitante abre a URL, o servidor lê o nome dentro do endereço, manda a requisição por essa conexão, e o agente a repete na sua porta local e devolve a resposta em stream pelo mesmo caminho. Várias requisições podem estar em voo nessa única conexão ao mesmo tempo, e HTTP e WebSocket passam os dois.
- Pegue um token. Digite seu e-mail no formulário de cadastro. O token aparece na página na hora; não há e-mail de confirmação.
- Salve o token.
localhostly login <token>o escreve em~/.localhostly/config.json, legível só pelo seu usuário. - Abra o túnel.
localhostly 3000escreve primeiro a URL pública, depois uma linha para cada requisição com a hora, o método, o caminho, o status e os milissegundos.
O seu app recebe 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 por cima; --host meuapp.test:3000 manda a ele outro endereço e outro Host. O nome são 3 palavras em inglês, adjetivo, cor e animal, sorteadas pelo servidor.
A URL fica pronta no mesmo comando, sem DNS para configurar
Não há domínio para trazer nem registro para criar: o servidor sorteia o nome do seu túnel quando o agente conecta, e o endereço já vem com o certificado HTTPS de *.localhostly.iblabs.io. A conta é um e-mail: o token está na página de cadastro no momento em que você envia o formulário, e localhostly login <token> é toda a configuração. Dali, localhostly 3000 escreve a URL e o primeiro visitante já pode abri-la.
O nome fica com o agente. Depois de uma queda ele reconecta sozinho e recebe o mesmo nome de volta por 10 minutos, então uma URL que você colou em algum lugar continua funcionando; instalado como serviço do sistema, ele pede o nome de novo depois de reiniciar.
Webhooks chegam ao seu app sem página de aviso
A primeira visita de um navegador recebe uma página de aviso dizendo que o site é servido do computador de alguém, e o botão dela grava um cookie de 24 horas. Entregas de webhook e clientes de API não são navegadores e não recebem página nenhuma: a requisição cai no seu app como foi enviada, e qualquer cliente pode pular a página com o cabeçalho X-Localhostly-Skip-Warning.
Dê ao provedor https://<nome>.localhostly.iblabs.io/<seu caminho>; cada entrega aparece como uma linha no seu terminal com método, caminho, status e tempo.
Server-Sent Events, downloads longos e uploads grandes passam
Uma resposta que o seu app escreve ao longo do tempo chega ao visitante conforme é escrita: num stream medido, Server-Sent Events escritos em 0, 3 e 6 segundos chegaram ao visitante em 0,6, 3,6 e 6,6 segundos. O limite de 60 segundos cobre só o primeiro byte; começada a resposta, não há limite, então um download longo ou um stream que fica aberto passa.
Os corpos de requisição e de resposta cruzam o túnel em pedaços de até 64 KiB, nunca inteiros na memória: um upload de 20 MiB passou com o pico de memória abaixo de 100 MiB na medição, e um download de 20 MiB chegou a um visitante lento do mesmo jeito. O WebSocket do visitante chega ao seu app, e o upgrade só completa quando o seu app o aceita, com o subprotocolo que ele escolheu.
Tranque o túnel com senha ou lista de IPs
Com --password o navegador pede uma senha a todo visitante antes de carregar qualquer coisa; sem valor, o localhostly gera uma de 12 caracteres e a mostra no seu terminal e em mais lugar nenhum. O cabeçalho Authorization do visitante para no servidor e nunca chega ao seu app.
Com --allow 203.0.113.7,10.0.0.0/8 o túnel admite só esses endereços IP ou faixas, IPv4 ou IPv6, até 64 entradas; todo outro endereço recebe uma página 403 que mostra o endereço, e um upgrade de WebSocket vindo dele também recebe 403. Com --allow não há página de aviso, e com --password junto o visitante precisa dos dois.
- O servidor registra método, caminho sem a query, status, tempo, nome do túnel e conta de cada visita, e nunca o corpo de uma requisição nem um cookie.
- O seu token fica do nosso lado só como um hash SHA-256.
- O HTTPS termina no balanceador do localhostly, então o servidor do localhostly vê e repassa o seu tráfego; isso não é criptografia de ponta a ponta.
Deixe o túnel como serviço do sistema
localhostly service install 3000 registra o túnel como serviço do sistema, systemd no Linux, launchd no macOS ou serviço do Windows, que reconecta sozinho, lembra o nome, o pede de novo depois de reiniciar e continua tentando quando o servidor o recusa. localhostly service status informa o estado; localhostly service uninstall o tira.
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 no npm leva só o agente. Salve o token com localhostly login <token> e abra o túnel com localhostly 3000.
Pegue seu token
Um e-mail é tudo o que o cadastro pede: o token aparece na página de cadastro, nenhum e-mail de confirmação vem depois, e localhostly login <token> o guarda no seu computador.