4.4 KiB
4.4 KiB
Решение проблемы 501 "Method not implemented"
Проблема
При смене root-пароля через Proxmox API получали ошибку:
AxiosError: Request failed with status code 501
statusMessage: "Method 'POST /nodes/sv1/lxc/105/config' not implemented"
Причина
Proxmox API не поддерживает POST для изменения конфигурации контейнера. Правильный метод - PUT.
Решение
Было (неправильно):
const response = await axios.post(
`${PROXMOX_API_URL}/nodes/${PROXMOX_NODE}/lxc/${vmid}/config`,
`password=${encodeURIComponent(newPassword)}`,
...
);
Стало (правильно):
const response = await axios.put(
`${PROXMOX_API_URL}/nodes/${PROXMOX_NODE}/lxc/${vmid}/config`,
`password=${encodeURIComponent(newPassword)}`,
...
);
Правильные HTTP методы для Proxmox API
LXC Container Config (/nodes/{node}/lxc/{vmid}/config)
GET- получить конфигурациюPUT- изменить конфигурацию (в т.ч. пароль)- ❌
POST- не поддерживается
LXC Container Status (/nodes/{node}/lxc/{vmid}/status/{action})
POST- start/stop/restart/shutdown
LXC Container Create (/nodes/{node}/lxc)
POST- создать новый контейнер
Документация Proxmox VE API
Официальная документация: https://pve.proxmox.com/pve-docs/api-viewer/
Основные правила:
- GET - чтение данных
- POST - создание ресурсов, выполнение действий (start/stop)
- PUT - изменение существующих ресурсов
- DELETE - удаление ресурсов
Тестирование
Через curl:
# Получить конфигурацию (GET)
curl -k -X GET \
-H "Authorization: PVEAPIToken=user@pam!token=secret" \
https://proxmox:8006/api2/json/nodes/nodename/lxc/100/config
# Изменить пароль (PUT)
curl -k -X PUT \
-H "Authorization: PVEAPIToken=user@pam!token=secret" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "password=NewPassword123" \
https://proxmox:8006/api2/json/nodes/nodename/lxc/100/config
Через веб-интерфейс:
- Откройте панель управления сервером
- Вкладка "Настройки"
- Нажмите "Сменить root-пароль"
- Проверьте логи:
pm2 logs ospab-backend
Проверка прав API токена
Убедитесь, что API токен имеет права:
# В Proxmox WebUI
# Datacenter → Permissions → API Tokens
# Проверьте права токена:
# - VM.Config.* (для изменения конфигурации)
# - VM.PowerMgmt (для start/stop)
Или через командную строку:
pveum user token permissions api-user@pve sv1-api-user
Fallback через SSH
Если API не работает, система автоматически использует SSH:
ssh root@proxmox "pct set {vmid} --password 'новый_пароль'"
Для этого нужно:
- Настроить SSH ключи:
ssh-keygen -t rsa -b 4096
ssh-copy-id root@proxmox_ip
- Проверить доступ:
ssh root@proxmox_ip "pct list"
Деплой исправления
# На сервере
cd /var/www/ospab-host/backend
git pull
npm run build
pm2 restart ospab-backend
# Проверка логов
pm2 logs ospab-backend --lines 50
Ожидаемые логи при успехе
✅ Пароль успешно изменён для контейнера 105
✅ Пароль успешно обновлён для сервера #17 (VMID: 105)
Ожидаемые логи при ошибке
❌ Ошибка смены пароля через API: ...
⚠️ Пробуем через SSH...
✅ Пароль изменён через SSH для контейнера 105