2026: OpenClaw Gateway — встроенные пробы здоровья (/health, /ready) и балансировка: удалённый физический Mac, Docker Compose и Kubernetes; затенение путей и ложный NotReady (фрагменты конфигурации + FAQ)
Эксплуатации и SRE, которые держат OpenClaw Gateway на удалённых физических Mac, сталкиваются с одним классом инцидентов: пробы проходят локально, но падают через nginx, либо Kubernetes помечает Pod как NotReady, пока Compose остаётся «зелёным». Здесь — согласование /health и /ready на bare metal, в Docker Compose и Kubernetes, разбор затенения путей, копируемые фрагменты и FAQ по ложной готовности.
1. Введение: три плоскости, один контракт
launchd на «голом» Mac, healthcheck в Compose и livenessProbe/readinessProbe в Kubernetes должны разделять одну семантику: /health — «перезапусти меня, если я завис», /ready — «пускай пользовательский трафик только если объявленные зависимости реально доступны». Когда reverse-proxy или неверный upstream отвечает на эти пути вместо шлюза, получаются невоспроизводимые алерты и дрожащие выкаты.
После того как пробы стабилизированы, имеет смысл связать их с наблюдаемостью: см. OpenClaw Gateway — метрики Prometheus и панели Grafana на удалённом физическом Mac. Если вы только поднимаете узел, начните с Как эффективно запустить проект OpenClaw на Mac в 2026 году — там базовый порядок действий до появления стабильных /health и /ready.
2. Три боли: затенение, дрейф и «ложь» балансировщика
- Затенение путей. Статический
location /, SPA fallback или агрессивныйtry_filesмогут вернуть200 OKс HTML на/ready, не доходя до OpenClaw. Балансировщик считает пул тёплым; шлюз пробу не видел. - Семантический дрейф между платформами. Compose помечает сервис healthy, когда проверка на уровне движка прошла; Kubernetes может направить трафик на другую ревизию при пересечении селекторов или если Ingress шлёт пробы на canary-backend, который вы не собирались тестировать.
- Скрытая цена стабильности и аудита. Повторное использование
/readyдля liveness связывает сбои зависимостей с рестартами Pod. На флоте удалённых Mac это проявляется как мигание Screen Sharing, полузаписанное состояние агента и шумный дежурный — не «просто Kubernetes».
3. Матрица: где какую пробу запускать
Используйте таблицу на дизайн-ревью до вставки YAML в прод. Вся игра — в вопросе «кто обязан видеть какой сигнал?»
| Сигнал | Физический Mac + reverse proxy | Docker Compose | Kubernetes |
|---|---|---|---|
| /health (дешёвая) | LB → nginx → gateway; без CDN-кэша на пути проб | healthcheck на опубликованный порт | livenessProbe.httpGet.path=/health |
| /ready (строгая) | Та же цепочка, что у пользователя (Host + TLS); без статического затенения | depends_on: condition service_healthy | readinessProbe + startupProbe на холодный старт |
| Типичный режим отказа | Префиксный location побеждает proxy_pass | Опубликованный порт ≠ порт healthcheck LB | RBAC / NetworkPolicy режет kubelet subnet |
4. Семь шагов выравнивания
- Перечислите вызывающих проб. Вынесите каждый health URL из облачного LB, блока
server_namenginx, Compose, Helm values и мониторинга. Пустая строка в таблице — слепая зона. - Докажите затенение. С хоста прокси выполните
curl -svH 'Host: your.api' https://127.0.0.1/readyи сравните тело с прямымcurlна порт шлюза на loopback. - Закрепите location выше catch-all. Отдельные
location = /healthиlocation = /readyсproxy_passна upstream шлюза,proxy_buffering off;иadd_header Cache-Control no-store;. - Compose: согласуйте таймауты с LB.
interval,timeoutиretriesдержите в пределах ~80% от внешнего LB, чтобы не помечать healthy раньше внешнего арбитра. - Kubernetes: разделите пробы. Liveness на
/health, readiness на/ready, добавьтеstartupProbeс большимfailureThresholdдля прогрева маршрутизатора моделей. - Репетиция выката. Blue/green или rolling: следите за
kubectl get endpointsи логами шлюза; трафик должен смещаться только после переключения/readyна новой ревизии. - Архивируйте диффы. Храните обезличенные
nginx -T, YAML Compose и выводkubectl describe podс метками времени — это сократит время разбора следующего ложного NotReady.
5. Фрагменты конфигурации
5.1 nginx: явные location для проб (без затенения)
location = /health { proxy_pass http://openclaw_gateway; proxy_http_version 1.1;
proxy_set_header Host $host; proxy_buffering off; add_header Cache-Control "no-store"; }
location = /ready { proxy_pass http://openclaw_gateway; proxy_http_version 1.1;
proxy_set_header Host $host; proxy_buffering off; add_header Cache-Control "no-store"; }
5.2 Docker Compose: healthcheck и зависимость
services:
openclaw-gateway:
image: your.registry/openclaw-gateway@sha256:…
healthcheck:
test: ["CMD", "curl", "-fsS", "http://127.0.0.1:18789/health"]
interval: 15s
timeout: 3s
retries: 5
start_period: 120s
edge-proxy:
depends_on:
openclaw-gateway:
condition: service_healthy
5.3 Kubernetes: startup + readiness + liveness
startupProbe:
httpGet: { path: /ready, port: http }
periodSeconds: 5
failureThreshold: 30
readinessProbe:
httpGet: { path: /ready, port: http }
periodSeconds: 10
timeoutSeconds: 3
livenessProbe:
httpGet: { path: /health, port: http }
periodSeconds: 20
timeoutSeconds: 2
Подставьте имя port: http в соответствии с containerPort. Если TLS терминируется на Ingress, пробы обычно остаются на plain-порту контейнера, если sidecar mesh не навязывает свой TLS.
6. Цифры для ссылок в отчётах
- 18789 — типичный HTTP-порт поверхности OpenClaw Gateway на Mac-узлах; всегда сверяйте с вашим
openclaw.jsonили release notes перед шаблонами LB. - 120 с
start_period— разумный первый ориентир для холодного кэша моделей и задержки монтирования Secret на удалённых Mac; ужимайте по измеренному P95 после двух недель метрик. - 3 с timeout readiness — баланс между медленными upstream и агрессией kubelet; сочетайте с
failureThresholdвместо бесконечных таймаутов, скрывающих реальные зависания.
7. FAQ: воспроизводимые ложные срабатывания
Что такое затенение путей для /health и /ready за nginx?
Широкий префиксный location или SPA fallback отвечает на пути проб до upstream OpenClaw. Вы видите HTML с кодом 200, тогда как прямой curl к Pod возвращает JSON — исправьте порядок location, отключите кэш на путях проб и проверьте цели proxy_pass.
Должны ли liveness и readiness оба вызывать /ready?
Нет. Liveness остаётся дешёвым на /health; readiness на /ready отсекает трафик только по тем зависимостям, которые вы считаете обязательными.
Почему Compose healthy, а LB снимает задачу?
Разные сетевые namespace и разные пути Host/TLS. Запустите точно тот же curl, что healthcheck LB (включая SNI и путь), с бастиона или подсети LB — не только изнутри контейнера.
Что даёт ложный NotReady сразу после выката на удалённом Mac?
Холодные кэши и рукопожатия зависимостей превышают начальные таймауты. Используйте startupProbe или start_period, логируйте задержку по зависимостям, затем ужесточайте пороги на основе фактов.
8. Почему Mac mini уместен для завершения этой цепочки сложности
Семантика проб имеет значение только пока хост остаётся в сети: Apple Silicon Mac mini сочетает низкое энергопотребление в простое (часто порядка нескольких ватт), бесшумную работу для стоек и столов и Unix-инструментарий — curl, launchctl, Docker Desktop или Colima и SSH — без типичных для Windows-флотов проблем с драйверами.
Gatekeeper, SIP и FileVault снижают риск подмены долгоживущих токенов агента рядом со шлюзом. Это важно, когда именно /ready — сигнал, по которому балансировщик выпускает автоматизацию в интернет.
Если вы хотите прогнать эту историю с пробами и балансировкой на железе, которое можно оставить без присмотра, Mac mini M4 — сильная база на 2026 год: нажмите CTA ниже, чтобы сравнить узлы ZoneMac, готовые под шлюз, и выкатывайте с теми же приёмочными curl, что вы только что задокументировали.
Готовы запускать OpenClaw на выделенных Mac-шлюзах?
Арендуйте удалённый Mac mini с сетью и паттернами доступности, на которые опирается этот runbook: пробы, SSH и нагрузка CI и агентов.