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

7.6 KiB
Raw Blame History

Установка 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

Создай каталоги:

mkdir -p /mnt/ssd/apps/mcp/{pve,kybinka,pve1}

Для самоподписанных сертификатов Proxmox используй verify_ssl: false и security.dev_mode: true.

Конфигурация pve

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

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

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-файлы:

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 с рабочей директорией:

/mnt/ssd/apps/mcp

Используй один compose-файл:

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

Для каждого сервиса используй отдельный ключ. Сгенерировать ключ можно командой:

openssl rand -hex 32

Замени значения СГЕНЕРИРОВАТЬ_ОТДЕЛЬНЫЙ_КЛЮЧ_* в Dockge, нажми Save, затем Down и Deploy/Up.


Шаг 4. Проверить контейнеры

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:

curl -H "Authorization: Bearer КЛЮЧ_ИЗ_PROXMOX_API_KEY_PVE" \
  http://192.168.31.100:8811/health

Ожидаемый ответ:

{"status":"ok"}

Шаг 5. Подключить к Open WebUI

В Open WebUI перейди по пути:

Настройки → Интеграции → External Tool Servers → «+»

Добавь сервер pve:

Название: Proxmox pve
URL: http://192.168.31.100:8811/openapi.json
Авторизация: Bearer
Токен: значение PROXMOX_API_KEY из сервиса proxmox-mcp-pve в Dockge

Добавь сервер kybinka:

Название: Proxmox kybinka
URL: http://192.168.31.100:8812/openapi.json
Авторизация: Bearer
Токен: значение PROXMOX_API_KEY из сервиса proxmox-mcp-kybinka в Dockge

Добавь сервер pve1:

Название: 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.


Диагностика

Если появляется ошибка:

Invalid API key

проверь, что Bearer-токен в Open WebUI полностью совпадает с PROXMOX_API_KEY соответствующего контейнера в Dockge.

Если появляется ошибка:

Insecure TLS configuration blocked

проверь наличие блока:

"security": {
  "dev_mode": true
}

Если появляется McpError: Connection closed, сначала ищи выше в логе первичную ошибку конфигурации.

Не публикуй реальные значения PROXMOX_API_KEY и auth.token_value в чат или репозиторий. Если они были опубликованы, их следует заменить.