Откат неподтверждённых изменений
This commit is contained in:
-289
@@ -1,289 +0,0 @@
|
||||
# Развёртывание Proxmox MCP и TrueNAS MCP
|
||||
|
||||
Инструкция предназначена для развёртывания стека Docker Compose на TrueNAS-хосте `192.168.31.100`, где также работает Open WebUI.
|
||||
|
||||
Состав стека:
|
||||
|
||||
- `proxmox-mcp-pve` — Proxmox MCP для сервера `pve`, порт `8811`;
|
||||
- `proxmox-mcp-kybinka` — Proxmox MCP для сервера `kybinka`, порт `8812`;
|
||||
- `proxmox-mcp-pve1` — Proxmox MCP для сервера `pve1`, порт `8813`;
|
||||
- `truenas-mcp` — TrueNAS MCP, порт `8814`.
|
||||
|
||||
## 1. Предварительные требования
|
||||
|
||||
На хосте TrueNAS должны быть доступны:
|
||||
|
||||
- Docker Engine и Docker Compose plugin;
|
||||
- рабочий каталог `/mnt/ssd/apps/mcp`;
|
||||
- исходники TrueNAS MCP в каталоге `/mnt/ssd/apps/mcp/truenas`;
|
||||
- файл `/mnt/ssd/apps/mcp/truenas/Dockerfile`;
|
||||
- сетевой доступ от Docker-хоста к Proxmox API и TrueNAS API.
|
||||
|
||||
Проверьте версии:
|
||||
|
||||
```bash
|
||||
docker --version
|
||||
docker compose version
|
||||
```
|
||||
|
||||
Перейдите в каталог, где находятся `compose.yaml` и `.env`:
|
||||
|
||||
```bash
|
||||
cd /mnt/ssd/apps/mcp
|
||||
```
|
||||
|
||||
## 2. Подготовка конфигурационных каталогов
|
||||
|
||||
```bash
|
||||
mkdir -p /mnt/ssd/apps/mcp/{pve,kybinka,pve1,truenas}
|
||||
```
|
||||
|
||||
Каждый Proxmox MCP получает собственный `config.json`. Пример для `pve`:
|
||||
|
||||
```json
|
||||
{
|
||||
"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
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Для `kybinka` и `pve1` измените `proxmox.host`, `token_name` и `token_value`.
|
||||
|
||||
Права доступа к конфигурациям:
|
||||
|
||||
```bash
|
||||
chmod 700 /mnt/ssd/apps/mcp/{pve,kybinka,pve1,truenas}
|
||||
chmod 600 /mnt/ssd/apps/mcp/{pve,kybinka,pve1,truenas}/config.json
|
||||
```
|
||||
|
||||
Проверьте JSON до запуска:
|
||||
|
||||
```bash
|
||||
for file in /mnt/ssd/apps/mcp/{pve,kybinka,pve1,truenas}/config.json; do
|
||||
[ -f "$file" ] && python3 -m json.tool "$file" >/dev/null && echo "OK: $file"
|
||||
done
|
||||
```
|
||||
|
||||
> `auth.token_value` — секрет подключения MCP к Proxmox. Он не используется в Open WebUI.
|
||||
|
||||
## 3. Подготовка переменных окружения
|
||||
|
||||
Скопируйте шаблон:
|
||||
|
||||
```bash
|
||||
cp .env.example .env
|
||||
chmod 600 .env
|
||||
```
|
||||
|
||||
Сгенерируйте отдельные Bearer-ключи для OpenAPI:
|
||||
|
||||
```bash
|
||||
openssl rand -hex 32
|
||||
```
|
||||
|
||||
Внесите разные значения в:
|
||||
|
||||
```dotenv
|
||||
PROXMOX_PVE_API_KEY=...
|
||||
PROXMOX_KYBINKA_API_KEY=...
|
||||
PROXMOX_PVE1_API_KEY=...
|
||||
TRUENAS_API_KEY=...
|
||||
```
|
||||
|
||||
Не добавляйте `.env` в Git. Файл уже включён в `.gitignore`.
|
||||
|
||||
### Адрес публикации портов
|
||||
|
||||
В `.env`:
|
||||
|
||||
```dotenv
|
||||
MCP_BIND_ADDRESS=192.168.31.100
|
||||
```
|
||||
|
||||
Это позволяет Open WebUI обращаться к сервисам по LAN-адресу. Если Open WebUI и MCP доступны только локально, используйте `127.0.0.1`. При публикации на LAN-адрес ограничьте входящие соединения firewall-правилом только для хоста Open WebUI.
|
||||
|
||||
## 4. Проверка Compose-файла
|
||||
|
||||
До запуска выполните:
|
||||
|
||||
```bash
|
||||
docker compose --env-file .env config >/tmp/proxmox-mcp-compose-rendered.yaml
|
||||
docker compose --env-file .env config --quiet
|
||||
```
|
||||
|
||||
Проверьте, что отрендеренный файл не содержит неожиданных путей или настроек. Не публикуйте его, если в нём присутствуют раскрытые секреты.
|
||||
|
||||
Если `truenas/Dockerfile` отсутствует, сборка `truenas-mcp` завершится ошибкой. В этом случае сначала разместите исходники TrueNAS MCP в каталоге `./truenas`.
|
||||
|
||||
## 5. Первый запуск
|
||||
|
||||
Соберите TrueNAS MCP и запустите весь стек:
|
||||
|
||||
```bash
|
||||
docker compose --env-file .env up -d --build
|
||||
```
|
||||
|
||||
Проверьте состояние:
|
||||
|
||||
```bash
|
||||
docker compose ps
|
||||
docker compose logs --tail=100 proxmox-mcp-pve
|
||||
docker compose logs --tail=100 proxmox-mcp-kybinka
|
||||
docker compose logs --tail=100 proxmox-mcp-pve1
|
||||
docker compose logs --tail=100 truenas-mcp
|
||||
```
|
||||
|
||||
## 6. Проверка HTTP API
|
||||
|
||||
Проверка жизнеспособности Proxmox MCP:
|
||||
|
||||
```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 -f http://192.168.31.100:8811/openapi.json >/tmp/pve-openapi.json
|
||||
curl -f http://192.168.31.100:8812/openapi.json >/tmp/kybinka-openapi.json
|
||||
curl -f http://192.168.31.100:8813/openapi.json >/tmp/pve1-openapi.json
|
||||
```
|
||||
|
||||
Проверка Bearer-ключа:
|
||||
|
||||
```bash
|
||||
curl -f \
|
||||
-H "Authorization: Bearer ${PROXMOX_PVE_API_KEY}" \
|
||||
http://192.168.31.100:8811/health
|
||||
```
|
||||
|
||||
Если endpoint `/health` в используемой версии образа отсутствует, ориентируйтесь на `/livez` и ответ `/openapi.json`.
|
||||
|
||||
## 7. Подключение к Open WebUI
|
||||
|
||||
Для каждого сервера создайте отдельный External Tool Server:
|
||||
|
||||
| Сервис | Базовый URL | OpenAPI |
|
||||
|---|---|---|
|
||||
| Proxmox pve | `http://192.168.31.100:8811` | `openapi.json` |
|
||||
| Proxmox kybinka | `http://192.168.31.100:8812` | `openapi.json` |
|
||||
| Proxmox pve1 | `http://192.168.31.100:8813` | `openapi.json` |
|
||||
| TrueNAS MCP | `http://192.168.31.100:8814` | `openapi.json` |
|
||||
|
||||
Используйте авторизацию `Bearer` и соответствующий ключ из `.env`.
|
||||
|
||||
Важно:
|
||||
|
||||
- в URL указывайте только базовый адрес;
|
||||
- не добавляйте `/openapi.json` в базовый URL;
|
||||
- не используйте `auth.token_value` из Proxmox `config.json` как Bearer-ключ Open WebUI;
|
||||
- для каждого сервиса используйте собственный ключ.
|
||||
|
||||
## 8. Обновление
|
||||
|
||||
Перед обновлением сохраните текущую конфигурацию:
|
||||
|
||||
```bash
|
||||
cp .env .env.backup.$(date +%Y%m%d-%H%M%S)
|
||||
docker compose config > compose.rendered.backup.yaml
|
||||
```
|
||||
|
||||
Обновите образы и пересоберите TrueNAS MCP:
|
||||
|
||||
```bash
|
||||
docker compose pull
|
||||
docker compose up -d --build
|
||||
```
|
||||
|
||||
Проверьте состояние после обновления:
|
||||
|
||||
```bash
|
||||
docker compose ps
|
||||
docker compose logs --since=10m
|
||||
```
|
||||
|
||||
В production рекомендуется заменить `:latest` в `compose.yaml` на конкретный tag или digest образа.
|
||||
|
||||
## 9. Откат
|
||||
|
||||
Если новая версия работает некорректно:
|
||||
|
||||
```bash
|
||||
docker compose down
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
Для полноценного отката необходимо вернуть предыдущую версию image в `compose.yaml`, затем выполнить:
|
||||
|
||||
```bash
|
||||
docker compose pull
|
||||
docker compose up -d --build
|
||||
```
|
||||
|
||||
## 10. Диагностика
|
||||
|
||||
### `Invalid API key`
|
||||
|
||||
Проверьте, что Bearer-ключ Open WebUI точно совпадает с переменной соответствующего сервиса:
|
||||
|
||||
```bash
|
||||
docker compose config | grep -E 'PROXMOX_API_KEY|TRUENAS_API_KEY'
|
||||
```
|
||||
|
||||
Не вставляйте вывод этой команды в публичный чат или issue.
|
||||
|
||||
### `Connection closed`
|
||||
|
||||
Проверьте первичную ошибку в логах:
|
||||
|
||||
```bash
|
||||
docker compose logs --tail=200 proxmox-mcp-pve
|
||||
```
|
||||
|
||||
Затем проверьте:
|
||||
|
||||
- доступность Proxmox API с Docker-хоста;
|
||||
- правильность `host`, `port`, `token_name` и `token_value`;
|
||||
- существование смонтированного `config.json`;
|
||||
- соответствие версии OpenAPI-интерфейса и конфигурации Open WebUI.
|
||||
|
||||
### Ошибка bind на порт
|
||||
|
||||
Проверьте занятые порты:
|
||||
|
||||
```bash
|
||||
ss -ltnp | grep -E ':8811|:8812|:8813|:8814'
|
||||
```
|
||||
|
||||
Измените `MCP_BIND_ADDRESS` или внешние порты в `compose.yaml`.
|
||||
|
||||
### Контейнер завершается при включённом hardening
|
||||
|
||||
В Compose включены `read_only`, `no-new-privileges` и `cap_drop: ALL`. Если конкретная версия образа требует запись в каталог или capability, проверьте ошибку в логах и ослабляйте только проблемную настройку. Не удаляйте весь hardening без необходимости.
|
||||
|
||||
## 11. Безопасность
|
||||
|
||||
- Не коммитьте `.env`, реальные `config.json`, API-ключи и пароли.
|
||||
- Используйте отдельные токены для каждого Proxmox-сервера.
|
||||
- Минимизируйте ACL токенов Proxmox.
|
||||
- Для TrueNAS предпочтительно использовать HTTPS и `TRUENAS_VERIFY_SSL=true`.
|
||||
- `TRUENAS_ENABLE_DESTRUCTIVE_OPS=false` оставляйте включённым, пока destructive-операции не потребуются явно.
|
||||
- Не публикуйте MCP-порты в Интернет.
|
||||
- Зафиксируйте версии образов вместо `latest`.
|
||||
- Регулярно проверяйте логи и свободное место Docker-хранилища.
|
||||
Reference in New Issue
Block a user