docker login, лестницы backoff при 429/5xx, пороги диска) и блок FAQ. Внутренние материалы без входа: каталог блога, гайд по ускорению Git и Docker pull, главная MacPull.
Сценарии и чеклист рисков
Трансграничный docker pull ломается предсказуемо: лимиты (HTTP 429), кратковременные сбои апстрима (502/503), истечение токена посредине пайплайна, давление на диск из‑за кеша слоёв и рассинхрон TLS или прокси на общих раннерах. Прежде чем крутить параллелизм, зафиксируйте доминирующий сценарий — иначе вы оптимизируете не тот рычаг.
На пуле удалённых Mac симптомы накладываются: джоба выглядит «простаивающей по CPU», пока слои не двигаются; другая джоба нагружает APFS; третья сжигает повторы на один и тот же шард registry. Метки инцидентов вроде много 429, много 5xx, auth или диск помогают на еженедельном разборе двигать один параметр за раз, а не сбрасывать профиль демона целиком.
Отдельный класс рисков — одновременный релиз, когда десятки пайплайнов тянут один и тот же digest: горячие точки на edge-кешах registry без регионального relay почти гарантируют всплеск 429. Зафиксируйте в runbook, при какой доле ошибок вы откатываете concurrency на предыдущую ступень и удлиняете backoff, вместо того чтобы наращивать число ретраев без джиттера.
max-concurrent-downloads голодает соседей и усиливает задержку SSD — относитесь к pull как к общему ресурсу.Таблицы в следующих разделах используйте как критерии приёмки: если после роста concurrency доля 429 растёт — откатите на шаг назад и удлините паузы, не добавляя «слепых» ретраев.
Аутентификация и минимальные права
GHCR обычно требует GitHub PAT с read:packages (classic) или fine-grained токен, ограниченный репозиториями, которые публикуют образы. Частные registry (Harbor, облачные vendor-реестры, self-hosted distribution) заслуживают только pull через robot-аккаунты или короткоживущие OIDC-токены, если платформа это поддерживает.
На общих удалённых Mac не оставляйте долгоживущие учётные данные в world-readable ~/.docker/config.json. Предпочтительнее docker login на время джобы из секрета CI, затем docker logout в trap, либо credential helper с узким ACL в связке ключей пользователя CI.
Сравнивая GHCR и частный registry с точки зрения IAM: у GitHub связаны членство в org, видимость пакетов и scope PAT; у Harbor-стиля чаще проще аудит robot-аккаунтов и политики хранения, но сложнее онбординг для команд, привыкших только к GitHub SSO. Выберите поток с минимальными постоянными привилегиями и единым runbook ротации на весь пул.
- Не используйте личный admin-PAT на всю команду — ротация превращается в инцидент.
- Сужайте токен до минимального namespace пакетов; разделите CI read и release write.
- Ротируйте по календарю короче максимального TTL вендора, чтобы алерты сработали до жёсткого истечения.
Трансграничная сеть и выбор конечных точек registry: таблица
Выбор между ghcr.io и частным relay / зеркалом — это баланс задержки, комплаенса и операционных затрат, а не только «что быстрее». Зафиксируйте основной endpoint и документированный fallback.
| Класс endpoint | Сильные стороны | Слабые стороны | Когда выбирать |
|---|---|---|---|
| GHCR (ghcr.io) | Нативная идентичность GitHub, OIDC в Actions, не нужно своё зеркало. | Межрегиональная задержка; общие лимиты без enterprise-договоров. | Образы уже на GitHub; раннеры близко к edge (US/EU). |
| Частный registry в регионе раннера | Прогнозируемый egress; региональный SLA; опции private link. | Доп. шаги репликации/промоушена из GHCR. | Нужна резидентность данных рядом с парком Mac. |
| Pull-through cache / прокси Harbor | Один тёплый кеш на много джобов при достаточном диске. | Единая точка отказа без кластера; явные политики против cache poisoning. | Много сборщиков на общих слоях; трансграничный канал дорог или нестабилен. |
Задержка — лишь половина картины: стоимость egress и изоляция сбоев критичны, когда один перегруженный канал блокирует все продуктовые линии. Опишите основной путь (например vendor registry в регионе) и холодный fallback (GHCR со строгим concurrency), чтобы дежурство не импровизировало при аварии.
Исполняемая матрица параметров (стартовые значения)
Ниже — базовые профили для удалённого Mac CI. Семь дней замеряйте долю 429, p95 pull и задержку диска, прежде чем переходить в колонку «агрессивный».
| Профиль раннера | Параллельные загрузки слоёв | TTL / обновление токена docker login |
Лестница backoff HTTP 429 (с + джиттер) | Лестница backoff 5xx / connect (с, потолок) | Пороги диска (предупр. / throttle / стоп) |
|---|---|---|---|---|---|
| Консервативный (общий пул, слабый WAN) | max-concurrent-downloads: 2 · BuildKit параллелизм 2 |
Fine-grained PAT 30–60 суток; токен джобы ≤6 ч; login на каждую джобу | Учитывать Retry-After; иначе 4 → 8 → 16 → 32 → 64 (макс. 120) |
1 → 3 → 9 → 27 → 60 (макс. 300) | 80% / 85% / 90% занято на томе данных; держите ≥18 ГБ свободно |
| Сбалансированный (NVMe, стабильный egress) | max-concurrent-downloads: 3–4 · BuildKit параллелизм 4 |
PAT 60–90 суток; ротация по календарю на 50% TTL; еженедельная сверка | 2 → 4 → 8 → 16 → 32 (макс. 90) | 1 → 2 → 6 → 18 → 45 (макс. 180) | 82% / 87% / 92%; держите ≥25 ГБ свободно |
| Агрессивный (выделенный Mac, зеркало в том же регионе) | max-concurrent-downloads: 5–6 только если p95 очереди диска стабилен |
Короткий robot-токен 12–24 ч + автоматическое обновление в полночь | 1 → 2 → 4 → 8 → 16 (макс. 60) — оправдано лишь за вашим кешем | 0.5 → 1 → 3 → 9 (макс. 60) | 85% / 90% / 93% с проактивным docker image prune между джобами |
Заметки по внедрению: задайте max-concurrent-downloads в JSON демона Docker; ограничьте параллелизм слоёв BuildKit через окружение (например BUILDKIT_MAX_PARALLELISM=4), если ваш стек это поддерживает. Закодируйте лестницу backoff в тонкой обёртке вокруг docker pull или в политике ретраев оркестратора, чтобы команды не плодили разные наборы чисел.
Для общей настройки пула (Git + Docker + диск) держите под рукой FAQ: параллельный pull и диск.
Интеграция в CI: шаги и плейсхолдеры команд
Подставьте свои имена оркестратора; плейсхолдеры в ВЕРХНЕМ_РЕГИСТРЕ — для поиска и замены.
- Гейт диска:
df -h "$WORKSPACE_ROOT"— ненулевой код выхода, если занято ≥ THROTTLE_PERCENT из матрицы. - Логин:
echo "$REGISTRY_TOKEN" | docker login REGISTRY_HOST -u REGISTRY_USER --password-stdin - Pull по digest:
docker pull REGISTRY_HOST/NAMESPACE/IMAGE@sha256:IMAGE_DIGEST - Проверка:
docker image inspect REGISTRY_HOST/NAMESPACE/IMAGE@sha256:IMAGE_DIGEST --format '{{.Id}}' - Очистка в trap:
docker logout REGISTRY_HOSTи при необходимостиdocker image prune -f --filter "until=24h", если диск > WARN_PERCENT.
Если стек уже опирается на OpenClaw и Docker, после настройки registry сверьтесь с гайдом по Docker CI на удалённом Mac.
FAQ: залипший pull, сертификаты, прокси
Pull «висит» на слое. Снизьте max-concurrent-downloads, проверьте MTU и HTTP/2 через корпоративный прокси; в обёртке задайте явный low-speed timeout (быстрый fail, затем retry по лестнице 5xx).
Ошибки сертификата. Импортируйте CA registry в системную связку ключей и в доверенные сертификаты Docker; hostname в docker pull должен совпадать с SAN. Смешение доступа по IP и по DNS часто даёт ложное ощущение MITM.
Прокси. Единообразно экспортируйте HTTPS_PROXY для демона и CLI; в allow-list — ghcr.io, хосты *.github.com и ваш частный registry. Если авторизация проходит, а блобы стоят, проверьте прямые URL блобов с curl --http1.1 -I, чтобы выявить «ломающий» middlebox.
Итоги: выбирайте endpoint, ограничивайте concurrency, закладывайте предсказуемую ёмкость
Оставайтесь на GHCR, когда идентичность и публикация уже живут на GitHub и задержка приемлема; переходите к частному registry в регионе или pull-through cache, когда важны комплаенс, устойчивость к всплескам или стоимость трансграничного трафика. Сочетайте токены с минимальными правами со строкой TTL из матрицы, применяйте пороги диска до pull и централизуйте backoff при 429/5xx, чтобы ретраи не давили стадом.
Нужен выделенный Apple Silicon с местом под кеши и ручную настройку демона — откройте тарифы, оформите узел на странице покупки / аренды, загляните в центр помощи или продолжайте читать технический блог и главную — всё без обязательного входа.
Удалённый Mac CI с запасом под настройку registry
Узлы класса Mac Mini — SSH/VNC, предсказуемый диск и политики под ваш контроль. Сравните планы или читайте гайды; вход не обязателен.