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

272 lines
7.6 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` соответствующего `config.json`;
- сохрани Secret, который показывается только один раз.
Повтори операцию для `kybinka` и `pve1`.
---
## Шаг 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` выполняется с ключом из переменной `PROXMOX_API_KEY` сервиса `proxmox-mcp-pve`:
```bash
curl -H "Authorization: Bearer КЛЮЧ_ИЗ_PROXMOX_API_KEY_PVE" \
http://192.168.31.100:8811/health
```
Ожидаемый ответ:
```json
{"status":"ok"}
```
---
## Шаг 5. Подключить к Open WebUI
В Open WebUI перейди по пути:
```text
Настройки → Интеграции → External Tool Servers → «+»
```
Добавь сервер `pve`:
```text
Название: Proxmox pve
URL: http://192.168.31.100:8811/openapi.json
Авторизация: Bearer
Токен: значение PROXMOX_API_KEY из сервиса proxmox-mcp-pve в Dockge
```
Добавь сервер `kybinka`:
```text
Название: Proxmox kybinka
URL: http://192.168.31.100:8812/openapi.json
Авторизация: Bearer
Токен: значение PROXMOX_API_KEY из сервиса proxmox-mcp-kybinka в Dockge
```
Добавь сервер `pve1`:
```text
Название: Proxmox pve1
URL: http://192.168.31.100:8813/openapi.json
Авторизация: Bearer
Токен: значение PROXMOX_API_KEY из сервиса proxmox-mcp-pve1 в Dockge
```
Не используй для авторизации значение `auth.token_value` из `config.json`. Это другой Secret — он нужен MCP-серверу для подключения к Proxmox, а не Open WebUI.
После сохранения открой новый чат, нажми значок инструментов и включи нужный сервер, например `Proxmox pve`.
---
## Диагностика
Если появляется ошибка:
```text
Invalid API key
```
проверь, что Bearer-токен в Open WebUI полностью совпадает с `PROXMOX_API_KEY` соответствующего контейнера в Dockge.
Если появляется ошибка:
```text
Insecure TLS configuration blocked
```
проверь наличие блока:
```json
"security": {
"dev_mode": true
}
```
Если появляется `McpError: Connection closed`, сначала ищи выше в логе первичную ошибку конфигурации.
> Не публикуй реальные значения `PROXMOX_API_KEY` и `auth.token_value` в чат или репозиторий. Если они были опубликованы, их следует заменить.