UI управления (браузер)¶
UI управления — это небольшое одностраничное приложение Vite + Lit, которое обслуживается Gateway:
- по умолчанию:
http://<host>:18789/ - необязательный префикс: задайте
gateway.controlUi.basePath(например,/openclaw)
Он напрямую общается с WebSocket Gateway на том же порту.
Быстрое открытие (локально)¶
Если Gateway запущен на том же компьютере, откройте:
Если страница не загружается, сначала запустите Gateway: openclaw gateway.
Аутентификация передаётся во время рукопожатия WebSocket через:
connect.params.auth.tokenconnect.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.allowTailscale — true. 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 — в другом месте.
- Запустите dev‑сервер UI:
pnpm ui:dev - Откройте 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.