Перейти к основному содержанию

UI управления (браузер)

UI управления — это небольшое одностраничное приложение Vite + Lit, которое обслуживается Gateway:
  • по умолчанию: http://<host>:18789/
  • необязательный префикс: задайте gateway.controlUi.basePath (например, /openclaw)
Он напрямую общается с WebSocket Gateway на том же порту.

Быстрое открытие (локально)

Если Gateway запущен на том же компьютере, откройте: Если страница не загружается, сначала запустите Gateway: openclaw gateway. Аутентификация передаётся во время рукопожатия WebSocket через:
  • connect.params.auth.token
  • connect.params.auth.password Панель настроек дашборда позволяет сохранить токен; пароли не сохраняются. Мастер онбординга по умолчанию генерирует токен Gateway, поэтому при первом подключении вставьте его сюда.

Сопряжение устройства (первое подключение)

Когда вы подключаетесь к UI управления из нового браузера или с нового устройства, Gateway требует одноразового подтверждения сопряжения — даже если вы находитесь в том же Tailnet с gateway.auth.allowTailscale: true. Это мера безопасности для предотвращения несанкционированного доступа. Что вы увидите: «disconnected (1008): pairing required» Как одобрить устройство:
# List pending requests
openclaw devices list

# Approve by request ID
openclaw devices approve <requestId>
После одобрения устройство запоминается и не потребует повторного подтверждения, пока вы не отзовёте его с помощью openclaw devices revoke --device <id> --role <role>. Devices CLI для ротации токенов и отзыва. Примечания:
  • Локальные подключения (127.0.0.1) одобряются автоматически.
  • Удалённые подключения (LAN, Tailnet и т. п.) требуют явного одобрения.
  • Каждый профиль браузера генерирует уникальный идентификатор устройства, поэтому смена браузера или очистка данных браузера потребует повторного сопряжения.

Что он умеет (на сегодня)

  • Чат с моделью через Gateway WS (chat.history, chat.send, chat.abort, chat.inject)
  • Потоковая передача вызовов инструментов и живые карточки вывода инструментов в чате (события агента)
  • Каналы: WhatsApp/Telegram/Discord/Slack + каналы плагинов (Mattermost и т. п.) — статус + QR‑вход + конфиг на канал (channels.status, web.login.*, config.patch)
  • Инстансы: список присутствия + обновление (system-presence)
  • Сеансы: список + переопределения «thinking/verbose» для каждого сеанса (sessions.list, sessions.patch)
  • Cron‑задачи: список/добавить/запустить/включить/выключить + история запусков (cron.*)
  • Skills: статус, включение/выключение, установка, обновление ключей API (skills.*)
  • Узлы: список + возможности (node.list)
  • Подтверждения выполнения команд: редактирование списков разрешённых для Gateway или узла + запрос политики для exec host=gateway/node (exec.approvals.*)
  • Конфиг: просмотр/редактирование ~/.openclaw/openclaw.json (config.get, config.set)
  • Конфиг: применить + перезапустить с валидацией (config.apply) и пробудить последний активный сеанс
  • Записи конфига включают защиту по базовому хэшу, чтобы предотвратить перезапись параллельных правок
  • Схема конфига + рендеринг форм (config.schema, включая схемы плагинов и каналов); редактор Raw JSON остаётся доступным
  • Отладка: снимки статуса/здоровья/моделей + журнал событий + ручные RPC‑вызовы (status, health, models.list)
  • Логи: живой tail файловых логов Gateway с фильтрацией/экспортом (logs.tail)
  • Обновление: запуск обновления пакета/git + перезапуск (update.run) с отчётом о перезапуске
Примечания к панели Cron‑задач:
  • Для изолированных задач доставка по умолчанию — объявление краткого резюме. Можно переключить на «нет», если нужны только внутренние запуски.
  • Поля канал/цель появляются, когда выбрано «announce».

Поведение чата

  • chat.send неблокирующий: сразу подтверждается с { runId, status: "started" }, а ответ поступает потоково через события chat.
  • Повторная отправка с тем же idempotencyKey возвращает { status: "in_flight" } во время выполнения и { status: "ok" } после завершения.
  • chat.inject добавляет заметку ассистента в транскрипт сеанса и рассылает событие chat только для UI‑обновлений (без запуска агента и без доставки в канал).
  • Остановка:
    • Нажмите Stop (вызывает chat.abort)
    • Введите /stop (или stop|esc|abort|wait|exit|interrupt) для внеполосной отмены
    • chat.abort поддерживает { sessionKey } (без runId) для отмены всех активных запусков для этого сеанса

