update README.md
This commit is contained in:
@@ -1,139 +0,0 @@
|
||||
# Конфигурация сети и хранилища для Proxmox
|
||||
|
||||
## Обзор
|
||||
|
||||
Теперь вы можете настроить сетевой интерфейс и диск для контейнеров/VM через переменные окружения в `.env` файле.
|
||||
|
||||
## Переменные окружения
|
||||
|
||||
### 1. Сетевой мост (Network Bridge)
|
||||
|
||||
```env
|
||||
PROXMOX_NETWORK_BRIDGE=vmbr0
|
||||
```
|
||||
|
||||
**Как узнать доступные мосты:**
|
||||
1. Войдите в Proxmox веб-интерфейс
|
||||
2. Перейдите: `Datacenter → Node (sv1) → Network`
|
||||
3. Посмотрите список доступных мостов (обычно `vmbr0`, `vmbr1`, `vmbr2`)
|
||||
|
||||
**Изменение:**
|
||||
- Просто измените значение в `.env` на нужный мост
|
||||
- Например: `PROXMOX_NETWORK_BRIDGE=vmbr1`
|
||||
|
||||
### 2. Хранилище для дисков (Storage)
|
||||
|
||||
```env
|
||||
PROXMOX_VM_STORAGE=local
|
||||
PROXMOX_BACKUP_STORAGE=local
|
||||
PROXMOX_ISO_STORAGE=local
|
||||
```
|
||||
|
||||
**Как узнать доступные хранилища:**
|
||||
1. Войдите в Proxmox веб-интерфейс
|
||||
2. Перейдите: `Datacenter → Storage`
|
||||
3. Посмотрите список доступных хранилищ (обычно `local`, `local-lvm`, `nfs-storage`)
|
||||
|
||||
**Изменение:**
|
||||
- Измените значения в `.env` на нужные хранилища
|
||||
- Например: `PROXMOX_VM_STORAGE=local-lvm`
|
||||
|
||||
## Применение изменений
|
||||
|
||||
После изменения `.env` файла:
|
||||
|
||||
### На локальной машине (разработка):
|
||||
|
||||
```bash
|
||||
cd backend
|
||||
npm run build
|
||||
npm run dev
|
||||
```
|
||||
|
||||
### На production сервере:
|
||||
|
||||
```bash
|
||||
cd /var/www/ospab-host/ospabhost/backend
|
||||
|
||||
# 1. Редактируем .env файл
|
||||
vim .env
|
||||
|
||||
# 2. Изменяем нужные переменные
|
||||
# PROXMOX_NETWORK_BRIDGE=vmbr1 # например, на другой мост
|
||||
# PROXMOX_VM_STORAGE=local-lvm # например, на другое хранилище
|
||||
|
||||
# 3. Пересобираем и перезапускаем
|
||||
npm run build
|
||||
pm2 restart ospab-backend
|
||||
|
||||
# 4. Проверяем логи
|
||||
pm2 logs ospab-backend --lines 30
|
||||
```
|
||||
|
||||
## Проверка настроек
|
||||
|
||||
После создания нового контейнера проверьте его конфигурацию:
|
||||
|
||||
```bash
|
||||
# SSH на Proxmox сервер
|
||||
ssh root@sv1.ospab.host
|
||||
|
||||
# Посмотреть конфигурацию контейнера (замените 100 на VMID)
|
||||
pct config 100
|
||||
|
||||
# Проверить сетевой интерфейс (должен показать ваш мост)
|
||||
# net0: name=eth0,bridge=vmbr0,ip=dhcp
|
||||
|
||||
# Проверить хранилище (должен показать ваше хранилище)
|
||||
# rootfs: local:100/vm-100-disk-0.raw,size=20G
|
||||
```
|
||||
|
||||
## Примеры конфигураций
|
||||
|
||||
### Конфигурация 1: Стандартная (по умолчанию)
|
||||
```env
|
||||
PROXMOX_NETWORK_BRIDGE=vmbr0
|
||||
PROXMOX_VM_STORAGE=local
|
||||
```
|
||||
|
||||
### Конфигурация 2: Отдельная сеть + LVM хранилище
|
||||
```env
|
||||
PROXMOX_NETWORK_BRIDGE=vmbr1
|
||||
PROXMOX_VM_STORAGE=local-lvm
|
||||
```
|
||||
|
||||
### Конфигурация 3: NFS хранилище
|
||||
```env
|
||||
PROXMOX_NETWORK_BRIDGE=vmbr0
|
||||
PROXMOX_VM_STORAGE=nfs-storage
|
||||
PROXMOX_BACKUP_STORAGE=nfs-storage
|
||||
```
|
||||
|
||||
## Решение проблем
|
||||
|
||||
### Ошибка: "storage 'xxx' does not exist"
|
||||
- Проверьте, что хранилище существует в Proxmox (Datacenter → Storage)
|
||||
- Убедитесь, что имя написано правильно (чувствительно к регистру)
|
||||
|
||||
### Ошибка: "bridge 'xxx' does not exist"
|
||||
- Проверьте, что мост существует в Proxmox (Node → Network)
|
||||
- Убедитесь, что имя написано правильно (обычно `vmbr0`, `vmbr1`)
|
||||
|
||||
### Контейнер создаётся, но не имеет сети
|
||||
- Проверьте, что мост активен и настроен правильно
|
||||
- Убедитесь, что DHCP работает в вашей сети (или используйте статический IP)
|
||||
|
||||
## Логирование
|
||||
|
||||
При создании контейнера в логах backend вы увидите:
|
||||
|
||||
```
|
||||
Создание LXC контейнера с параметрами: {
|
||||
...
|
||||
net0: 'name=eth0,bridge=vmbr0,ip=dhcp',
|
||||
rootfs: 'local:20',
|
||||
...
|
||||
}
|
||||
```
|
||||
|
||||
Проверьте эти значения, чтобы убедиться, что используются правильные настройки.
|
||||
@@ -1,132 +0,0 @@
|
||||
# PM2 Шпаргалка
|
||||
|
||||
## 🚀 Основные команды
|
||||
|
||||
```bash
|
||||
# Запуск
|
||||
pm2 start ecosystem.config.js --env production
|
||||
|
||||
# Остановка
|
||||
pm2 stop ospab-backend
|
||||
|
||||
# Перезапуск (без даунтайма)
|
||||
pm2 reload ospab-backend
|
||||
|
||||
# Полный перезапуск
|
||||
pm2 restart ospab-backend
|
||||
|
||||
# Удаление из PM2
|
||||
pm2 delete ospab-backend
|
||||
|
||||
# Список процессов
|
||||
pm2 list
|
||||
|
||||
# Детальная информация
|
||||
pm2 show ospab-backend
|
||||
```
|
||||
|
||||
## 📊 Мониторинг
|
||||
|
||||
```bash
|
||||
# Логи в реальном времени
|
||||
pm2 logs ospab-backend
|
||||
|
||||
# Последние 100 строк
|
||||
pm2 logs ospab-backend --lines 100
|
||||
|
||||
# Только ошибки
|
||||
pm2 logs ospab-backend --err
|
||||
|
||||
# Очистка логов
|
||||
pm2 flush
|
||||
|
||||
# Интерактивный мониторинг
|
||||
pm2 monit
|
||||
```
|
||||
|
||||
## 💾 Сохранение и автозапуск
|
||||
|
||||
```bash
|
||||
# Сохранить текущую конфигурацию
|
||||
pm2 save
|
||||
|
||||
# Настроить автозапуск при перезагрузке
|
||||
pm2 startup
|
||||
|
||||
# Отменить автозапуск
|
||||
pm2 unstartup
|
||||
|
||||
# Удалить сохранённую конфигурацию
|
||||
pm2 kill
|
||||
```
|
||||
|
||||
## 🔧 Управление через npm
|
||||
|
||||
```bash
|
||||
npm run pm2:start # Запуск
|
||||
npm run pm2:stop # Остановка
|
||||
npm run pm2:restart # Перезапуск
|
||||
npm run pm2:logs # Логи
|
||||
npm run pm2:monit # Мониторинг
|
||||
npm run pm2:status # Статус
|
||||
```
|
||||
|
||||
## 📦 Обновление PM2
|
||||
|
||||
```bash
|
||||
# Обновить PM2
|
||||
npm install -g pm2@latest
|
||||
|
||||
# Обновить процессы PM2
|
||||
pm2 update
|
||||
```
|
||||
|
||||
## 🐛 Отладка
|
||||
|
||||
```bash
|
||||
# Показать переменные окружения
|
||||
pm2 env 0
|
||||
|
||||
# Информация о системе
|
||||
pm2 info ospab-backend
|
||||
|
||||
# Метрики
|
||||
pm2 describe ospab-backend
|
||||
```
|
||||
|
||||
## ⚡ Быстрые сценарии
|
||||
|
||||
### Деплой нового кода
|
||||
```bash
|
||||
git pull origin main
|
||||
cd backend
|
||||
npm install
|
||||
npm run build
|
||||
pm2 reload ospab-backend
|
||||
pm2 save
|
||||
```
|
||||
|
||||
### Полный перезапуск системы
|
||||
```bash
|
||||
pm2 kill
|
||||
pm2 start ecosystem.config.js --env production
|
||||
pm2 save
|
||||
pm2 startup # Выполнить команду, которую выведет
|
||||
```
|
||||
|
||||
### Проверка статуса
|
||||
```bash
|
||||
pm2 list
|
||||
pm2 logs ospab-backend --lines 50
|
||||
curl http://localhost:5000
|
||||
```
|
||||
|
||||
## 🎯 Текущая конфигурация
|
||||
|
||||
- **Название**: ospab-backend
|
||||
- **Экземпляры**: 4
|
||||
- **Режим**: cluster
|
||||
- **Порт**: 5000
|
||||
- **Логи**: ./logs/pm2-error.log, ./logs/pm2-out.log
|
||||
- **Автоперезапуск**: Да
|
||||
- **Лимит памяти**: 500 MB/процесс
|
||||
@@ -1,186 +0,0 @@
|
||||
# 🚀 Быстрый старт PM2
|
||||
|
||||
## Запуск Backend в 4 экземплярах
|
||||
|
||||
### Через npm scripts (рекомендуется):
|
||||
|
||||
```bash
|
||||
# 1. Сборка проекта
|
||||
npm run build
|
||||
|
||||
# 2. Запуск PM2
|
||||
npm run pm2:start
|
||||
|
||||
# 3. Проверка статуса
|
||||
npm run pm2:status
|
||||
```
|
||||
|
||||
### Через скрипты:
|
||||
|
||||
```bash
|
||||
# Дать права на выполнение (только один раз)
|
||||
chmod +x start-pm2.sh restart-pm2.sh stop-pm2.sh
|
||||
|
||||
# Запуск
|
||||
./start-pm2.sh
|
||||
|
||||
# Перезапуск
|
||||
./restart-pm2.sh
|
||||
|
||||
# Перезапуск с пересборкой
|
||||
./restart-pm2.sh --build
|
||||
|
||||
# Перезапуск с обновлением из Git
|
||||
./restart-pm2.sh --update
|
||||
|
||||
# Остановка
|
||||
./stop-pm2.sh
|
||||
```
|
||||
|
||||
### Через PM2 напрямую:
|
||||
|
||||
```bash
|
||||
# Запуск
|
||||
pm2 start ecosystem.config.js --env production
|
||||
|
||||
# Сохранение конфигурации
|
||||
pm2 save
|
||||
|
||||
# Настройка автозапуска
|
||||
pm2 startup
|
||||
# Выполните команду, которую выведет pm2 startup
|
||||
```
|
||||
|
||||
## ⚙️ Настройка автозапуска
|
||||
|
||||
Чтобы backend автоматически запускался при перезагрузке сервера:
|
||||
|
||||
```bash
|
||||
# 1. Запустить процесс
|
||||
npm run pm2:start
|
||||
|
||||
# 2. Настроить автозапуск
|
||||
pm2 startup
|
||||
|
||||
# 3. Выполнить команду, которую выведет pm2 startup
|
||||
# Например:
|
||||
# sudo env PATH=$PATH:/usr/bin pm2 startup systemd -u root --hp /root
|
||||
|
||||
# 4. Сохранить текущую конфигурацию
|
||||
pm2 save
|
||||
```
|
||||
|
||||
## 📊 Мониторинг
|
||||
|
||||
```bash
|
||||
# Просмотр логов
|
||||
npm run pm2:logs
|
||||
|
||||
# Интерактивный мониторинг
|
||||
npm run pm2:monit
|
||||
|
||||
# Статус всех процессов
|
||||
npm run pm2:status
|
||||
|
||||
# Детальная информация
|
||||
pm2 show ospab-backend
|
||||
```
|
||||
|
||||
## 🔄 Обновление кода
|
||||
|
||||
```bash
|
||||
# Вариант 1: Вручную
|
||||
git pull origin main
|
||||
npm install
|
||||
npm run build
|
||||
npm run pm2:restart
|
||||
|
||||
# Вариант 2: Через скрипт
|
||||
./restart-pm2.sh --update
|
||||
```
|
||||
|
||||
## 🛑 Остановка
|
||||
|
||||
```bash
|
||||
# Через npm
|
||||
npm run pm2:stop
|
||||
|
||||
# Через скрипт
|
||||
./stop-pm2.sh
|
||||
|
||||
# Напрямую
|
||||
pm2 stop ospab-backend
|
||||
pm2 delete ospab-backend
|
||||
pm2 save
|
||||
```
|
||||
|
||||
## 📝 Полезные команды
|
||||
|
||||
```bash
|
||||
# Логи в реальном времени
|
||||
pm2 logs ospab-backend --lines 100
|
||||
|
||||
# Очистка логов
|
||||
pm2 flush
|
||||
|
||||
# Перезапуск без даунтайма
|
||||
pm2 reload ospab-backend
|
||||
|
||||
# Обновление PM2
|
||||
npm install -g pm2@latest
|
||||
pm2 update
|
||||
|
||||
# Резервная копия конфигурации
|
||||
pm2 save --force
|
||||
```
|
||||
|
||||
## 🔍 Проверка работы
|
||||
|
||||
После запуска проверьте:
|
||||
|
||||
```bash
|
||||
# 1. Статус процессов (должно быть 4 инстанса "online")
|
||||
pm2 list
|
||||
|
||||
# 2. Backend доступен
|
||||
curl http://localhost:5000
|
||||
|
||||
# 3. Логи без ошибок
|
||||
pm2 logs ospab-backend --lines 50
|
||||
```
|
||||
|
||||
## ⚠️ Устранение проблем
|
||||
|
||||
### PM2 не запускается
|
||||
|
||||
```bash
|
||||
# Проверить версию Node.js
|
||||
node -v
|
||||
|
||||
# Переустановить PM2
|
||||
npm install -g pm2@latest
|
||||
|
||||
# Удалить старую конфигурацию
|
||||
pm2 kill
|
||||
rm -rf ~/.pm2
|
||||
|
||||
# Запустить заново
|
||||
npm run pm2:start
|
||||
```
|
||||
|
||||
### Процессы крашатся
|
||||
|
||||
```bash
|
||||
# Посмотреть ошибки
|
||||
pm2 logs ospab-backend --err
|
||||
|
||||
# Увеличить лимит памяти в ecosystem.config.js
|
||||
# max_memory_restart: '1G'
|
||||
|
||||
# Уменьшить количество инстансов
|
||||
# instances: 2
|
||||
```
|
||||
|
||||
## 📚 Подробная документация
|
||||
|
||||
См. [PM2_SETUP.md](./PM2_SETUP.md) для детальной информации.
|
||||
@@ -1,257 +0,0 @@
|
||||
# Настройка PM2 для Backend
|
||||
|
||||
## 📦 Установка PM2 (если ещё не установлен)
|
||||
|
||||
```bash
|
||||
# Глобальная установка PM2
|
||||
npm install -g pm2
|
||||
|
||||
# Проверка версии
|
||||
pm2 -v
|
||||
```
|
||||
|
||||
## 🚀 Запуск Backend в 4 экземплярах
|
||||
|
||||
### Шаг 1: Сборка проекта
|
||||
|
||||
```bash
|
||||
cd /var/www/ospab-host/backend
|
||||
# или локально:
|
||||
cd backend
|
||||
|
||||
# Установка зависимостей (если нужно)
|
||||
npm install
|
||||
|
||||
# Компиляция TypeScript
|
||||
npm run build
|
||||
```
|
||||
|
||||
### Шаг 2: Создание папки для логов
|
||||
|
||||
```bash
|
||||
mkdir -p logs
|
||||
```
|
||||
|
||||
### Шаг 3: Запуск с помощью PM2
|
||||
|
||||
```bash
|
||||
# Запуск 4 экземпляров согласно ecosystem.config.js
|
||||
pm2 start ecosystem.config.js --env production
|
||||
|
||||
# Или напрямую (без конфига):
|
||||
pm2 start dist/src/index.js -i 4 --name ospab-backend
|
||||
```
|
||||
|
||||
### Шаг 4: Сохранение конфигурации для автозапуска
|
||||
|
||||
```bash
|
||||
# Сохранить текущий список процессов
|
||||
pm2 save
|
||||
|
||||
# Настроить автозапуск при перезагрузке сервера
|
||||
pm2 startup
|
||||
|
||||
# Выполните команду, которую выведет pm2 startup
|
||||
# Обычно это что-то вроде:
|
||||
# sudo env PATH=$PATH:/usr/bin pm2 startup systemd -u root --hp /root
|
||||
```
|
||||
|
||||
## 📊 Управление процессами
|
||||
|
||||
### Просмотр статуса
|
||||
|
||||
```bash
|
||||
# Список всех процессов
|
||||
pm2 list
|
||||
|
||||
# Детальная информация о процессе
|
||||
pm2 show ospab-backend
|
||||
|
||||
# Мониторинг в реальном времени
|
||||
pm2 monit
|
||||
```
|
||||
|
||||
### Логи
|
||||
|
||||
```bash
|
||||
# Все логи
|
||||
pm2 logs
|
||||
|
||||
# Логи конкретного процесса
|
||||
pm2 logs ospab-backend
|
||||
|
||||
# Последние 100 строк
|
||||
pm2 logs ospab-backend --lines 100
|
||||
|
||||
# Очистка логов
|
||||
pm2 flush
|
||||
```
|
||||
|
||||
### Перезапуск
|
||||
|
||||
```bash
|
||||
# Перезапуск без даунтайма (рекомендуется)
|
||||
pm2 reload ospab-backend
|
||||
|
||||
# Полный перезапуск (с кратковременным даунтаймом)
|
||||
pm2 restart ospab-backend
|
||||
|
||||
# Остановка
|
||||
pm2 stop ospab-backend
|
||||
|
||||
# Удаление из PM2
|
||||
pm2 delete ospab-backend
|
||||
```
|
||||
|
||||
## 🔧 Обновление кода (деплой)
|
||||
|
||||
### Вариант 1: Автоматический деплой через PM2
|
||||
|
||||
```bash
|
||||
# Из корня проекта
|
||||
pm2 deploy ecosystem.config.js production
|
||||
```
|
||||
|
||||
### Вариант 2: Ручной деплой
|
||||
|
||||
```bash
|
||||
cd /var/www/ospab-host
|
||||
|
||||
# Обновление кода
|
||||
git pull origin main
|
||||
|
||||
# Переход в backend
|
||||
cd backend
|
||||
|
||||
# Установка зависимостей
|
||||
npm install
|
||||
|
||||
# Сборка
|
||||
npm run build
|
||||
|
||||
# Перезапуск без даунтайма
|
||||
pm2 reload ospab-backend
|
||||
|
||||
# Сохранение конфигурации
|
||||
pm2 save
|
||||
```
|
||||
|
||||
## 📈 Мониторинг и отладка
|
||||
|
||||
### Проверка памяти и CPU
|
||||
|
||||
```bash
|
||||
pm2 monit
|
||||
```
|
||||
|
||||
### Веб-интерфейс (опционально)
|
||||
|
||||
```bash
|
||||
# Установка PM2 Plus (бесплатно для мониторинга)
|
||||
pm2 link <secret_key> <public_key>
|
||||
|
||||
# Или просто веб-дашборд
|
||||
pm2 web
|
||||
# Откройте http://localhost:9615
|
||||
```
|
||||
|
||||
## ⚙️ Текущая конфигурация
|
||||
|
||||
- **Экземпляры**: 4 процесса в кластерном режиме
|
||||
- **Порт**: 5000 (балансировка внутри PM2)
|
||||
- **Автоперезапуск**: Да
|
||||
- **Лимит памяти**: 500 MB на процесс
|
||||
- **Логи**: `./logs/pm2-error.log` и `./logs/pm2-out.log`
|
||||
|
||||
## 🔍 Проверка автозапуска
|
||||
|
||||
После перезагрузки сервера:
|
||||
|
||||
```bash
|
||||
# Проверить, что PM2 запустился
|
||||
pm2 list
|
||||
|
||||
# Должен показать 4 экземпляра ospab-backend в статусе "online"
|
||||
```
|
||||
|
||||
## 🛠️ Устранение проблем
|
||||
|
||||
### PM2 не запускается при загрузке
|
||||
|
||||
```bash
|
||||
# Удалить старую конфигурацию
|
||||
pm2 unstartup
|
||||
|
||||
# Создать новую
|
||||
pm2 startup
|
||||
# Выполните команду, которую выведет
|
||||
|
||||
# Сохранить
|
||||
pm2 save
|
||||
```
|
||||
|
||||
### Процессы крашатся
|
||||
|
||||
```bash
|
||||
# Проверить логи ошибок
|
||||
pm2 logs ospab-backend --err
|
||||
|
||||
# Увеличить лимит памяти в ecosystem.config.js
|
||||
# max_memory_restart: '1G'
|
||||
|
||||
# Перезапустить
|
||||
pm2 reload ecosystem.config.js
|
||||
```
|
||||
|
||||
### Высокая нагрузка на CPU
|
||||
|
||||
```bash
|
||||
# Уменьшить количество экземпляров
|
||||
# В ecosystem.config.js:
|
||||
instances: 2
|
||||
|
||||
# Перезапустить
|
||||
pm2 reload ecosystem.config.js
|
||||
```
|
||||
|
||||
## 📝 Полезные команды
|
||||
|
||||
```bash
|
||||
# Обновить PM2 до последней версии
|
||||
npm install -g pm2@latest
|
||||
pm2 update
|
||||
|
||||
# Резервная копия конфигурации PM2
|
||||
pm2 save --force
|
||||
|
||||
# Информация о системе
|
||||
pm2 info ospab-backend
|
||||
|
||||
# Метрики производительности
|
||||
pm2 describe ospab-backend
|
||||
```
|
||||
|
||||
## 🎯 Быстрый старт (TL;DR)
|
||||
|
||||
```bash
|
||||
# 1. Перейти в папку backend
|
||||
cd backend
|
||||
|
||||
# 2. Собрать проект
|
||||
npm run build
|
||||
|
||||
# 3. Создать папку логов
|
||||
mkdir -p logs
|
||||
|
||||
# 4. Запустить PM2
|
||||
pm2 start ecosystem.config.js --env production
|
||||
|
||||
# 5. Сохранить и настроить автозапуск
|
||||
pm2 save
|
||||
pm2 startup
|
||||
|
||||
# 6. Проверить статус
|
||||
pm2 list
|
||||
```
|
||||
|
||||
Готово! Backend запущен в 4 экземплярах и будет автоматически запускаться при перезагрузке сервера. 🚀
|
||||
@@ -1,65 +0,0 @@
|
||||
# Решение проблемы Foreign Key при удалении тарифов
|
||||
|
||||
## Проблема
|
||||
При попытке удалить тариф через Prisma Studio появляется ошибка:
|
||||
```
|
||||
Foreign key constraint violated on the fields: (`tariffId`)
|
||||
```
|
||||
|
||||
## Причина
|
||||
Тариф используется серверами. MySQL не позволяет удалить тариф, если на него ссылаются записи в таблице `server`.
|
||||
|
||||
## Решение
|
||||
|
||||
### Способ 1: Безопасный (рекомендуется)
|
||||
Удаляет только неиспользуемые тарифы, сохраняет серверы.
|
||||
|
||||
```bash
|
||||
mysql -u root -p ospabhost < backend/prisma/safe_tariff_migration.sql
|
||||
```
|
||||
|
||||
### Способ 2: Полная очистка (только для dev!)
|
||||
Удаляет ВСЕ серверы и тарифы.
|
||||
|
||||
```bash
|
||||
# Сначала бэкап!
|
||||
mysqldump -u root -p ospabhost > backup.sql
|
||||
|
||||
# Потом очистка
|
||||
mysql -u root -p ospabhost < backend/prisma/clean_slate_migration.sql
|
||||
```
|
||||
|
||||
### Способ 3: Ручное удаление через SQL
|
||||
|
||||
```sql
|
||||
-- 1. Найти тарифы без серверов
|
||||
SELECT t.id, t.name, COUNT(s.id) as servers
|
||||
FROM tariff t
|
||||
LEFT JOIN server s ON s.tariffId = t.id
|
||||
GROUP BY t.id
|
||||
HAVING servers = 0;
|
||||
|
||||
-- 2. Удалить только неиспользуемые
|
||||
DELETE FROM tariff WHERE id IN (
|
||||
SELECT id FROM (
|
||||
SELECT t.id FROM tariff t
|
||||
LEFT JOIN server s ON s.tariffId = t.id
|
||||
GROUP BY t.id
|
||||
HAVING COUNT(s.id) = 0
|
||||
) as unused
|
||||
);
|
||||
|
||||
-- 3. Добавить категорию
|
||||
ALTER TABLE tariff ADD COLUMN category VARCHAR(50) NOT NULL DEFAULT 'vps';
|
||||
|
||||
-- 4. Добавить новые тарифы (см. safe_tariff_migration.sql)
|
||||
```
|
||||
|
||||
## Перезапуск backend
|
||||
|
||||
```bash
|
||||
cd backend
|
||||
npm start
|
||||
```
|
||||
|
||||
Готово! 🎉
|
||||
@@ -1,149 +0,0 @@
|
||||
# Решение проблемы 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**.
|
||||
|
||||
## Решение
|
||||
|
||||
### Было (неправильно):
|
||||
```typescript
|
||||
const response = await axios.post(
|
||||
`${PROXMOX_API_URL}/nodes/${PROXMOX_NODE}/lxc/${vmid}/config`,
|
||||
`password=${encodeURIComponent(newPassword)}`,
|
||||
...
|
||||
);
|
||||
```
|
||||
|
||||
### Стало (правильно):
|
||||
```typescript
|
||||
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/
|
||||
|
||||
Основные правила:
|
||||
1. **GET** - чтение данных
|
||||
2. **POST** - создание ресурсов, выполнение действий (start/stop)
|
||||
3. **PUT** - изменение существующих ресурсов
|
||||
4. **DELETE** - удаление ресурсов
|
||||
|
||||
## Тестирование
|
||||
|
||||
### Через curl:
|
||||
```bash
|
||||
# Получить конфигурацию (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
|
||||
```
|
||||
|
||||
### Через веб-интерфейс:
|
||||
1. Откройте панель управления сервером
|
||||
2. Вкладка "Настройки"
|
||||
3. Нажмите "Сменить root-пароль"
|
||||
4. Проверьте логи: `pm2 logs ospab-backend`
|
||||
|
||||
## Проверка прав API токена
|
||||
|
||||
Убедитесь, что API токен имеет права:
|
||||
```bash
|
||||
# В Proxmox WebUI
|
||||
# Datacenter → Permissions → API Tokens
|
||||
# Проверьте права токена:
|
||||
# - VM.Config.* (для изменения конфигурации)
|
||||
# - VM.PowerMgmt (для start/stop)
|
||||
```
|
||||
|
||||
Или через командную строку:
|
||||
```bash
|
||||
pveum user token permissions api-user@pve sv1-api-user
|
||||
```
|
||||
|
||||
## Fallback через SSH
|
||||
|
||||
Если API не работает, система автоматически использует SSH:
|
||||
```bash
|
||||
ssh root@proxmox "pct set {vmid} --password 'новый_пароль'"
|
||||
```
|
||||
|
||||
Для этого нужно:
|
||||
1. Настроить SSH ключи:
|
||||
```bash
|
||||
ssh-keygen -t rsa -b 4096
|
||||
ssh-copy-id root@proxmox_ip
|
||||
```
|
||||
|
||||
2. Проверить доступ:
|
||||
```bash
|
||||
ssh root@proxmox_ip "pct list"
|
||||
```
|
||||
|
||||
## Деплой исправления
|
||||
|
||||
```bash
|
||||
# На сервере
|
||||
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
|
||||
```
|
||||
|
||||
## Дополнительные ресурсы
|
||||
|
||||
- [Proxmox VE API Documentation](https://pve.proxmox.com/pve-docs/api-viewer/)
|
||||
- [Proxmox VE Administration Guide](https://pve.proxmox.com/pve-docs/pve-admin-guide.html)
|
||||
- [pct command reference](https://pve.proxmox.com/pve-docs/pct.1.html)
|
||||
@@ -1,144 +0,0 @@
|
||||
# Простые команды для создания нагрузки на сервер
|
||||
# Выполняйте их в консоли вашего LXC контейнера через noVNC или SSH
|
||||
|
||||
## 1. БЫСТРЫЙ ТЕСТ (без установки дополнительных пакетов)
|
||||
|
||||
### CPU нагрузка (запустить в фоне)
|
||||
# Создаёт 100% нагрузку на все ядра на 2 минуты
|
||||
yes > /dev/null &
|
||||
yes > /dev/null &
|
||||
yes > /dev/null &
|
||||
yes > /dev/null &
|
||||
|
||||
# Остановить через 2 минуты:
|
||||
# killall yes
|
||||
|
||||
|
||||
### Memory нагрузка
|
||||
# Заполнить 500MB оперативки
|
||||
cat <( </dev/zero head -c 500m) <(sleep 120) | tail &
|
||||
|
||||
# Для 1GB используйте:
|
||||
# cat <( </dev/zero head -c 1000m) <(sleep 120) | tail &
|
||||
|
||||
|
||||
### Disk I/O нагрузка
|
||||
# Создать файл 1GB и записать его несколько раз
|
||||
dd if=/dev/zero of=/tmp/testfile bs=1M count=1000 oflag=direct &
|
||||
|
||||
# Удалить после теста:
|
||||
# rm /tmp/testfile
|
||||
|
||||
|
||||
### Network нагрузка
|
||||
# Скачать большой файл
|
||||
wget -O /dev/null http://speedtest.tele2.net/100MB.zip &
|
||||
|
||||
# Или создать сетевой трафик:
|
||||
# ping -f 8.8.8.8 -c 10000 &
|
||||
|
||||
|
||||
|
||||
## 2. С УСТАНОВКОЙ STRESS-NG (рекомендуется)
|
||||
|
||||
# Установить stress-ng (один раз)
|
||||
apt-get update && apt-get install -y stress-ng
|
||||
|
||||
### Комплексный тест (5 минут)
|
||||
# CPU 50%, Memory 50%, Disk I/O
|
||||
stress-ng --cpu 2 --cpu-load 50 --vm 1 --vm-bytes 512M --hdd 1 --timeout 300s
|
||||
|
||||
### Только CPU (80% нагрузка, 3 минуты)
|
||||
stress-ng --cpu 4 --cpu-load 80 --timeout 180s
|
||||
|
||||
### Только Memory (заполнить 70%, 3 минуты)
|
||||
stress-ng --vm 2 --vm-bytes 70% --timeout 180s
|
||||
|
||||
### Только Disk I/O (3 минуты)
|
||||
stress-ng --hdd 4 --timeout 180s
|
||||
|
||||
|
||||
|
||||
## 3. PYTHON СКРИПТ (если Python установлен)
|
||||
|
||||
# Создать файл test_load.py:
|
||||
cat > /tmp/test_load.py << 'EOF'
|
||||
import time
|
||||
import threading
|
||||
|
||||
def cpu_load():
|
||||
"""CPU нагрузка"""
|
||||
end_time = time.time() + 180 # 3 минуты
|
||||
while time.time() < end_time:
|
||||
[x**2 for x in range(10000)]
|
||||
|
||||
def memory_load():
|
||||
"""Memory нагрузка"""
|
||||
data = []
|
||||
for i in range(100):
|
||||
data.append(' ' * 10000000) # ~10MB каждый
|
||||
time.sleep(1)
|
||||
|
||||
# Запустить в потоках
|
||||
threads = []
|
||||
for i in range(4): # 4 потока для CPU
|
||||
t = threading.Thread(target=cpu_load)
|
||||
t.start()
|
||||
threads.append(t)
|
||||
|
||||
# Memory нагрузка
|
||||
m = threading.Thread(target=memory_load)
|
||||
m.start()
|
||||
threads.append(m)
|
||||
|
||||
# Ждать завершения
|
||||
for t in threads:
|
||||
t.join()
|
||||
|
||||
print("Test completed!")
|
||||
EOF
|
||||
|
||||
# Запустить:
|
||||
python3 /tmp/test_load.py &
|
||||
|
||||
|
||||
|
||||
## 4. МОНИТОРИНГ НАГРУЗКИ
|
||||
|
||||
# Установить htop для визуального мониторинга
|
||||
apt-get install -y htop
|
||||
|
||||
# Запустить htop
|
||||
htop
|
||||
|
||||
# Или использовать стандартные команды:
|
||||
top # CPU и Memory
|
||||
iostat -x 1 # Disk I/O (нужно установить: apt install sysstat)
|
||||
free -h # Memory
|
||||
uptime # Load average
|
||||
|
||||
|
||||
|
||||
## 5. ОСТАНОВИТЬ ВСЕ ТЕСТЫ
|
||||
|
||||
# Остановить все процессы нагрузки
|
||||
killall stress-ng yes dd wget python3
|
||||
|
||||
# Очистить временные файлы
|
||||
rm -f /tmp/testfile /tmp/test_load.py
|
||||
|
||||
|
||||
|
||||
## КАК ПРОВЕРИТЬ РЕЗУЛЬТАТЫ
|
||||
|
||||
1. Откройте панель управления сервером в браузере
|
||||
2. Перейдите на вкладку "Мониторинг"
|
||||
3. Выберите период "1h" или "6h"
|
||||
4. Вы увидите графики:
|
||||
- CPU usage (оранжевый график)
|
||||
- Memory usage (синий график)
|
||||
- Disk usage (зеленый график)
|
||||
- Network In/Out (фиолетовый график)
|
||||
|
||||
5. Обновите страницу через 1-2 минуты после запуска теста
|
||||
6. Используйте кнопки периодов (1h, 6h, 24h) для изменения масштаба
|
||||
@@ -1,168 +0,0 @@
|
||||
# Тестирование смены root-пароля
|
||||
|
||||
## Как это работает
|
||||
|
||||
Система использует **3 метода** смены пароля с автоматическим fallback:
|
||||
|
||||
### Метод 1: Proxmox API (основной)
|
||||
```
|
||||
POST /api/nodes/{node}/lxc/{vmid}/config
|
||||
Body: password=новый_пароль
|
||||
```
|
||||
- Самый быстрый и надёжный
|
||||
- Работает через API токен
|
||||
- Не требует SSH доступа
|
||||
|
||||
### Метод 2: SSH + pct set (fallback)
|
||||
```bash
|
||||
ssh root@proxmox "pct set {vmid} --password 'новый_пароль'"
|
||||
```
|
||||
- Запасной вариант если API не работает
|
||||
- Требует SSH доступа от backend к Proxmox
|
||||
- Настраивается через `.env`
|
||||
|
||||
### Метод 3: Exec внутри контейнера (последний fallback)
|
||||
```
|
||||
POST /api/nodes/{node}/lxc/{vmid}/exec
|
||||
Body: { command: ["bash", "-c", "echo 'root:пароль' | chpasswd"] }
|
||||
```
|
||||
- Выполняет команду внутри контейнера
|
||||
- Работает если контейнер запущен
|
||||
- Не требует SSH
|
||||
|
||||
## Как протестировать
|
||||
|
||||
### 1. Через веб-интерфейс
|
||||
|
||||
1. Откройте панель управления сервером
|
||||
2. Перейдите на вкладку "Настройки"
|
||||
3. Нажмите кнопку "Сменить root-пароль"
|
||||
4. Подтвердите действие
|
||||
5. Новый пароль появится на вкладке "Обзор"
|
||||
|
||||
### 2. Через API (curl)
|
||||
|
||||
```bash
|
||||
# Получить токен (замените email и password)
|
||||
TOKEN=$(curl -X POST https://ospab.host:5000/api/auth/login \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"email":"user@example.com","password":"yourpassword"}' \
|
||||
| jq -r '.token')
|
||||
|
||||
# Сменить пароль (замените {id} на ID сервера)
|
||||
curl -X POST https://ospab.host:5000/api/server/{id}/password \
|
||||
-H "Authorization: Bearer $TOKEN" \
|
||||
| jq
|
||||
```
|
||||
|
||||
### 3. Проверка нового пароля
|
||||
|
||||
#### Через noVNC консоль:
|
||||
1. Откройте консоль сервера
|
||||
2. Войдите как `root`
|
||||
3. Введите новый пароль из панели
|
||||
|
||||
#### Через SSH:
|
||||
```bash
|
||||
ssh root@IP_СЕРВЕРА
|
||||
# Введите новый пароль
|
||||
```
|
||||
|
||||
## Логи и отладка
|
||||
|
||||
### Backend логи
|
||||
```bash
|
||||
# Просмотр логов в реальном времени
|
||||
pm2 logs ospab-backend
|
||||
|
||||
# Или если запущен напрямую
|
||||
tail -f /var/www/ospab-host/backend/logs/pm2-out.log
|
||||
```
|
||||
|
||||
### Что искать в логах:
|
||||
|
||||
**Успешная смена:**
|
||||
```
|
||||
✅ Пароль успешно изменён для контейнера 123
|
||||
✅ Пароль успешно обновлён для сервера #5 (VMID: 123)
|
||||
```
|
||||
|
||||
**Ошибки:**
|
||||
```
|
||||
❌ Ошибка смены пароля через API: ...
|
||||
⚠️ Основной метод не сработал, пробуем через exec...
|
||||
❌ Ошибка смены пароля через SSH: ...
|
||||
```
|
||||
|
||||
## Возможные проблемы
|
||||
|
||||
### Проблема 1: "Не удалось изменить пароль"
|
||||
|
||||
**Причина:** Нет доступа к Proxmox API или SSH
|
||||
|
||||
**Решение:**
|
||||
```bash
|
||||
# Проверьте переменные окружения
|
||||
cat /var/www/ospab-host/backend/.env | grep PROXMOX
|
||||
|
||||
# Должны быть установлены:
|
||||
PROXMOX_API_URL=https://IP:8006/api2/json
|
||||
PROXMOX_TOKEN_ID=root@pam!your-token-name
|
||||
PROXMOX_TOKEN_SECRET=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
|
||||
PROXMOX_NODE=proxmox
|
||||
```
|
||||
|
||||
### Проблема 2: SSH метод не работает
|
||||
|
||||
**Причина:** Нет SSH ключей или доступа
|
||||
|
||||
**Решение:**
|
||||
```bash
|
||||
# Настройте SSH ключи (на сервере с backend)
|
||||
ssh-keygen -t rsa -b 4096
|
||||
ssh-copy-id root@PROXMOX_IP
|
||||
|
||||
# Проверьте доступ
|
||||
ssh root@PROXMOX_IP "pct list"
|
||||
```
|
||||
|
||||
### Проблема 3: Контейнер не запущен
|
||||
|
||||
**Причина:** Exec метод работает только для запущенных контейнеров
|
||||
|
||||
**Решение:**
|
||||
1. Запустите контейнер
|
||||
2. Подождите 30 секунд
|
||||
3. Попробуйте снова сменить пароль
|
||||
|
||||
## Автоматическое скрытие пароля
|
||||
|
||||
Пароль автоматически скрывается через **30 минут** после:
|
||||
- Создания сервера
|
||||
- Смены пароля
|
||||
|
||||
### Как проверить:
|
||||
1. Создайте сервер или смените пароль
|
||||
2. Пароль виден на вкладке "Обзор"
|
||||
3. Через 30 минут пароль будет заменён на "••••••••"
|
||||
4. Кнопка "Показать пароль" перестанет работать
|
||||
|
||||
### Как показать снова:
|
||||
Нажмите "Сменить root-пароль" - будет сгенерирован новый пароль и снова виден 30 минут.
|
||||
|
||||
## Частые вопросы
|
||||
|
||||
**Q: Как часто можно менять пароль?**
|
||||
A: Без ограничений. Каждая смена генерирует новый случайный пароль.
|
||||
|
||||
**Q: Можно ли задать свой пароль?**
|
||||
A: Нет, система генерирует случайный пароль 16 символов для безопасности.
|
||||
|
||||
**Q: Пароль сохраняется в базе?**
|
||||
A: Да, в зашифрованном виде в таблице `server.rootPassword`.
|
||||
|
||||
**Q: Что если я потерял пароль?**
|
||||
A: Просто нажмите "Сменить root-пароль" - будет сгенерирован новый.
|
||||
|
||||
**Q: Работает ли для KVM виртуалок?**
|
||||
A: Эта реализация для LXC контейнеров. Для KVM нужна доработка.
|
||||
Reference in New Issue
Block a user