285 lines
7.8 KiB
Markdown
285 lines
7.8 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** с OpenAPI-интерфейсом для Open WebUI.
|
||
|
||
## Архитектура
|
||
|
||
Узлы `pve`, `kybinka` и `pve1` — независимые Proxmox-серверы. Для каждого узла запускается отдельный MCP-контейнер с отдельным портом.
|
||
|
||
---
|
||
|
||
## Шаг 1. Создать API-токен на каждом Proxmox-узле
|
||
|
||
На каждом Proxmox-сервере открой **Datacenter → Permissions → API Tokens** и создай токен.
|
||
|
||
- User: `root@pam`;
|
||
- Token ID должен совпадать со значением `auth.token_name` соответствующего `config.json`;
|
||
- сохрани Secret, который показывается только один раз.
|
||
|
||
---
|
||
|
||
## Шаг 2. Подготовить конфиги на TrueNAS
|
||
|
||
Создай каталоги:
|
||
|
||
```bash
|
||
mkdir -p /mnt/ssd/apps/mcp/{pve,kybinka,pve1}
|
||
```
|
||
|
||
Для самоподписанных сертификатов Proxmox используются `verify_ssl: false` и `security.dev_mode: true`.
|
||
|
||
### Конфигурация `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": "openwebui-token",
|
||
"token_value": "СЕКРЕТНЫЙ_ТОКЕН_PVE"
|
||
},
|
||
"logging": {
|
||
"level": "INFO"
|
||
},
|
||
"security": {
|
||
"dev_mode": true
|
||
}
|
||
}
|
||
EOF
|
||
```
|
||
|
||
### Конфигурация `kybinka`
|
||
|
||
```bash
|
||
cat > /mnt/ssd/apps/mcp/kybinka/config.json << 'EOF'
|
||
{
|
||
"proxmox": {
|
||
"host": "192.168.1.10",
|
||
"port": 8006,
|
||
"verify_ssl": false
|
||
},
|
||
"auth": {
|
||
"user": "root@pam",
|
||
"token_name": "open-webui",
|
||
"token_value": "СЕКРЕТНЫЙ_ТОКЕН_KYBINKA"
|
||
},
|
||
"logging": {
|
||
"level": "INFO"
|
||
},
|
||
"security": {
|
||
"dev_mode": true
|
||
}
|
||
}
|
||
EOF
|
||
```
|
||
|
||
### Конфигурация `pve1`
|
||
|
||
```bash
|
||
cat > /mnt/ssd/apps/mcp/pve1/config.json << 'EOF'
|
||
{
|
||
"proxmox": {
|
||
"host": "192.168.31.4",
|
||
"port": 8006,
|
||
"verify_ssl": false
|
||
},
|
||
"auth": {
|
||
"user": "root@pam",
|
||
"token_name": "open-webui",
|
||
"token_value": "СЕКРЕТНЫЙ_ТОКЕН_PVE1"
|
||
},
|
||
"logging": {
|
||
"level": "INFO"
|
||
},
|
||
"security": {
|
||
"dev_mode": true
|
||
}
|
||
}
|
||
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
|
||
```
|
||
|
||
Важно:
|
||
|
||
- `auth.token_value` — Secret API-токена Proxmox из `config.json`;
|
||
- `PROXMOX_API_KEY` — отдельный ключ OpenAPI из compose/Dockge, который используется в Open WebUI как Bearer-токен.
|
||
|
||
---
|
||
|
||
## Шаг 3. Запустить три контейнера через Dockge
|
||
|
||
В Dockge создай один Stack `proxmox-mcp` с рабочей директорией:
|
||
|
||
```text
|
||
/mnt/ssd/apps/mcp
|
||
```
|
||
|
||
Используй один 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
|
||
```
|
||
|
||
Для каждого сервиса используй отдельный ключ. Ключ можно сгенерировать командой:
|
||
|
||
```bash
|
||
openssl rand -hex 32
|
||
```
|
||
|
||
В Dockge нажми **Save**, затем **Down** и **Deploy/Up**.
|
||
|
||
---
|
||
|
||
## Шаг 4. Проверить контейнеры
|
||
|
||
```bash
|
||
curl -f http://192.168.31.100:8811/livez
|
||
curl -f http://192.168.31.100:8812/livez
|
||
curl -f http://192.168.31.100:8813/livez
|
||
```
|
||
|
||
Проверка OpenAPI для `pve`:
|
||
|
||
```bash
|
||
curl -H "Authorization: Bearer КЛЮЧ_ИЗ_PROXMOX_API_KEY_PVE" \
|
||
http://192.168.31.100:8811/health
|
||
```
|
||
|
||
---
|
||
|
||
## Шаг 5. Подключить к Open WebUI
|
||
|
||
В Open WebUI перейди:
|
||
|
||
```text
|
||
Настройки → Интеграции → External Tool Servers → «+»
|
||
```
|
||
|
||
> Важно: в основном поле **URL** указывается только базовый адрес сервера. Не добавляй к нему `/openapi.json`, потому что Open WebUI добавляет путь спецификации отдельно.
|
||
|
||
### Сервер `pve`
|
||
|
||
```text
|
||
Название: Proxmox pve
|
||
URL: http://192.168.31.100:8811
|
||
Авторизация: Bearer
|
||
Токен: значение PROXMOX_API_KEY из сервиса proxmox-mcp-pve в Dockge
|
||
Спецификация OpenAPI: openapi.json
|
||
```
|
||
|
||
Итоговый адрес спецификации должен быть:
|
||
|
||
```text
|
||
http://192.168.31.100:8811/openapi.json
|
||
```
|
||
|
||
### Сервер `kybinka`
|
||
|
||
```text
|
||
Название: Proxmox kybinka
|
||
URL: http://192.168.31.100:8812
|
||
Авторизация: Bearer
|
||
Токен: значение PROXMOX_API_KEY из сервиса proxmox-mcp-kybinka в Dockge
|
||
Спецификация OpenAPI: openapi.json
|
||
```
|
||
|
||
Итоговый адрес:
|
||
|
||
```text
|
||
http://192.168.31.100:8812/openapi.json
|
||
```
|
||
|
||
### Сервер `pve1`
|
||
|
||
```text
|
||
Название: Proxmox pve1
|
||
URL: http://192.168.31.100:8813
|
||
Авторизация: Bearer
|
||
Токен: значение PROXMOX_API_KEY из сервиса proxmox-mcp-pve1 в Dockge
|
||
Спецификация OpenAPI: openapi.json
|
||
```
|
||
|
||
Итоговый адрес:
|
||
|
||
```text
|
||
http://192.168.31.100:8813/openapi.json
|
||
```
|
||
|
||
Не используй для авторизации значение `auth.token_value` из `config.json`. Это секрет подключения MCP-сервера к Proxmox, а не ключ OpenAPI.
|
||
|
||
После сохранения открой новый чат, нажми значок инструментов и включи нужный сервер.
|
||
|
||
---
|
||
|
||
## Диагностика
|
||
|
||
Если Open WebUI формирует адрес вида:
|
||
|
||
```text
|
||
http://192.168.31.100:8811/openapi.json/openapi.json
|
||
```
|
||
|
||
замени URL сервера на базовый:
|
||
|
||
```text
|
||
http://192.168.31.100:8811
|
||
```
|
||
|
||
а в поле спецификации оставь только:
|
||
|
||
```text
|
||
openapi.json
|
||
```
|
||
|
||
Если появляется `Invalid API key`, Bearer-токен Open WebUI не совпадает с `PROXMOX_API_KEY` соответствующего контейнера Dockge.
|
||
|
||
Если появляется `McpError: Connection closed`, сначала ищи выше в логе первичную ошибку.
|
||
|
||
> Не публикуй реальные значения `PROXMOX_API_KEY` и `auth.token_value` в чат или репозиторий. Если они были опубликованы, их следует заменить.
|