Доступ через Tailnet (рекомендуется)

Интегрированный Tailscale Serve (предпочтительно)

Оставьте Gateway на loopback и проксируйте его через Tailscale Serve с HTTPS:
openclaw gateway --tailscale serve
Откройте:
  • https://<magicdns>/ (или ваш настроенный gateway.controlUi.basePath)
По умолчанию запросы Serve могут аутентифицироваться через заголовки идентичности Tailscale (tailscale-user-login), когда gateway.auth.allowTailscaletrue. OpenClaw проверяет идентичность, разрешая адрес x-forwarded-for с помощью tailscale whois и сопоставляя его с заголовком, и принимает такие запросы только когда они приходят на loopback с заголовками Tailscale x-forwarded-*. Установите gateway.auth.allowTailscale: false (или принудительно gateway.auth.mode: "password"), если хотите требовать токен/пароль даже для трафика Serve.

Привязка к tailnet + токен

openclaw gateway --bind tailnet --token "$(openssl rand -hex 32)"
Затем откройте:
  • http://<tailscale-ip>:18789/ (или ваш настроенный gateway.controlUi.basePath)
Вставьте токен в настройках UI (передаётся как connect.params.auth.token).

Небезопасный HTTP

Если вы открываете дашборд по обычному HTTP (http://<lan-ip> или http://<tailscale-ip>), браузер работает в незащищённом контексте и блокирует WebCrypto. По умолчанию OpenClaw блокирует подключения UI управления без идентичности устройства. Рекомендуемое исправление: используйте HTTPS (Tailscale Serve) или открывайте UI локально:
  • https://<magicdns>/ (Serve)
  • http://127.0.0.1:18789/ (на хосте шлюза Gateway)
Пример понижения (только токен по HTTP):
{
  gateway: {
    controlUi: { allowInsecureAuth: true },
    bind: "tailnet",
    auth: { mode: "token", token: "replace-me" },
  },
}
Это отключает идентичность устройства и сопряжение для UI управления (даже по HTTPS). Используйте только если вы доверяете сети. См. Tailscale для рекомендаций по настройке HTTPS.

Сборка UI

Gateway раздаёт статические файлы из dist/control-ui. Соберите их с помощью:
pnpm ui:build # auto-installs UI deps on first run
Необязательная абсолютная база (когда нужны фиксированные URL ресурсов):
OPENCLAW_CONTROL_UI_BASE_PATH=/openclaw/ pnpm ui:build
Для локальной разработки (отдельный dev‑сервер):
pnpm ui:dev # auto-installs UI deps on first run
Затем укажите UI URL WebSocket вашего Gateway (например, ws://127.0.0.1:18789).

Отладка/тестирование: dev‑сервер + удалённый Gateway

UI управления — это статические файлы; цель WebSocket настраивается и может отличаться от HTTP‑источника. Это удобно, когда вы хотите запускать Vite dev‑сервер локально, а Gateway — в другом месте.
  1. Запустите dev‑сервер UI: pnpm ui:dev
  2. Откройте URL вида:
http://localhost:5173/?gatewayUrl=ws://<gateway-host>:18789
Необязательная одноразовая аутентификация (если требуется):
http://localhost:5173/?gatewayUrl=wss://<gateway-host>:18789&token=<gateway-token>
Примечания:
  • gatewayUrl сохраняется в localStorage после загрузки и удаляется из URL.
  • token сохраняется в localStorage; password хранится только в памяти.
  • Когда задан gatewayUrl, UI не использует запасные учётные данные из конфига или переменных окружения. Явно укажите token (или password). Отсутствие явных учётных данных — ошибка.
  • Используйте wss://, когда Gateway находится за TLS (Tailscale Serve, HTTPS‑прокси и т. п.).
  • gatewayUrl принимается только в окне верхнего уровня (не во встраиваемом), чтобы предотвратить кликджекинг.
  • Для кросс‑доменной разработки (например, pnpm ui:dev к удалённому Gateway) добавьте origin UI в gateway.controlUi.allowedOrigins.
Пример:
{
  gateway: {
    controlUi: {
      allowedOrigins: ["http://localhost:5173"],
    },
  },
}
Подробности настройки удалённого доступа: Remote access.