Разработчики и пользователи CI, которые часто тянут код и зависимости на удалённом Mac, нередко сталкиваются с таймаутами и обрывами. В этом FAQ — исполняемые параметры и шаги для Git, Homebrew и npm; сравнение своего зеркала, прокси и публичного зеркала; краткие итоги и рекомендации. Используйте материал как чеклист для стабильной трансграничной загрузки. Для массовой установки пакетов Python через uv и зеркала PyPI см. матрицу uv и lockfile.

Почему на удалённом Mac Git, Homebrew и npm часто дают таймауты и обрывы

Три основные причины:

  • Большая RTT и потери пакетов. Трансграничные или удалённые каналы добавляют задержку и потери. Таймауты клиентов по умолчанию короткие; один медленный участок может прервать передачу.
  • Маленькие буферы и отсутствие повторов. У Git по умолчанию небольшой http.postBuffer для крупных push; HTTP-клиенты часто не повторяют запрос при временных сбоях. У Homebrew и npm похожие умолчания.
  • Нет переиспользования соединения. Повторные SSH-подключения (например для Git по SSH) каждый раз пересогласовываются. Без ControlPersist каждая операция clone или fetch платит полной ценой установки соединения и сильнее страдает от обрывов в середине передачи.

Раннеры CI на удалённом Mac усиливают проблему: много джоб параллельно клонируют и ставят зависимости, поэтому таймауты и повторы критичны для стабильности. Трансграничные команды чаще всего сталкиваются с этим, когда узел Mac и апстрим Git/npm/Homebrew находятся в разных регионах.

Git: исполняемые параметры таймаута и повтора (http.postBuffer, timeout, ControlPersist)

Используйте эти настройки глобально или для репозитория, чтобы снизить таймауты и улучшить поведение при повторах.

Буфер HTTP и правила низкой скорости (таймаут):

git config --global http.postBuffer 524288000
git config --global http.lowSpeedLimit 1000
git config --global http.lowSpeedTime 60

Пояснение: postBuffer 500 МБ для крупных push; lowSpeedLimit (байт/с) и lowSpeedTime (секунды) вместе задают таймаут передачи (например прервать, если < 1000 байт/с в течение 60 с).

Опционально — таймаут HTTP (секунды): git config --global http.version HTTP/1.1 может помочь за частью прокси. Для жёсткого таймаута: git config --global http.lowSpeedTime 120 (увеличьте при очень медленных каналах). В CI задавайте эти параметры через git config в джобе или в глобальном конфиге образа раннера.

Переиспользование SSH (ControlPersist): добавьте в ~/.ssh/config для хоста (например Host github.com):

Host github.com
  ControlMaster auto
  ControlPath ~/.ssh/sockets/%r@%h-%p
  ControlPersist 600

Создайте каталог: mkdir -p ~/.ssh/sockets. Новые соединения переиспользуют мастер-сессию 600 секунд, что снижает переподключения и сбои в середине clone.

Homebrew и npm: настройка повторов и таймаутов по шагам

Homebrew. Задайте число повторов и при необходимости быстрый core remote:

export HOMEBREW_CURL_RETRIES=5
export HOMEBREW_CORE_GIT_REMOTE="https://github.com/Homebrew/homebrew-core.git"
# Опционально: зеркало
# export HOMEBREW_BOTTLE_DOMAIN="https://mirror.example.com"

Добавьте экспорты в ~/.zshrc или в окружение CI. На нестабильных сетях увеличьте HOMEBREW_CURL_RETRIES.

npm. Повторы и таймауты (в .npmrc или через переменные окружения):

fetch-retries=5
fetch-retry-mintimeout=20000
fetch-retry-maxtimeout=120000
fetch-timeout=300000

Время в миллисекундах. Для CI часто важнее зеркало реестра или прокси, чем только эти параметры; комбинируйте с таблицей ниже. Задайте их в проекте в .npmrc или в окружении CI, чтобы каждый запуск использовал одну и ту же политику повторов и таймаутов.

Своё зеркало vs прокси vs публичное зеркало: сравнение

Выбор зависит от сценария, возможностей по сопровождению и затрат.

Вариант Лучше всего для Скорость / стабильность Затраты / поддержка
Публичное зеркало Быстрое решение без своей инфраструктуры Хорошо, если регион совпадает Бесплатно; возможны лимиты или ограничения SLA
Прокси (HTTP/SOCKS) Снятие блокировок и единая точка выхода Зависит от расположения и пропускной способности прокси Затраты на прокси; минимум настроек в приложениях
Своё зеркало Полный контроль, интенсивный CI Максимум при близости к раннеру Хранилище и синхронизация; сопровождение на вас

Для удалённого Mac в CI: начните с публичного зеркала или прокси, если раннер трансграничный; переходите на своё зеркало при необходимости максимальной стабильности и возможности запускать задачи синхронизации. Подробнее: гид по зеркалу Git и прокси и ускорение трансграничной загрузки.

Итоги и рекомендации

  • Увеличьте Git http.postBuffer, задайте lowSpeedLimit и lowSpeedTime, включите SSH ControlPersist для переиспользования соединения.
  • Задайте Homebrew HOMEBREW_CURL_RETRIES и при необходимости core remote или зеркало bottle; для npm — fetch-retries и таймауты (и зеркало реестра при необходимости).
  • Выберите зеркало, прокси или своё зеркало по таблице выше; комбинируйте с shallow clone или кешем где возможно (см. статью про стратегию кеша).
  • Краткий чеклист: буфер и lowSpeed* для Git заданы; SSH ControlPersist настроен; повторы Homebrew и повторы/таймауты npm заданы; зеркало или прокси выбраны и применены. После каждого изменения перезапускайте падающий clone или установку для проверки.

Стабильный узел удалённого Mac снижает количество сбоев при загрузке и падений CI. MacPull предоставляет выделенные инстансы Mac Mini (в том числе M4) с SSH/VNC — вы получаете фиксированное окружение и предсказуемую сеть в выбранном регионе. Примените чеклист выше на своём раннере, затем ознакомьтесь с тарифами и оформлением аренды или главной — просмотр без входа. Ещё материалы: блог.

Стабильный удалённый Mac для Git, Homebrew и npm

Арендуйте Mac Mini M4 для надёжной загрузки кода и зависимостей и стабильного CI. SSH/VNC включены. Тарифы и оформление аренды — без входа. Или читайте другие статьи в блоге.

Стабильный узел Mac
Доступ SSH/VNC
Готов к загрузке