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

Подключиться к удалённому серверу

Каждый клиент — это отрисовщик поверх cc_server, которому принадлежат данные. Приложение для компьютера может запустить сервер внутри себя; веб-приложение по адресу app.usectrl.dev не может, потому что вкладка браузера не способна обслуживать сервер. В любом случае это руководство направляет клиент на сервер, работающий в другом месте, — небольшую машину, облачную ВМ, сборочный сервер.

  • Работающий cc_server. Если его у вас нет, см. Запустить headless-сервер.
  • Либо три значения для сопряжения, выданные сервером, — URL сервера (ws://…/rpc или wss://…/rpc), ID устройства и ключ сопряжения, — либо одноразовый код приглашения от администратора рабочего пространства. Активация приглашения создаёт вашего пользователя, записывает ваше членство и выдаёт учётные данные для этого клиента за вас, поэтому вам никогда не приходится иметь дело с ID устройства или ключом.

Локальному серверу ничего не нужно: ws://localhost:9030/rpc работает и из приложения для компьютера, и из браузера, потому что браузеры считают локальный интерфейс доверенным источником.

Сервер на другой машине — другое дело. app.usectrl.dev отдаётся по HTTPS, поэтому браузер откроет сокет wss:// только с сертификатом, которому он уже доверяет, — а cc_server в принципе отказывается привязываться к адресу, отличному от локального, без TLS. Дайте ему одно из:

  • сертификат напрямую, с --tls-cert и --tls-key
  • обратный прокси, терминирующий TLS, перед ним, с сервером, запущенным с --insecure (открытый текст за прокси, только в доверенной сети)
  • туннель или VPN, который предоставляет сертификат, — Tailscale, cloudflared и подобные. В разделе Настройки → Сервер → Подключение и состояние есть встроенное включение туннеля в пункте Открыть доступ к серверу.

Две настройки на стороне сервера легко упустить. За прокси, NAT или туннелем задайте --public-url как адрес, по которому клиенты должны фактически дозваниваться, — по умолчанию он равен локальной привязке, поэтому без него клиенты пытаются обратиться не к тому хосту. А если вы размещаете собственную копию веб-сборки, добавьте её источник в --allowed-origins, который по умолчанию содержит только https://app.usectrl.dev; локальный интерфейс и нативные клиенты разрешены всегда.

При чистой установке:

  1. Запустите Control Center. Экран первого запуска спрашивает Как запускать Control Center?
  2. Вместо Запустить в этом приложении заполните поля подключения: URL сервера, а также либо код приглашения, либо ID устройства и ключ сопряжения.
  3. Нажмите Подключить. Control Center дозванивается до сервера и открывает входящие рабочего пространства.

На компьютере, который уже запускает собственный сервер:

  1. Откройте Настройки → Сервер → Подключение и состояние.
  2. Нажмите Добавить сервер. Введите URL сервера (wss://host:9030/rpc) и либо код приглашения, либо ID устройства и ключ сопряжения. Кнопка-суффикс в поле URL находит экземпляры cc_server в вашей локальной сети или tailnet.
  3. Нажмите Подключить, затем Переключить в строке нового сервера.

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

После переключения на компьютере нет собственной базы данных. Каждый экран читает и пишет через удалённый сервер по WebSocket.

Веб-сборка всегда удалённая.

  1. Откройте app.usectrl.dev или собственную копию веб-сборки.
  2. Введите URL сервера и либо код приглашения, либо ID устройства и ключ сопряжения.
  3. Клиент дозванивается до сервера и отрисовывает тот же интерфейс, что и приложение для компьютера.

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

Веб-клиент читает и пишет на тот же сервер, что и приложение для компьютера, но нескольким поверхностям нужно нативное окно или собственные устройства машины:

  • нет всплывающих уведомлений ОС, звуков уведомлений и постоянной полосы баннеров (центр уведомлений внутри приложения всё ещё работает)
  • нет поиска серверов в локальной сети или tailnet в диалоге Добавить сервер
  • нет встроенного средства чтения статей — статьи из ленты новостей открываются в новой вкладке
  • нет повторного запуска резюме встречи и отмены того, что уже обрабатывается

Две вещи ведут себя иначе, а не отсутствуют. Запись встречи работает в браузере: захватываются ваш микрофон и демонстрация экрана с аудиодорожкой. Открыть в IDE тоже работает, но просит сервер запустить редактор на экране сервера, поэтому кнопка прячется на headless-хосте без установленных редакторов.

  • Время ожидания подключения истекло: сервер должен быть доступен с клиента. Проверьте привязку (--bind any), что порт открыт и что --public-url указывает адрес, по которому клиент действительно может дозвониться. В открытом интернете TLS обязателен — привязка к нелокальному адресу открытым текстом отклоняется при запуске, если только сервер не был запущен с --insecure за прокси.
  • Браузер отказывается подключаться, а нативный клиент работает: источника браузера нет в списке --allowed-origins сервера. По умолчанию разрешён только https://app.usectrl.dev (плюс локальный интерфейс).
  • Ключ сопряжения отклонён: снова выполните cc_server pair на сервере, чтобы сменить ключ этого устройства, затем введите новый. Отозванное устройство обнаруживает, что его учётные данные исчезли, и отказывает безопасно; отзыв разрывает активный сеанс в течение секунд.
  • Не то рабочее пространство: рабочее пространство — часть URL (/workspaces/:workspaceId/…) и передаётся с каждым вызовом, поэтому переключение рабочего пространства в одном клиенте меняет только ваш собственный вид. Вы можете попасть только в те рабочие пространства, где вы состоите членом, — всё остальное отклоняется с “Not a member of this workspace”. См. Рабочие пространства и изоляция.