mem_limit · healthcheck и start_period · backoff restart · ротация json-file и проверка диска
Команды, которые держат OpenClaw на VPS 24/7, часто упираются в три класса сбоев: слишком короткий healthcheck убивает холодный старт Gateway, mem_limit ниже пиков WASM даёт exit 137, а стандартные логи json-file заполняют корень. Здесь — минимальный набор отличий между dev и prod compose, шестишаговая воспроизводимая база и условия, когда дрожь перезапусков требует ручной остановки, со ссылками на статью про Exit 137 и allowedOrigins и материал про фиксацию образа и откат.
В разработке часто снимают лимиты памяти, укорачивают окно health и пишут лог в консоль. В безлюдной эксплуатации это складывается в бурю перезапусков: unhealthy до того, как Gateway слушает порт, restart: always каждые секунды, а файлы логов съедают inode или квоту быстрее, чем помогает backoff.
У OpenClaw первая сборка и загрузка модели поднимают RSS. Если mem_limit держать по среднему стабильной фазы, ночью сработает OOM killer. Каждый параметр должен маппиться на поле docker inspect или метрику хоста в тикете.
Слишком короткий start_period: пробы падают до 18789, панель показывает бесконечные рестарты.
mem_limit и пики: первый WASM или установка зависимостей выходит за cgroup, код 137 и мало прикладных логов.
Безлимитный json-file: колбэки и отладка забивают корень в горячие дни проверки PR.
Restart без backoff: ошибка конфигурации и ложный unhealthy вместе голодают CPU и IO.
Dev bind mounts в prod: горячая перезагрузка и слабые права расширяют поверхность секретов.
База — два override в одном репозитории: docker-compose.yml с общими сервисами и docker-compose.prod.yml только с прод-отличиями, чтобы не разъезжал копипаст.
| Измерение | Дев по умолчанию | Прод база |
|---|---|---|
| Память | Без лимита или только хост | Явный mem_limit с запасом на холод; сверка со статьёй Exit 137 |
| Healthcheck | Короткий interval, нет start_period | start_period закрывает холод; retries и timeout под язык SLA |
| Restart | unless-stopped или нет | on-failure или ограниченный always плюс алерты на хосте |
| Драйвер логов | Дефолт json-file | max-size + max-file; без ручного truncate |
| Тома и секреты | Бинд исходников | Конфиг только для чтения; секреты из env_file или Docker secret, не в слоях образа |
Каждая прод-строка должна иметь панель в Grafana или поле в тикете, иначе это список желаний.
Шаги предполагают образы по гайду фиксации; при :latest сначала полный холод на staging, потом прод override.
Снять пики: на staging docker stats --no-stream и ps в контейнере, RSS десять минут вокруг первого Ready.
Записать mem_limit: пик умножить на согласованный коэффициент; политику swap на хосте задокументировать.
Определить readiness: HTTP или CMD на той же loopback, что и Gateway.
Поставить start_period: покрыть первую установку зависимостей и компиляцию WASM; ориентир — p95 холода, не среднее.
Сжать json-file: блок logging на сервис с max-size и max-file; алерт на скорость роста каталога логов.
Прогнать рестарты: один провальный проб, проверить интервалы, backoff и пейджинг по runbook.
services:
openclaw:
mem_limit: "2g"
logging:
driver: json-file
options:
max-size: "20m"
max-file: "5"
healthcheck:
test: ["CMD", "curl", "-f", "http://127.0.0.1:18789/health"]
interval: 30s
timeout: 5s
retries: 5
start_period: 180s
restart: on-failure:5
Заметка: пути health должны совпадать с образом; если только TCP, CMD-SHELL с nc, но зафиксировать больший риск ложных срабатываний, чем у HTTP.
Если docker events за пять минут перескакивает порог runbook, сначала подозревать ошибку конфигурации и ложный unhealthy, а не только нехватку RAM. Слепые рестарты усиливают запись логов.
Если корень только для чтения, снять трафик или остановить reverse proxy, затем освобождать место по порядку из статьи Exit 137; без проверки диска не форсить compose up -d поверх данных.
Внимание: меньший max-file быстрее убирает горячие логи; длинная ретенция — в объектное хранилище или лог-хост, а не бесконечное раздувание одного файла.
Заморозить релизы: закрыть вход пайплайна при шторме выше порога.
Снять срез: фрагменты Health и OOM из inspect плюс последние двести строк логов.
Откатить compose: вернуть предыдущий override и сохранить пакет воспроизведения для разбора.
Ниже — старт для устава и дежурств; замените реальными гистограммами холода и кривой роста диска. Не продавайте это как SLA клиенту без измерений.
Если на том же VPS есть reverse proxy или небольшая БД, mem_limit и IO логов конкурируют с соседями; ревью должно требовать RSS контейнера, свободную память хоста и задержку записи на одном дашборде.
| Форма хоста | Старт логирования | Связь с пинами образа |
|---|---|---|
| 2 vCPU / 4 ГБ | Меньше max-size, короче хранение, агрессивнее выгрузка | Digest-pin против сюрпризного роста холода |
| 4 vCPU / 8 ГБ | max-file можно чуть ослабить, ротация обязательна | staging и prod с разными тегами, один digest на проверку |
| Смешанная нагрузка | Отдельный диск данных или том логов вне партиции БД | Окна обновления как в статье про пин |
OpenClaw на маленьком одноразовом VPS одновременно недофинансирует память, диск и ротацию секретов; свой bare metal меняет это на риск питания и линии.
Командам, которым нужны контрактная вычислительная мощность, выбор региона и проверяемая полоса, при этом Gateway и каналы должны оставаться наблюдаемыми 24/7, часто лучше подходят арендованные облачные Mac mini; облачная аренда Mac mini VpsMesh позволяет принять baseline Compose, обратный прокси и резервные копии в одной истории ёмкости.
Проверьте пользователя и PATH пробы и start_period на холод; сверьте loopback с статьёй про allowedOrigins и reverse proxy.
Сначала dmesg хоста и код выхода, затем повторная выборка пиков и лимит; подробности в статье Exit 137. Тарифы на странице цен.
Горячее локальное окно короче; длинная ретенция — в центральное хранилище. Политики в справочном центре.