Files
proxmox-mcp-setup/proxmox-mcp-open-webui-setup.md
T

196 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Установка Proxmox MCP-сервера и подключение к Open WebUI
Инструкция под твою инфраструктуру: **pve** (192.168.31.2), **kybinka** (192.168.1.10), **pve1** (192.168.31.4), **TrueNAS** (192.168.31.100, там же крутится Open WebUI).
Используем проект **ProxmoxMCP-Plus** — он умеет работать сразу в двух режимах:
- родной MCP (для Claude Desktop, Cursor и т.д.)
- **OpenAPI-мост** — именно он нужен для Open WebUI, потому что Open WebUI не умеет подключаться к MCP напрямую, а понимает только обычный HTTP/OpenAPI.
## ⚠️ Важный момент про архитектуру
Твои три Proxmox-узла (`pve`, `kybinka`, `pve1`) — это **не один кластер**, а три независимых сервера в разных подсетях. Один MCP-контейнер умеет говорить только с **одним** Proxmox API за раз. Значит, чтобы управлять всеми тремя из чата, нужно поднять **три отдельных контейнера** (по одному на узел), каждый на своём порту, и подключить их к Open WebUI как три отдельных инструмента.
TrueNAS отдельно — это **не Proxmox**, и ProxmoxMCP-Plus с ним не работает. Управлять TrueNAS через тот же чат — отдельная задача (нужен другой MCP-сервер, для TrueNAS API). Ниже — только про Proxmox-узлы, но покажу, где ты потом можешь добавить TrueNAS-инструмент рядом.
Разворачивать контейнеры удобнее всего **на TrueNAS** — там уже крутится Open WebUI, сервер работает постоянно, и можно поднимать Docker-контейнеры через Dockge.
---
## Шаг 1. Создать API-токен на каждом Proxmox-узле
Токен создаётся отдельно на **каждом** из трёх узлов (pve, kybinka, pve1), заходишь в веб-интерфейс каждого по отдельности.
1. Открой веб-интерфейс узла, например `https://192.168.31.2:8006`.
2. Слева: **Datacenter → Permissions → API Tokens**.
3. Нажми **Add**:
- User: `root@pam` (для учёбы ок, в проде лучше завести отдельного пользователя с ограниченными правами)
- Token ID: `mcp-token`
- **сними галку** "Privilege Separation" (иначе токену нужно отдельно назначать права)
4. Нажми **Add**, скопируй **Token ID** и **Secret** — секрет показывается один раз, сохрани его сразу в текстовый файл.
Повтори для `kybinka` и `pve1`. В итоге у тебя будет 3 пары `user@realm!token-name` + `secret`.
---
## Шаг 2. Подготовить конфиги на TrueNAS
Зайди на TrueNAS по SSH (или через Shell в веб-интерфейсе), создай папку для конфигов:
```bash
mkdir -p /mnt/ssd/apps/mcp/{pve,kybinka,pve1}
```
(используется пул `ssd`; если у тебя он смонтирован по другому пути или ты хочешь другой пул — замени `/mnt/ssd` на свой).
Создай конфиг для узла **pve**:
```bash
cat > /mnt/ssd/apps/mcp/pve/config.json << 'EOF'
{
"proxmox": {
"host": "192.168.31.2",
"port": 8006,
"verify_ssl": false
},
"auth": {
"user": "root@pam",
"token_name": "mcp-token",
"token_value": "СЮДА_СЕКРЕТ_ТОКЕНА_PVE"
}
}
EOF
```
Аналогично создай `config.json` в папках `kybinka` (host `192.168.1.10`) и `pve1` (host `192.168.31.4`), с соответствующими токенами.
> `verify_ssl: false` — потому что у Proxmox самоподписанный сертификат по умолчанию. Для учебного стенда это нормально.
---
## Шаг 3. Запустить три контейнера через Dockge
Вместо запуска через Shell создай один Stack (стек) в веб-интерфейсе **Dockge**. Все три контейнера будут управляться из одного стека.
1. Открой Dockge в браузере.
2. Нажми **Create Stack** (или **+**).
3. Введи имя стека, например `proxmox-mcp`.
4. В качестве рабочей директории стека укажи:
`/mnt/ssd/apps/mcp`
Если Dockge уже использует собственную корневую директорию для стеков, выбери или создай каталог, соответствующий этому пути. Важно, чтобы каталоги `pve`, `kybinka` и `pve1` с файлами `config.json` находились внутри рабочей директории стека.
5. В редакторе compose-файла вставь следующий конфиг:
```yaml
services:
proxmox-mcp-pve:
image: ghcr.io/rekklesna/proxmoxmcp-plus:latest
container_name: proxmox-mcp-pve
restart: unless-stopped
ports:
- "8811:8811"
environment:
PROXMOX_API_KEY: ключ-для-pve-придумай-любой-длинный
volumes:
- /mnt/ssd/apps/mcp/pve/config.json:/app/proxmox-config/config.json:ro
proxmox-mcp-kybinka:
image: ghcr.io/rekklesna/proxmoxmcp-plus:latest
container_name: proxmox-mcp-kybinka
restart: unless-stopped
ports:
- "8812:8811"
environment:
PROXMOX_API_KEY: ключ-для-kybinka-придумай-любой-длинный
volumes:
- /mnt/ssd/apps/mcp/kybinka/config.json:/app/proxmox-config/config.json:ro
proxmox-mcp-pve1:
image: ghcr.io/rekklesna/proxmoxmcp-plus:latest
container_name: proxmox-mcp-pve1
restart: unless-stopped
ports:
- "8813:8811"
environment:
PROXMOX_API_KEY: ключ-для-pve1-придумай-любой-длинный
volumes:
- /mnt/ssd/apps/mcp/pve1/config.json:/app/proxmox-config/config.json:ro
```
6. Замени значения `ключ-для-*` на собственные длинные ключи. Ключи можно сгенерировать заранее командой:
```bash
openssl rand -hex 32
```
Команду можно выполнить на любом компьютере, где установлен OpenSSL. Для каждого контейнера используй отдельный ключ.
7. Нажми **Save**.
8. Нажми **Deploy** / **Up** / **Start** — название кнопки зависит от версии Dockge.
После запуска в Dockge должны появиться три контейнера:
- `proxmox-mcp-pve` — порт `8811`;
- `proxmox-mcp-kybinka` — порт `8812`;
- `proxmox-mcp-pve1` — порт `8813`.
> Если Dockge не может найти `config.json`, проверь, что рабочая директория стека действительно `/mnt/ssd/apps/mcp`, а файлы находятся по адресам `/mnt/ssd/apps/mcp/pve/config.json`, `/mnt/ssd/apps/mcp/kybinka/config.json` и `/mnt/ssd/apps/mcp/pve1/config.json`.
---
## Шаг 4. Проверить, что контейнеры работают
Проверку можно выполнить через встроенный Terminal/Shell TrueNAS или другим компьютером в сети:
```bash
curl -f http://192.168.31.100:8811/livez # pve
curl -f http://192.168.31.100:8812/livez # kybinka
curl -f http://192.168.31.100:8813/livez # pve1
```
Каждый должен ответить `200 OK`. Дальше проверь авторизованный доступ (подставь свой ключ и порт):
```bash
curl -H "Authorization: Bearer ключ-для-pve" http://192.168.31.100:8811/health
```
Если видишь `{"status":"ok"}` (или похожее) — контейнер видит Proxmox API.
---
## Шаг 5. Подключить к Open WebUI
Раз Open WebUI и MCP-контейнеры теперь на одной машине (TrueNAS), обращаться можно либо по `localhost`, либо по IP TrueNAS — зависит от того, в одной ли они Docker-сети. Проще всего указывать IP: `192.168.31.100`.
1. Зайди в Open WebUI → **Settings (шестерёнка) → Admin Settings → Tools** (в некоторых версиях — **Workspace → Tools**, а сами инструменты подключаются как "OpenAPI Tool Server").
2. Нажми **Add Tool Server** (или "+"):
- **URL**: `http://192.168.31.100:8811/openapi.json`
- **Auth**: Bearer, вставь ключ `ключ-для-pve`
- Имя — например `Proxmox pve`
3. Повтори для kybinka (`http://192.168.31.100:8812/openapi.json`) и pve1 (`http://192.168.31.100:8813/openapi.json`), каждый со своим ключом и понятным именем.
4. Сохрани. В списке моделей/чата должна появиться возможность включить эти инструменты (обычно — иконка инструментов рядом с полем ввода сообщения, там выбираешь, какие серверы разрешить в конкретном чате).
---
## Шаг 6. Проверка в чате
Открой новый чат в Open WebUI, включи инструмент `Proxmox pve`, и напиши что-то вроде:
> Покажи список нод и виртуальных машин на pve
Если всё настроено верно, модель вызовет `get_nodes` / `get_vms` и покажет актуальные данные (например, VM `haos-16.1` и LXC `mariadb`, `Panel` — как в твоей инвентаризации).
---
## Частые проблемы
| Симптом | Причина |
| --- | --- |
| Инструмент не появляется в Open WebUI | Проверь, что URL заканчивается на `/openapi.json`, а не просто на `/docs` |
| 401 Unauthorized | Ключ Bearer в Open WebUI не совпадает с `PROXMOX_API_KEY` в compose-файле Dockge |
| Контейнер падает при старте | Опечатка в `config.json` (проверь логи контейнера в Dockge) |
| Модель "не видит" VM | Токен Proxmox создан с "Privilege Separation" — права токена ограничены, пересоздай без этой галки или явно выдай права в Datacenter → Permissions |
## Что дальше
- Если захочешь и **изменять** серверы (создавать/удалять VM), а не только смотреть — это уже доступно из коробки, но советую сначала потренироваться на `pve1` (он у тебя простаивает и ничего важного там нет).
- Для управления **TrueNAS** из того же чата понадобится отдельный MCP/OpenAPI-сервер под TrueNAS API — если нужно, могу подобрать и расписать так же подробно.