243 lines
9.0 KiB
Markdown
243 lines
9.0 KiB
Markdown
# Установка 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**. Для Open WebUI применяется его OpenAPI-интерфейс.
|
||
|
||
## ⚠️ Важный момент про архитектуру
|
||
|
||
Узлы `pve`, `kybinka` и `pve1` — независимые Proxmox-серверы. Для каждого узла требуется отдельный контейнер MCP с отдельным портом.
|
||
|
||
---
|
||
|
||
## Шаг 1. Создать API-токен на каждом Proxmox-узле
|
||
|
||
Токен создаётся отдельно на каждом узле.
|
||
|
||
1. Открой веб-интерфейс узла, например `https://192.168.31.2:8006`.
|
||
2. Перейди в **Datacenter → Permissions → API Tokens**.
|
||
3. Нажми **Add**:
|
||
- User: `root@pam`;
|
||
- Token ID: `openwebui-token`;
|
||
- отключи **Privilege Separation**, если используешь права пользователя напрямую.
|
||
4. Сохрани **Token ID** и **Secret**. Secret показывается только один раз.
|
||
|
||
Повтори для `kybinka` и `pve1`. В конфигурацию нужно подставить секрет токена соответствующего узла.
|
||
|
||
---
|
||
|
||
## Шаг 2. Подготовить конфиги на TrueNAS
|
||
|
||
Файлы конфигурации должны находиться в следующих каталогах:
|
||
|
||
```text
|
||
/mnt/ssd/apps/mcp/pve/config.json
|
||
/mnt/ssd/apps/mcp/kybinka/config.json
|
||
/mnt/ssd/apps/mcp/pve1/config.json
|
||
```
|
||
|
||
Если каталоги ещё не созданы, выполни на TrueNAS через SSH или Shell:
|
||
|
||
```bash
|
||
mkdir -p /mnt/ssd/apps/mcp/{pve,kybinka,pve1}
|
||
```
|
||
|
||
> В каждом файле должен быть секрет API-токена именно соответствующего Proxmox-узла. Не оставляй текст `СЮДА_СЕКРЕТ_ТОКЕНА_*` в рабочем конфиге.
|
||
|
||
### Конфигурация узла `pve`
|
||
|
||
Создай файл `/mnt/ssd/apps/mcp/pve/config.json`:
|
||
|
||
```bash
|
||
cat > /mnt/ssd/apps/mcp/pve/config.json << 'EOF'
|
||
{
|
||
"dev_mode": true,
|
||
"proxmox": {
|
||
"host": "192.168.31.2",
|
||
"port": 8006,
|
||
"verify_ssl": false
|
||
},
|
||
"auth": {
|
||
"user": "root@pam",
|
||
"token_name": "openwebui-token",
|
||
"token_value": "СЮДА_СЕКРЕТ_ТОКЕНА_PVE"
|
||
},
|
||
"logging": {
|
||
"level": "INFO"
|
||
}
|
||
}
|
||
EOF
|
||
```
|
||
|
||
### Конфигурация узла `kybinka`
|
||
|
||
Создай файл `/mnt/ssd/apps/mcp/kybinka/config.json`:
|
||
|
||
```bash
|
||
cat > /mnt/ssd/apps/mcp/kybinka/config.json << 'EOF'
|
||
{
|
||
"dev_mode": true,
|
||
"proxmox": {
|
||
"host": "192.168.1.10",
|
||
"port": 8006,
|
||
"verify_ssl": false
|
||
},
|
||
"auth": {
|
||
"user": "root@pam",
|
||
"token_name": "openwebui-token",
|
||
"token_value": "СЮДА_СЕКРЕТ_ТОКЕНА_KYBINKA"
|
||
},
|
||
"logging": {
|
||
"level": "INFO"
|
||
}
|
||
}
|
||
EOF
|
||
```
|
||
|
||
### Конфигурация узла `pve1`
|
||
|
||
Создай файл `/mnt/ssd/apps/mcp/pve1/config.json`:
|
||
|
||
```bash
|
||
cat > /mnt/ssd/apps/mcp/pve1/config.json << 'EOF'
|
||
{
|
||
"dev_mode": true,
|
||
"proxmox": {
|
||
"host": "192.168.31.4",
|
||
"port": 8006,
|
||
"verify_ssl": false
|
||
},
|
||
"auth": {
|
||
"user": "root@pam",
|
||
"token_name": "openwebui-token",
|
||
"token_value": "СЮДА_СЕКРЕТ_ТОКЕНА_PVE1"
|
||
},
|
||
"logging": {
|
||
"level": "INFO"
|
||
}
|
||
}
|
||
EOF
|
||
```
|
||
|
||
Проверь корректность всех JSON-файлов до запуска контейнеров:
|
||
|
||
```bash
|
||
python3 -m json.tool /mnt/ssd/apps/mcp/pve/config.json
|
||
python3 -m json.tool /mnt/ssd/apps/mcp/kybinka/config.json
|
||
python3 -m json.tool /mnt/ssd/apps/mcp/pve1/config.json
|
||
```
|
||
|
||
Если ошибок нет, команды выведут отформатированное содержимое JSON. При необходимости ограничь права доступа к файлам с токенами:
|
||
|
||
```bash
|
||
chmod 600 /mnt/ssd/apps/mcp/{pve,kybinka,pve1}/config.json
|
||
```
|
||
|
||
> `verify_ssl: false` отключает проверку TLS-сертификата Proxmox. Параметр `dev_mode: true` требуется текущей версией ProxmoxMCP-Plus, чтобы разрешить такое подключение с самоподписанным сертификатом. Для production лучше установить доверенный сертификат и использовать `verify_ssl: true` вместе с `dev_mode: false`.
|
||
|
||
---
|
||
|
||
## Шаг 3. Запустить три контейнера через Dockge
|
||
|
||
В Dockge создай один Stack с именем `proxmox-mcp`.
|
||
|
||
1. Открой Dockge.
|
||
2. Нажми **Create Stack** или **+**.
|
||
3. Укажи имя `proxmox-mcp`.
|
||
4. Укажи рабочую директорию стека:
|
||
|
||
`/mnt/ssd/apps/mcp`
|
||
|
||
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. Замени значения `ключ-для-*` на свои ключи.
|
||
7. Нажми **Save**, затем **Deploy** / **Up** / **Start**.
|
||
|
||
В результате должны запуститься контейнеры `proxmox-mcp-pve`, `proxmox-mcp-kybinka` и `proxmox-mcp-pve1` на портах `8811`, `8812` и `8813` соответственно.
|
||
|
||
---
|
||
|
||
## Шаг 4. Проверить, что контейнеры работают
|
||
|
||
```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
|
||
```
|
||
|
||
Авторизованный запрос:
|
||
|
||
```bash
|
||
curl -H "Authorization: Bearer ключ-для-pve" http://192.168.31.100:8811/health
|
||
```
|
||
|
||
---
|
||
|
||
## Шаг 5. Подключить к Open WebUI
|
||
|
||
В Open WebUI добавь три OpenAPI Tool Server:
|
||
|
||
- `http://192.168.31.100:8811/openapi.json` — `Proxmox pve`;
|
||
- `http://192.168.31.100:8812/openapi.json` — `Proxmox kybinka`;
|
||
- `http://192.168.31.100:8813/openapi.json` — `Proxmox pve1`.
|
||
|
||
Для каждого сервера укажи свой Bearer-ключ из `PROXMOX_API_KEY` в compose-конфигурации Dockge.
|
||
|
||
---
|
||
|
||
## Частые проблемы
|
||
|
||
| Симптом | Причина |
|
||
| --- | --- |
|
||
| `logging Field required` | В контейнер попал старый `config.json` без блока `logging` или подключён неправильный файл через volume |
|
||
| `Insecure TLS configuration blocked` | В конфигурации отсутствует `dev_mode: true` при использовании `verify_ssl: false` |
|
||
| `McpError: Connection closed` | MCP-сервер завершился из-за ошибки конфигурации; исправь первичную ошибку выше по логу |
|
||
| Контейнер падает при старте | Невалидный JSON или неверный путь к `config.json` |
|
||
| `401 Unauthorized` | Bearer-ключ не совпадает с `PROXMOX_API_KEY` |
|
||
| Инструмент не появляется в Open WebUI | Проверь URL `/openapi.json` и доступность соответствующего порта |
|
||
| Модель не видит VM | Проверь права API-токена Proxmox и логи контейнера в Dockge |
|
||
|
||
Если после изменения конфигурации остаётся ошибка `logging Field required`, останови Stack в Dockge, проверь файлы на TrueNAS и заново выполни **Deploy**. В compose должны использоваться именно эти volume-маунты:
|
||
|
||
```yaml
|
||
- /mnt/ssd/apps/mcp/pve/config.json:/app/proxmox-config/config.json:ro
|
||
- /mnt/ssd/apps/mcp/kybinka/config.json:/app/proxmox-config/config.json:ro
|
||
- /mnt/ssd/apps/mcp/pve1/config.json:/app/proxmox-config/config.json:ro
|
||
```
|