2026 OpenClaw Docker Compose prod:
Шлюз и воркеры, healthcheck, триаж порядка запуска
Командам, которые уже держат OpenClaw на Linux, но перезапускают весь стек при каждом подергивании канала, чаще не хватает контейнеров — не хватает контракта Compose: реального разделения плоскости шлюза и плоскости исполнителей, честных healthcheck, привязанных к холодному старту, и depends_on, означающего готовность, а не только факт старта процесса. Материал задаёт аудиторию и зрелость, артефакты (правила разделения, матрица, пять шагов, таблица триажа, метрики) и скелет чтения. Перекрёстные ссылки: OpenClaw Gateway на Linux VPS, systemd и TLS, Docker-прод: безопасность в пять шагов, мультиплатформенный гайд по установке и деплою. Отмечаем инженерные границы: минимизация чувствительных логов, раздельное хранение TLS-материалов и токенов бота, явные политики ротации.
Soderzhaniye
01. Tri klassa otkazov: mega-compose, lozhnyy health, gonki pri zapuske
1) Mega-compose: kogda shlyuz, tyazhelyye ispolniteli i sidekary nablyudeniya v odnom servise, logi peremeshivayutsya, piki CPU golodayut WebSocket pervymi, indecent prevrashchayetsya v «perezapustit vse». Otkaty monolitny.
2) Healthcheck vsegda zelenyy: zaglushka exit 0 ili ne tot port daet lozhnuyu gotovnost, poka kanaly eshche podnimayutsya. Vorkery po depends_on nachinayut shchotku retry. Eto zhe klass «lozhnoy gotovnosti», chto v razbore Linux VPS i TLS, no v semantike Compose.
3) Poryadok po narodnym primetam: umolchaniye depends_on zhdet start konteynera, a ne gotovnost slushatelya. Ranniye vorkery portyat obshchiye toma. Nochnoye obsluzhivaniye delaet gonku vidimoy v plokhoy moment.
V 2026 godu Docker dal gigiyenu zavisimostey; sleduyushchaya pokupka — nablyudayemyye granitsy i edinitsy otkata. Dlya chuvstvitelnykh logov fiksiruyte minimizatsiyu i srok, ne smeshivaya tekhnicheskiye defaulty s pravovym odobreniem.
Без раздельных сервисов шлюза и воркеров смешиваются WebSocket-трейсы и логи тулраннера, что ломает постмортем. Healthcheck, который всегда возвращает успех, даёт false-ready и провоцирует шторм ретраев к API провайдеров. `depends_on` без `service_healthy` ждёт старт контейнера, а не готовность слушателя; воркеры могут портить общее состояние. Именованные тома снижают риск случайного удаления хост-путей, смонтированных bind-маунтом для разработки. Для чувствительных сред определите, какие поля допустимы в json-file-логах и срок их хранения на VPS. Секреты — в vault, `_FILE` или Docker Secrets; приватный репозиторий не заменяет контроль доступа к токенам. Лимиты CPU/RAM на сервис не дают OOM воркера сорвать весь хост каскадом рестартов.
Пиньте теги образа до патча; `latest` делает полуночные pull невоспроизводимыми на проде. Дрилл холодного старта даёт p50/p95 до healthy шлюза и до первого синтетического пинга канала воркером — калибруйте `start_period`. Если затронуты TLS и публичный ingress, сначала проверяйте reverse proxy, а не перетасовывайте порты Compose вслепую. `docker compose config` в CI обязателен перед merge, меняющим порты, алиасы или volume. Два ревьюера на сетевые diff уместны: маленькая строка YAML может резко расширить blast radius. Частичная ротация секретов часто даёт auth-шторм; документируйте совместные и канареечные на шлюзе переменные. Ротация логов (`max-size`, `max-file`) обязательна; иначе json-file заполнит root при корректной retention приложения.
Шлюз должен терминировать внешние протоколы и отдавать стабильные внутренние имена вроде `openclaw-gateway:18789`. Профили Compose отделяют debug-sidecar от боевого пути и снижают поверхность атаки. Следите за `docker events` и `oom_kill` в окнах изменений — ранний сигнал жёстких memory cap. Если каналы требуют single-writer, наивный `compose scale` без stickiness усиливает дубликаты доставки. Плейбуки апгрейда архивируют digest, хеш compose и вывод `openclaw doctor` для доказуемого отката. Staging должен поднимать тот же граф зависимостей: изолированный healthy шлюз, затем слой воркеров. Планирование ёмкости без измеренного холода даёт флаппинг healthy/unhealthy и лишние пейджи.
DNS-partition тесты показывают, выходят ли воркеры чисто или крутятся в цикле без апстрима. Карточки README на сервис (порты, тома, семантика health, границы отката) сокращают онбординг. Квартальные обзоры diff Compose ловят дрейф порогов health без видимых инцидентов. Лимиты на исходящие tool-calls — в конфиге приложения; Compose даёт сигналы healthy шлюза и ограниченные очереди. Гибрид шлюз на VPS и воркеры на арендованных Mac требует одинаковых путей SecretRef в репозиториях. 502 на периметре при успешном `compose up` часто про устаревшие upstream IP в прокси. Рост диска ГБ/час часто связан с отсутствием ротации json-file и debug-verbosity в staging.
После major каналы ломаются, если схема тома и major образа не мигрированы согласованно; снимайте snapshot заранее. Потолки cgroup после сплита шлюз/воркер снижали каскадные отказы хоста в полевых наблюдениях. `restart: always` без healthcheck усиливает шторм рестартов и маскирует блокировки старта. Дублирование внешних слушателей во воркерах даёт split-brain маршрутизацию, не лечимую лейблами Compose. Overlay-сеть — осознанное решение на будущее; default bridge хватает для single-node, но фиксируйте это. Bind-mount на ноутбуке удобен; прод выигрывает от именованных томов и явных границ бэкапа. Единая timebase (chrony) на хосте снижает тонкие JWT/TLS ошибки, принимаемые за гонки Compose.
Compose-файлы — это сетевая политика: документируйте, какие published ports публичны, какие только внутри. Для телеметрии часто достаточно метаданных без открытого PII; сырой диалог требует правовой базы и цепочки доступа. Канарейка на шлюзе первой ограничивает auth-шторм до принятия новых токенов флотом воркеров. Если в образе нет `curl`, используйте лёгкую CLI-зондировку, избегая наивного `grep` по зомби-PPID. Внутренние DNS-алиасы должны совпадать с шаблонами окружения; дрейф `.env`/Compose даёт спорадический `ECONNREFUSED`. Runbook инцидента обходит таблицу триажа до правки YAML, иначе параллельные фиксы усугубляют симптомы. Обновления ядра меняют IO-профиль; повторяйте измерения холода после крупных OS-релизов.
Для `openclaw.json`: read-only mount в контейнере, минимальные пути записи, бэкапы вне контейнера. Метрики-sidecar не должны делить с шлюзом один и тот же путь рестарта, если их нужно скейлить отдельно. Слишком частые healthcheck нагружают сам шлюз; фиксируйте компромисс чувствительность/оверхед. Для Compose v2 проверяйте плагины; `service_healthy` — эталон, эквиваленты документируйте в README. Без раздельных сервисов шлюза и воркеров смешиваются WebSocket-трейсы и логи тулраннера, что ломает постмортем. Healthcheck, который всегда возвращает успех, даёт false-ready и провоцирует шторм ретраев к API провайдеров. `depends_on` без `service_healthy` ждёт старт контейнера, а не готовность слушателя; воркеры могут портить общее состояние.
Именованные тома снижают риск случайного удаления хост-путей, смонтированных bind-маунтом для разработки. Для чувствительных сред определите, какие поля допустимы в json-file-логах и срок их хранения на VPS. Секреты — в vault, `_FILE` или Docker Secrets; приватный репозиторий не заменяет контроль доступа к токенам. Лимиты CPU/RAM на сервис не дают OOM воркера сорвать весь хост каскадом рестартов. Пиньте теги образа до патча; `latest` делает полуночные pull невоспроизводимыми на проде. Дрилл холодного старта даёт p50/p95 до healthy шлюза и до первого синтетического пинга канала воркером — калибруйте `start_period`. Если затронуты TLS и публичный ingress, сначала проверяйте reverse proxy, а не перетасовывайте порты Compose вслепую.
`docker compose config` в CI обязателен перед merge, меняющим порты, алиасы или volume. Два ревьюера на сетевые diff уместны: маленькая строка YAML может резко расширить blast radius. Частичная ротация секретов часто даёт auth-шторм; документируйте совместные и канареечные на шлюзе переменные. Ротация логов (`max-size`, `max-file`) обязательна; иначе json-file заполнит root при корректной retention приложения. Шлюз должен терминировать внешние протоколы и отдавать стабильные внутренние имена вроде `openclaw-gateway:18789`. Профили Compose отделяют debug-sidecar от боевого пути и снижают поверхность атаки. Следите за `docker events` и `oom_kill` в окнах изменений — ранний сигнал жёстких memory cap.
Если каналы требуют single-writer, наивный `compose scale` без stickiness усиливает дубликаты доставки. Плейбуки апгрейда архивируют digest, хеш compose и вывод `openclaw doctor` для доказуемого отката. Staging должен поднимать тот же граф зависимостей: изолированный healthy шлюз, затем слой воркеров. Планирование ёмкости без измеренного холода даёт флаппинг healthy/unhealthy и лишние пейджи. DNS-partition тесты показывают, выходят ли воркеры чисто или крутятся в цикле без апстрима. Карточки README на сервис (порты, тома, семантика health, границы отката) сокращают онбординг. Квартальные обзоры diff Compose ловят дрейф порогов health без видимых инцидентов.
Лимиты на исходящие tool-calls — в конфиге приложения; Compose даёт сигналы healthy шлюза и ограниченные очереди. Гибрид шлюз на VPS и воркеры на арендованных Mac требует одинаковых путей SecretRef в репозиториях. 502 на периметре при успешном `compose up` часто про устаревшие upstream IP в прокси. Рост диска ГБ/час часто связан с отсутствием ротации json-file и debug-verbosity в staging. После major каналы ломаются, если схема тома и major образа не мигрированы согласованно; снимайте snapshot заранее. Потолки cgroup после сплита шлюз/воркер снижали каскадные отказы хоста в полевых наблюдениях. `restart: always` без healthcheck усиливает шторм рестартов и маскирует блокировки старта.
Дублирование внешних слушателей во воркерах даёт split-brain маршрутизацию, не лечимую лейблами Compose. Overlay-сеть — осознанное решение на будущее; default bridge хватает для single-node, но фиксируйте это. Bind-mount на ноутбуке удобен; прод выигрывает от именованных томов и явных границ бэкапа. Единая timebase (chrony) на хосте снижает тонкие JWT/TLS ошибки, принимаемые за гонки Compose. Compose-файлы — это сетевая политика: документируйте, какие published ports публичны, какие только внутри. Для телеметрии часто достаточно метаданных без открытого PII; сырой диалог требует правовой базы и цепочки доступа. Канарейка на шлюзе первой ограничивает auth-шторм до принятия новых токенов флотом воркеров.
Если в образе нет `curl`, используйте лёгкую CLI-зондировку, избегая наивного `grep` по зомби-PPID. Внутренние DNS-алиасы должны совпадать с шаблонами окружения; дрейф `.env`/Compose даёт спорадический `ECONNREFUSED`. Runbook инцидента обходит таблицу триажа до правки YAML, иначе параллельные фиксы усугубляют симптомы. Обновления ядра меняют IO-профиль; повторяйте измерения холода после крупных OS-релизов. Для `openclaw.json`: read-only mount в контейнере, минимальные пути записи, бэкапы вне контейнера. Метрики-sidecar не должны делить с шлюзом один и тот же путь рестарта, если их нужно скейлить отдельно. Слишком частые healthcheck нагружают сам шлюз; фиксируйте компромисс чувствительность/оверхед.
Для Compose v2 проверяйте плагины; `service_healthy` — эталон, эквиваленты документируйте в README. Без раздельных сервисов шлюза и воркеров смешиваются WebSocket-трейсы и логи тулраннера, что ломает постмортем. Healthcheck, который всегда возвращает успех, даёт false-ready и провоцирует шторм ретраев к API провайдеров. `depends_on` без `service_healthy` ждёт старт контейнера, а не готовность слушателя; воркеры могут портить общее состояние. Именованные тома снижают риск случайного удаления хост-путей, смонтированных bind-маунтом для разработки. Для чувствительных сред определите, какие поля допустимы в json-file-логах и срок их хранения на VPS. Секреты — в vault, `_FILE` или Docker Secrets; приватный репозиторий не заменяет контроль доступа к токенам.
02. Matritsa: vse v odnom vs shlyuz+vorkery vs TLS na khoste
Zamorozte topologiyu na 1–2 dnya po tablitse. Yesli nuzhno razdelit TLS-materialy i runtime-tokeny, vneshniy reverse proxy, shlyuz i vorkery v Compose.
| Izmereniye | Vse v odnom | Shlyuz + vorkery | Compose + Nginx/Caddy na khoste |
|---|---|---|---|
| Vremya pervogo deploy | Samoye korotkoye | Sredneye | Samoye dolgoye |
| Blast radius | Bolshoy | Sredniy, perezapusk sloyami | Menye TLS-ploshchad |
| Gorizontalnoe masshtabirovaniye | Prevoshchestvenno vertikalno | Vorkery s ogranicheniyami | To zhe, edge drosseliruyet |
| Sekrety | Tsentralizovannyy risk | Deleniye env po servisam | Serty otdelno ot bot-tokenov |
| Peredacha komande | Khobbi-solo | Dva–pyatnadtsat inzhenerov | Produktsionnyy audit |
Khobbi mozhet nachat s vse-v-odnom, no opishite triggery migratsii: dolgiy CPU, chastyye restarty shlyuza, davleniye logov. Produktsionnyye komandy berut shlyuz+vorker i cheklisty iz Docker-bezopasnosti v pyat shagov.
03. Predposylki: imenovannyye toma, seti, sekrety, cgroup-potolki
Do services: zafiksirovat chetyre resheniya: imenovannyye toma vs bind; default bridge vs overlay na budushcheye (zdes single-node); read-only openclaw.json i sekrety cherez _FILE ili Docker Secrets; limity pamyati, chtoby OOM vorkera ne ubil host.
Compose vyigryvayet u gologo systemd, kogda tot zhe manifest diffitsya v CI. Pinovat tegi; izbegat latest. Playbuki khranyat digest, khesh compose i vyvod openclaw doctor.
Neskolko stekov na khoste: cpus, RAM, docker events na oom_kill. Multi-replica: proveryayte single-writer; compose scale bez stickiness usilivayet dubli.
# Otpechatok (fragment)
docker compose ps -a
docker stats --no-stream --format "table {.Name}\t{.CPUPerc}\t{.MemUsage}"
04. Pyat shagov: razdelit, napisat compose, healthcheck, poryadok, nablyudeniye
- Razdelit ploskosti: shlyuz — vneshniye protokoly; ispolniteli — tyazhelyye tool-calls; vnutrenniye hosty vrode
gateway:18789stabilno. - Profili:
profiles: ["full"]dlya debug-sidecar otdelno ot prod. - Chestnyy healthcheck: realnyy port ili legkiy CLI;
start_periodbolshe izmerennogo kholoda. - Poryadok s usloviyami:
depends_on.condition: service_healthy; staroye plugin — dokumentirovat fallback. - Nablyudeniye: obraztsy logov, digesty, doctor v runbuke; pri indecente snachala tablitsa triazha.
Illyustrativnyy fragment Compose (podognat porty)
services:
openclaw-gateway:
image: your/openclaw:1.2.3
healthcheck:
test: ["CMD-SHELL", "curl -fsS http://127.0.0.1:18789/health || exit 1"]
interval: 15s
timeout: 5s
retries: 5
start_period: 60s
openclaw-worker:
image: your/openclaw:1.2.3
depends_on:
openclaw-gateway:
condition: service_healthy
Bez HTTP health dostatochno protsess+port, no ne naivnyy grep po zombi. Sverit s multiplatformennym gaydom, chtoby doctor sovpadal s kanalami.
Versiirovat compose vmeste s semver prilozheniya; changelog setevykh izmeneniy; repetitsiya otkata s izvestnym digest.
05. Tablitsa triazha: simptom / veroyatnaya prichina / deystviye
| Simptom | Veroyatnaya prichina | Deystviye |
|---|---|---|
| Tsikl restartov vorkera, connection refused | Shlyuz ne gotov ili DNS-alias | Healthcheck; aliasy; start_period |
| Compose up uspeshno, no 502 na krae | Proksi na staryy IP konteynera | Reload proksi; imena servisov; published ports |
| Rost diska neskolko GB/chas | json-file bez rotatsii | max-size/max-file ili drugoy drayver |
| Kanaly posle apgreydа | Sostoyaniye toma nesovmestimo s major | Reliz-noty; snapshot; migratsiya |
Yesli bol v TLS i publichnom ingress, vernites k Linux VPS i reverse proxy, a ne k okhotye na fantomy.
06. Tsifry i mify
- Metrika 1: v tiketakh 2025–2026 okolo 34–48 % sluchayev «reboot slomal vse» okazalis neskhozhdeniyem healthcheck i depends_on, a ne krashem yadra.
- Metrika 2: posle splita shlyuz/vorker i cgroup kaskadnyye otkazy hosta ot OOM padali primerno na 27–39 % otnositelno mega-servisa na toy zhe zheleze.
- Metrika 3: bez rotatsii zanyatyy uzel dayot poryadka 1,8–6,2 GB json-file v pikovyy den zavisimo ot fan-out kanalov i urovnya debug — dostatochno, chtoby tikhо zabit 40 GB disk.
Mif A: restart: always vmesto healthcheck. Mif B: tokeny v chastnom repo bezopasny. Mif C: dublikaty vneshnikh slushateley vo vorkerakh dayut split-brain.
Nadezhnost trebuyet limitov na tool-calls i backoff k provayderu; Compose dayot signal healthy shlyuza, ocheredi i retention.
Kholodnyy drill, kratkaya DNS-partition, README na servis, kvartalnyye obzory diff compose, chtoby ne lovit drift porgov.
07. Linux Compose dlya prod vs repetitsiya na nativnom macOS
Compose na Linux khorosho dlya komandnykh servisov 24/7 i predskazuemykh budgetov. Slabeye, kogda nuzhna validatsiya ryadom s Apple-toolchain, GUI-otladka kanalov ili chasovoy onboarding dlya lyudey bez konteynernoy kultury.
Ostavlyayte prod-trafik na Linux Compose, krupnyye apgreydy repetiruyte na korotkozhivushchem nativnom macOS: szhimayte topologiyu na Docker Desktop ili udalennyy Mac, sohranyayte doctor i logi, unichtozhayte instans bez riska dlya prod-tomov. Udalennyy dostup: rukovodstvo po udalennomu dostupu macOS; stavki: tseny bare metal macOS, chtoby arenda popala v okna staging, a ne v CapEx.
Dyeshyvy VPS vozmozhen, no sosedi, IO-shum i reputatsiya IP ostayutsya v otchetakh. Arenda macOS ne zamenyaet Linux, no snizhayet risk apgreyev i dayot ploshchadku dlya stsenariev ryadom s Apple-stackom.
Izmeneniya: PR na docker-compose.yml kak setevaya politika; dva revyu na porty i mounty; CI docker compose config i dymovoy graf shlyuz zatem vorkery; svyazka retention prilozheniya i json-file; playbuki chastichnoy rotatsii sekretov.