От доступа до рабочего окружения

Три способа подключиться к M4

Используйте SSH для командной строки, графический рабочий стол для интерактивных задач, а CI runner — для автоматических сборок. Все три способа ведут к одному выделенному физическому узлу, а не к разным окружениям.

Если вы уже арендуете узел, откройте в консоли сведения об инстансе, связанном с заказом. Там указаны адрес хоста, порт SSH, имя пользователя и инструкции. Вместо переменных хоста в этой статье подставляйте реальные данные своего инстанса.

SSHПроверка узла, передача файлов и запуск сборок
Графический рабочий столРабота с Xcode, симулятором и интерфейсом macOS
CI runnerЗапуск задач проекта на собственном физическом узле
Сначала настройте проверяемое подключение

SSH: создайте ключ и добавьте псевдоним узла

Сначала подключитесь через командную строку, затем настройте графический рабочий стол и CI-конвейер. SSH — самый быстрый способ проверить доступность узла и найти проблему с аутентификацией.

  1. 01

    Создайте ключ на локальном компьютере

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

    ssh-keygen -t ed25519 -f ~/.ssh/xcnode_ed25519 -C "xcnode-workstation"
    ssh-add ~/.ssh/xcnode_ed25519

    Если ssh-add сообщает, что агент аутентификации недоступен, сначала убедитесь, что на локальном компьютере запущен SSH agent. Парольная фраза ключа и пароль удалённого пользователя — не одно и то же.

  2. 02

    Установите открытый ключ и проверьте узел

    Задайте три переменные по инструкции к инстансу. Используйте ssh-copy-idтолько если инструкция разрешает первоначальную аутентификацию по паролю. Если открытый ключ уже добавлен, сразу проверьте вход. При первом подключении сверьте отпечаток хоста — не принимайте неизвестный хост только потому, что появилось предложение подтвердить подключение.

    read -r -p "Host: " NODE_HOST
    read -r -p "SSH port: " NODE_PORT
    read -r -p "User: " NODE_USER
    ssh-copy-id -i ~/.ssh/xcnode_ed25519.pub -p "$NODE_PORT" "$NODE_USER@$NODE_HOST"
    ssh -i ~/.ssh/xcnode_ed25519 -p "$NODE_PORT" "$NODE_USER@$NODE_HOST"

    Команды для ввода переменных выше рассчитаны на Bash. В macOS сначала запустите bash в zsh, а затем выполните их. Если не удаётся установить открытый ключ при первом подключении, воспользуйтесь способом управления данными доступа из консоли или создайте запрос в поддержку. Не пытайтесь снова и снова вводить пароль.

  3. 03

    Сохраните псевдоним и проверьте окружение

    Добавьте псевдоним в локальный файл ~/.ssh/config . Поля в угловых скобках ниже замените данными своего инстанса, сами скобки удалите. Windows OpenSSH также читает файл .ssh/configв каталоге пользователя.

    Host xcnode-work
      HostName <INSTANCE_HOST>
      Port <SSH_PORT>
      User <INSTANCE_USER>
      IdentityFile ~/.ssh/xcnode_ed25519
      IdentitiesOnly yes
      ServerAliveInterval 30
      ServerAliveCountMax 3
    ssh xcnode-work
    uname -m
    sysctl -n machdep.cpu.brand_string
    xcode-select -p
    xcodebuild -version

    uname -m должна вывести arm64. Название чипа должно соответствовать модели в заказе, а версию Xcode проверяйте по фактической установке на узле. Параметры поддержания соединения не запускают задачи повторно автоматически: длительные сборки поручайте runner или инструменту управления постоянными сессиями.

Три клиентские ОС — три нюанса

Сначала проверьте, что локально выполняется команда ssh -V. Отсутствие вспомогательной команды не означает, что узел не поддерживает SSH.

Настройка локального клиента и установка открытого ключа
Локальная ОСSSH-клиентУстановка открытого ключаПримечания
macOSOpenSSH в Терминалеssh-copy-id Обычно нужно установить отдельно. Можно также добавить открытый ключ по инструкции к инстансу.В качестве оболочки по умолчанию обычно используется zsh. Не копируйте команды ввода, рассчитанные только на Bash, без изменений.
WindowsOpenSSH Client в PowerShellВ WSL можно использовать ssh-copy-idили добавить открытый ключ через консоль.В PowerShell и WSL разные каталоги пользователя и файлы ключей.
LinuxПакет OpenSSH-клиента для дистрибутиваОбычно доступна команда ssh-copy-id. Если её нет, сначала установите клиентские инструменты.Права на закрытый ключ задайте как 600, для каталога~/.ssh задайте права 700.
Когда нужен графический интерфейс

Графический рабочий стол: используйте SSH-туннель

После проверки SSH убедитесь, что служба общего экрана работает и графическая сессия доступна. Открытый порт ещё не означает, что рабочий стол готов к подключению.

Общий экран macOS

