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 до расширения цепочек — см. матрицу выше.
⑤ Короткие факты для дизайн-дока
3× попытки с backoff 2·4·8 с; 2 ротации цепочки за job; один пользователь для пробы и CI (keychain/PAC).
⑥ FAQ
go mod download нет?
GOSUMDB, корни TLS, приватные пути в прокси; go mod download -x.
ThrottleInterval ≥60 с, логи в ~/Library/Logs, алерт только на серии провалов.
Да — иначе keychain/PAC дают ложный «работает в SSH».
Итог
GOPROXY — как внешняя зависимость: таймауты, ограниченный backoff, экспорт цепочки в том же процессе что и go mod download, логи в CI; база — чистый doctor OpenClaw.
Дальше без входа в аккаунт: главная, оформление покупки, центр помощи, оглавление блога.
Продолжить чтение: оглавление блога и материалы по OpenClaw по ссылкам в начале статьи.