--- date: 2026-04-17 type: project tags: [dttb, bot] --- # OpenClaw — основной AI-бот (LXC 137) Справочник по установке, настройке и починке OpenClaw. Обновлён 2026-04-17. ## Что это **OpenClaw** (в Telegram/Nextcloud — "Максимка") — основной AI-бот Олега. Multi-channel AI gateway: принимает сообщения из Telegram и Nextcloud Talk, отвечает через OmniRoute (бесплатные модели) и умеет делегировать сложные задачи на code-server (Opus 4.7 через Max подписку). - **NPM пакет:** [`openclaw`](https://www.npmjs.com/package/openclaw) - **GitHub:** https://github.com/openclaw/openclaw - **Автор конфига:** установлен и ведётся Олегом под персонажа "Максимка" 🤖 ## Где живёт | Параметр | Значение | |----------|----------| | Proxmox LXC | **137** (hostname `openclaw`) | | IP | 10.0.0.239 (LAN) / 100.70.167.54 (NetBird) | | CPU / RAM | 2 vCPU / 6 GB | | Node.js | v24.x | | Доступ | `sshpass -p '1qaz!QAZ' ssh root@10.0.0.250 "pct exec 137 -- bash"` | ## Установка (из чистого LXC) ```bash # Ubuntu LXC с Node ≥ 20 apt update && apt install -y nodejs npm npm install -g openclaw openclaw setup # интерактивный онбординг openclaw configure # настройка каналов, моделей, креденшалов ``` Бинарь попадает в `/usr/bin/openclaw` (shim), код в `/usr/lib/node_modules/openclaw/`. ## Структура на диске ``` /root/.openclaw/ ← state dir (OPENCLAW_STATE_DIR) ├── openclaw.json ← главный config ├── openclaw.json.bak ← автобэкап (последний) ├── openclaw.json.bak-YYYY-MM-DD-... ← ручные бэкапы (сам делай перед правками) ├── agents/ │ ├── main/ │ │ ├── sessions/ │ │ │ ├── sessions.json ← индекс сессий (key → id, model, tokens) │ │ │ ├── .jsonl ← полная переписка сессии (messages, tool calls) │ │ │ └── .jsonl.reset.* ← архив после /reset │ │ └── agent/models.json ← модели доступные агенту (в кэше) │ ├── codex/ │ └── claude-code/ ├── nextcloud-talk/ ← state Nextcloud Talk канала ├── credentials/ ├── memory/ ← векторная память (если включена) ├── canvas/ ← Canvas host контент ├── delivery-queue/ ├── flows/ ├── exec-approvals.json ← whitelist команд для exec tool └── storage.sqlite? (нет в openclaw, только у omniroute) /root/clawd/ ← рабочая папка бота (workspace) ├── IDENTITY.md ← личность бота (имя, язык, аватар) ├── INFRASTRUCTURE.md ← карта инфраструктуры для бота ├── TOOLS.md ← креды, порты, ссылки (важно держать актуальным) ├── DELEGATION.md ← инструкция как делегировать на Opus/code-server ├── MEMORY.md ← что помнить постоянно ├── SOUL.md ← характер, вайб ├── USER.md ← что знать про пользователя (Олега) ├── AGENTS.md ← про суб-агентов ├── HEARTBEAT.md ← статус-флаг для self-check ├── HAPP-VPN.md ← текущие VPN настройки пользователя ├── tasks.md ← TODO бота ├── scripts/ ← рабочие скрипты (wrapper, monitor, cron) │ ├── claude-code-wrapper.sh ← **делегирование на Opus 4.7** │ ├── email_monitor.py ← cron */10, Авито уведомления │ ├── znam-pairing-check.sh ← cron */3 │ └── nextcloud-talk-bot.py ← legacy (старый бот, не используется) ├── knowledge-base/ ← база знаний бота ├── memory/ ← его заметки ├── projects/ ← проекты ├── prompts/ ← системные промпты └── claude-code-sessions/ ← сессии claude CLI на этой машине (не на code-server) /root/.config/systemd/user/ └── openclaw-gateway.service ← **systemd --user** service (не /etc/systemd/system!) ``` ## Сервис (systemd user) OpenClaw gateway — systemd **user**-level unit, не system. Все команды с `--user`. ```bash systemctl --user status openclaw-gateway.service systemctl --user restart openclaw-gateway.service systemctl --user reset-failed openclaw-gateway.service # при restart loop journalctl --user -u openclaw-gateway.service -n 50 --no-pager ``` Unit запускает: ``` ExecStart=/usr/bin/node /usr/lib/node_modules/openclaw/dist/index.js gateway --port 18789 ``` Порты: - **18789** — gateway (WebSocket + HTTP), в `.env` `OPENCLAW_GATEWAY_PORT` - **18789/__openclaw__/canvas/** — Canvas host (UI) - Если запущен в `--dev`: gateway 19001 ## Конфигурация: `openclaw.json` Единый JSON, валидируется zod-схемой с `additionalProperties: false` на большинстве секций. **Любой лишний ключ ломает старт** с `Config invalid`. ### Просмотр и правка ```bash openclaw config file # путь к активному конфигу openclaw config get gateway.port # значение по dot-path openclaw config set gateway.port 18789 # изменить openclaw config unset acp.agents # удалить ключ openclaw config schema # полная JSON schema — узнать какие поля допустимы openclaw config validate # проверить без рестарта openclaw doctor # диагностика openclaw doctor --fix # автофикс (не всесильный, делай бэкап) ``` ### Секции конфига (по schema) - `env` — переменные окружения gateway - `update` — auto-update настройки, канал релизов - `agents` — defaults (модель, workspace, concurrency) + **list** (массив агентов, не объект!) - `acp` — Agent Control Protocol. Допустимые ключи: `enabled, dispatch, backend, defaultAgent, allowedAgents, maxConcurrentSessions, stream, runtime`. **`agents` запрещён!** - `auth` — API ключи профилей - `channels` — telegram, nextcloud-talk, discord и т.д. - `messages` — маршрутизация сообщений - `commands` — кастомные slash-команды - `hooks` — webhook и event-хуки - `skills` — skill-паки - `tools` — browser, search, file, runtime и пр. - `gateway` — настройки WS-сервера (порт, auth, binding) - `wizard` — состояние setup wizard - `meta` — версия/метаданные - `logging` — уровни и вывод логов - `browser` — headless browser настройки - `ui` — UI preferences - `models` — провайдеры + каталог моделей - `bindings` — key bindings - `broadcast` — broadcast/notification - `audio` — входы/выходы аудио - `session` — управление сессиями и persistence - `cron` — scheduled tasks через gateway - `web` — web server / API - `discovery` — service discovery (Tailscale + CoreDNS) - `canvasHost` — Canvas - `talk` — голос/речь - `plugins` — плагины - `diagnostics` — OpenTelemetry, cache-trace - `cli` — CLI баннер, startup - `secrets` — secret providers - `mcp` — MCP-сервера ### Провайдеры моделей (наш стек) В `openclaw.json → models.providers` у Олега настроены: - `openrouter` - `anthropic` - `zai` — OmniRoute через ZenAI адаптер - `omniroute` — прямой OmniRoute (localhost:20128 на code-server) - `zai-orig` — оригинальный zai endpoint ### Модели в сессиях — **НЕ ТРОГАЙ** В `agents/main/sessions/sessions.json` и `agent/models.json` модели хранятся в формате: - `kr/claude-sonnet-4.5` — Kiro провайдер - `cx/gpt-5.4` — Codex (OpenAI) - `gh/claude-sonnet-4.5` — GitHub Models - `glm/glm-5.1` — Z.AI GLM - `gemini-cli/gemini-2.5-pro` — Google Gemini CLI **Не добавляй префикс `zai/`!** Это прямая адресация Kiro/Codex/GH/GLM провайдеров. Работает. `openclaw models list` показывает только `zai/*` — это view того что openclaw регистрирует локально, но провайдеры резолвят и `kr/...` напрямую. Лог вида: ``` [diagnostic] FailoverError: Unknown model: kr/claude-sonnet-4.5 ... next=zai/kr/claude-sonnet-4.5 ``` — **безвредный warning** с автофоллбеком. Игнорируй. Это НЕ причина того что бот не отвечает. ## Делегирование на code-server (Opus 4.7) Для сложных задач (большой рефакторинг, генерация кода) бот делегирует на LXC 132 (code-server) где установлен Claude Code CLI с Max подпиской. **Wrapper:** `/root/clawd/scripts/claude-code-wrapper.sh` Текущая (рабочая, 2026-04-17) реализация — non-interactive print-режим: ```bash #!/bin/bash # Wrapper: делегирует задачу на code-server (LXC 132), Opus 4.7. # Использование: # claude-code-wrapper.sh "текст задачи" # echo "задача" | claude-code-wrapper.sh set -e if [ -t 0 ] && [ $# -eq 0 ]; then echo "ERROR: нужен prompt в аргументе или на stdin" >&2 exit 2 fi PROMPT="${*:-$(cat)}" PROMPT_B64=$(printf %s "$PROMPT" | base64 -w0) ssh -o StrictHostKeyChecking=no root@10.0.0.250 \ "pct exec 132 -- bash -c \"cd /root && echo $PROMPT_B64 | base64 -d | claude -p --output-format text\"" ``` Ключевое: **`claude -p`** (print-режим). Без `-p` запускается REPL и виснет. Инструкция для самого бота — в `/root/clawd/DELEGATION.md`. ## Каналы ### Telegram - Bot token хранится в `channels.telegram.token` (через `ref:env` или напрямую) - `dmPolicy` и `groupPolicy` — доступ. **Open policy небезопасно** (security audit ругается), используй `allowlist` + `allowFrom` - Bot username указан в openclaw status ### Nextcloud Talk - URL `http://10.0.0.230:11001` (Nextcloud AIO) - Пользователь `maximka` / `MaximkaBot2026` - Основная беседа token: `aecax6yg` - Админ: `admin` / `1qaz!QAZ` ## Частые проблемы и их решения ### Проблема: `Config invalid ... Unrecognized key` Новая версия openclaw ужесточила schema. Старые поля больше не принимаются. 1. `cp /root/.openclaw/openclaw.json /root/.openclaw/openclaw.json.bak-$(date +%F-%H%M)` 2. `openclaw doctor --fix` — мигрирует что может 3. Если не помогло — получить expected schema: `openclaw config schema` (JSON), сравнить со своим config 4. Частые исправления: - `acp.agents` → перенести содержимое в `agents.list` (**массив**!), удалить из acp - `agents.list` как `{"name": {...}}` → переделать в `[{"id":"name", ...}]` - Удалить неизвестные top-level ключи ### Проблема: Gateway падает с `Cannot find module 'dist/index.js'` Временная ошибка во время `npm install` (файлы распаковываются). Подождать, сервис сам поднимется через Restart=always. ### Проблема: Bot "залип" — не отвечает в Telegram/Talk Порядок проверки: 1. `pct status 137` — LXC запущен? 2. `pct exec 137 -- systemctl --user is-active openclaw-gateway.service` — gateway активен? 3. `pct exec 137 -- openclaw status` — каналы ON? сессии есть? 4. `journalctl --user -u openclaw-gateway.service --since "10 min ago" | grep -iE "error|fail"` — последние ошибки 5. Если gateway в restart-loop: `systemctl --user reset-failed openclaw-gateway.service` перед рестартом ### Проблема: Бот застревает при делегировании на Opus Wrapper запускал `claude` без `-p` → интерактивный REPL → висел. Решение уже в wrapper (2026-04-17). Если опять: проверить что `/root/clawd/scripts/claude-code-wrapper.sh` использует `claude -p --output-format text`, а не голый `claude`. ### Проблема: Crash-loop каждые ~40 сек с `CIAO PROBING/ANNOUNCEMENT CANCELLED` (bonjour плагин) **Симптомы (2026-04-27, openclaw 2026.4.24):** - `systemctl --user is-active openclaw-gateway.service` → `active`, но `NRestarts` растёт каждую минуту - В логе `/tmp/openclaw/openclaw-.log`: цикл `gateway ready (8 plugins: ..., bonjour, ...)` → `[openclaw] Unhandled promise rejection: CIAO PROBING CANCELLED` (или `CIAO ANNOUNCEMENT CANCELLED`) → `wrote stability bundle ... unhandled_rejection.json` → `Main process exited, code=exited, status=1/FAILURE` → systemd рестартит через 5 сек - В журналах раньше предупреждение: `bonjour: watchdog detected non-announced service; attempting re-advertise` - Telegram молчит (бот не успевает обработать update между рестартами) **Корень:** плагин `bonjour` использует `@homebridge/ciao` для mDNS-анонса. Если LXC сеть не пускает multicast (типичная история для bridged-LXC за NPM), ciao периодически отменяет PROBING/ANNOUNCEMENT, выбрасывает rejection, который не отлавливается и валит весь node-процесс. **Починка:** отключить bonjour-плагин — он по умолчанию загружается, даже если не прописан в `plugins.entries`. ```bash pct exec 137 -- bash -c ' cp /root/.openclaw/openclaw.json /root/.openclaw/openclaw.json.bak.$(date +%F-%H%M) python3 -c " import json p = \"/root/.openclaw/openclaw.json\" d = json.load(open(p)) d.setdefault(\"plugins\",{}).setdefault(\"entries\",{})[\"bonjour\"] = {\"enabled\": False} json.dump(d, open(p,\"w\"), indent=2, ensure_ascii=False) " XDG_RUNTIME_DIR=/run/user/0 systemctl --user restart openclaw-gateway.service ' ``` **Проверка успеха:** в логе должно быть `ready (7 plugins: acpx, browser, device-pair, nextcloud-talk, phone-control, talk-voice, telegram)` — без `bonjour`. `NRestarts=0` после рестарта, аптайм > 60 сек. **Что bonjour даёт и что теряем:** mDNS-анонс gateway по `_openclaw-gw._tcp.local.` для автодискавери в LAN. У нас доступ всегда по фиксированному IP (10.0.0.239) или через `bot.dttb.ru` — не нужен. ### Проблема: Telegram polling stall + OmniRoute fetch failed (DNS отдаёт FakeIP) **Симптомы (2026-04-27):** - В логе `Telegram webhook cleanup failed: Network request for 'deleteWebhook' failed!`, `[telegram] Polling stall detected (no completed getUpdates for 240s); forcing restart` - `OpenRouter pricing fetch failed (timeout 30s)`, OmniRoute через себя возвращает `502 [kiro/...]: fetch failed (reset after 5s)` - Из контейнера `getent ahostsv4 api.telegram.org` отдаёт `198.18.0.6` (или другой `198.18.x`) - `curl https://api.telegram.org/` → `Failed to connect ... port 443 after Xms` - Но curl `--resolve api.telegram.org:443:149.154.166.110` → `200 OK` за ~150мс — то есть **сама сеть работает**, просто DNS даёт неработающий IP **Корень:** дефолтный `/etc/resolv.conf` в LXC 137 после создания указывает на gateway `10.0.0.1` (это OpenWrt/MikroTik LionART с Mihomo/sing-box). Mihomo возвращает **FakeIP** (`198.18.0.0/15` per RFC 6815) для проксируемых доменов. FakeIP перенаправляется TPROXY-правилами на самом маршрутизаторе → его собственный proxy-выход. **Из LXC 137 трафик в `198.18/15`** некуда идти — нет route и нет TPROXY на этой машине, connection просто фейлится. **Fix — DNS на честные `1.1.1.1` / `8.8.8.8`** (UDP/53 на них уходит через NetBird `wt0` → Финка-exit → реальный ответ): ```bash pct set 137 --nameserver '1.1.1.1 8.8.8.8' pct exec 137 -- bash -c 'cat > /etc/resolv.conf < # проверка # Или ручной: tar czf /root/openclaw-state-$(date +%F).tar.gz /root/.openclaw /root/clawd ``` Ключевые файлы для ручного бэкапа: - `/root/.openclaw/openclaw.json` — конфиг - `/root/.openclaw/agents/main/sessions/` — история сессий - `/root/clawd/*.md` — personality и инструкции - `/root/.config/systemd/user/openclaw-gateway.service` — systemd unit ## История изменений (релевантное) - **2026-04-14** — LXC 129 (старый Clawdbot) удалён, данные в `/root/clawd/` на LXC 137. Решение: [decisions/2026-04-14-openclaw-claude-code-pipeline.md](../../decisions/2026-04-14-openclaw-claude-code-pipeline.md). - **2026-04-17** — обновление 2026.4.10 → 2026.4.15, починка config (удалён `acp.agents`, `agents.list` object → удалён), починка wrapper (`claude` → `claude -p`), создан DELEGATION.md. Решение: [decisions/2026-04-17-code-server-upgrade.md](../../decisions/2026-04-17-code-server-upgrade.md). - **2026-04-27** — две независимые проблемы привели к "бот молчит": 1. openclaw 2026.4.24 в crash-loop каждые ~40 сек на `Unhandled promise rejection: CIAO PROBING/ANNOUNCEMENT CANCELLED` (mDNS bonjour-плагин). Лечится отключением `plugins.entries.bonjour.enabled = false`. 2. После починки crash-loop всплыла FakeIP DNS — `/etc/resolv.conf` смотрел на `10.0.0.1`, тот отдавал `198.18.0.6` для api.telegram.org (Mihomo FakeIP без proxy-маршрута из LXC). Лечится переключением DNS на `1.1.1.1 8.8.8.8` через `pct set --nameserver` (резолвят через NetBird wt0). См. два новых раздела в "Частые проблемы".