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

245 lines
6.8 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** с OpenAPI-интерфейсом для Open WebUI.
## Архитектура
Узлы `pve`, `kybinka` и `pve1` — независимые Proxmox-серверы. Для каждого узла запускается отдельный MCP-контейнер с отдельным портом.
---
## Шаг 1. Создать API-токен на каждом Proxmox-узле
На каждом Proxmox-сервере отдельно открой **Datacenter → Permissions → API Tokens** и создай токен.
- User: `root@pam`;
- Token ID должен точно совпадать со значением `auth.token_name`;
- сохрани Secret, который показывается только один раз.
Повтори операцию для `kybinka` и `pve1`.
---
## Шаг 2. Подготовить конфиги на TrueNAS
Создай каталоги:
```bash
mkdir -p /mnt/ssd/apps/mcp/{pve,kybinka,pve1}
```
> Важно: `dev_mode` находится внутри блока `security`, а не в корне JSON. Именно такую структуру ожидает ProxmoxMCP-Plus.
### Конфигурация `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
```
Ограничь права доступа к файлам с токенами:
```bash
chmod 600 /mnt/ssd/apps/mcp/{pve,kybinka,pve1}/config.json
```
`verify_ssl: false` используется для самоподписанных сертификатов Proxmox. Для production следует установить доверенный сертификат и использовать `verify_ssl: true` вместе с `security.dev_mode: false`.
---
## Шаг 3. Запустить три контейнера через Dockge
В Dockge создай один Stack с именем `proxmox-mcp` и рабочей директорией:
```text
/mnt/ssd/apps/mcp
```
Вставь в редактор Dockge один 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
```
Не добавляй несколько блоков `services:` подряд. Нажми **Save**, затем **Down** и **Deploy/Up**. После изменения JSON-файлов контейнеры нужно перезапустить или пересоздать.
---
## Шаг 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:
```bash
curl -H "Authorization: Bearer ЗАМЕНИТЬ_КЛЮЧ_PVE" \
http://192.168.31.100:8811/health
```
---
## Шаг 5. Подключить к 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`.
---
## Диагностика
Если появляется ошибка:
```text
Insecure TLS configuration blocked
```
проверь, что внутри каждого файла присутствует:
```json
"security": {
"dev_mode": true
}
```
Проверка volume-маунта:
```bash
docker inspect proxmox-mcp-pve \
--format '{{range .Mounts}}{{println .Source "->" .Destination}}{{end}}'
```
Ожидаемый результат:
```text
/mnt/ssd/apps/mcp/pve/config.json -> /app/proxmox-config/config.json
```
Проверка файла внутри контейнера:
```bash
docker exec proxmox-mcp-pve cat /app/proxmox-config/config.json
```
`McpError: Connection closed` является вторичной ошибкой: MCP OpenAPI Proxy закрывается после ошибки валидации конфигурации.
> Не публикуй реальные значения `PROXMOX_API_KEY` и `auth.token_value` в чат или репозиторий. Если они были опубликованы, их следует заменить.