Pular para o conteúdo

Encaminhar portas a partir de um terminal

Um servidor que você inicia no terminal de uma conversa é publicado apenas para aquele espaço. O painel de portas detecta os processos que este app iniciou lá e que estão escutando, mapeia-os e dá a você um endereço para cada lugar de onde você possa querer alcançá-los. Dois espaços podem ambos escutar na 5173; seus mapas nunca se misturam.

Nada aqui abre a máquina: cada caminho é criado pelo servidor, sob demanda, e morre com o terminal ou o rig.

  1. Abra o Terminal (VM) ou o shell do host da conversa (em um espaço ou na página de uma PR).
  2. Inicie seu servidor — pnpm dev, python -m http.server 8000, qualquer coisa.
  3. Em poucos segundos, o ícone de plugue no canto superior direito do terminal ganha um ponto. Clique nele.

O painel lista cada porta que está escutando com o processo que a detém, no formato 3000 → 3000: à esquerda, a porta à qual o processo se vinculou; à direita, a porta em que ele responde localmente (o mesmo número sempre que ela estava livre na sua máquina). Cada linha também informa se o localhost do desktop, o Navegador (VM) e o Android conseguem alcançá-la.

A descoberta é contida: um Terminal (VM) é consultado dentro desse convidado; um shell do host é consultado a partir da árvore de processos do PTY dessa sessão. Outros espaços, e outros processos no seu Mac, não são listados.

Novas portas neste terminal são encaminhadas automaticamente. Desative Encaminhar portas automaticamente no mesmo painel se você quiser apenas as que você mesmo adicionar.

Use Copiar URL local na linha — http://localhost:3000. O encaminhamento escuta apenas no loopback, então nada mais na sua rede consegue vê-lo.

Se dois espaços expõem a 5173 do convidado e a sua máquina já ocupa a 127.0.0.1:5173, o segundo espaço mantém a 5173 do convidado e recebe uma porta local efêmera. Copiar URL usa o número da direita.

Em um shell do host, o processo já está na sua máquina. Mapear a mesma porta local não faz nada; escolher uma porta local diferente vincula um proxy de loopback à que você escolheu.

--host (ou vincular a 0.0.0.0) não faz um Navegador (VM) em recinto conseguir alcançar um servidor no Mac. O convidado tem o próprio loopback; o servidor implanta um túnel nesse convidado quando a aba Navegador está no mesmo espaço.

Abra o navegador em recinto na mesma conversa. Digite localhost:<left-hand port> — o número ao qual o processo se vinculou. Um remapeamento (5173 → 3000) também responde no número da direita nesse navegador, então Copiar URL funciona lá também. O browser_use de um agente consegue navegar para qualquer um dos dois. Um servidor no Espaço A nunca aparece como localhost:5173 no navegador do Espaço B.

Use localhost, não um IP da LAN nem --host. O convidado tem o próprio loopback; o túnel escuta lá tanto em IPv4 quanto em IPv6.

Páginas que abrem muitas conexões de uma vez (dezenas de recursos, um socket de live reload) compartilham esse mesmo túnel. O Navegador (VM) multiplexa todas em um único exec persistente, então uma rajada de buscas não é um processo iniciado por conexão e não atinge o tempo limite como uma página em branco.

Dentro de um espaço, um encaminhamento de Terminal (VM) tem precedência sobre um shell do host no mesmo número. Entre espaços não há precedência — são mapas separados.

Abra a aba Android desse espaço. O localhost:<port> do emulador é então revertido para a porta publicada deste espaço (adb reverse). Um emulador é global para o dispositivo: conectar o Espaço B redireciona a :5173 para B e descarta a de A. Feche a aba e os reverses que este rig implantou são removidos.

O Simulador de iOS já é o Mac — sem reverse. Um iPhone físico ainda precisa de um compartilhamento na LAN.

⋯ → Compartilhar na rede local publica a porta em <server-ip>:<random port> — útil para abrir a página no seu celular, ou quando o servidor roda em outra máquina.

  • A porta da LAN é sempre atribuída pelo SO, nunca o número do convidado, de modo que a exposição é um endereço deliberado e visível, e não adivinhável.
  • Ela permanece privada (somente loopback) até você ativá-la, e ⋯ → Apenas local a tira de volta da rede.

⋯ → Definir um domínio do navegador (.test) atribui à porta um domínio de desenvolvimento como myapp.test. Dentro do Navegador (VM), https://myapp.test passa a carregar seu servidor com um cadeado válido — útil para qualquer coisa que se comporte de forma diferente em uma origem nomeada ou em um contexto seguro (cookies, service workers, callbacks do OAuth).

  • Os domínios precisam terminar em .test ou .localhost — os dois TLDs reservados para desenvolvimento, então um nome de desenvolvimento nunca pode se sobrepor a um site real.
  • Os nomes de domínio são únicos no servidor; os números de porta não são. Dois espaços podem ambos usar 5173, mas não podem ambos reivindicar myapp.test.
  • O certificado vem de uma autoridade local emitida no seu servidor na primeira vez que for necessária. As chaves dela ficam sob o diretório de dados do servidor e nunca entram em nenhum convidado; o navegador em recinto confia exatamente nessa chave, então o TLS para a internet real continua validando normalmente.
  • O domínio resolve somente dentro do Navegador (VM). Seu próprio navegador no host usa localhost:<port> em vez disso.
  • http://myapp.test simples também funciona.

Adicionar porta na parte inferior do painel mapeia uma porta antes de (ou independentemente de) qualquer coisa estar escutando nela. Um encaminhamento manual mantém o endereço enquanto seu servidor reinicia — a linha mostra não está escutando até ele voltar —, ao passo que os encaminhamentos automáticos desaparecem quando a porta deles desaparece. Em um shell do host, você também pode definir uma porta local diferente.

As portas têm como chave o espaço de trabalho e o espaço. O próprio mapa de portas do hipervisor é fixo quando uma máquina inicializa, então um Terminal (VM) usa dois canais estreitos controlados pelo servidor: uma faixa de entrada pré-criada para o convidado, que se recusa a conectar a qualquer porta em que o convidado não esteja de fato escutando, e túneis reversos que o servidor mantém abertos para o Navegador (VM) e o Android. Um shell do host nunca varre a máquina inteira. Nenhum processo de escuta é criado dentro de um convidado sem que o servidor o tenha colocado lá, e tudo é desmontado junto com o terminal ou o rig. O design é explicado em Rigs e recintos; as portas reservadas exatas e as regras de domínio estão na referência de rigs.