На локальном Mac можно использовать встроенное приложение «Общий экран». Стандартный порт VNC — TCP 5900. Фактический порт, способ аутентификации и состояние службы уточняйте в инструкции к инстансу.

Убедившись, что на удалённом узле используется порт 5900, создайте туннель в локальном Терминале и оставьте его открытым. Здесь используется локальный порт 15900, чтобы избежать конфликта со службой на компьютере.

ssh -N -L 127.0.0.1:15900:127.0.0.1:5900 \
  -o ExitOnForwardFailure=yes xcnode-work

Затем откройте клиент в другом окне Терминала:

open "vnc://127.0.0.1:15900"
Туннель принимает подключения только на локальном интерфейсе

VNC-клиенты для Windows и Linux

Выберите VNC-клиент, поддерживающий способ аутентификации инстанса, например TigerVNC. Сначала создайте такой же SSH-туннель, затем укажите в клиенте адрес 127.0.0.1и порт 15900.

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

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

Храните данные доступа к рабочему столу отдельно от SSH-ключей

Сначала настройте плавную работу, потом повышайте качество

При первом подключении выберите автоматическое или низкое качество изображения и используйте только один монитор. Не передавайте одновременно большие файлы и полноэкранное динамичное изображение. Когда текст станет чётким, а управление — отзывчивым, постепенно повышайте разрешение и качество цвета. Высокая скорость передачи файлов по SSH не означает низкую задержку графического рабочего стола.

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

Автоматически запускайте задачи на узле

Подключение CI: регистрация и проверка автозапуска

Runner выполняет задачи на облачном Mac, а не на вашем локальном компьютере. Сначала проверьте инструменты на интерактивной задаче, а затем запустите runner как службу.

Self-hosted runner GitHub Actions

Откройте настройки runner в проекте или организации и выберите macOS ARM64. Подготовьте программу с помощью команд загрузки и проверки, указанных на странице. URL регистрации и временный токен получите там же.

cd ~/actions-runner
read -r -p "Registration URL: " RUNNER_URL
read -r -s -p "Registration token: " RUNNER_TOKEN
printf '\n'
./config.sh --url "$RUNNER_URL" --token "$RUNNER_TOKEN" \
  --name xcnode-work --labels xcnode,arm64
unset RUNNER_TOKEN
./run.sh

Команды ввода выше выполняются в Bash. Запустите тестовую задачу и убедитесь, что runner доступен и сборка завершилась. Затем остановите процесс и установите службу:

./svc.sh install
./svc.sh start
./svc.sh status

Укажите в рабочем процессе точные метки, чтобы задача не попала на машину с другой архитектурой:

runs-on: [self-hosted, macOS, ARM64, xcnode]
steps:
  - run: xcodebuild -version

Токен регистрации — не постоянный ключ проекта. Не добавляйте его в репозиторий, вывод сборки или вложения к запросам в поддержку.

GitLab Runner

Создайте runner в проекте или группе и получите токен аутентификации по актуальной инструкции платформы. Установите версию для macOS ARM64 и зарегистрируйте runner в Терминале графической сессии пользователя, от имени которого он будет работать. Не запускайте сборки проекта от имени root.

gitlab-runner register

Введите URL инстанса и токен аутентификации по запросу, выберите исполнитель shell . Настройте для runner метки xcnode и arm64 и ограничьте его доверенными проектами.

gitlab-runner install
gitlab-runner start
gitlab-runner status

Сначала запустите минимальную тестовую задачу для проверки окружения, затем добавьте подпись и архивирование:

build-check:
  tags: [xcnode, arm64]
  script:
    - uname -m
    - xcode-select -p
    - xcodebuild -version

У исполнителя Shell есть доступ к файлам пользователя, от имени которого он работает. Выделенная машина сама по себе не изолирует недоверенные задачи в рамках одной учётной записи.

Автозапуск и интерактивность проверяйте отдельно

Пользовательские службы macOS обычно управляются launchd и могут зависеть от пользовательской сессии. После установки службы проверьте процессы, журналы и очередь. С согласия команды проверьте восстановление после перезагрузки. Для задач с симулятором или графическим интерфейсом убедитесь, что активная сессия удовлетворяет требованиям: статуса «в сети» у runner недостаточно.

Начните с одной задачи и зафиксируйте фактический пиковый расход памяти проекта, прежде чем увеличивать параллелизм. Разделяйте кэш по проектам и версиям Xcode, а артефакты сборки храните отдельно. Если используете сертификаты подписи из системной Связки ключей, отдельно проверьте права пользователя службы: успешная сборка в Терминале не гарантирует успех в фоновом режиме.

Выбирайте расположение по результатам проверки сети

Четыре узла: сначала проверьте сеть, которой пользуетесь

В Сингапуре, Токио, Сеуле и Гонконге доступны две конфигурации. Актуальную доступность смотрите в консоли. Географическое расстояние — лишь ориентир: важны также маршруты операторов связи и рабочее расписание команды.

