Аудитория: команды на удалённом Mac, где OpenClaw соседствует с Go и часто падает go mod download из‑за egress или первого зеркала GOPROXY. Дано: openclaw onboard/doctor, шаблоны health-проб с потолком повторов, обёртка ротации GOPROXY и логи в CI без SSH. См. матрицу Go modules, health LaunchAgent, повторы после сбоев — без входа.
  • Тихий отказ первого хопа: корпоративное зеркало отвечает слишком долго, Go обрывает попытку до того как цепочка через запятую успеет перейти ко второму прокси, потому что на уровне job не было повторов с разумным backoff.
  • Расхождение окружения: разработчик экспортирует GOPROXY в ~/.zshrc, а агент CI и задания launchd стартуют с урезанным окружением и продолжают бить в неверный endpoint.
  • Слепые падения: оркестратор показывает только код выхода без указания какой URL ломается, и каждый инцидент превращается в ручной поиск по логам на раннере.

① Почему на удалённом Mac ломается go mod download

Загрузка модулей — DNS, TCP, TLS, HTTP и кеш. На общих Apple Silicon раннерах всплеск pull может голодать первый прокси при здоровых зеркалах; сертификаты у интерактивного пользователя и сервиса расходятся — TLS ошибки выглядят как «битый модуль».

openclaw doctor и go env — одно семейство предпроверок перед Go: PATH, права, сеть. Между job комбинируйте пробы GOPROXY с логами и порогами алертов без tight loop перезапусков.

② Чеклист установки, настройки и разбора типовых сбоев

Выполняйте сверху вниз на стендовом Mac до переноса тех же plist и YAML в продакшен пул.

  • База. Node 22+, OpenClaw в PATH сервиса, без интерактивного sudo в CI.
  • Onboard/doctor на образе; устранить предупреждения прав и конфигов.
  • Go. Пин go version; в начале job — go env GOPROXY GOPRIVATE GONOPROXY GOSUMDB GOMODCACHE.
  • Проба. curl с таймаутами по каждому URL GOPROXY, статус и время в лог.
  • Обёртка. go mod download только из скрипта с сменой цепочки и лимитом попыток.
  • LaunchAgent опционально: интервал + ThrottleInterval.
  • Логи. tee в артефакт; маскировать секреты.
  • Алерты. Два провала пробы подряд ~5 мин или две ротации GOPROXY в одном job.

③ Шаблоны скриптов: проба, backoff и обёртка загрузки

Проба проверяет TCP/TLS/HTTP; путь модуля подставьте под зеркало. Три попытки с паузами 2·4·8 с на URL (~25 с на хоп) — дешевле красного CI.

#!/usr/bin/env bash
set -euo pipefail
# goproxy-probe.sh — печатает первый живой базовый URL или код 1
CANDIDATES=(
  "https://corp-go.example.com"
  "https://goproxy.cn"
  "https://proxy.golang.org"
)
probe_one() {
  local url="$1" attempt=1 delay=2
  while [[ $attempt -le 3 ]]; do
    if curl -fsS --connect-timeout 8 --max-time 20 -o /dev/null \
        "$url/github.com/golang/glog/@v/v1.2.0.info" \
        || curl -fsS --connect-timeout 8 --max-time 20 -o /dev/null "$url/"; then
      echo "$url"
      return 0
    fi
    sleep "$delay"
    delay=$(( delay * 2 ))
    attempt=$(( attempt + 1 ))
  done
  return 1
}
for c in "${CANDIDATES[@]}"; do
  if base=$(probe_one "$c"); then
    echo "GOPROXY_PRIMARY=$base"
    exit 0
  fi
done
echo "all GOPROXY candidates failed" >&2
exit 1

Обёртка: GOPROXY_PRIMARY → цепочка по политике → go mod download; при ошибке — go env -json и запасная цепочка; не более двух ротаций за job.

#!/usr/bin/env bash
set -euo pipefail
LOG="${RUNNER_TEMP:-/tmp}/gomod-$(date +%s).log"
export GOPROXY="$(./goproxy-probe.sh | sed -n 's/^GOPROXY_PRIMARY=//p'),https://proxy.golang.org,direct"
echo "Using GOPROXY=$GOPROXY" | tee -a "$LOG"
if ! go mod download -x 2>&1 | tee -a "$LOG"; then
  export GOPROXY="https://proxy.golang.org,direct"
  echo "Fallback GOPROXY=$GOPROXY" | tee -a "$LOG"
  go mod download -x 2>&1 | tee -a "$LOG"
fi

Пример GitHub Actions: если задан GITHUB_STEP_SUMMARY, добавьте короткий блок с хвостом лога чтобы рядом с красной галочкой было видно какой хоп отвалился — без входа в отдельную консоль.

if [[ -n "${GITHUB_STEP_SUMMARY:-}" ]]; then
  {
    echo "### go mod fetch"
    echo '```'
    tail -n 40 "$LOG"
    echo '```'
  } >> "$GITHUB_STEP_SUMMARY"
fi

④ Ручной export против автоматического выбора прокси

Подход Плюсы Риски Когда уместен
Ручной export GOPROXY=... в профилях shell Быстро для одной интерактивной сессии на ноутбуке CI и демоны не видят переменную; плохо переживает аварию зеркала Только отладка вручную
Статическая цепочка в YAML CI Прозрачна в истории git Нет адаптивного failover при деградации одного хопа Стабильный egress и одно доверенное зеркало
Скрипт пробы плюс обёртка как в этой статье Логирует победивший хоп; ограниченные повторы; не требует login shell Нужно сопровождать список URL и тестовых путей Общие пулы удалённых Mac и трансграничные раннеры

Комплаенс: GOPRIVATE/GONOPROXY до расширения цепочек — см. матрицу выше.

⑤ Короткие факты для дизайн-дока

попытки с backoff 2·4·8 с; 2 ротации цепочки за job; один пользователь для пробы и CI (keychain/PAC).

⑥ FAQ

Пробы ОК, go mod download нет?

GOSUMDB, корни TLS, приватные пути в прокси; go mod download -x.

Шторм LaunchAgent?

ThrottleInterval ≥60 с, логи в ~/Library/Logs, алерт только на серии провалов.

Один аккаунт для пробы и CI?

Да — иначе keychain/PAC дают ложный «работает в SSH».

Итог

GOPROXY — как внешняя зависимость: таймауты, ограниченный backoff, экспорт цепочки в том же процессе что и go mod download, логи в CI; база — чистый doctor OpenClaw.

Дальше без входа в аккаунт: главная, оформление покупки, центр помощи, оглавление блога.

Продолжить чтение: оглавление блога и материалы по OpenClaw по ссылкам в начале статьи.

Удалённый Mac для OpenClaw и Go CI

Mac mini, SSH, быстрый диск и предсказуемый egress под ваши пробы GOPROXY. Главная, покупка, помощь и блог открываются без регистрации.