mem_limit · первый проход WASM · allowedOrigins · сопряжение через compose exec · шаблон compose
После запуска по инструкции docker compose на малом VPS чаще всего три картины: мгновенный выход 137, долгое отсутствие ответа на 18789, Control UI с non-loopback или ошибками Host. Статья даёт сначала чеклист по free -h, mem_limit и окну 3–7 минут на первую WASM-компиляцию, затем таблицу симптом → доказательство в docker logs → действие для Exit 137, прав на томах и рассинхрона монтирования; далее таблицу решений по 127.0.0.1, allowedOrigins и обратному прокси для UI; в конце шестишаговый runbook сопряжения в контейнере и десять пунктов перед продом. Вместе с OpenClaw v2026.4 — установка и усиление Docker, установка Gateway и чеклист doctor и эксплуатационный разбор в три блока это переводит задачу из «контейнер поднялся» в «стабильно без постоянного контроля».
При первом старте OpenClaw Gateway в контейнере высокая загрузка CPU при позднем открытии порта чаще всего фаза компиляции WASM, а не взаимная блокировка. Как в статье v2026.4: если свободная память на хосте и mem_limit слишком малы, OOM в Linux даёт Exit 137, иногда без явного сообщения приложения в логах.
Хост: выполнить free -h; устойчивый запас заметно ниже примерно 1,5–2 ГиБ повышает риск 137; без swap ещё сильнее.
Compose: задать mem_limit: 2g или выше и не конкурировать по памяти с тяжёлыми сервисами на той же машине.
Первое окно: после холодного старта выждать 3–7 минут до вывода об ошибке; docker logs -f покажет, идёт ли ещё цепочка компиляции.
Healthcheck: healthcheck.start_period не меньше 360 с, чтобы compose не перезапускал процесс до завершения WASM.
Ложные срабатывания: не повторять docker compose restart внутри первого окна — каждый рестарт снова даёт пик холодного старта.
Эти пять пунктов на первой странице runbook «OpenClaw на VPS» снижают число тикетов «сделал по гайду, не поднимается». Многоуровневый разбор Gateway: статья по эксплуатации.
Таблица выстроена как сначала доказательство, потом действие, чтобы увести тикеты от «шлюз сломан» к воспроизводимым полям. Вместе с чеклистом doctor по установке удобно ссылаться на строки в шаблоне тикета.
| Симптом | docker logs / хост | Приоритетное действие |
|---|---|---|
| Сразу 137 | dmesg с OOM или обрыв лога | Поднять mem_limit или класс инстанса; снизить конкуренцию |
| Permission denied на workspace | Том с владельцем root, пользователь node в контейнере без записи | chown на UID контейнера или согласовать user: с томом |
| Конфиг не применяется | Два пути к .openclaw на хосте и в compose | Один bind; перед рестартом docker compose config |
| Нестабильный DNS | curl из контейнера к endpoint модели — таймаут | Проверить dns Docker и резолв на хосте по длинной статье |
| Циклы рестартов без новых логов | Слишком агрессивный healthcheck | Увеличить start_period и retries |
Эффективность Docker-разбора зависит от того, доказан ли 137 как OOM, а не принят наугад за баг приложения.
Если Gateway на VPS сочетается с постоянно доступным удалённым Mac, разделяйте приёмку «ресурсы контейнера» (compose, логи) и «SLA узла» (зона, окна обслуживания).
Публикация 18789 в интернет с VPS — типичная ошибка. В статье по установке рекомендуется только loopback в контейнере, TLS на Caddy или Nginx на 443. Ошибка non-loopback в Control UI означает расхождение Origin браузера и разрешённых Origins у шлюза, а не «сломан Docker».
| Сценарий | Прослушивание / прокси | Настройка |
|---|---|---|
| Отладка через локальный SSH-туннель | 127.0.0.1:18789 | allowedOrigins включает http://127.0.0.1:18789 |
| Боевой HTTPS по домену | Прокси на loopback-upstream | allowedOrigins с https://ваш-домен; по возможности без Host-отката |
| Временная лаборатория | HTTP на внутренний IP | Явно перечислить IP-источники; сузить CIDR; убрать после работ |
| «Срочно увидеть UI» | TLS снаружи всё равно желателен | Host-откат из документации только осознанно; затем откатить |
{
"gateway": {
"mode": "local",
"controlUi": {
"allowedOrigins": ["https://openclaw.example.com"]
}
}
}
Заметка: после правок openclaw.json проверьте, не попадает ли docker compose restart в первое WASM-окно и не суммируется ли это с ложной диагностикой из раздела 2.
Для openclaw в контейнере HOME и том конфигурации должны совпадать с рабочим процессом, иначе «на хосте approve, в контейнере pending». Имя сервиса здесь openclaw — замените на своё в compose.
Имя сервиса: docker compose ps — контейнер с Gateway.
Та же среда: docker compose exec openclaw sh -lc 'pwd; echo $HOME; ls -la ~/.openclaw | head'
Список запросов: docker compose exec openclaw openclaw devices list
Request ID: из UI или лога, затем openclaw devices approve <id>.
Видимость API-ключа: при No API key found for provider убедиться, что .env попадает в контейнер через compose, а не только в shell-профиль хоста.
Поля тикета: путь к compose, тег образа, краткий openclaw.json, команда approve для повторного использования.
Важно: openclaw devices approve на хосте при том, что конфиг смонтирован только в контейнере, даёт ложный отрицательный результат.
Три типичных интервала проверки — заполните реальными метриками хоста и добавьте в README, чтобы новые участники не повторяли одни и те же ошибки.
| № | Перед продом | Критерий успеха |
|---|---|---|
| 01 | ports только 127.0.0.1 | 18789 недоступен из интернета напрямую |
| 02 | env_file и пути секретов согласованы | Ключ провайдера модели читается в контейнере |
| 03 | mem_limit и политика swap задокументированы | Нагрузочный прогон без 137 |
| 04 | healthcheck.start_period ≥ 360s | Нет шторма рестартов в первом окне |
| 05 | В openclaw.json gateway.mode = local | Невалидные ключи убраны |
| 06 | TLS и HSTS на прокси | Нет предупреждений mixed content |
| 07 | allowedOrigins покрывает реальные Origin | Нет non-loopback в Control UI |
| 08 | Сопряжение устройств проверено внутри контейнера | devices list пуст или всё approved |
| 09 | Резервная копия пути .openclaw и версии | Восстановление по одной странице runbook |
| 10 | Согласовано с документацией каналов | Доступны колбэки IM или webhook |
services:
openclaw:
image: ghcr.io/openclaw/openclaw:latest
restart: unless-stopped
mem_limit: 2g
ports:
- "127.0.0.1:18789:18789"
volumes:
- ${HOME}/.openclaw:/home/node/.openclaw
env_file:
- .env
healthcheck:
test: ["CMD", "curl", "-f", "http://127.0.0.1:18789/health"]
interval: 60s
timeout: 15s
retries: 5
start_period: 360s
Постоянный Gateway на ноутбуке страдает от сна, закрытой крышки и нестабильного uplink; домашний канал редко даёт измеримый SLA. Облачный Mac mini с поминутной или периодической оплатой лучше подходит для гибридных сценариев OpenClaw на VPS с графикой или Xcode.
Частая ошибка: 0.0.0.0:18789 «для удобной отладки» на публичном VPS — это вынос контрольной плоскости под сканеры.
Если нужен стабильный Docker-шлюз и тяжёлые шаги на macOS с договорной фиксацией, закупка и синхронизация между площадками часто дороже аренды. Для узлов 7×24 с проверяемым SLA и гибкими размерами аренда Mac mini в облаке VpsMesh часто выгоднее: зафиксируйте в архитектуре разделение VPS OpenClaw и выделенного удалённого Mac, оцените ёмкость по ценам аренды и оформлению заказа — это проще закрепить в договоре, чем устные обещания.
Сначала dmesg на хосте и mem_limit на предмет OOM; заложите окно первой WASM-компиляции. Базовые ресурсы сверьте с статьёй OpenClaw v2026.4.
В openclaw.json в gateway.controlUi.allowedOrigins указать реальный HTTPS-Origin и проверить, что прокси не передаёт неверный Host на upstream. Полный поток: чеклист установки Gateway.
Через docker compose exec тот же пользователь и те же монтирования, что у Gateway, затем openclaw devices list. Иначе эксплуатационный разбор в три блока. Ёмкость: цены аренды, оформить заказ; связь: центр помощи.