# Установка 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` в чат или репозиторий. Если они были опубликованы, их следует заменить.