Добавлена инструкция по установке Proxmox MCP-сервера и подключению к Open WebUI
This commit is contained in:
@@ -0,0 +1,183 @@
|
|||||||
|
# Установка 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-контейнеры через встроенный интерфейс Apps.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Шаг 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/tank/apps-config/proxmox-mcp/{pve,kybinka,pve1}
|
||||||
|
```
|
||||||
|
|
||||||
|
(путь `/mnt/tank/...` подставь под свой реальный пул — у тебя есть `tank`, `ssd`, `backup`, `video`, подойдёт любой не занятый под VM-диски).
|
||||||
|
|
||||||
|
Создай конфиг для узла **pve**:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cat > /mnt/tank/apps-config/proxmox-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. Запустить три контейнера (по одному на узел)
|
||||||
|
|
||||||
|
Проще всего — через **docker-compose** прямо в шелле TrueNAS (TrueNAS 25.10 поддерживает Docker нативно).
|
||||||
|
|
||||||
|
Создай файл `docker-compose.yml`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cat > /mnt/tank/apps-config/proxmox-mcp/docker-compose.yml << 'EOF'
|
||||||
|
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/tank/apps-config/proxmox-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/tank/apps-config/proxmox-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/tank/apps-config/proxmox-mcp/pve1/config.json:/app/proxmox-config/config.json:ro
|
||||||
|
EOF
|
||||||
|
```
|
||||||
|
|
||||||
|
Замени `ключ-для-*` на свои сгенерированные ключи, например так:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
openssl rand -hex 32
|
||||||
|
```
|
||||||
|
|
||||||
|
Выполни для каждого сервиса свой ключ, вставь в файл. Запусти всё:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /mnt/tank/apps-config/proxmox-mcp
|
||||||
|
docker compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Шаг 4. Проверить, что контейнеры работают
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -f http://localhost:8811/livez # pve
|
||||||
|
curl -f http://localhost:8812/livez # kybinka
|
||||||
|
curl -f http://localhost:8813/livez # pve1
|
||||||
|
```
|
||||||
|
|
||||||
|
Каждый должен ответить `200 OK`. Дальше проверь авторизованный доступ (подставь свой ключ и порт):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -H "Authorization: Bearer ключ-для-pve" http://localhost: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` в docker-compose |
|
||||||
|
| Контейнер падает при старте | Опечатка в `config.json` (проверь `docker compose logs proxmox-mcp-pve`) |
|
||||||
|
| Модель "не видит" VM | Токен Proxmox создан с "Privilege Separation" — права токена ограничены, пересоздай без этой галки или явно выдай права в Datacenter → Permissions |
|
||||||
|
|
||||||
|
## Что дальше
|
||||||
|
|
||||||
|
- Если захочешь и **изменять** серверы (создавать/удалять VM), а не только смотреть — это уже доступно из коробки, но советую сначала потренироваться на `pve1` (он у тебя простаивает и ничего важного там нет).
|
||||||
|
- Для управления **TrueNAS** из того же чата понадобится отдельный MCP/OpenAPI-сервер под TrueNAS API — если нужно, могу подобрать и расписать так же подробно.
|
||||||
Reference in New Issue
Block a user