Перезапуск одного шлюза OpenClaw на одном порту быстр, но груб: активные вызовы инструментов, наполовину переданные токены модели и подтверждения вебхуков могут пропасть посреди ответа. В 2026 году команды, которым важно доверие операторов, применяют слив трафика—оставляют старую бинарь живой, пока новые TCP-сессии направляются на свежую сборку на втором loopback-порту, и завершают старый процесс только после срабатывания таймеров простоя. Здесь описан практичный паттерн nginx с взвешенным upstream на macOS, численные значения по умолчанию и проверки в духе openclaw doctor. Дополните чтение обратным прокси и туннелем для TLS и размещения туннеля и восстановлением через LaunchAgent, если слив сорвался и нужен жёсткий рестарт.
Вы получите таблицу фаз, таймауты, зонды curl и идеи по инъекции ошибок для 24/7-шлюза на арендованном Apple Silicon. Также зафиксируйте в runbook владельца смены, SHA зелёной сборки и время reload nginx—иначе постмортемы превращаются в споры.
Почему жёсткие рестарты ломают ожидания
Пользователи меньше прощают 500, чем медленные ответы. Рестарт, рвущий активные keep-alive, выглядит как таинственный баннер «ассистент офлайн», даже если health через миллисекунды снова зелёный. Слив сохраняет семантику TCP: старые соединения завершаются, новые идут на green.
Финансовым и комплаенс-командам важно избегать дублей биллинга при автоповторах без ключей идемпотентности. Окно 120 секунд почти бесплатно по сравнению с разбором дубликатов.
Топология blue, green, nginx
Привяжите blue к 127.0.0.1:8787, green к 127.0.0.1:8788. Публичный трафик не бьёт напрямую в эти порты: nginx слушает 443 и проксирует в upstream с обоими loopback. В стационаре вес 100 на blue; при выкате сдвигайте по 10 пунктов, следя за бюджетом ошибок.
| Фаза | Вес blue | Вес green | Фокус |
|---|---|---|---|
| Стабильно | 100 | 0 | Базовые метрики |
| Канарейка | 90 | 10 | Паритет ошибок |
| Середина | 50 | 50 | Гистограммы задержек |
| Готово | 0 | 100 | Слить сокеты blue |
Черновик конфигурации nginx
Держите конфигурацию простой: два upstream-сервера, least_conn или ip_hash, если важны липкие сессии для адаптеров каналов, и явные proxy-заголовки для исходного хоста в логах OpenClaw.
На практике полезно вынести общие директивы в отдельный файл, подключаемый через include, чтобы синтаксическая проверка nginx -t отлавливала опечатки до копирования на продакшен. Версионируйте конфиг в том же репозитории, что и манифесты LaunchAgent: так проще восстановить последнее стабильное состояние при откате.
Если терминируете TLS на nginx, следите за совпадением наборов шифров с тем, что ожидают старые клиенты SDK: обновление OpenSSL на хосте иногда сдвигает порядок шифров, и мобильные приложения с жёстко прошитыми списками начинают падать на рукопожатии ещё до того, как запрос дойдёт до OpenClaw.
upstream openclaw_gateway {
least_conn;
server 127.0.0.1:8787 weight=90 max_fails=3 fail_timeout=10s;
server 127.0.0.1:8788 weight=10 max_fails=3 fail_timeout=10s;
}
server {
listen 443 ssl;
location / {
proxy_pass http://openclaw_gateway;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_read_timeout 300s;
}
}
Перезагружайте nginx через nginx -t && nginx -s reload; reload занимает доли секунды и сохраняет большинство idle-соединений в зависимости от политики воркеров.
Согласованные таймауты
Выровняйте proxy_read_timeout с верхним пределом простоя модели на стороне шлюза. Типичный разрыв: 300 с у nginx и 60 с внутри шлюза—пользователь видит обрезанный стрим, а логи винят модель.
Для WebSocket и потокового HTTP на location нужен proxy_buffering off; иначе буферы по умолчанию на 4 МБ создают иллюзию зависаний.
Во время слива fail_timeout должен быть достаточно коротким, чтобы убрать плохую green-сборку, но не настолько, чтобы health-чеки дребезжали при всплесках CPU на M4 с параллельными агентами.
Проверка и откат
Перед первыми 10 % прогоните синтетический чат прямо на loopback green; сравните медиану времени до первого токена с blue—остановите выкат при регрессии свыше 8 %.
Корреляционные ID между access-логами nginx и структурированными логами OpenClaw обязательны.
Откат—вес 100/0 и остановка green; тренируйте ежемесячно.
Расширьте сценарий проверки негативными кейсами: намеренно оборвите green во время слива и убедитесь, что nginx корректно помечает upstream как недоступный, а клиенты получают предсказуемый код ошибки, а не пустой ответ. Зафиксируйте ожидаемые статусы в пользовательской документации—мобильные SDK иногда кэшируют тело ответа и при повторе создают дубликаты запросов к биллингу.
Если у вас несколько географических зон, прогоните синтетику из каждой: задержка до шлюза может маскировать проблемы time-to-first-token, и команда ошибочно одобрит green, который на самом деле хуже в регионе с высоким RTT. Снимите трассу с арендованного Mac mini в той же сети, что и продакшен-шлюз, и сравните гистограммы.
Процессы и порты macOS
Запускайте каждый шлюз под своим ярлыком LaunchAgent, чтобы launchctl kickstop попадал в нужное семейство PID. Разделяйте StandardOutPath по цветам, иначе JSON-строки перемешаются.
Проверяйте сокеты командой lsof -nP -iTCP:8787 -sTCP:LISTEN после каждого шага; «зомби»-слушатели появляются при горячей перезагрузке без освобождения порта.
Прогоняйте весь cutover на железе, близком к продакшену. Облачный Mac mini MacHTML—обычно около $16.9/сутки—даёт термику Apple Silicon, реальный launchd и SSH для правок nginx без сна ноутбука.
Учитывайте политику Gatekeeper и нотаризацию: если green подписан другим сертификатом разработчика, macOS может показать диалог при первом запуске в интерактивной сессии, хотя демон стартует без GUI. Для полностью автоматизированных сред заранее занесите бинарь в список доверенных или используйте те же учётные записи подписи, что и для blue, чтобы ночной деплой не завис на ожидании клика.
При работе с несколькими пользователями на одном хосте проверьте umask и права на Unix-сокеты, если позже перейдёте с TCP на сокеты домена: nginx, запущенный от другого пользователя, не должен упираться в права доступа к сокету green.
Наблюдаемость
Каждые 10 секунд во время переключения экспортируйте: активные upstream-соединения по цветам, долю 5xx по цветам, p95 времени до первого токена из синтетики. Стройте на одной оси.
Аннотируйте Grafana временем reload nginx и SHA Git green.
Тревожьте, если 5xx у green выше blue более чем на 0,5 п.п. дольше 3 минут, пока green несёт трафик.
Добавьте к дашборду счётчики отброшенных соединений на стороне nginx (upstream-таймауты, ошибки TLS) и раздельно логируйте отмены на стороне клиента—мобильные сети часто рвут длинные стримы без вины шлюза. Если доля отмен растёт только на green, ищите расхождение в заголовках сжатия или в версии HTTP/2 между сборками.
Для долгосрочной эксплуатации храните агрегированные срезы по часам: даже идеальный слив не спасёт от утечки памяти в green. Сравнивайте RSS процессов blue и green при одинаковой нагрузке; всплеск на десятки процентов после нескольких часов работы — сигнал к расследованию до того, как вы доведёте вес до 100 %.
Безопасность двух слушателей
Два loopback-порта удваивают риск случайного 0.0.0.0. Автоматизируйте постдеплой-проверку listening-адресов в CI.
Ротация секретов должна обновить оба цвета до сдвига трафика; иначе green стартует со старыми ключами API и тихо ломается под нагрузкой.
Отключайте отладочные админ-маршруты в обеих сборках.
Если перед шлюзом стоит WAF или обратный прокси у провайдера, согласуйте с ними список IP-диапазонов для health-checkов: во время слива частота проб может вырасти, и автоматические правила иногда принимают это за атаку. Заранее внесите исключения или снизьте чувствительность на окно деплоя.
При работе с клиентскими сертификатами убедитесь, что nginx одинаково передаёт цепочку доверия к обоим upstream-процессам; иначе green может отвергать те же клиенты, которые успешно проходили на blue, и вы увидите рост 401 именно на доле трафика green.
Мультитенантность
Маркируйте лимиты по арендаторам в конфигурации OpenClaw и сверяйте с зонами limit_req nginx. Слив не исправляет несправедливость, если green удвоил параллелизм по ошибке.
Крупные переключения планируйте вне cron-снимков диска: всплески APFS могут добавить 30–80 мс к хвостам задержек независимо от весов nginx.
Для команд с разными SLA по арендаторам заранее определите, может ли «шумный» клиент исчерпать очередь green до того, как вы завершите слив: иногда разумнее временно направить такого клиента на выделенный хост, чем рисковать общим бюджетом ошибок во время переключения всей площадки.
После завершения слива сохраните снимок метрик на неделю: сравнение неделя-к-неделе покажет, не проявилась ли деградация из-за скрытой утечки в новой библиотеке, которую вы подтянули вместе с green.
В долгосрочной перспективе стоит автоматизировать «тёмные часы»: если бизнес позволяет, переносите слив на интервал минимального трафика в конкретном часовом поясе клиентов, даже если инфраструктура круглосуточная—меньше одновременных долгих сессий означает более предсказуемое время освобождения сокетов и более короткое окно наблюдения за аномалиями.
Фиксируйте в журнале изменений не только версию OpenClaw, но и версию nginx и OpenSSL: при расследовании странных таймаутов через месяц это сэкономит часы сравнения конфигураций.
При необходимости параллельного слива на нескольких хостах синхронизируйте часы через NTP и помечайте события в единой шкале времени UTC, иначе корреляция логов между машинами превратится в головоломку.
FAQ
Устраняет ли слив все ошибки?
Нет—прикладные баги остаются, но пропадает класс транспортных сбросов.
Unix-сокеты вместо TCP?
Да, upstream nginx поддерживает unix:; логика весов та же.
mTLS к upstream-моделям?
Завершайте или прокидывайте согласованно на обоих цветах; смешанные конфигурации путают логи TLS.
Постоянно работающим шлюзам важны экономика и выделенное железо. Mac mini сочетает низкое энергопотребление в простое и запас по ядрам для двухцветных процессов во время переключений; macOS совпадает с автоматизацией многих операторов OpenClaw. Аренда через MacHTML убирает закупочные задержки, оставляет VNC для визуальных проверок и позволяет изолировать стейджинг для репетиций reload nginx, пока продакшен не тронут—эластичная мощность без второй машины, нужной лишь в релизные недели.
Репетиция blue/green на реальном macOS
Закажите облачный Mac mini, подключите nginx к двум loopback-портам и отработайте взвешенные переключения OpenClaw до продакшен-окна.