Совместный OpenClaw с несколькими skill-пакетами на арендованном удалённом Mac — это задача разделения ёмкости: один шумный проект может «съесть» лимиты поставщика API и охладить остальных. Решение — слой бюджета на шлюзе с независимыми счётчиками по арендатору и проекту, явными предохранителями (circuit breaker), зафиксированной лестницей деградации и аудитом, объясняющим кто и сколько потратил. Ниже — компактный runbook после поднятия шлюза (см. Docker, прокси и усиление) и при желании локального инференса (OpenClaw и Ollama); песочница и egress остаются по руководству по навыкам, здесь — расход, токены и сдерживание отказов.
| Критерий | Шлюз, прокси или sidecar | Логика только в skill-пакете |
|---|---|---|
| Защита от обхода | Высокая: единая точка перед OpenClaw | Низкая: новый инструмент легко забыть обернуть |
| Аудит и корреляция | Единый формат логов по всем пакетам | Фрагментированные журналы по репозиториям |
| Мультитенантность | Естественные ключи tenant и project на границе | Риск дрейфа соглашений между пакетами |
Модель бюджета и измерения счётчиков
Стройте измерения так, чтобы каждую строку журнала можно было отнести к владельцу затрат. На аренде диски и образы переиспользуются — атрибуция в логах заменяет недостающую долгую локальную историю.
- Арендатор или центр затрат — стабильный идентификатор (tenant=acme) из CI или сессии шлюза; каждое событие учёта должно его нести.
- Проект или skill-пакет — независимые счётчики на репозиторий или bundle (project=mobile-ci, pack=release-notes), чтобы один пакет не выжигал квоту другого.
- Поверхность upstream — раздельные бюджеты на чат-дополнения, эмбеддинги, веб-поиск и loopback-модели; деградация становится точной: дорогой маршрут режется без остановки дешёвых шагов.
- Временные окна — сочетайте всплеск (например запросов в минуту) с бюджетом (час или сутки): первое защищает термику и пул соединений на Mac, второе — линию финансов.
- Единица учёта — на маршрут одна первичная метрика: HTTP-запросы к поставщику, вызовы инструментов OpenClaw, оценка USD из метаданных или токены prompt и completion. Две метрики в одном счётчике путают дежурных; при необходимости ведите параллельные ряды с одинаковыми метками.
Реализуйте лимиты на обратном прокси, API-шлюзе или лёгком sidecar перед OpenClaw. Навыкам выдавайте уже ограниченные краткоживущие учётные данные с минимальными привилегиями, без права открыть новый платный канал в обход шлюза. Состояние счётчиков храните в Redis или аналоге, если воркеров шлюза несколько; чисто in-memory допустимо лишь для экспериментов на одном процессе.
Шаблоны конфигурации и переменных окружения
Храните шаблоны рядом с compose или plist launchd. Секреты — в защищённом env на арендованном хосте, не в git. Имена иллюстративны; сопоставьте их с Envoy, nginx+lua, Caddy или маленьким sidecar на Go.
.env.budget.example (перед публикацией снаружи удалите чувствительное):
# Бэкенд счётчиков
BUDGET_REDIS_URL=redis://127.0.0.1:6379/0
BUDGET_KEY_PREFIX=oc:gw:2026
# Значения по умолчанию, если клиент не передал заголовок проекта
BUDGET_DEFAULT_TENANT=shared-lab
BUDGET_DEFAULT_PROJECT=misc
# Суточный потолок по арендатору (USD по заголовкам usage или вашей тарифной таблице)
BUDGET_TENANT_DAILY_USD_MAX=200
BUDGET_PROJECT_DAILY_USD_MAX=50
# Всплеск: запросов в минуту на пару (tenant, project)
BUDGET_RPM_BURST=60
# Предохранитель: окно по доле ошибок
FUSE_WINDOW_SEC=60
FUSE_ERROR_RATIO_OPEN=0.5
FUSE_COOLDOWN_SEC=120
# Аудит
BUDGET_LOG_SAMPLE_RATE=1.0
BUDGET_LOG_REDACT_HEADERS=Authorization,X-Api-Key
Минимальные привилегии токенов: выдавайте отдельные ключи поставщика на арендатора или репозиторий CI и маппируйте их в метаданные шлюза, чтобы счётчики подцеплялись автоматически. Токен аутентификации шлюза OpenClaw (часто порт 18789) отвечает только за транспорт — не смешивайте его с ключами вендора модели и с «токенами» в смысле биллинга LLM. В runbook зафиксируйте три понятия: auth шлюза, ключ поставщика, расход по токенам или USD.
Контракт заголовков для внутренних вызовов (люди и CI): в проде требуйте X-Tenant-Id и X-Project-Id на периметре; отклоняйте запросы без меток, чтобы каждое решение было пригодно для аудита.
Предохранители и стратегии деградации
Предохранитель срабатывает при деградации здоровья или экономики сервиса; деградация — это поведение, пока предохранитель открыт. Пропишите его заранее, иначе под пейджером операторы импровизируют.
| Условие (срабатывание) | Детекция | Поведение при деградации | Поля аудита |
|---|---|---|---|
| Суточный USD проекта выше потолка | Скользящая сумма по заголовкам usage или тарифу | HTTP 429 и Retry-After; по желанию очередь для асинхронного повтора | tenant, project, window, spent, cap |
| Превышен всплеск RPM | Скользящий счётчик по ключу | Сброс нагрузки: сначала низкоприоритетные классы маршрутов | route_class, rpm, limit |
| Серия 5xx и таймаутов upstream | Доля ошибок за FUSE_WINDOW_SEC | Открытый предохранитель: кэшированный ответ, локальная модель или статический режим degraded | error_ratio, upstream, fuse_state |
| Глобальный потолок арендатора (несколько проектов) | Сумма по проектам под одним tenant | Жёсткая остановка арендатора; остальные не затронуты | tenant_spend, projects_included |
| Давление диска или очереди на Mac | Локальные метрики scratch, глубина заданий launchd | Снижение конкурентности; пауза для класса не-CI трафика | host, metric, action |
После закрытия предохранителя (истёк cooldown и упала доля ошибок) наращивайте трафик полуоткрытым зондом: пускайте долю запросов до полного восстановления. Каждый переход состояния пишите в журнал для разбора инцидентов — особенно на переиспользуемых дисках аренды, где длинная локальная история ненадёжна.
Согласование с частотой вызовов CI
Непрерывная интеграция классически ломает бюджет: десятки workflow, матрицы сборок и «агент на каждый push» синхронизируются по часу и бьют в одни счётчики.
- Отдельные ключи для CI — маппируйте ключи поставщика или подключения шлюза на tenant=ci и отдельный project на репозиторий; для всплесковых пайплайнов дневной USD у CI может быть ниже, чем у интерактива.
- Джиттер и сдвиг расписаний — избегайте cron 0 * * * * для хуков агента; используйте случайные смещения или группы concurrency, чтобы арендованный Mac видел более ровный поток.
- Идемпотентность — прокидывайте стабильный Idempotency-Key или SHA коммита через шлюз, чтобы повтор после 429 не утраивал оплату одной логической операции, если поставщик уже принял первый запрос.
- Разделение узлов — если мобильные релизные сборки и пакетный LLM делят один Mac, вынесите их на два арендованных узла или разнесите по окнам; бюджетный слой помогает, но предел всё равно задают CPU и uplink.
Согласуйте это с лимитами в YAML CI (группы concurrency, дорогие пути только через workflow_dispatch). Шлюз держит жёсткий потолок; пайплайн должен целиться ниже, чтобы люди не жили под постоянным шумом отказов.
FAQ по типичным превышениям
Вопрос: счётчики сходятся, а счёт поставщика всё равно вырос.
Ответ: ищите трафик в обход шлюза — локальные скрипты с сырыми ключами, другой контейнер на хосте или ноутбук в той же организации у поставщика. Ротируйте ключи и направьте весь прод-расход через учитываемый путь.
Вопрос: один проект получает 429, остальные простаивают.
Ответ: так задумано при per-project капах. Поднимайте лимит по тикету или вынесите нагрузку на выделенный ключ проекта со своей серией бюджета.
Вопрос: объединять ли эмбеддинги и чат в одном ведре?
Ответ: только если вы хотите, чтобы они конкурировали. Чаще разделяют, чтобы тяжёлый retrieval не блокировал диалог в инциденте.
Вопрос: что писать в строку аудита для комплаенса?
Ответ: метка UTC, tenant, project, имя маршрута или инструмента, решение (allow / deny_budget / fuse_open), оценка стоимости или дельта токенов, correlation id с логами OpenClaw. Секреты редактируйте; храните id версии политики.
Вопрос: Redis недоступен — что делает шлюз?
Ответ: явно выберите fail-closed или fail-open. Закрытый режим бережёт бюджет, но останавливает работу; открытый сохраняет доступность ценой риска перерасхода. Для лабораторной аренды в рабочие часы чаще безопаснее fail-closed с алертом.
Резюме
Мультипроектный OpenClaw на арендованном Mac предсказуем, когда бюджеты помечены (арендатор, проект, upstream), принудительно применяются на шлюзе, подкреплены предохранителями и таблицей деградации и сопровождаются структурированным аудитом. Числовые лимиты сочетайте с ключами поставщика минимальной необходимой области и ясным разделением аутентификации шлюза и расхода на модель. CI получает собственные ключи и расписание, чтобы не синхронизировать всплески с интерактивом.
Когда узел упирается не в красные бюджеты, а в задержку и очереди, сначала добавляйте вычислительную мощность, а не только поднимайте капы. Откройте тарифы и оформление заказа дополнительных ярусов Mac mini M4 и регионов — страницы можно просматривать без входа в аккаунт. Справка по доступу и типовым сбоям — в центре помощи.