На общих Apple Silicon-узлах типичная авария выглядит одинаково: ночью кто-то стянул новый чекпоинт, диск заполнился до предела, утром пайплайны сыпятся в ENOSPC, а symlink на внешний том «сломался» после перезагрузки из‑за другого имени в /Volumes. Ниже — воспроизводимая схема: один канонический путь для job’ов, физическое многоуровневое хранение, окно очистки через LaunchAgent и явные пороги диска, чтобы автоматизация оставалась предсказуемой неделю за неделей.
Предусловия и разделение среды
Начните с сервисной учётной записи macOS (не общего «админского» логина), под которой крутятся LaunchAgent и SSH-сессии CI: так проще согласовать umask, владельцев каталогов и переменные launchd. Даже на одном физическом SSD заранее опишите два логических уровня: горячий — низкая задержка чтения мелких шардов, тёплый — дешёвый объём для архивов и редких весов.
Зафиксируйте все переменные, которые ваша сборка OpenClaw и рантайм моделей читают из окружения: часто это домашний конфиг плюс каталоги вроде HF_HOME, OLLAMA_MODELS или аналоги для llama.cpp — сверяйте имена с гайдом по установке и типичным сбоям, чтобы у коллег дерево каталогов совпадало побайтно.
- Закрепите Node 22+ и semver OpenClaw; выпишите их во внутренний runbook.
- Создайте
~/Library/Logs/OpenClawCache/с правами755для сервисного пользователя. - Вынесите переменные кеша в
EnvironmentVariablesplist — без секретов в Git. - Проверьте
diskutil apfs listи стабильность точек монтирования после reboot (избегайте «плавающих» имён вродеUntitled).
Пути кеша и схема многоуровневого хранения
Выберите один канонический путь, который всегда используют скрипты CI (например ~/.openclaw/cache/models). Реальные блобы держите в корнях уровней, например /Volumes/FastSSD/oc-models и /Volumes/BulkDisk/oc-models-archive. Каталог по каноническому пути замените symlink на горячий том — тогда в pipeline не нужно хардкодить буквы дисков.
# Пример: канонический путь → быстрый том (сначала остановите задачи OpenClaw) mkdir -p "/Volumes/FastSSD/oc-models" rm -rf "$HOME/.openclaw/cache/models" # сделайте бэкап, если это был каталог ln -s "/Volumes/FastSSD/oc-models" "$HOME/.openclaw/cache/models" readlink -f "$HOME/.openclaw/cache/models"
Перенос с тёплого на горячий уровень выполняйте rsync -a --partial --inplace или атомарным mv в пределах одного тома. Обратная демоция — только после фиксации контрольных сумм или манифеста версии.
| Решение | Горячий уровень (внутренний) | Тёплый уровень (внешний / архив) |
|---|---|---|
| Цель по задержке | Низкая p95 на мелких чтениях | Допустимы редкие pull |
| Symlink с канонического пути | По умолчанию для активных моделей | Только если горячий том заполнен |
| Риск мультитенантного раннера | Отдельный symlink на пользователя | Орг. зеркало только для чтения |
Чеклист структуры кеша
- Symlink существует после холодной перезагрузки (проверка
readlinkв префлайте CI). - Временные и финальные файлы на одном томе, чтобы не ловить ошибки cross-device rename.
- Имена lockfile/манифеста привязаны к пинам версий — скрипты очистки знают эти файлы.
- Деревья с тысячами мелких файлов учтены отдельно от пары мульти-ГБ весов (inode vs объём).
Расписание очистки и ротация логов
Не удаляйте каталоги вслепую, пока процесс держит mmap или открытые дескрипторы. Задайте окно обслуживания, когда CI обычно простаивает: на пулах удалённых Mac часто берут локальные 02:00–04:00. На macOS удобнее пользовательский LaunchAgent с StartCalendarInterval (час и минута), чем crontab: наследуется сессия пользователя, проще аудит по арендаторам. Если политика команды уже строится на cron — явно пропишите PATH и пользователя, иначе скрипт «тихо» не найдёт бинарники.
| Планировщик | Когда уместен | Риск |
|---|---|---|
| LaunchAgent + StartCalendarInterval | Per-user раннеры, доступ к связке ключей GUI | Дубли plist при правках нескольких админов |
| crontab | Наследие Linux-документации | Другой PATH, нет GUI-сессии, дрейф прав |
| SSH-скрипт из CI | Политика хранится в Git | Нужен backoff при пересечении часовых поясов |
Для ротации логов пишите stdout/stderr агента в файлы с датой под ~/Library/Logs/OpenClawCache/ и добавьте строфу newsyslog или еженедельный gzip в том же окне. Храните хотя бы неделю stdout очистки — иначе «пропажи» в кеше не объяснить постфактум.
#!/bin/bash set -euo pipefail # Пример: вызывается из plist после проверки простоя (опционально pgrep) find "$HOME/.openclaw/cache/tmp" -type f -mtime +3 -delete find "$HOME/.openclaw/cache/tmp" -type d -empty -delete
Квоты и пороги заполнения диска
Соедините идею квоты с простым разбором df в том же патруле, что следит за шлюзом. Практичная матрица для общих раннеров 2026 года:
| Заполнение | Действие | Канал алерта |
|---|---|---|
| ≥ 80% | Уведомление + плановая очистка в следующем окне | Slack / webhook, уровень INFO |
| ≥ 85% | Запрет новых «экспериментальных» загрузок моделей | Pager, WARNING |
| ≥ 90% | LRU на tmp + демоция на тёплый уровень по политике | Pager, CRITICAL |
Если на томе доступны мягкие квоты, закладывайте запас ниже «маркетинговой» ёмкости: снимки APFS и служебные метаданные незаметно съедают гигабайты. Всегда смотрите df -h и df -i: исчерпание inode выглядит как «диск полон», хотя одного большого файла для удаления нет.
Повторы при сбоях и устранение неполадок
Оборачивайте загрузки в ограниченный экспоненциальный backoff (например 5 с, 15 с, 45 с) с джиттером, чтобы стая Mac не долбила одно зеркало синхронно. При ошибке пройдитесь по короткому списку:
- ENOSPC / «No space left» — смотрите том цели symlink, а не только
$HOME. - Stale file handle — перемонтируйте внешний диск; проверьте порядок разблокировки APFS при старте.
- HTTP 429 / 5xx — политика регистра: снизьте параллелизм, уважайте
Retry-After. - Permission denied — сверьте владельца после копирования машины, затем
openclaw doctorпосле обновления macOS.
Стабильность шлюза сверяйте с паттернами восстановления и повторов, чтобы скрипты кеша не воевали с «мигающим» демоном.
Чеклист приёмки перед продом
- После холодной загрузки symlink разрешается до запуска любых job’ов.
- Скрипт патруля диска печатает понятный процент использования и падает с ненулём при >90% на быстром томе.
- Два успешных dry-run очистки заархивированы с номером тикета; деструктивный режим включён только после них.
- CI ссылается только на канонический путь — нет дубликатов с «голыми» путями монтирования.
- В runbook описан откат: смена symlink на тёплый уровень за ≤5 минут.
Итоги и куда двигаться дальше
Кратко: предсказуемые загрузки моделей для OpenClaw на удалённом Mac строятся на одном каноническом пути, symlink на горячий том, документированном тёплом архиве, ночном окне очистки через LaunchAgent, ротации логов и явных порогах заполнения диска. Автоматизацию оформляйте как часть CI: версионируйте plist, гоняйте dry-run и разводите сетевые повторы от аварий «диск забит».
Дополнительно (без входа): центр помощи MacPull, тарифы, оформление аренды, оглавление блога; из серии OpenClaw — автоматизация предзагрузки ClawHub и усиление безопасности шлюза.
Выделенный узел Apple Silicon с запасом по NVMe и понятными окнами обслуживания — та база, на которой многоуровневый кеш остаётся воспроизводимым из спринта в спринт.
Нужен запас диска под модели?
Арендуйте Mac mini с быстрым NVMe и стабильным SSH: страницы блога, помощи и оформления аренды открываются без логина.