Сингапур

Командам из Юго-Восточной Азии стоит начать с этой локации. Проверьте работу рабочего стола через обычную офисную сеть, затем протестируйте загрузку проекта и передачу артефактов.

sg · UTC+8

Токио

Командам из Японии и Восточной Азии стоит начать с этой локации. Близкий часовой пояс не гарантирует более быстрого соединения — сравните работу в часы пик и в спокойное время.

jp · UTC+9

Сеул

Командам из Кореи и Северо-Восточной Азии стоит начать с этой локации. Для постоянно работающего runner особенно важна стабильность доступа к репозиториям и источникам зависимостей.

kr · UTC+9

Гонконг

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

hk · UTC+8

Проверьте три показателя: задержку, её колебания и работу реальной задачи

Проверяйте реальный адрес назначенного инстанса, а не скорость соединения с доменом сайта. Команды ниже выполняются в локальном терминале Bash после задания переменных узла.

ping -c 20 "$NODE_HOST"
ssh -p "$NODE_PORT" "$NODE_USER@$NODE_HOST" 'uptime'

В Windows PowerShell используйте команду ping -n 20 <INSTANCE_HOST>. Запишите потери пакетов и диапазон времени отклика, затем проверьте реальную загрузку из Git или передачу артефакта сборки. ICMP может блокироваться сетевыми правилами: если ping не отвечает, отдельно проверьте фактический порт SSH.

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

Разберём понятия в одной таблице

Восемь терминов о подключении

Разделяйте ресурсы, протоколы подключения и планирование задач — так при устранении проблем вы не будете смешивать разные уровни.

Физический узел
Машина Apple Silicon, на которой работает macOS. По заказу выделяется целое устройство, а не виртуальная машина на общем хосте.
Выделенный
На время аренды физическая машина закрепляется за одним клиентом: CPU, GPU и объединённая память не делятся с другими клиентами.
VNC
Протокол для передачи изображения удалённого экрана и ввода с клавиатуры и мыши. Состояние службы, порт и аутентификацию нужно проверять отдельно.
Общий экран
Функция и клиент macOS для доступа к удалённой графической сессии. Не заменяет подключение к командной строке по SSH.
SSH-ключ
Учётные данные, состоящие из открытого и закрытого ключей. Открытый ключ можно добавить на узел, а закрытый следует хранить только на защищённом клиентском устройстве.
Self-hosted runner
Агент для выполнения CI-задач на собственном узле. Он использует установленные на узле инструменты, права и кэш.
Объединение через Thunderbolt 5
Дополнительная опция подключения выбранных узлов. Она не объединяет несколько устройств в единую систему с общей памятью: программное обеспечение всё равно должно поддерживать распределённые задачи.
Объединённая память
В Apple Silicon CPU и GPU используют общий пул памяти, поэтому при сборках, работе симулятора и задачах с моделями нужно учитывать общий расход памяти.
Проверьте доступ, затем ограничьте его

Убедитесь, что вход по ключу работает, и ужесточите настройки доступа

Не меняйте способ аутентификации, пока не проверили единственный доступный вход. Оставьте текущую сессию открытой и проверьте вход по новому ключу во втором Терминале — только после этого меняйте настройки узла.

Отключите вход по паролю

Проверьте конфигурацию sshd и подключаемые файлы для установленной версии macOS. Включите аутентификацию по открытому ключу и отключите аутентификацию по паролю и через клавиатурный интерактивный режим. Не ограничивайтесь изменением одного поля: его значение может переопределяться в другом файле.

PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication no

Перед применением конфигурации выполните команду sudo /usr/sbin/sshd -t для проверки синтаксиса, затем примените изменения по инструкции к инстансу.

Откройте только необходимые порты

Подключайтесь по SSH через порт, указанный в инструкции. Для графического рабочего стола используйте локальный туннель — не открывайте порт 5900 в публичную сеть. Закрывайте временные тестовые службы сразу после использования, проверяйте адрес прослушивания и правила брандмауэра.

lsof -nP -iTCP -sTCP:LISTEN

Runner обычно сам подключается к службе CI. Не открывайте дополнительные входящие порты для управления без необходимости.

Управляйте доступом по пользователям и задачам

Используйте отдельный открытый ключ для каждого участника и отзывайте соответствующий доступ при его уходе. Передавайте runner задачи только из доверенных репозиториев. Ключи проекта храните в защищённых переменных платформы CI, а не в скриптах или файлах проекта.

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

Прикладывайте к запросу в поддержку только обезличенные журналы, номер заказа и шаги с ошибкой. Не отправляйте закрытые ключи, пароли или токены регистрации.

Превратите локальный процесс в готовое удалённое рабочее место

Сначала выберите модель и срок аренды, затем получите данные доступа к инстансу. Начните с проверки SSH и по очереди подключите графический рабочий стол и очередь сборки. Если возникнет проблема с уже работающим инстансом, отправьте через консоль обезличенные сведения для диагностики.