Этот runbook описывает, как запускать воспроизводимый пакетный инференс через Ollama на арендованном удалённом Mac, оставляя рядом OpenClaw для агентов и автоматизации. Вы поставите оба сервиса с разумными умолчаними, направите API через небольшой обратный прокси вместо «голых» портов, ограничите конкуренцию на уровне очереди и сервера и добавите деградацию с повторами, чтобы ночные джобы переживали кратковременную перегрузку. Точки входа без входа в аккаунт: главная, каталог заметок, справка.
Цель и рекомендуемая схема
Пакеты ломаются, когда параллелизм превышает VRAM, модели постоянно выгружаются, а клиенты сдаются после первого таймаута. На удалённом Mac разумно зафиксировать роли так:
- Ollama —
127.0.0.1:11434(только инференс). - OpenClaw Gateway —
127.0.0.1:18789(агенты; см. официальные материалы по Docker и CLI). - Край — Caddy/Nginx с одним TLS-именем в VPN или SSH -L с ноутбука.
- Воркер очереди — ограничивает число задач в полёте и задаёт бэкофф.
Так вы отделяете «интерактивных» агентов от тяжёлого пакетного скоринга и можете независимо перезапускать или ограничивать каждый контур.
Установка Ollama на macOS (удалённый Mac)
Установите движок и заранее стяните модель, которую будете гонять пакетом:
curl -fsSL https://ollama.com/install.sh | sh
ollama pull llama3.2
Сохраняйте привязку к loopback, если специально не задаёте OLLAMA_HOST. Для настроек после перезагрузки положите OLLAMA_NUM_PARALLEL в профиль shell или plist launchd. Дымовой тест: curl -fsS http://127.0.0.1:11434/api/tags. Клиенты в стиле OpenAI могут использовать /v1/chat/completions на том же порту. На Apple Silicon нативная установка обычно быстрее контейнера для Metal.
OpenClaw Gateway: что важно при совместной установке
Два поддерживаемых пути: глобальный CLI (Node 24 или 22.16+) или Docker со скриптом ./docker-setup.sh в клоне openclaw/openclaw. Типичный сценарий на Mac: npm install -g openclaw@latest, затем openclaw onboard --install-daemon и openclaw gateway --port 18789 --verbose; либо Docker с примонтированным конфигом и workspace. Ollama лучше держать нативным ради Metal; инструменты OpenClaw пусть бьют в 127.0.0.1:11434. Проверка шлюза: curl -fsS http://127.0.0.1:18789/healthz. Усиление, Docker и типовые сбои — в связанной заметке OpenClaw: Docker, прокси и удалённый Mac.
Маршрутизация API: одно имя, два upstream
Если клиенты в VPN нуждаются в HTTPS к обоим стекам, завершите TLS один раз и разведите по пути (идея для Caddy):
inference.internal.example.com {
route /v1/* {
reverse_proxy 127.0.0.1:11434
}
route /openclaw/* {
reverse_proxy 127.0.0.1:18789
}
}
Добавьте ограничение частоты на прокси (limit_req в Nginx или rate-limit в Caddy), чтобы погасить всплески клиентов. Нет публичного hostname — используйте ssh -L для 11434 и 18789 вместо открытия фаервола наружу.
Решения по маршрутизации
| Трафик | Назначение | Почему |
|---|---|---|
Пакет /api/generate или OpenAI-шим |
127.0.0.1:11434 |
Минимальная задержка; держите за loopback или аутентифицированным прокси. |
| UI шлюза и WS control plane | 127.0.0.1:18789 |
Здоровье OpenClaw — /healthz; при отладке — туннель. |
| Недоверенный интернет | По умолчанию никуда | Сначала VPN, SSH или mTLS, затем публикация любого из портов. |
Скрипт очереди: потолок параллелизма и безопасный JSON
Храните по одному промпту на строку в prompts.txt. Ниже python3 нужен только для корректной сборки JSON. Параллелизм — через небольшой bash job pool на штатном bash macOS (без GNU xargs -P).
#!/usr/bin/env bash
set -euo pipefail
OLLAMA_URL="${OLLAMA_URL:-http://127.0.0.1:11434}"
MODEL="${MODEL:-llama3.2}"
MAX_JOBS="${MAX_JOBS:-2}"
PROMPTS="${1:?path to prompts.txt}"
mkdir -p out failed
run_one() {
local i="$1" line="$2"
local body try=0 delay=1
body="$(python3 -c 'import json,sys; print(json.dumps({"model":sys.argv[1],"prompt":sys.argv[2],"stream":False}))' "$MODEL" "$line")"
while (( try < 4 )); do
if curl -fsS --max-time 600 -H 'Content-Type: application/json' \
-d "$body" "$OLLAMA_URL/api/generate" -o "out/resp-$i.json"; then
return 0
fi
sleep "$delay"
delay=$(( delay * 2 ))
try=$(( try + 1 ))
done
printf '%s\n' "$line" >> "failed/prompts-$i.txt"
return 1
}
export -f run_one
export OLLAMA_URL MODEL
i=0
while IFS= read -r line || [ -n "${line-}" ]; do
i=$((i+1))
while (( $(jobs -rp | wc -l | tr -d ' ') >= MAX_JOBS )); do
sleep 0.2
done
( run_one "$i" "$line" ) || true
done < "$PROMPTS"
wait
MAX_JOBS не поднимайте выше того, что позволяют OLLAMA_NUM_PARALLEL и доступная unified memory. На классе 16 ГБ для 7B–8B начните с 1, затем увеличивайте, наблюдая Memory Pressure в Мониторинге системы или vm_stat.
Лимиты ресурсов: Ollama, macOS и драйвер пакета
Слоите ограничения, чтобы одна «убийственная» задача не вытеснила все модели из RAM:
- Ollama —
OLLAMA_NUM_PARALLELзадаёт максимум одновременных запросов на сервере; при частой смене моделей смотритеOLLAMA_MAX_LOADED_MODELS. - Очередь —
MAX_JOBS(или пул в Python) — клиентский предохранитель; он должен быть не больше серверного параллелизма с учётом cron и других потребителей. - macOS — длительные пакеты можно обернуть отдельным пользователем или заданием
launchdсSoftResourceLimits/HardResourceLimitsпо памяти, если нужен жёсткий порог. - OpenClaw — помните про песочницы агентов и всплески инструментов; разнесите по времени cron, чтобы автоматизации OpenClaw и пакеты Ollama не пиковали одновременно.
На арендованном Mac заранее заложите запас диска под кеш моделей и логи; при нехватке места Ollama и шлюз ведут себя непредсказуемо.
Деградация и повторы
Пример воркера уже повторяет сетевые сбои с экспоненциальным бэкоффом. Расширьте идею на уровень модели:
- Основная модель — полный контекст и качество.
- Запасная — меньшая квантовка или прожорливость при OOM-подобных ответах или серии 500.
- Усечение — ограничьте длину промпта на последней попытке и залогируйте id задачи.
- Dead letter — то, что не прошло после лимита попыток, падает в
failed/для разбора днём.
Всегда ограничивайте суммарное число попыток (в примере — четыре), иначе «ядовитый» промпт заблокирует всю очередь. Джиттер к sleep снижает синхронные штормы при восстановлении сервиса.
FAQ
Слушать ли Ollama на всех интерфейсах? Только если осознанно принимаете риск. Предпочтительнее loopback плюс SSH или VPN и аутентификация перед любым маршрутизируемым адресом.
Где жить лимитам конкуренции? В Ollama (OLLAMA_NUM_PARALLEL), на обратном прокси (rate limit) и в очереди (MAX_JOBS). Вместе они гасят скрытую перегрузку.
Как OpenClaw связан с Ollama? OpenClaw — шлюз и агенты; Ollama — локальный HTTP LLM. Сосуществуют на одном Mac, но не должны делить один процесс-контейнер без необходимости.
Что при таймаутах? curl --max-time, бэкофф, опционально меньшая модель и dead-letter — без бесконечных циклов.
Как проверить оба сервиса? curl на /api/tags и /healthz; снаружи — только туннель SSH, не открывайте порты в интернет по умолчанию.
Итог
Надёжный пакетный инференс Ollama на арендованном удалённом Mac строится из соседнего OpenClaw для оркестрации, loopback для инференса, обратного прокси только там, где нужен HTTPS, и согласованных лимитов параллелизма на сервере, краю и в очереди. Слой повторов и запасных моделей превращает ночной прогон в отчёт с явными неудачами, а не в зависший пайплайн. Для сравнения ёмкости и оформления без входа в кабинет откройте тарифы, заказ и справку.