Перейти к содержимому

Пробросить порты из терминала

Сервер, который вы запускаете в терминале разговора, публикуется только для этого пространства. Панель портов замечает слушателей, запущенных этим приложением там, сопоставляет их и выдаёт вам адрес для каждого места, откуда вы, возможно, захотите к ним обратиться. Два пространства могут одновременно слушать 5173; их карты никогда не смешиваются.

Здесь ничто не открывает машину наружу: каждый путь создаётся сервером по запросу и умирает вместе с терминалом или rig.

  1. Откройте Терминал (VM) разговора или хост-оболочку (в пространстве или на странице PR).
  2. Запустите свой сервер — pnpm dev, python -m http.server 8000, что угодно.
  3. Через несколько секунд у значка вилки в правом верхнем углу терминала появится точка. Нажмите на него.

Панель перечисляет каждый слушающий порт вместе с владеющим им процессом в виде 3000 → 3000: слева — порт, который занял процесс, справа — порт, на котором он отвечает локально (тот же номер, если он был свободен на вашей машине). В каждой строке также сказано, могут ли до него добраться localhost в настольном приложении, Браузер (VM) и Android.

Обнаружение ограничено: Терминал (VM) опрашивается внутри этого гостя; хост-оболочка опрашивается из дерева процессов PTY этой сессии. Другие пространства и другие процессы на вашем Mac не перечисляются.

Новые порты в этом терминале пробрасываются автоматически. Отключите Автопроброс портов на той же панели, если хотите оставить только те, что добавляете сами.

Используйте Скопировать локальный URL в строке — http://localhost:3000. Проброс слушает только loopback, поэтому больше ничего в вашей сети его не видит.

Если два пространства оба открывают гостевой 5173, а ваша машина уже держит 127.0.0.1:5173, второе пространство сохраняет гостевой 5173 и получает эфемерный локальный порт. Копирование URL берёт правый номер.

В хост-оболочке процесс уже находится на вашей машине. Сопоставление того же локального порта ничего не меняет; выбор другого локального порта привязывает loopback-прокси к выбранному вами.

--host (или привязка к 0.0.0.0) не даёт изолированному Браузеру (VM) добраться до сервера на Mac. У гостя собственный loopback; сервер пробивает туннель в этого гостя, когда вкладка браузера находится в том же пространстве.

Откройте изолированный браузер в том же разговоре. Введите localhost:<left-hand port> — номер, который занял процесс. Переназначение (5173 → 3000) тоже отвечает по правому номеру в этом браузере, поэтому копирование URL работает и там. browser_use агента может перейти по любому из них. Сервер в пространстве A никогда не появляется как localhost:5173 в браузере пространства B.

Используйте localhost, а не IP в локальной сети и не --host. У гостя собственный loopback; туннель слушает там и по IPv4, и по IPv6.

Страницы, которые открывают много соединений сразу (десятки ресурсов, сокет живой перезагрузки), используют тот же туннель. Браузер (VM) мультиплексирует их в один постоянный exec, поэтому всплеск запросов — это не запуск отдельного процесса на каждое соединение и он не заканчивается тайм-аутом в виде белой страницы.

Внутри одного пространства проброс из Терминала (VM) имеет приоритет над хост-оболочкой на том же номере. Между пространствами приоритета нет — это отдельные карты.

Откройте вкладку Android этого пространства. Тогда localhost:<port> эмулятора перенаправляется обратно на опубликованный порт этого пространства (adb reverse). Эмулятор один на всё устройство: подключение пространства B перенацеливает :5173 на B и сбрасывает reverse пространства A. Закройте вкладку, и reverse-перенаправления, созданные этим rig, будут удалены.

iOS Simulator и так является Mac — reverse не нужен. Физическому iPhone по-прежнему нужен общий доступ в локальной сети.

⋯ → Открыть в локальной сети публикует порт по адресу <server-ip>:<random port> — удобно, чтобы открыть страницу на телефоне, или когда сервер работает на другой машине.

  • Порт в локальной сети всегда назначает ОС, а не гостевой номер, поэтому доступ — это намеренный, видимый адрес, а не тот, который можно угадать.
  • Он остаётся приватным (только loopback), пока вы его не переключите, а ⋯ → Только локально убирает его из сети обратно.

⋯ → Задать домен браузера (.test) назначает порту dev-домен, например myapp.test. Внутри Браузера (VM) https://myapp.test тогда загружает ваш сервер с действительным замком — это полезно для всего, что ведёт себя иначе на именованном origin или в защищённом контексте (куки, service workers, callback-и OAuth).

  • Домены должны заканчиваться на .test или .localhost — это два TLD, зарезервированных для разработки, поэтому dev-имя никогда не перекроет реальный сайт.
  • Доменные имена уникальны на сервере; номера портов — нет. Два пространства могут оба использовать 5173, но не могут оба занять myapp.test.
  • Сертификат выдаёт локальный удостоверяющий центр, созданный на вашем сервере при первой необходимости. Его ключи лежат в каталоге данных сервера и никогда не попадают ни в одного гостя; изолированный браузер доверяет ровно этому одному ключу, поэтому TLS к реальному интернету по-прежнему проверяется как обычно.
  • Домен разрешается только внутри Браузера (VM). Ваш собственный браузер на хосте вместо этого использует localhost:<port>.
  • Обычный http://myapp.test тоже работает.

Добавить порт внизу панели сопоставляет порт заранее (или независимо от того, слушает ли его что-нибудь). Ручной проброс сохраняет свой адрес, пока ваш сервер перезапускается — в строке отображается не слушает, пока он не вернётся, — тогда как автопробросы исчезают вместе со своим портом. В хост-оболочке можно также задать другой локальный порт.

Порты привязаны к рабочему пространству и пространству. Собственная карта портов гипервизора фиксируется при загрузке машины, поэтому Терминал (VM) едет по двум узким каналам, которыми управляет сервер: один заранее созданный входящий путь в гостя, который отказывается подключаться к любому порту, который гость на самом деле не слушает, и обратные туннели, которые сервер держит открытыми для Браузера (VM) и Android. Хост-оболочка никогда не сканирует всю машину. Внутри гостя никогда не создаётся слушатель, которого туда не поместил сервер, и всё сносится вместе с терминалом или rig. Устройство объясняется в разделе Rigs и изолированные среды; точные зарезервированные порты и правила доменов — в справочнике по rig.