Document the new GET /api/backups/scan-nfs/{server_id} endpoint and
the storage-add dialog's export scan button in CHANGELOG(.ru).md and
WIKI(.ru).md.
151 KiB
📖 PVEmanager — Документация
Полное руководство по установке, настройке и использованию PVEmanager v1.16.0
📑 Содержание
- Быстрый старт
- Установка и развёртывание
- Основные возможности
- Система уведомлений
- Управление ВМ и контейнерами
- Массовые операции
- Шаблоны ОС
- Images — каталог облачных образов
- Развёртывание LXC из CT-шаблонов
- App Store
- Кластеры Proxmox
- Снимки (Snapshots)
- Резервные копии
- IPAM
- Удалённое выполнение команд
- Мониторинг
- Безопасность (RBAC v2)
- Локализация
- Настройки
- Управление SSH-ключами
- Сети (SDN и интерфейсы узлов)
- Инструмент pve CLI
- Справочник API
- Рабочие области (Workspaces)
- Назначение серверов пользователю
- Владелец ВМ / LXC
- Квоты
- Логи и аудит
- Устранение неполадок
- FAQ
🚀 Быстрый старт
Требования
- Docker и Docker Compose
- Минимум 2 ГБ RAM
- Сервер Proxmox VE с доступом к API
Запуск за 1 минуту
# Клонировать репозиторий
git clone https://github.com/your-repo/pvemanager.git
cd pvemanager
# Скопировать и настроить переменные окружения
cp .env.example .env
cp backend/.env.example backend/.env
# Запуск
docker compose up -d
# Открыть в браузере
open http://localhost:3001
Учётные данные по умолчанию:
- Логин:
admin - Пароль:
admin123
⚠️ Обязательно смените пароль после первого входа!
📦 Установка и развёртывание
Варианты развёртывания
1. Standalone (разработка)
docker compose up -d
- Порт UI: 3001 (frontend), порт API: 8000 (backend)
- Без обратного прокси NGINX
- Подходит для локальной разработки
2. С NGINX (HTTP)
./deploy.sh
# Выбрать вариант 2
3. С NGINX + SSL (продакшн)
./deploy.sh
# Выбрать вариант 3
# Указать домен и email для Let's Encrypt
4. Установка одной командой (bootstrap.sh)
Один скрипт, который устанавливает панель как на обычном хосте Debian/Ubuntu, так и напрямую на хосте Proxmox VE — среда определяется по наличию /etc/pve:
git clone https://git.tzim.uz/markmorado/pvemanager.git
cd pvemanager
bash bootstrap.sh
- Обычный хост Debian/Ubuntu — при необходимости ставит Docker и
git/curl/openssl/jq, клонирует репозиторий вPVEMANAGER_DIR(по умолчанию/opt/pvemanager) и передаёт управлениеdeploy.sh --standalone. - Хост Proxmox VE — создаёт LXC на Debian 12 (DHCP на
vmbr0,nesting=1,keyctl=1для Docker внутри), устанавливает панель внутри по тому же сценарию, а после того как панель ответит наGET /health, создаёт на самом хосте PVE локальный API-токенroot@pam!pvemanager(pvesh create ... --privsep 0) и регистрирует этот хост как первую ноду панели. Пароль от Proxmox никуда не передаётся. - Настраивается через переменные окружения (
PVEMANAGER_REPO,PVEMANAGER_VERSION,PVEMANAGER_DIR, а такжеPVEMANAGER_LXC_*— vmid, хранилище, мост и ресурсы контейнера) — полный список и значения по умолчанию см. в заголовкеbootstrap.sh. - Скрипт переживает сбой
apt-get updateиз-за недоступного enterprise-репозитория на неподписанном хосте PVE, не прерывая bootstrap до установкиgit/curl.
Переменные окружения
Основные (.env)
# База данных
POSTGRES_PASSWORD=your_secure_password
# Часовой пояс
TZ=Your/Timezone
# Отключить проверку обновлений (для приватных репо без токена)
DISABLE_UPDATE_CHECK=false
# Токен GitHub для доступа к приватному репозиторию (опционально)
GITHUB_TOKEN=
Backend (backend/.env)
# Секретный ключ (сгенерируйте уникальный! минимум 32 символа)
SECRET_KEY=your-very-long-secret-key-change-me
# Пароль администратора по умолчанию — ОБЯЗАТЕЛЬНО смените перед первым развёртыванием!
ADMIN_PASSWORD=admin123
# Ключ шифрования Fernet для чувствительных полей БД (пароли Proxmox/cloud-init).
# Сгенерировать: python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"
# ВНИМАНИЕ: храните этот ключ в безопасности — его потеря означает потерю доступа к зашифрованным паролям.
# Если не задан, пароли хранятся в открытом виде (небезопасно).
FERNET_KEY=
# Время жизни JWT-токена (в минутах). По умолчанию: 480 (8 часов)
ACCESS_TOKEN_EXPIRE_MINUTES=480
# CORS-источники (через запятую). В продакшне используйте реальный домен(ы).
CORS_ORIGINS=*
Уведомления Email и Telegram
Настройки SMTP и Telegram-бота теперь управляются через веб-интерфейс:
- Перейдите в Настройки → Уведомления
- В разделе «Настройка каналов уведомлений» заполните:
- SMTP — параметры вашего почтового сервера
- Telegram — токен бота от @BotFather
- Нажмите кнопку Тест для проверки настроек
📚 Справочник API
В этом разделе перечислены ключевые эндпоинты API. Все они требуют JWT-аутентификации.
Аутентификация
POST /api/auth/login— возвращаетaccess_token
Обновления системы
GET /settings/api/version— текущая версияGET /settings/api/updates/repository— получить URL git-репозиторияPUT /settings/api/updates/repository— задать URL git-репозиторияGET /settings/api/updates/check— проверить наличие обновленийPOST /settings/api/updates/perform— запустить обновление
Серверы Proxmox
GET /api/servers— список серверовPOST /api/servers— добавить сервер (auto_create_tokenсоздаёт API-токен по логину/паролю)PUT /api/servers/{id}— обновить серверDELETE /api/servers/{id}— удалить серверPOST /api/servers/{id}/test— проверить подключениеPOST /api/servers/{id}/provision-token— перевести сервер с пароля на автосозданный API-токен
Виртуальные машины
GET /api/servers/{id}/resources— список ВМPOST /api/servers/{id}/vm/{vmid}/start?node={node}— запустить ВМPOST /api/servers/{id}/vm/{vmid}/stop?node={node}— остановить ВМPOST /api/servers/{id}/vm/{vmid}/restart?node={node}— перезагрузить ВМGET /api/servers/{id}/vm/{vmid}/status?node={node}— статус ВМ
Контейнеры
GET /api/servers/{id}/resources— список контейнеровPOST /api/servers/{id}/container/{vmid}/start?node={node}— запустить контейнерPOST /api/servers/{id}/container/{vmid}/stop?node={node}— остановить контейнерPOST /api/servers/{id}/container/{vmid}/restart?node={node}— перезагрузить контейнерGET /api/servers/{id}/container/{vmid}/status?node={node}— статус контейнера
Шаблоны ОС
GET /templates/api/groups— список групп шаблоновPOST /templates/api/groups— создать группу шаблоновGET /templates/api/templates— список шаблоновPOST /templates/api/templates— создать шаблонDELETE /templates/api/templates/{id}— удалить шаблон
IPAM
GET /ipam/api/networks— список сетейPOST /ipam/api/networks— создать сетьDELETE /ipam/api/networks/{id}— удалить сетьGET /ipam/api/allocations— список выделенных IPPOST /ipam/api/allocations— создать выделение IPDELETE /ipam/api/allocations/{id}— освободить IP
Уведомления
GET /api/notifications— список уведомленийPATCH /api/notifications/{id}/read— отметить прочитаннымDELETE /api/notifications/{id}— удалить уведомление
Пользователи и роли
GET /api/users— список пользователей (админ)POST /api/users— создать пользователя (админ)PUT /api/users/{id}— обновить пользователя (админ)DELETE /api/users/{id}— удалить пользователя (админ)GET /api/roles— список ролей (админ)POST /api/roles— создать роль (админ)PUT /api/roles/{id}— обновить роль (админ)DELETE /api/roles/{id}— удалить роль (админ)
Квоты
GET /api/users/{id}/quota— квота пользователя и текущее использование (требуетquota:view)PUT /api/users/{id}/quota— задать квоту пользователя;nullдля метрики = без ограничений (требуетquota:manage)GET /api/quota— собственная квота и использование текущего пользователя (self-service)
Настройки
GET /settings/api/panel— получить настройки панелиPUT /settings/api/panel— обновить настройки панелиGET /settings/api/security— получить настройки безопасностиPUT /settings/api/security— обновить настройки безопасностиGET /settings/api/notifications— получить настройки уведомленийPUT /settings/api/notifications— обновить настройки уведомлений
Резервные копии и хранилища
GET /api/backups/storages/{server_id}— список хранилищGET /api/backups/scan-nfs/{server_id}?server=<ip>— сканировать NFS-сервер на доступные экспортыPOST /api/backups/storages/{server_id}— добавить хранилищеPUT /api/backups/storages/{server_id}/{storage_id}— обновить хранилищеDELETE /api/backups/storages/{server_id}/{storage_id}— удалить хранилищеGET /api/backups/list/{server_id}?node=&storage=— список файлов резервных копийDELETE /api/backups/{server_id}/backup— удалить файл резервной копииPOST /api/backups/create— создать резервную копию VM/LXC (vzdump)POST /api/backups/restore— восстановить VM/LXC из резервной копииGET /api/backups/task/{server_id}/{node}/{upid}— статус/лог задачиGET /api/backups/jobs— список запланированных заданий резервного копированияPOST /api/backups/jobs— создать запланированное заданиеPUT /api/backups/jobs/{id}— обновить заданиеDELETE /api/backups/jobs/{id}— удалить задание
Высокая доступность (HA)
GET /api/{server_id}/ha/status— статус HA для всех ВМGET /api/{server_id}/ha/{vm_type}/{vmid}— статус HA для ВМPOST /api/{server_id}/ha/{vm_type}/{vmid}/add— добавить ВМ в HADELETE /api/{server_id}/ha/{vm_type}/{vmid}/remove— убрать ВМ из HA
SDN (Software Defined Networking)
GET /api/servers/{server_id}/sdn/status— проверить доступность SDNGET /api/servers/{server_id}/sdn/zones— список зонPOST /api/servers/{server_id}/sdn/zones— создать зонуPUT /api/servers/{server_id}/sdn/zones/{zone}— обновить зонуGET /api/servers/{server_id}/sdn/vnets— список VNetPOST /api/servers/{server_id}/sdn/vnets— создать VNetPUT /api/servers/{server_id}/sdn/vnets/{vnet}— обновить VNetPOST /api/servers/{server_id}/sdn/vnets/{vnet}/subnets— создать подсеть (поддерживаетcreate_ipam_network)DELETE /api/servers/{server_id}/sdn/vnets/{vnet}/subnets/{cidr}— удалить подсетьPOST /api/servers/{server_id}/sdn/apply— применить ожидающие изменения SDN
Сети узлов
GET /api/servers/{server_id}/nodes— список узлов сервера
Прочее
POST /api/sync-vms— принудительная немедленная синхронизация ВМ со всех серверов ProxmoxDELETE /proxmox/api/all-tasks/completed— удалить все завершённые/проваленные/отменённые задачи текущего пользователя (и ProxmoxTask, и TaskQueue)
🏠 Основные возможности
Дашборд
- 5 карточек статистики — узлы, ВМ, контейнеры, кластеры, оповещения (в реальном времени)
- Карточки ресурсов — CPU, RAM, хранилище с мини-графиками (sparkline)
- Чип статуса в шапке —
All systems operational/ предупреждения / критические оповещения - Живые часы в шапке
- Количество кластеров вычисляется автоматически из базы данных
- Счётчик оповещений из AuditLog (ошибки + критические за последние 24 ч)
- Недавние события аудита (последние 5) на дашборде
- Селектор кластера в боковой панели — показывает активный кластер или имя standalone
- Бейдж версии в шапке
Серверы Proxmox
- Добавление нескольких серверов
- Аутентификация через API Token или пароль
- Автоматическое создание API-токена с переводом уже подключённых по паролю серверов без переподключения
- Мониторинг статуса серверов с различением недоступной ноды и отклонённых/протухших учётных данных
- Доступность storage по нодам
Управление ВМ и LXC
- Просмотр всех виртуальных машин
- Запуск / Остановка / Перезагрузка / Выключение
- Изменение конфигурации (CPU, RAM, диск)
- VNC-консоль в браузере
- Удалённое выполнение команд
Массовые операции
- Массовый запуск/остановка/перезагрузка/удаление ВМ и контейнеров
- Система очереди задач с отслеживанием прогресса
- Фоновая обработка
Шаблоны ОС
- Быстрое развёртывание ВМ из шаблонов
- Кросс-узловое развёртывание шаблонов для кластеров
- Группы шаблонов и иконки
- Переустановка ВМ из шаблона
Снимки (Snapshots)
- Создание, удаление, откат снимков VM/LXC
- Система очереди операций со снимками
- Архивирование снимков при удалении ВМ
Резервные копии
- Ручное создание резервных копий (vzdump) для ВМ и контейнеров
- Просмотр и удаление копий по хранилищу/узлу
- Восстановление VM/LXC из копии с опциональным новым VMID
- Запланированные задания с cron-выражениями
- Политики хранения копий (keep_last, keep_daily, keep_weekly, keep_monthly)
- Управление пулами хранилищ (добавить, изменить, удалить)
- Отслеживание прогресса задач через UPID
Высокая доступность (HA)
- Просмотр статуса HA для всех ВМ на сервере
- Добавление/удаление ВМ из групп Proxmox HA
- Статус HA и информация о группе для каждой ВМ
IPAM (управление IP-адресами)
- Управление сетями и подсетями
- Привязка к серверу и узлу — сети привязываются к конкретному серверу и узлу Proxmox, чтобы исключить назначение IP между серверами
- Ручной выбор сервера + сети в модальном окне при привязке IP к VM/LXC
- Динамические селекторы сервера и узла в формах создания сети
- Автоматическое выделение IP
- Резервирование и освобождение IP
- История выделений
Уведомления
- Оповещения о событиях ВМ в реальном времени
- Email-уведомления через SMTP
- Telegram-уведомления через Bot API
- In-App уведомления с иконкой колокольчика
Безопасность
- RBAC v2 с атомарными правами (
resource:action) - Изоляция пользователей в стиле VPS (пользователи видят только свои инстансы)
- Блокировка IP (автоматическая и ручная)
- Управление сессиями
- Защита входа (блокировка, ограничение частоты)
- Журналы аудита
Квоты
Ограничения ресурсов на пользователя, применяемые при развёртывании VM/LXC:
- Ограничиваемые метрики — количество инстансов, суммарные vCPU (ядра), суммарная RAM (МБ) и суммарный диск (ГБ), просуммированные по неудалённым, не-шаблонным инстансам пользователя
- Без ограничений по умолчанию — пользователь без строки квоты или с пустой метрикой (
NULL) не ограничен по этой метрике; администраторы никогда не блокируются - Применение — развёртывание инстанса, превышающего любой лимит, отклоняется с HTTP 429 и двуязычным сообщением с прогнозируемым значением и лимитом
- Управление админом — задание лимитов на пользователя на странице Пользователи (диалог квот с живыми полосами использования); требует право
quota:manage(quota:viewдля чтения) - Self-service — каждый пользователь видит свои лимиты и текущее использование на странице Настройки, а остаток квоты показывается подсказкой в мастере создания инстанса
- Текущее использование берётся из кэша
vm_instances(owner_id), где RAM хранится в МБ, а диск — в ГБ
Мониторинг
- Метрики CPU, RAM, диска, сети в реальном времени
- Исторические графики (час, день, неделя, месяц) как для инстансов, так и для нод (вкладка «Графики» у ноды: CPU, IO delay, память, load average, сеть, swap, корневая ФС)
- Пороги оповещений по ресурсам
🔔 Система уведомлений
Обзор
Система уведомлений обеспечивает:
- Оповещения в реальном времени о событиях ВМ
- Email-уведомления через SMTP
- Telegram-уведомления через Bot API
- In-App уведомления с иконкой колокольчика
Типы уведомлений
| Тип | Описание | Пример |
|---|---|---|
vm_status |
Изменения состояния ВМ | ВМ запущена/остановлена |
resource_alert |
Оповещения по ресурсам | CPU > 80%, RAM > 85% |
system |
Системные события | Ошибки подключения |
Уровни важности
| Уровень | Цвет | Описание |
|---|---|---|
critical |
🔴 Красный | Критические проблемы |
warning |
🟠 Оранжевый | Предупреждения |
info |
🔵 Синий | Информационные |
success |
🟢 Зелёный | Успешные операции |
Настройка Email
- Перейдите в Настройки → Уведомления
- В «Настройке каналов уведомлений» заполните данные SMTP:
- SMTP-сервер — адрес почтового сервера
- Порт — 465 для SSL, 587 для STARTTLS
- Пользователь — ваш email
- Пароль — пароль приложения
- Email отправителя — адрес отправителя
- В «Настройках уведомлений» отметьте Email-уведомления
- Нажмите Тест для проверки
Поддерживаемые SMTP-серверы:
| Сервер | Хост | Порт | TLS |
|---|---|---|---|
| Yandex | smtp.yandex.ru | 465 | SSL |
| Gmail | smtp.gmail.com | 587 | STARTTLS |
| Mail.ru | smtp.mail.ru | 465 | SSL |
⚠️ Для Yandex и Gmail используйте «пароль приложения», а не основной пароль!
Настройка Telegram
- Создайте бота через @BotFather
- В Настройки → Уведомления введите токен бота
- Отправьте боту
/start - Получите Chat ID через @userinfobot
- В «Настройках уведомлений» включите Telegram и введите Chat ID
- Нажмите Проверить для подтверждения
Параметры уведомлений
| Параметр | Описание |
|---|---|
| Включено | Активировать канал |
| Только критические | Отправлять только критический уровень |
| Тихие часы | Период без уведомлений (напр., 23:00 – 07:00) |
Фоновый мониторинг
Автоматически отслеживает:
- Статус ВМ каждые 30 секунд
- Ресурсы каждые 60 секунд
- Пороги: CPU > 80%, RAM > 85%, диск > 90%
🖥️ Управление ВМ и контейнерами
Палитра команд (Ctrl+K)
Нажмите Ctrl+K (⌘K на macOS) в любом месте приложения, чтобы открыть палитру команд — поисковый список всех пунктов навигации. Начните печатать для фильтрации, затем Enter для перехода. Палитра и боковое меню используют один унифицированный реестр навигации, поэтому всегда синхронизированы.
Действия с ВМ
Меню строки инстанса (⋯) содержит Опции, Миграцию, Изменение ресурсов, Создание резервной копии и Удаление наряду с действиями питания ниже. Меню остаётся открытым при живых обновлениях списка.
| Действие | Описание | Хоткей |
|---|---|---|
| Start | Запустить ВМ | - |
| Stop | Остановить (ACPI-выключение) | - |
| Restart | Перезагрузить | - |
| Force Stop | Принудительная остановка | - |
| Delete | Удалить ВМ | - |
Вкладки инстанса: для ВМ карточки Compute resources, CPU options, Disk management и Disk resize находятся на вкладке Hardware; LXC-контейнеры (у которых нет вкладки Hardware) держат эти карточки на вкладке Settings.
Массовые операции
Выберите несколько ВМ/контейнеров и выполните массовые действия:
- Отметьте чекбокс рядом с каждой нужной ВМ
- Используйте «Выбрать все» для выбора всех видимых ВМ
- Нажмите кнопку действия в панели массовых операций:
- Start All — запустить все выбранные
- Stop All — остановить все выбранные
- Restart All — перезагрузить все выбранные
- Delete All — удалить все выбранные (с подтверждением)
Подробнее см. Массовые операции.
Консоль (VNC / терминал)
- QEMU-ВМ — VNC-консоль через noVNC (графический вывод в браузере).
- Откройте детали ВМ → нажмите Console, либо ПКМ по ВМ в списке → VNC Console
- Полный проброс клавиатуры и мыши; поддержка полноэкранного режима
- LXC-контейнеры — интерактивный shell через терминал xterm.js.
- Откройте детали контейнера → нажмите Terminal, либо ПКМ по контейнеру в списке → Terminal
- Полный PTY: автодополнение, цвета, Unicode, изменение размера терминала при ресайзе окна
- Использует WebSocket-протокол Proxmox
termproxy(рукопожатие аутентификации + keepalive-пинги каждые 2 мин)
Изменение конфигурации
CPU: 1–32 ядра
RAM: 512 МБ – 128 ГБ
Диск: увеличение размера (уменьшение невозможно)
Примечание (v1.2.0+): изменение размера диска полностью асинхронно. Панель ждёт завершения задачи ресайза в Proxmox перед запуском ВМ, что предотвращает ошибки
lock file timeout, возникавшие при немедленном запуске ВМ после запроса ресайза.
Высокая доступность (HA)
Требуется кластер Proxmox с настроенным менеджером HA.
- Откройте детали ВМ или контейнера
- Перейдите на вкладку HA
- Нажмите Add to HA и выберите HA-группу (опционально)
- Для удаления — нажмите Remove from HA
Операции панели сейчас отражают статус HA, но не заменяют конфигурацию менеджера Proxmox HA.
⚡ Массовые операции
Обзор
Массовые операции позволяют выполнить одно и то же действие над несколькими ВМ или контейнерами одновременно. Это удобно, когда нужно запустить, остановить или перезагрузить много виртуальных машин сразу.
Поддерживаемые действия
| Действие | Описание | Требуется подтверждение |
|---|---|---|
| Bulk Start | Запустить все выбранные VM/контейнеры | Нет |
| Bulk Stop | Остановить все выбранные (ACPI-выключение) | Нет |
| Bulk Restart | Перезагрузить все выбранные | Нет |
| Bulk Shutdown | Корректное выключение | Нет |
| Bulk Delete | Удалить все выбранные | Да (двойное подтверждение) |
Как использовать
- Перейдите на страницу «Виртуальные машины»
- Выберите ВМ чекбоксами:
- Кликайте отдельные чекбоксы
- Или используйте «Выбрать все» для всех видимых ВМ
- Панель массовых действий появляется внизу при выборе ВМ
- Нажмите нужное действие
- Подтвердите при запросе (для операций удаления)
Панель задач (Task Drawer)
При запуске массовой операции Task Drawer автоматически открывается в боковой панели. Он показывает прогресс каждой задачи в реальном времени:
- Выполняющиеся задачи показывают спиннер и текущий прогресс (
completed / total) - Завершённые задачи зелёные; проваленные — красные
- Задачи старше 24 часов автоматически скрываются из панели (остаются доступны на странице
/tasks) - Кнопка корзины (🗑) в шапке панели удаляет все завершённые/проваленные/отменённые задачи одним кликом
Отслеживание UPID Proxmox
Начиная с v1.1.5, отдельные действия управления VM/LXC (start / stop / restart) связаны с реальным UPID задачи Proxmox. UPID регистрируется как запись ProxmoxTask и опрашивается в реальном времени, поэтому Task Drawer отражает фактическое состояние задачи на стороне Proxmox.
Ограничения
- Одновременно выполняется только одна массовая задача
- Задачи обрабатываются последовательно
- Максимум элементов на задачу: не ограничено (но учитывайте нагрузку на сервер)
- Задачи нельзя приостановить (только отменить, если ожидают)
📋 Шаблоны ОС
Концепция
Шаблоны ОС позволяют быстро развёртывать ВМ из предварительно настроенных шаблонов.
Создание группы шаблонов
- Шаблоны ОС → Groups → Add Group
- Введите имя (напр., «Linux Servers»)
- Добавьте описание
Добавление шаблона
- Шаблоны ОС → Templates → Add Template
- Или: Scan → выбрать из Proxmox
Развёртывание ВМ
- Выберите шаблон
- Укажите:
- Имя ВМ
- Целевой узел (для кластеров — выбрать, куда развернуть)
- CPU/RAM/диск
- IP-адрес (или авто из IPAM)
- SSH-ключ (опционально)
- Нажмите Deploy
Кросс-узловое развёртывание шаблонов (кластеры)
При использовании кластеров Proxmox шаблоны можно развернуть на любой узел кластера:
Как это работает
- Создание шаблона на любом узле — шаблон изначально создаётся на одном узле кластера
- Выбор целевого узла — при развёртывании ВМ выберите любой онлайн-узел кластера
- Автоматическая репликация — если шаблона нет на целевом узле:
- Система клонирует шаблон на целевой узел
- Конвертирует клон в шаблон
- Отслеживает реплицированные шаблоны в базе данных
- Последующие развёртывания — используют уже реплицированный шаблон (быстро)
Требования
- Кластер Proxmox (узлы должны быть в одном кластере)
- Рекомендуется общее хранилище (но не обязательно)
- Шаблон должен быть доступен с исходного узла
Пример
Кластер: pve1, pve2, pve3
Шаблон: Ubuntu-22.04 на pve1
Развёртывание на pve1: используется оригинальный шаблон (быстро)
Развёртывание на pve2: репликация шаблона → развёртывание (первый раз медленнее)
Развёртывание на pve3: репликация шаблона → развёртывание (первый раз медленнее)
Следующее развёртывание на pve2: используется реплицированный шаблон (быстро)
Переустановка ВМ
- Откройте детали ВМ
- Нажмите Reinstall
- Выберите шаблон
- VMID сохраняется
📥 Images — каталог облачных образов
Обзор
Модуль Images позволяет просматривать, скачивать и управлять образами ОС из облачных репозиториев. Образы можно скачивать напрямую в хранилище Proxmox и опционально автоматически конвертировать в шаблоны ВМ.
Возможности
- Просмотр облачных образов — обнаружение образов ОС из стандартного репозитория Proxmox и кастомных зеркал
- Скачивание образов — загрузка образов
.qcow2в любое хранилище Proxmox с отслеживанием прогресса - Автоконвертация в шаблон — опциональная автоматическая конвертация скачанных образов в шаблоны ВМ Proxmox
- Фильтрация по архитектуре — образы фильтруются по платформе узла (x86-64, aarch64); архитектура по умолчанию соответствует выбранному узлу
- Кастомные зеркала — администраторы могут добавлять, редактировать и управлять кастомными источниками зеркал
- Загрузка ISO — установочный ISO можно скачать по URL, из сохранённого зеркала (
kind=iso) или прямо на шаге ISO в мастере создания инстанса. Встроенный каталог намеренно ограничен.qcow2— у установочных ISO нет стабильной ссылки на «последнюю версию», поэтому жёстко прописанные ссылки протухали бы при каждом релизе - Загрузка локального файла — ISO или шаблон LXC (
vztmpl) можно загрузить со своего компьютера прямо в storage ноды — для образов, которые нигде публично не доступны панели
Доступ к Images
- Перейдите в Infrastructure → Images (боковое меню)
- Выберите сервер и узел Proxmox
- Просматривайте доступные образы, отфильтрованные по архитектуре
Скачивание образа
- Нажмите Download рядом с нужным образом
- Выберите целевое хранилище
- Опционально включите Convert to Template (создаёт шаблон ВМ по завершении)
- Нажмите Download — прогресс отслеживается в реальном времени
- По завершении образ доступен в хранилище для развёртывания ВМ
Загрузка локального файла
- Перейдите в Infrastructure → Images и выберите Upload
- Укажите файл ISO или
vztmplи целевое хранилище - Панель передаёт файл на ноду в фоне; прогресс отслеживается так же, как при загрузке по URL
- По завершении файл доступен в хранилище для развёртывания ВМ/CT
Установка ОС с ISO
Мастер создания инстанса предлагает тип «пустая ВМ» для установки с ISO: создаётся ВМ с пустым диском и смонтированным на ide2 образом, который ставится первым в порядке загрузки, — гость сразу попадает в установщик через встроенную консоль noVNC. Выбор гостя Windows автоматически задаёт прошивку OVMF, SATA-диск и сетевую карту e1000, так как у установщика ещё нет драйверов virtio.
Извлечение и монтирование ISO
На странице ВМ диалог ISO показывает все образы, уже лежащие в хранилище ноды — включая те, что появились там до подключения ноды к панели, — и текущий смонтированный образ, если он есть:
- Монтировать — выберите ISO из хранилища; опционально отметьте «загрузка с этого ISO», чтобы поставить CD-ROM первым в порядке загрузки.
- Извлечь (переименовано из «Отсоединить») — снимает смонтированный ISO; опционально отметьте «загрузка с диска», чтобы поставить основной диск первым в порядке загрузки.
Любое действие, меняющее порядок загрузки, применяется через гибридную перезагрузку: штатное ACPI-выключение с откатом на принудительную остановку, затем запуск. Это убирает таймаут ping гостя, с которым сталкивается обычный рестарт на свежеустановленной ОС, где ещё не запущен QEMU Guest Agent.
GitHub-зеркало с QEMU Guest Agent
Встроенный каталог образов amd64 ссылается на GitHub-зеркало, содержащее облачные образы с предустановленным qemu-guest-agent. Это даёт:
- Живые метрики на ВМ (CPU, память, заполнение диска, скорости I/O) сразу после деплоя — дополнительная установка агента не нужна
- Образы включают контрольную сумму sha256; если закешированный файл не совпадает с опубликованной суммой, панель скачает его повторно автоматически
Чтобы собрать или обновить зеркало самостоятельно, запустите вспомогательный скрипт на Linux-хосте с установленным QEMU:
bash patch-cloud-images.sh
Скрипт скачивает исходный .qcow2, устанавливает qemu-guest-agent через virt-customize и публикует патченный образ как GitHub Release.
Кастомные зеркала (только админ)
Администраторы могут настроить кастомные репозитории образов:
- Перейдите в Настройки → Images → Custom Mirrors
- Нажмите Add Mirror
- Введите URL зеркала (должен быть валидным репозиторием Proxmox)
- Сохраните — зеркало сразу появится в браузере образов
Формат URL зеркала:
Валидное зеркало должно предоставлять стандартную структуру репозитория Proxmox с файлом index.json, содержащим метаданные образов.
Эндпоинты API
| Метод | Эндпоинт | Описание |
|---|---|---|
GET |
/api/images |
Список доступных образов |
GET |
/api/images/node-arch/{server_id}/{node} |
Архитектура узла |
POST |
/api/images/download |
Запустить скачивание (возвращает UPID задачи) |
GET |
/api/images/mirrors |
Список кастомных зеркал (админ) |
POST |
/api/images/mirrors |
Добавить кастомное зеркало (админ) |
PUT |
/api/images/mirrors/{id} |
Обновить зеркало (админ) |
DELETE |
/api/images/mirrors/{id} |
Удалить зеркало (админ) |
Отслеживание задачи скачивания
Скачивание образов отслеживается как задачи Proxmox (UPID). Используйте стандартный эндпоинт задач для мониторинга прогресса:
GET /api/backups/task/{server_id}/{node}/{upid}
📦 Развёртывание LXC из CT-шаблонов
Обзор
Начиная с v1.5.0, LXC-контейнеры можно создавать напрямую из файлов CT-шаблонов Proxmox (.tar.zst, .tar.gz) без необходимости заранее настраивать запись «Шаблон ОС». Это стандартный способ развернуть Debian, Ubuntu, Alpine и другие дистрибутивы из списка загрузок Proxmox.
Просмотр доступных CT-шаблонов
CT-шаблоны берутся напрямую из хранилища сервера Proxmox:
- Перейдите в Instances → Create Instance
- Выберите целевой сервер Proxmox
- Выберите тип LXC Container
- Мастер получает доступные файлы
.tar.zst/.tar.gzсо всех хранилищ выбранного сервера
Развёртывание LXC-контейнера
- Шаг Server — выберите сервер Proxmox
- Шаг Type — выберите LXC Container
- Шаг Template — выберите CT-шаблон из списка
- Шаг Config — заполните:
- Имя контейнера (hostname)
- Ядра CPU, RAM (МБ), Swap (МБ), диск (ГБ)
- Хранилище, сетевой мост
- IP-адрес / шлюз (вручную или из IPAM)
- Root-пароль и/или SSH-ключи
- Владелец (только админ)
- Опции Start after create / On-boot
- Шаг Confirm — проверьте и нажмите Deploy
Развёртывание выполняется асинхронно; прогресс отслеживается в Task Drawer.
SSH-ключи при развёртывании LXC
- Выберите один или несколько ключей из личной библиотеки SSH-ключей (см. Управление SSH-ключами)
- Админы, развёртывающие от имени другого пользователя, могут выбрать ключи из библиотеки этого пользователя
- Ключи внедряются в
authorized_keysконтейнера во время провижининга
Переустановка LXC-контейнера (CT-шаблон)
Контейнеры, созданные из CT-шаблонов, поддерживают переустановку:
- Откройте меню действий контейнера → Reinstall
- Опционально выберите другой CT-шаблон
- Автоматически сохраняются:
- Root-пароль
- SSH-ключи
- IP-адрес и шлюз
- Старый контейнер уничтожается, создаётся новый с тем же VMID
Примечание:
nesting=1включается по умолчанию для всех новых LXC-контейнеров для совместимости с systemd 255+ (cgroup v2).
🛒 App Store
Каталог self-hosted приложений с установкой в один клик. Каждое приложение работает в собственном unprivileged LXC-контейнере с Docker Compose (1 приложение = 1 LXC). Каталог мультиисточниковый: runtipi/runtipi-appstore (~265 приложений) и опционально getumbrel/umbrel-apps (~380 приложений). Источники выбираются через APPSTORE_SOURCES; id приложений Umbrel имеют префикс (umbrel-<id>) во избежание коллизий.
Предварительные требования
- Золотой шаблон LXC (Debian 12 + Docker + Compose) на каждый сервер Proxmox. Соберите его из App Store → золотой шаблон (
POST /api/appstore/golden-template, выбирает сервер/узел/хранилище) — это автоматизирует ручную процедуру из docs/golden-template.md. Хранилище шаблона и rootfs выбираются из выпадающих списков, заполненных реальными хранилищами выбранного сервера/ноды (по contentvztmpl/rootdir), с автоподстановкойlocal/local-lvm, если они доступны. Полученный volid vztmpl хранится для каждогоserver_id(шаблон, собранный на сервере A, лежит только в хранилище A и никогда не используется для установки на сервере B);APPSTORE_GOLDEN_TEMPLATE— лишь последний запасной вариант для серверов без собственной сборки. - SSH-доступ от панели к узлу Proxmox (используется для
pct exec/pct push). - Установлен
FERNET_KEY(шифрует секреты приложений на диске).
Настройки окружения
| Переменная | По умолчанию | Назначение |
|---|---|---|
APPSTORE_GOLDEN_TEMPLATE |
— | запасной volid золотого vztmpl, используется только если у сервера нет собственного сохранённого шаблона |
APPSTORE_NAMESERVER |
1.1.1.1 8.8.8.8 |
DNS, явно задаваемый на LXC App Store (и на CT сборки золотого шаблона) — без него контейнер наследует резолвер узла, который может быть недоступен из сети LXC (напр., DNS только для Tailscale на хосте) и ломает pull образов |
APPSTORE_SOURCES |
runtipi |
активные источники каталога через запятую (runtipi, umbrel) |
RUNTIPI_APPSTORE_REPO |
runtipi/runtipi-appstore |
источник каталога Runtipi |
RUNTIPI_APPSTORE_REF |
master |
ветка/тег/коммит (рекомендуется зафиксировать) |
UMBREL_APPSTORE_REPO |
getumbrel/umbrel-apps |
источник каталога Umbrel (когда включён umbrel) |
UMBREL_APPSTORE_REF |
master |
ветка/тег/коммит Umbrel |
UMBREL_APPSTORE_GALLERY_CDN |
https://getumbrel.github.io/umbrel-apps-gallery |
CDN иконок Umbrel (<app-id>/icon.svg, скачиваются пофайлово параллельно) |
APPSTORE_DATA_DIR |
/app/data/appstore |
кэш логотипов (смонтированный volume) |
CATALOG_SYNC_INTERVAL_HOURS |
24 |
интервал авто-синхронизации каталога |
APPSTORE_HOST_ARCH |
amd64 |
целевая архитектура узла (помечает неподдерживаемые приложения) |
Каталог
- Экран App Store: сетка карточек с поиском и фильтрами по категориям; кнопка Refresh catalog + метка времени последней синхронизации. Когда включено более одного источника, появляются фильтр источника и бейдж источника на карточке (Runtipi / Umbrel).
- Автоматическая синхронизация каждые 24 ч; повреждённая запись приложения пропускается без провала всей синхронизации. Каждый источник синхронизируется независимо, а проход исчез → недоступно ограничен рамками источника.
- Приложения Umbrel: метаданные из
umbrel-app.yml, иконки из репозитория gallery; при установке runtime-сервисы Umbrelapp_proxy/torвырезаются, а порт контейнера (app_proxy → APP_PORT) публикуется на хосте LXC. - Страница приложения: описание, версия, ссылка на источник, дисклеймер установки и предпросмотр compose.
Установка
Конвейер (каждый шаг журналируется и стримится по WebSocket):
- Клонирование золотого шаблона LXC (по умолчанию 2 vCPU / 2048 МБ / 8 ГБ, DHCP или расширенные переопределения).
- Запуск и ожидание IP.
pct pushdocker-compose.yml+.env(ответы формы + сгенерированныеrandom-секреты) + любые вложенныеdata_files.docker compose up -d.- HTTP health-check.
- Показ URL приложения и одноразовых учётных данных.
Проваленный шаг ставит статус error с логом шага; Retry не пересоздаёт LXC (идемпотентно по VMID) и повторно использует исходные параметры установки (сохранены в installed_apps.install_params), Delete удаляет контейнер и запись.
Заметки о надёжности:
- Файлы, поставляемые с приложением каталога (
data_files), доставляются в контейнер доdocker compose up; учитываются UmbrelAPP_PASSWORD/default_credentials. - Каталоги bind-mount хоста (
volumes:в compose приложения, и${APP_DATA_DIR}/..., и относительные пути) предварительно создаются с разрешительными правами доup— иначе Docker создаёт их как root, и non-root пользователи контейнера (напр.,mysqlу mariadb) получаютPermission denied. - Поиск VMID пропускает уже занятые записи —
nextidне резервирует номер, поэтому повтор мог бы иначе занять другой контейнер. pct createповторяет несколько раз при временной ошибке config-lock (частой сразу после удаления того же VMID, пока узел ещё стирает старый диск).- Delete теперь ждёт, пока Proxmox фактически подтвердит завершение задачи destroy (до 30 мин, покрывает медленное стирание диска), прежде чем пометить приложение удалённым — иначе VMID мог бы быть переиспользован, пока узел ещё занят.
- Значения
.env, содержащие#, берутся в кавычки (парсер dotenv иначе обрезал бы их как inline-комментарий); порт, явно выбранный в мастере (включая80), публикуется как есть.
Трей свёрнутых операций
Долгие операции App Store — установка приложения и сборка золотого шаблона — можно свернуть вместо того, чтобы держать диалог открытым:
- Свёрнутые операции живут в глобальном хранилище (сохраняется в
localStorage) и рендерятся как трей в макете приложения, поэтому плашка переживает навигацию по страницам и полную перезагрузку вкладки. Трей сам опрашивает прогресс каждой операции (REST, каждые 3 с), независимо от диалога. - Клик по плашке возвращает на страницу операции и переоткрывает диалог — установка возобновляется в мастере, сборка шаблона переоткрывает диалог золотого шаблона с предвыбранным сервером.
- Свернуть добавляет операцию в трей и закрывает диалог; ✕ на плашке лишь удаляет плашку (операция продолжает работать на сервере). Плашки операций, которых больше нет (
404после перезагрузки), очищаются автоматически.
Мои приложения
Управление установленными приложениями: Start / Stop / Restart / Logs / Delete, живой статус и кликабельный IP:port.
- Реконсиляция запускается каждые 60 с и при открытии экрана: LXC, удалённый вне PVEmanager, помечается
orphaned. - Обновление: делает pre-update снапшот Proxmox →
docker compose pull && up -d→ health-check; хранит только последний pre-update снапшот. - Откат: восстанавливает снапшот (⚠️ также откатывает данные приложения к моменту снапшота) и возвращает версию в базе данных.
Права
app:view (каталог + Мои приложения), app:install (установка), app:manage (синхронизация, жизненный цикл, обновление, откат, удаление). Админы обходят все проверки.
REST API
GET /api/appstore/catalog # список (q, category, source)
GET /api/appstore/catalog/{app_id} # детали
GET /api/appstore/catalog/{app_id}/logo # логотип (публично)
POST /api/appstore/catalog/sync # ручная синхронизация (админ)
POST /api/appstore/apps/install # установка
GET /api/appstore/apps # список установленных
POST /api/appstore/apps/{id}/action/{start|stop|restart}
GET /api/appstore/apps/{id}/logs
POST /api/appstore/apps/{id}/update
POST /api/appstore/apps/{id}/rollback
POST /api/appstore/apps/reconcile
DELETE /api/appstore/apps/{id}
POST /api/appstore/golden-template # собрать золотой vztmpl для сервера
GET /api/appstore/golden-template/status?server_id=… # шаблон сервера + последняя операция сборки
🔗 Кластеры Proxmox
Обзор
PVEmanager полностью поддерживает кластеры Proxmox, позволяя управлять несколькими узлами как единой сущностью.
Добавление кластера
- Перейдите в Proxmox VE → Add Server
- Введите IP-адрес любого узла (напр., pve1)
- Панель автоматически обнаружит все узлы кластера
- Все узлы появятся в селекторах узлов
Преимущества кластера
| Возможность | Standalone | Кластер |
|---|---|---|
| Кол-во узлов | 1 | Несколько |
| Кросс-узловые шаблоны | ❌ | ✅ |
| Выбор целевого узла | ❌ | ✅ |
| Автоматический failover | ❌ | ✅ (Proxmox HA) |
Создание кластера Proxmox
Если ваши узлы ещё не в кластере:
# На первом узле (pve1)
pvecm create my-cluster
# На других узлах (pve2, pve3 и т.д.)
pvecm add 10.10.10.11 # IP pve1
Кросс-узловое развёртывание шаблонов
См. Шаблоны ОС — Кросс-узловое развёртывание
Импорт уже существующего кластера
Если узлы уже объединены в кластер в обход панели (через pvecm или веб-интерфейс Proxmox), сначала добавьте каждый узел в панель как обычный standalone-сервер, затем воспользуйтесь Кластер → Импорт:
- Выберите любой из уже добавленных узлов — панель прочитает с него
cluster/config/joinи определит реальное имя кластера и список узлов - Совпавшие по IP или hostname серверы панели будут отмечены автоматически; узлы, ещё не добавленные в панель, будут показаны в списке, но привязать их нельзя, пока они не добавлены как серверы
- Подтвердите — панель только привяжет совпавшие записи серверов к группе кластера в своей БД; никакая команда
pvecmне выполняется, реальный кластер не затрагивается
Это чисто БД-аналог «Создать кластер»/«Присоединить ноду», которые выполняют настоящие операции pvecm create/pvecm add — используйте Импорт только когда узлы уже реально объединены в кластер.
📸 Снимки (Snapshots)
Обзор
Снимки позволяют сохранять и восстанавливать состояние ВМ и контейнеров в любой момент времени.
Создание снимка
- Откройте детали ВМ или контейнера
- Перейдите на вкладку Snapshots
- Нажмите Create Snapshot
- Введите имя и описание
- Опционально включите состояние RAM (только QEMU-ВМ)
Управление снимками
| Действие | Описание |
|---|---|
| Create | Сохранить текущее состояние ВМ |
| Rollback | Восстановить к предыдущему состоянию снимка |
| Delete | Удалить существующий снимок |
⚠️ Откат отменит все изменения, сделанные после создания снимка!
Очередь снимков
Операции со снимками обрабатываются через систему очереди задач. Прогресс отслеживается, результаты сохраняются для каждого элемента.
Эндпоинты API
# Список снимков
GET /api/{server_id}/vm/{vmid}/snapshots?node={node}
# Создать снимок
POST /api/{server_id}/vm/{vmid}/snapshots?node={node}
# Удалить снимок
DELETE /api/{server_id}/vm/{vmid}/snapshots/{snapname}?node={node}
# Откатить к снимку
POST /api/{server_id}/vm/{vmid}/snapshots/{snapname}/rollback?node={node}
Для LXC-контейнеров используйте
/container/вместо/vm/в эндпоинтах выше.
💾 Резервные копии
Обзор
PVEmanager предоставляет полный интерфейс управления резервными копиями на базе Proxmox vzdump. Можно создавать, просматривать, восстанавливать и удалять копии, а также настраивать автоматические запланированные задания.
Управление хранилищами
Перед созданием копий убедитесь, что целевое хранилище настроено в Proxmox.
| Действие | Описание |
|---|---|
| List storages | Просмотр всех хранилищ сервера |
| Add storage | Добавить пул хранилища (directory, NFS, CIFS и т.д.) |
| Edit storage | Изменить конфигурацию хранилища |
| Delete storage | Удалить хранилище из Proxmox |
Создание резервной копии
- Перейдите на страницу Backups
- Выберите сервер и узел
- Выберите хранилище, куда сохранить копию
- Выберите VM/контейнер (по VMID)
- Настройте опции:
- Режим:
snapshot(по умолчанию),suspendилиstop - Сжатие:
zstd(по умолчанию),lzo,gzip,none
- Режим:
- Нажмите Create Backup
- Возвращается UPID — используйте его для отслеживания прогресса
Режимы резервного копирования
| Режим | Описание | Простой |
|---|---|---|
snapshot |
Живой снимок (требует QEMU agent или LVM) | Нет |
suspend |
Приостановка ВМ на время копирования | Кратковременный |
stop |
Остановка ВМ, копирование, запуск | Полная остановка |
Просмотр и удаление копий
- Просматривайте существующие копии по серверу, узлу и хранилищу
- Фильтруйте по VMID
- Удаляйте отдельные файлы копий
Восстановление
- Выберите файл копии из списка
- Нажмите Restore
- Укажите:
- Целевое хранилище для восстановления
- Новый VMID (опционально, оставить оригинал или назначить новый)
- Start after restore (опционально)
- Восстановление выполняется как задача Proxmox (возвращается UPID для отслеживания)
⚠️ Восстановление в существующий VMID перезапишет его!
Запланированные задания резервного копирования
Автоматизируйте регулярные копии с помощью cron-планирования.
Создание задания
Server: выбрать сервер Proxmox
Node: целевой узел
VMIDs: список через запятую (напр., 100,101,102)
Storage: назначение копии
Mode: snapshot / suspend / stop
Compress: zstd / lzo / gzip / none
Cron: стандартное 5-полевое cron-выражение
Enabled: переключатель вкл/выкл
Примеры cron-выражений
| Выражение | Значение |
|---|---|
0 2 * * * |
Каждый день в 02:00 |
0 3 * * 0 |
Каждое воскресенье в 03:00 |
0 1 * * 1-5 |
Будни в 01:00 |
30 4 1 * * |
Первый день каждого месяца в 04:30 |
Политики хранения
Настройте, сколько копий хранить автоматически:
| Параметр | Описание | По умолчанию |
|---|---|---|
keep_last |
Хранить N последних копий | 3 |
keep_daily |
Одну в день в течение N дней | 7 |
keep_weekly |
Одну в неделю в течение N недель | 4 |
keep_monthly |
Одну в месяц в течение N месяцев | 6 |
Управление заданиями
- List jobs — все задания (админы видят все; пользователи — свои)
- Enable/disable — переключить без удаления
- Edit — изменить расписание, хранение, хранилище
- Delete — удалить задание и его запись в APScheduler
Отслеживание задач
Каждая операция копирования (создание / восстановление / удаление) возвращает UPID Proxmox. Используйте его для опроса статуса и логов:
# Статус задачи
GET /api/backups/task/{server_id}/{node}/{upid}
🌐 IPAM
Сети
Создавайте сети для организации IP-пространства:
Name: Production Network
CIDR: 192.168.1.0/24
VLAN: 100
Gateway: 192.168.1.1
DNS: 8.8.8.8, 8.8.4.4
Proxmox Server: выбрать сервер
Proxmox Node: выбрать узел (предотвращает назначение IP между серверами)
Пулы IP
Пулы задают диапазоны для автоматического выделения:
Pool: Web Servers
Start: 192.168.1.10
End: 192.168.1.50
Статус IP
| Статус | Описание |
|---|---|
| 🟢 Available | Свободен |
| 🔵 Allocated | Назначен ВМ |
| 🟠 Reserved | Зарезервирован |
💻 Удалённое выполнение команд
Требования
- QEMU Guest Agent установлен и запущен в ВМ
- ВМ должна быть запущена
Установка Guest Agent
Debian/Ubuntu:
apt install qemu-guest-agent
systemctl enable --now qemu-guest-agent
CentOS/RHEL/AlmaLinux:
yum install qemu-guest-agent
systemctl enable --now qemu-guest-agent
Windows: Скачайте virtio-win drivers
Использование
- Откройте детали ВМ
- Перейдите на вкладку Commands
- Введите команду или выберите из быстрых команд
- Нажмите Execute
Быстрые команды
| Команда | Описание |
|---|---|
df -h |
Использование диска |
free -h |
Использование памяти |
uptime |
Время работы |
ps aux |
Список процессов |
systemctl status |
Статус служб |
Ограничения
- Таймаут: 30 секунд
- Интерактивные команды не поддерживаются
- Требуется Guest Agent
📊 Мониторинг
Метрики в реальном времени
- CPU: суммарная нагрузка + по ядрам
- RAM: использовано/всего
- Диск: использовано/всего + I/O (карточки по каждому диску на вкладке Overview)
- Сеть: входящий/исходящий трафик (скорости в байт/с)
- Disk IOPS: скорости чтения/записи по каждому диску через QEMU guest agent (
get_vm_fsinfo) - Скорости сетевого I/O: живые байт/с, вычисляемые из накопительных счётчиков в
metrics_broadcaster
Гранулярность данных
| Источник | Гранулярность | Используется для |
|---|---|---|
cluster/resources (pvestatd) |
10 с | Обзор узлов и хранилищ |
status/current |
1 с | Метрики запущенных ВМ в реальном времени |
Все запущенные ВМ опрашиваются через status/current с частотой 1 с при ограниченной конкурентности. Результаты транслируются по WebSocket.
Где отображаются метрики
| Расположение | Показываемые данные |
|---|---|
| Инстанс → вкладка Overview | Карточки заполнения по дискам, карточка Network I/O, карточка Disk I/O-rate |
| Список инстансов | Столбцы Net I/O и Disk I/O; Disk% для LXC |
| Список top-loaded на дашборде | Оверлей метрик CPU, RAM, Disk, Net |
Периоды графиков
- Час
- День
- Неделя
- Месяц
Оповещения
Пороговые значения для уведомлений:
| Метрика | Warning | Critical |
|---|---|---|
| CPU | 80% | 90% |
| RAM | 85% | 95% |
| Диск | 90% | 95% |
🔒 Безопасность
Обзор
PVEmanager включает комплексные функции безопасности для защиты вашей инфраструктуры.
RBAC v2 — контроль доступа на основе ролей
Это тот раздел, который стоит прочитать, если RBAC кажется запутанным. Здесь модель разобрана от начала до конца: что такое право (permission), как реально проверяется запрос, что умеет каждая встроенная роль и — самое важное — как реализовано «пользователь видит только свои ВМ» (это отдельный механизм от RBAC, который легко настроить неправильно). Источники истины в бэкенде:
backend/app/rbac/permissions.py(каталог прав),backend/app/rbac/engine.py(логика проверки),backend/app/rbac/migration.py(роли по умолчанию).
Ментальная модель в одном абзаце
У пользователя ровно одна роль. Роль — это просто именованная JSON-карта прав → true/false (напр., {"vm:view": true, "vm:delete": false}). Каждый защищённый эндпоинт API объявляет нужное ему право (напр., «нужно vm:create»). При каждом запросе Permission Engine смотрит на карту прав роли вызывающего и отвечает да/нет. Нет ни ACL для отдельных ресурсов, ни рабочих «scope» у прав — право либо выдано роли, либо нет. Единственное кажущееся исключение — «пользователи видят только свои инстансы» — вообще не является правом: это отдельный фильтр по владельцу, описанный в конце раздела.
Формат права
Каждое право — атомарная строка:
resource:action
resource— над чем вы действуете (vm,backup,user, …).action— что вы делаете (view,create,delete, …).
Примеры: vm:view (видеть ВМ), server:create (добавить сервер Proxmox), log:export (скачать логи аудита), role:manage (полное администрирование ролей).
Про
:scope. Технически dataclass права поддерживает третий сегмент:scope, но ни одно встроенное право его не использует — все реальные права глобальные (resource:action). Игнорируйте scope при проектировании ролей; изоляция арендаторов реализована через владельца, а не через scope:own. (В старых версиях этой вики документировались вымышленные коды вродеvms:view:own— их никогда не было в коде, и они удалены.)
Как на самом деле работает проверка права (движок)
Когда эндпоинт спрашивает «есть ли у пользователя X:Y?», PermissionEngine.has_permission применяет правила по порядку и возвращает true на первом совпадении:
- Обход для админа. Если пользователь — администратор (
is_adminили роль с именемadmin), ответ всегда да — админы неявно держат все права и никогда не блокируются. - Прямая выдача. Точный код присутствует и равен
trueв карте роли (vm:createесть в роли → да). - Wildcard-выдача. Роль держит
resource:*(напр.,vm:*даёт все действияvm:). Wildcard не используется встроенными ролями, но вы можете добавить его в кастомные роли. manageподразумевает частые действия. Если роль держитresource:manage, движок также выдаёт эти действия для ресурса:view,list,update,start,stop,restart. Такvm:manageв одиночку позволяет смотреть/редактировать/управлять питанием ВМ, не перечисляя эти действия отдельно. ⚠️ Учтите:manageне подразумеваетcreateилиdelete— выдавайте их явно.
Если ни одно правило не совпало, доступ отклоняется с HTTP 403 Permission denied: X:Y.
Точки применения. Эндпоинты защищают доступ через FastAPI-зависимость
PermissionChecker(Depends(PermissionChecker("vm:create"))) или inline-вызовrequire_permission(user, "vm:create"). Фронтенд независимо скрывает пункты меню, на которые у пользователя нет прав (см. таблицу соответствия ниже), но реальной границей безопасности является именно проверка на бэкенде.
requires — зависимости прав
Многие права объявляют предпосылки (поле requires в permissions.py). Они выражают логические зависимости — напр., vm:create requires vm:view + template:view; vm:execute requires vm:console.
Важно:
requires— это документация / подсказка для UI, а не проверка в рантайме — движок не выдаёт предпосылки автоматически. Собирая кастомную роль, отмечайте предпосылки сами, иначе функция может работать наполовину (напр., пользователь, который можетvm:create, но не имеетvm:view, не увидит только что созданную ВМ).
Полный каталог прав
Сгруппировано по ресурсам. «Подразумевается manage» означает, что движок выдаёт это бесплатно, когда роль держит <resource>:manage (правило 4 выше).
Дашборд
| Право | Что открывает |
|---|---|
dashboard:view |
Доступ к странице Дашборда и обзорной статистике |
Серверы Proxmox и кластер (server, cluster)
| Право | Что открывает |
|---|---|
server:view |
Видеть список серверов/узлов и статус |
server:create |
Добавить новый сервер Proxmox |
server:update |
Редактировать параметры подключения сервера |
server:delete |
Удалить сервер Proxmox |
server:manage |
Полное управление сервером, включая кластерные операции (требует server:view) |
cluster:manage |
Создание кластеров, присоединение/исключение узлов (требует server:view) |
Виртуальные машины (vm)
| Право | Что открывает |
|---|---|
vm:view |
Видеть ВМ (с учётом фильтра владельца — см. ниже) |
vm:create |
Создавать ВМ (требует vm:view, template:view) |
vm:update |
Менять конфигурацию ВМ (CPU/RAM/диск) |
vm:delete |
Удалять ВМ |
vm:start / vm:stop / vm:restart |
Действия питания |
vm:console |
Консоль noVNC / xterm.js |
vm:migrate |
Миграция между узлами одного кластера |
vm:remote_migrate |
Миграция в другой зарегистрированный кластер (требует vm:migrate) |
vm:execute |
Выполнять команды через QEMU guest agent (требует vm:console) |
vm:manage |
Полное управление ВМ и глобальный флаг «видеть все инстансы» (см. раздел про изоляцию) |
LXC-контейнеры (lxc) — та же структура, что у VM: view, create, update, delete, start, stop, restart, console, migrate, remote_migrate. (Отдельного lxc:manage нет; листинг/питание контейнеров управляется действиями lxc:* и тем же фильтром владельца, что и ВМ.)
Шаблоны и образы (template)
| Право | Что открывает |
|---|---|
template:view |
Просматривать шаблоны ОС |
template:create / template:update / template:delete |
Управлять записями шаблонов |
template:manage |
Полное управление шаблонами, включая страницу Images (скачивание облачных образов) |
Хранилище (storage): storage:view, storage:manage.
Резервные копии (backup): backup:view, backup:create, backup:restore, backup:delete, backup:manage (хранилища + запланированные задания).
IPAM (ipam): ipam:view, ipam:manage.
Сети (network): network:view, network:manage (интерфейсы узла + зоны/vnet/подсети SDN).
Firewall (firewall): firewall:view, firewall:manage (правила датацентра/узла/ВМ, группы, IP-наборы).
Администрирование узла (node): node:view, node:manage (службы systemd, APT), node:upgrade (apt dist-upgrade), node:power (перезагрузка/выключение физического узла).
Пулы ресурсов (pool): pool:view, pool:manage.
PVE-доступ (access): access:view, access:manage (realm-ы аутентификации и API-токены Proxmox).
App Store (app): app:view (каталог + Мои приложения), app:install, app:manage (синхронизация, обновление, откат, удаление).
Скрипты (script): script:view, script:execute, script:manage (редактирование скриптов и git-источников).
Пользователи, квоты и роли (user, quota, role)
| Право | Что открывает |
|---|---|
user:view |
Видеть список пользователей |
user:create / user:update / user:delete |
Управлять учётными записями |
user:manage |
Полное администрирование пользователей, включая управление SSH-ключами других пользователей |
quota:view / quota:manage |
Читать / задавать квоты ресурсов пользователей (требует user:view) |
role:view |
Видеть роли и их права |
role:create / role:update / role:delete |
Управлять ролями |
role:manage |
Полное администрирование ролей, включая назначение (требует role:view, user:view) |
Логи (log): log:view, log:export, log:delete.
Настройки (setting): setting:view, setting:update (настройки панели), setting:manage (безопасность и расширенные настройки). Эти права относятся только к настройкам панели — собственная учётная запись пользователя (профиль, пароль, 2FA, SSH-ключи, предпочтения уведомлений) живёт на /profile, ограничена самим пользователем и не требует никаких прав.
Уведомления (notification): notification:view, notification:manage.
Делегированное редактирование ролей. Не-админ с
role:manageможет выдавать только те права, которыми владеет сам (can_assign_permission/validate_role_permissions). Это предотвращает эскалацию привилегий — нельзя раздать доступ, которого у вас нет. Админы освобождены от этого и могут выдавать что угодно.
Какое право открывает какую страницу в меню
Фронтенд (frontend/src/lib/nav-items.ts) скрывает пункт меню, если пользователь не админ и не держит указанное право. Пункты без права — только для админа. То же право защищает и сам маршрут (RequirePermission в frontend/src/components/shared/route-guards.tsx), поэтому скрытую страницу нельзя открыть вводом URL — при отказе пользователя перебрасывает на первую доступную ему страницу.
| Пункт меню | Требуемое право |
|---|---|
| Dashboard | dashboard:view |
| Instances | vm:view |
| Nodes | server:view |
| Cluster | cluster:manage |
| Templates | template:view |
| Images | template:manage |
| Backups | backup:view |
| Tasks | vm:view |
| App Store / My Apps | app:view |
| Scripts | script:view |
| IPAM | ipam:view |
| Networks | server:manage |
| Users | user:view |
| Workspaces | (только админ) |
| Logs | log:view |
| Settings (настройки панели) | setting:view |
| Профиль (меню пользователя, не сайдбар) | (без права — любой вошедший) |
Роли по умолчанию (встроенные)
Четыре роли пересоздаются/обновляются при каждом старте функцией ensure_default_roles_new_format. Это системные (is_system) роли. Логика посева только добавляет отсутствующие ключи прав — она никогда не перезаписывает ключи, которые админ уже переключил в UI, — поэтому ваши правки этих ролей переживают обновления. Новые права, добавленные при обновлении версии, также добавляются (backfill) к кастомным ролям, которые уже держат соответствующее «зонтичное» право (backfill_granular_permissions), поэтому кастомная роль на базе server:manage автоматически получает новые ключи node:* / network:* вместо молчаливой потери доступа.
| Роль | Назначение | Что может делать |
|---|---|---|
| admin | Администратор платформы | Всё. Держит каждое право и обход is_admin — видит все серверы, все инстансы (независимо от владельца), всех пользователей, настройки, безопасность. |
| moderator | Оператор без прав админа | Смотреть дашборд/серверы; создавать + управлять питанием + консоль ВМ и LXC; смотреть шаблоны/хранилище/firewall/сеть/узел/пулы/копии/IPAM/пользователей/логи; создавать копии; экспортировать логи; управлять уведомлениями. Нет удаления, изменения настроек, управления пользователями/ролями. Заметьте: без vm:manage модератор всё равно подчиняется фильтру владельца (см. ниже). |
| user | Стандартный арендатор (стиль VPS) | Смотреть + start/stop/restart/console для своих ВМ и LXC; смотреть шаблоны/хранилище/firewall/сеть/узел/пулы/IPAM; управлять своими уведомлениями. Собственный профиль, SSH-ключи и квота живут на /profile и не требуют прав, поэтому у роли намеренно нет setting:view (он открыл бы страницу настроек панели). Нет create/delete по умолчанию, нет дашборда. Ограничен своими инстансами, так как не имеет vm:manage. |
| demo | Read-only витрина | Только просмотр: дашборд, серверы, ВМ, LXC, шаблоны, хранилище, firewall, сеть, узел, пулы, IPAM. Ни действий питания, ни записи. |
Точный JSON каждой роли лежит в
NEW_DEFAULT_ROLESвbackend/app/rbac/migration.py— сверяйтесь с ним, если нужен побайтовый набор прав.
Управление ролями в UI
- Откройте Пользователи (нужно
role:view; для редактирования —role:manageили админ). - Перейдите на вкладку Roles → New Role или отредактируйте существующую.
- Права сгруппированы по категориям (Virtual Machines, Backups, User Management, …). Отметьте нужные чекбоксы.
- Не забудьте отметить и предпосылки (
requires) — движок не включает их автоматически. - Назначьте роль пользователю в диалоге редактирования пользователя.
Системные роли (admin/moderator/user/demo) удалить нельзя, но их наборы прав можно настраивать (ваши изменения сохраняются при обновлениях).
Legacy-формат прав
Старые релизы использовали точечный формат (vms.view, proxmox.manage). Он отображается на новый двоеточный формат через LEGACY_PERMISSION_MAP и конвертируется один раз в базе данных при старте, поэтому трансляция в рантайме не нужна. Вы всё ещё можете вписать legacy-код в кастомную роль — он разрешается прозрачно, — но новые роли должны использовать форму resource:action.
Изоляция пользователей — «каждый видит только свои инстансы»
Это функция, которую чаще всего путают с RBAC. Это не право. Это отдельный фильтр по владельцу, наложенный поверх прав vm:*/lxc:*. Понимание этого разделения — ключ к правильной настройке арендаторов.
Правило
| Вызывающий | Видит / управляет |
|---|---|
Админ или роль с именем admin |
Всеми инстансами |
Любая роль, держащая vm:manage |
Всеми инстансами |
Все остальные (включая стоковую роль user) |
Только инстансами, которыми владеет (owner_id == user.id) |
Решение принимает can_view_all_instances в backend/app/api/proxmox/_helpers.py. Обратите внимание: ключ «видеть всё» — это vm:manage, а не vm:view. Стоковая роль user намеренно несёт только vm:view, чтобы страница Instances вообще работала — vm:view сам по себе никогда не раскрывает ВМ других арендаторов.
⚠️ Самая частая ошибка конфигурации: выдать
vm:manageролиuser(или кастомной «арендаторской» роли), чтобы «дать им управлять своими ВМ». Это включает глобальный обзор, и каждый пользователь внезапно видит все ВМ в панели. Для арендаторов выдавайте гранулярные действия (vm:update,vm:delete,vm:start, …) вместоvm:manage. Резервируйтеvm:manageдля операторов/админов, которые должны видеть всё.
Как владение применяется везде
Владение проверяется не только в списке инстансов, но и на каждой поверхности, доступной непривилегированному пользователю:
- Список инстансов и действия над одним инстансом —
check_vm_access/require_vm_accessпроверяютowner_idперед любой операцией view/питание/консоль/снимок/копия/удаление. - Эндпоинты живых ресурсов — дашборд (
/api/resources/all) и страница узла/сервера (/api/{server_id}/resources) вызываютget_owned_vmidsи фильтруют живой листинг Proxmox до принадлежащих VMID, поэтому пользователь только сserver:viewне может перечислить ВМ других владельцев через страницу узла.
Назначение владельца
- Автоматически — когда пользователь развёртывает VM/LXC, он становится её
owner_id. - Вручную (админ) — откройте инстанс → кнопка Owner → выберите пользователя → Save. REST API см. в Владелец ВМ / LXC.
Инстансы, синхронизированные из Proxmox до появления владения, имеют owner_id = NULL (видны только привилегированным пользователям). Массово назначить им владельца:
docker compose exec app python assign_instances_owner.py
RBAC vs Workspaces vs назначение серверов vs владение
Эти четыре механизма складываются — не-админ должен пройти все применимые фильтры:
| Слой | На какой вопрос отвечает | Где настраивается |
|---|---|---|
| Роль RBAC | Какие действия пользователь вообще может выполнять? | Пользователи → Roles |
| Workspaces | Какие серверы пользователю разрешено видеть? | Рабочие области |
| Назначение серверов | Какие конкретные серверы внутри этих областей? | Назначение серверов пользователю |
| Владение | Какие отдельные ВМ/LXC (если нет vm:manage/админа)? |
Владелец ВМ / LXC |
Снимки (в контексте безопасности)
Снимки позволяют сохранять и восстанавливать состояние ВМ и контейнеров.
Снимки ВМ
# Список снимков
GET /api/{server_id}/vm/{vmid}/snapshots?node={node}
# Создать снимок
POST /api/{server_id}/vm/{vmid}/snapshots?node={node}
{
"snapname": "before-update",
"description": "Before system update",
"vmstate": false # Включить состояние RAM (опционально)
}
# Удалить снимок
DELETE /api/{server_id}/vm/{vmid}/snapshots/{snapname}?node={node}
# Откатить к снимку
POST /api/{server_id}/vm/{vmid}/snapshots/{snapname}/rollback?node={node}&start=false
Снимки контейнеров
Те же эндпоинты, но используйте /container/ вместо /vm/.
SDN (Software Defined Networking)
Управление зонами SDN и виртуальными сетями Proxmox.
Проверка доступности SDN
GET /api/servers/{server_id}/sdn/status
Возвращает:
{
"server_id": 1,
"sdn_available": true,
"pending_changes": false
}
Типы зон
| Тип | Описание |
|---|---|
simple |
Базовая изолированная сеть |
vlan |
Разделение на основе VLAN |
vxlan |
Overlay-сеть VXLAN |
evpn |
EVPN/VXLAN с BGP |
Эндпоинты SDN API
# Список зон
GET /api/servers/{server_id}/sdn/zones
# Создать зону
POST /api/servers/{server_id}/sdn/zones
{
"zone": "myzone",
"type": "simple"
}
# Обновить зону
PUT /api/servers/{server_id}/sdn/zones/{zone}
{
"mtu": 1500,
"dns": "8.8.8.8"
}
# Список VNet
GET /api/servers/{server_id}/sdn/vnets
# Создать VNet
POST /api/servers/{server_id}/sdn/vnets
{
"vnet": "vnet1",
"zone": "myzone",
"alias": "Production Network"
}
# Обновить VNet
PUT /api/servers/{server_id}/sdn/vnets/{vnet}
{
"alias": "Updated Alias",
"tag": 100
}
# Создать подсеть (с опциональным авто-созданием IPAM)
POST /api/servers/{server_id}/sdn/vnets/{vnet}/subnets
{
"subnet": "10.0.0.0/24",
"gateway": "10.0.0.1",
"snat": true,
"create_ipam_network": true
}
# Удалить подсеть (опционально удалить связанную сеть IPAM)
DELETE /api/servers/{server_id}/sdn/vnets/{vnet}/subnets/{subnet_cidr}?delete_ipam_network=true
# Применить изменения (обязательно после модификаций)
POST /api/servers/{server_id}/sdn/apply
Сетевые интерфейсы узлов
Управление сетевыми интерфейсами (мосты, bond-ы, VLAN) напрямую на узлах Proxmox.
Доступ к странице «Сети»
- Откройте Networks из бокового меню (требует право
server:manage; записи в SDN/интерфейсы требуютnetwork:manage) - Выберите сервер из выпадающего списка
- Страница показывает две вкладки: SDN и Node Interfaces
Управление интерфейсами узла
| Действие | Описание |
|---|---|
| List interfaces | Просмотр всех интерфейсов на выбранном узле |
| Create interface | Создать мост, bond, VLAN или alias |
| Edit interface | Изменить IP, маску, шлюз, порты и т.д. |
| Delete interface | Удалить конфигурацию интерфейса |
| Apply config | Активировать ожидающие изменения |
| Revert config | Откатить к рабочей конфигурации |
⚠️ Всегда применяйте изменения после создания или редактирования интерфейсов. Изменения находятся в staging до применения.
Эндпоинты Node Network API
# Список узлов сервера
GET /api/servers/{server_id}/nodes
# Список интерфейсов узла
GET /proxmox/api/servers/{server_id}/nodes/{node}/networks
# Детали интерфейса
GET /proxmox/api/servers/{server_id}/nodes/{node}/networks/{iface}
# Создать интерфейс
POST /proxmox/api/servers/{server_id}/nodes/{node}/networks
{
"iface": "vmbr1",
"type": "bridge",
"address": "10.0.0.1",
"netmask": "255.255.255.0",
"bridge_ports": "ens4",
"autostart": true
}
# Обновить интерфейс
PUT /proxmox/api/servers/{server_id}/nodes/{node}/networks/{iface}
{
"address": "10.0.0.2"
}
# Удалить интерфейс
DELETE /proxmox/api/servers/{server_id}/nodes/{node}/networks/{iface}
# Применить ожидающую конфигурацию сети
PUT /proxmox/api/servers/{server_id}/nodes/{node}/networks/apply
# Откатить ожидающие изменения
DELETE /proxmox/api/servers/{server_id}/nodes/{node}/networks/revert
Совместимость со старым форматом
Старый формат прав (vms.view, proxmox.manage) по-прежнему поддерживается и автоматически конвертируется в новый формат.
Блокировка IP
Автоматическая и ручная блокировка IP защищает от brute-force атак.
Автоматическая блокировка
Когда пользователь несколько раз не может войти с одного IP:
- После порога (по умолчанию: 10) неудачных попыток
- IP блокируется на настроенное время (по умолчанию: 60 минут)
- Блокировка может быть временной или постоянной
Ручная блокировка
Администраторы могут вручную блокировать IP:
- Блокировка с указанием причины
- Задать длительность или сделать постоянной
- Просмотр списка заблокированных IP
- Разблокировка по мере необходимости
Управление сессиями
Отслеживание и контроль активных пользовательских сессий.
| Функция | Описание |
|---|---|
| Active Sessions | Просмотр всех вошедших пользователей |
| Device Info | Определение браузера и устройства |
| IP Tracking | Логирование IP-адреса сессии |
| Single Session | Опция разрешить только одну сессию на пользователя |
| Force Logout | Завершить любую сессию |
Защита входа
| Настройка | По умолчанию | Описание |
|---|---|---|
| Max Login Attempts | 5 | Попыток до блокировки аккаунта |
| Lockout Duration | 30 мин | Как долго аккаунт заблокирован |
| IP Block Threshold | 10 | Неудачных попыток до блокировки IP |
| IP Block Duration | 60 мин | Как долго IP заблокирован |
Настройки безопасности
Доступ через Настройки → Безопасность:
| Настройка | По умолчанию | Описание |
|---|---|---|
| Session Timeout | 60 мин | Авто-выход после бездействия |
| Single Session | Выкл | Разрешить только одну сессию на пользователя |
| Password Min Length | 8 | Минимум символов пароля |
| Require Uppercase | Да | Пароль должен содержать заглавные |
| Require Lowercase | Да | Пароль должен содержать строчные |
| Require Numbers | Да | Пароль должен содержать цифры |
| Require Special | Нет | Пароль должен содержать спецсимволы |
| Password Expiry | 0 (никогда) | Дней до истечения пароля |
| API Rate Limit | 60/мин | Запросов API в минуту |
Лучшие практики
- Смените пароли по умолчанию сразу после установки
- Включите SSL/HTTPS в продакшне
- Используйте надёжные пароли с требованиями к сложности
- Мониторьте попытки входа на предмет подозрительной активности
- Настройте файрвол для ограничения доступа к панели
- Регулярно обновляйтесь для получения патчей безопасности
📝 Логи и аудит
Обзор
Страница Логи (/logs в боковом меню) даёт админам полный поисковый обзор таблицы audit_logs панели. Она дополняет ленту активности дашборда более глубокой фильтрацией, пагинацией и агрегированной статистикой за 24 часа.
Макет страницы
- Карточки статистики (окно 24ч) — всего событий, число ошибок, неудачные входы, число строк на текущей странице
- Фильтры — свободный поиск (по сообщению и имени пользователя) и выпадающий список уровней из
GET /logs/api/levels - Таблица логов — время, бейдж уровня, категория, имя пользователя, сообщение
- Пагинация — управляется API (
page,limit)
Уровни логов
| Уровень | Цвет | Описание |
|---|---|---|
INFO |
🔵 Синий | Информационные события |
SUCCESS |
🟢 Зелёный | Успешные операции |
WARNING |
🟡 Жёлтый | Некритические предупреждения |
ERROR |
🔴 Красный | Сбои |
CRITICAL |
🟣 Фиолетовый | Критические события безопасности / системы |
Справочник API
| Метод | Эндпоинт | Описание |
|---|---|---|
GET |
/logs/api/logs |
Список записей аудита (с пагинацией) |
GET |
/logs/api/stats |
Агрегированная статистика (по умолчанию 24ч) |
GET |
/logs/api/levels |
Различные уровни для выпадающего фильтра |
GET |
/logs/api/categories |
Различные категории |
Параметры запроса для GET /logs/api/logs
| Имя | Тип | Описание |
|---|---|---|
search |
string | Свободный поиск по сообщению/имени пользователя |
level |
string | Фильтр по уровню (INFO, ERROR, …) |
category |
string | Фильтр по категории |
username |
string | Фильтр по имени пользователя |
page |
int | Номер страницы (с 1) |
limit |
int | Размер страницы (по умолчанию 50) |
date_from |
ISO date | Нижняя граница (включительно) |
date_to |
ISO date | Верхняя граница (включительно) |
Форма ответа
{
"logs": [
{
"id": 1234,
"timestamp": "2026-06-04T10:21:33Z",
"level": "INFO",
"category": "vm",
"username": "admin",
"message": "VM 100 started on node pve1"
}
],
"total": 532,
"page": 1,
"limit": 50,
"pages": 11
}
Контроль доступа
Страница «Логи» защищена правом log:view в RBAC v2. Стоковая роль admin имеет его; moderator имеет доступ только на чтение; роли user и demo эту страницу не видят.
Хранение
Хранение логов управляется через Настройки → Панель → Дни хранения логов (добавлено в v1.5.2). Записи старше настроенного числа дней удаляются автоматически. По умолчанию — 30 дней.
🔑 Управление SSH-ключами
Обзор
У каждого пользователя есть личная библиотека SSH-ключей. Ключи из библиотеки можно выбирать при развёртывании ВМ или LXC-контейнеров, избавляя от необходимости каждый раз вставлять публичный ключ вручную.
Управление SSH-ключами
- Перейдите в Настройки → SSH Keys
- Нажмите Add Key
- Заполните:
- Name — читаемая метка (напр.,
Work laptop) - Public Key — вставьте полный публичный ключ (
ssh-rsa ...,ssh-ed25519 ...и т.д.) - Private Key (опционально) — хранится в базе в зашифрованном виде
- Comment (опционально) — свободная заметка
- Name — читаемая метка (напр.,
- Нажмите Save
SHA-256 отпечаток вычисляется и отображается автоматически.
Использование ключей при развёртывании
- В мастере создания инстанса на шаге Config показан селектор ключей
- Обычные пользователи видят свои ключи
- Админы, выбирающие владельца, видят ключи владельца в дополнение к своим
Синхронизация SSH-ключей при смене владельца
Когда администратор переназначает ВМ или LXC другому пользователю (через диалог Владелец на странице инстанса), панель автоматически:
- Удаляет публичный SSH-ключ предыдущего владельца из
ciuser/authorized keys инстанса - Внедряет публичный SSH-ключ нового владельца
Учётные данные для доступа всегда соответствуют текущему владельцу — ручная ротация ключей не нужна.
Управление ключами админом
Админы (пользователи с правом user:manage) могут просматривать и управлять SSH-ключами любого пользователя:
GET /api/ssh-keys/user/{user_id} — список ключей конкретного пользователя
Справочник API
| Метод | Эндпоинт | Описание |
|---|---|---|
GET |
/api/ssh-keys |
Список своих SSH-ключей |
POST |
/api/ssh-keys |
Добавить новый ключ |
PUT |
/api/ssh-keys/{id} |
Обновить ключ |
DELETE |
/api/ssh-keys/{id} |
Удалить ключ |
GET |
/api/ssh-keys/user/{user_id} |
Список ключей любого пользователя (админ) |
🌍 Локализация
Поддерживаемые языки
- 🇷🇺 Русский (полное покрытие начиная с v1.16.0)
- 🇺🇸 Английский (по умолчанию)
- 🇺🇿 Узбекский (частично)
v1.16.0 завершил полный проход по переводам: все ранее захардкоженные или непереведённые строки на дашборде, в инстансах, образах, App Store, нодах, ролях, хранилищах, скриптах, сертификатах, графиках, мастере, массовой миграции и реалмах доступа теперь корректно переведены на русский и английский.
Переключение языка
Начиная с v1.5.2, язык является пользовательской настройкой, хранящейся в базе данных.
- Настройки → Profile
- Выберите язык в выпадающем списке Language
- Нажмите Save — интерфейс переключится немедленно без перезагрузки страницы
Добавление нового языка
Переводы хранятся плоскими JSON-файлами в backend/app/locales/.
Чтобы добавить новый язык, просто создайте новый файл — изменения кода не требуются:
# Создать файл локали для узбекского
cp backend/app/locales/en.json backend/app/locales/uz.json
# Затем переведите значения в uz.json
Имя файла становится кодом языка (uz.json → "uz"). Панель подхватит его при следующем старте (или вызовите I18nService.reload() в рантайме).
Структура: каждый файл — плоский JSON-объект
{"key": "переведённая строка"}. Ключи должны совпадать с существующими ключами вru.json/en.json.
⚙️ Настройки
Профиль пользователя
- Полное имя
- Email (для уведомлений)
- Смена пароля
- Язык — язык UI пользователя (хранится в колонке БД
users.language); применяется сразу при сохранении черезi18n.changeLanguage(); у каждой учётной записи своя настройка - Публичный SSH-ключ — хранится в профиле пользователя и автоматически внедряется в VM/LXC при развёртывании через cloud-init
Настройки панели
| Параметр | Описание | По умолчанию |
|---|---|---|
| Refresh interval | Частота обновления данных | 30 сек |
| Log retention | Сколько дней хранить логи | 30 дней |
| Panel name | Отображаемое имя (read-only в UI, можно переопределить в БД) | env PANEL_NAME |
Примечание: настройка языка перенесена с вкладки «Панель» на вкладку «Профиль» в v1.5.2 — теперь каждый пользователь управляет своим языком независимо.
Обновления системы и выбор репозитория
Панель поддерживает автоматические обновления из Git-репозитория. Можно выбрать, какой репозиторий использовать:
Доступные варианты:
- git.tzim.uz/markmorado/pvemanager (по умолчанию) — основной репозиторий
- github.com/markmorado/pvemanager — зеркало
- Кастомный репозиторий — ваш форк или зеркало
Как сменить репозиторий:
- Перейдите в Настройки → System Updates
- В выпадающем списке «Git Repository» выберите предпочтительный репозиторий
- Для кастомного репозитория:
- Выберите «Custom Repository...» из списка
- Введите полный URL (напр.,
https://git.example.com/user/repo) - Нажмите Save
Настройка репозитория влияет на:
- Проверку обновлений (сравнение версий)
- Получение changelog
- Процесс обновления панели
Примечание: убедитесь, что выбранный репозиторий содержит валидные файлы
VERSIONиCHANGELOG.md.
Как работает процесс обновления
Начиная с v1.1.1, обновления выполняются сторожевым процессом на хосте (pvemanager-update.service), а не внутри контейнера. Это решает фундаментальную проблему, когда docker compose down убивал бы внутриконтейнерный скрипт до завершения пересборки.
[UI: "Update Panel"] → perform_update() → пишет .update_trigger
↓ (опрос каждые 3 сек)
[pvemanager-update.service на ХОСТЕ]
обнаруживает триггер → удаляет его → выполняет:
git pull
docker compose down
docker compose build --no-cache app
docker compose up -d
Логи: ./logs/update_host.log (видны из панели)
Установка сторожа обновлений
Сторож нужно установить один раз на хост-машине. Он автоматически настраивается при запуске deploy.sh, либо его можно установить/переустановить отдельно:
# Установка или переустановка (требует root для systemd)
sudo ./deploy.sh --watchdog
# Проверить, что запущен
systemctl status pvemanager-update
# Смотреть живой лог обновления
tail -f logs/update_host.log
Требования:
- systemd на хосте
- Пользователь, запускающий
deploy.sh --watchdog(или$SUDO_USER), должен быть в группеdocker(root разрешён всегда) - Volume
.:/project:rwвcompose.ymlдолжен присутствовать (он есть по умолчанию)
Примечание для non-root: если вы запустите
./deploy.sh --watchdogбез sudo, он сгенерирует готовые файлы в./systemd/и напечатает точныеsudo-команды для их установки.
Настройки уведомлений
- In-App: всегда включены
- Email: требует настройки SMTP
- Telegram: требует токен бота
🛠️ Инструмент pve CLI
Начиная с v1.1.2, PVEmanager поставляется со скриптом pve — удобным CLI-ярлыком для частых задач управления.
Установка
# Требует root (копирует скрипт в /usr/local/bin/pve и правит путь проекта)
sudo ./deploy.sh --install-cli
После установки команда pve доступна системно.
Использование
pve help # Показать все доступные команды
pve logs # Смотреть живые логи app
pve restart # Перезапустить все контейнеры
pve update # Запустить обновление панели (через сторож)
pve exec <cmd> # Выполнить команду внутри контейнера app
pve status # Показать статус docker compose
pve dev # Запустить frontend в dev-режиме (Vite HMR)
pve dev stop # Остановить dev-режим, вернуться к production frontend
Как это работает
deploy.sh --install-cliчитает файлpveиз корня проекта- Заменяет плейсхолдер
PVE_DIRфактическим путём проекта - Записывает результат в
/usr/local/bin/pveи делает исполняемым - Перезапустите
sudo ./deploy.sh --install-cliпосле перемещения каталога проекта
Примечание: бинарник
pveотражает каталог проекта на момент установки. Если вы перемещаете проект — переустановите CLI.
🔌 Справочник API
Аутентификация
# Получить токен
POST /api/auth/login
Content-Type: application/json
{
"username": "admin",
"password": "admin123"
}
# Ответ
{
"access_token": "eyJ...",
"token_type": "bearer"
}
Использование токена
curl -H "Authorization: Bearer eyJ..." \
http://localhost:8000/api/notifications
Основные эндпоинты
| Метод | Эндпоинт | Описание |
|---|---|---|
| GET | /api/servers |
Список серверов Proxmox |
| GET | /api/servers/{id} |
Получить конкретный сервер |
| POST | /api/servers |
Добавить сервер |
| PUT | /api/servers/{id} |
Обновить сервер |
| DELETE | /api/servers/{id} |
Удалить сервер |
| POST | /api/servers/{id}/test |
Проверить подключение |
| GET | /api/servers/{id}/resources |
ВМ и контейнеры сервера |
| POST | /api/servers/{id}/vm/{vmid}/{action} |
Управление ВМ (start/stop/restart) |
| POST | /api/servers/{id}/container/{vmid}/{action} |
Управление контейнером (start/stop/restart) |
| GET | /api/servers/{id}/vm/{vmid}/status |
Статус ВМ |
| GET | /api/servers/{id}/container/{vmid}/status |
Статус контейнера |
| GET | /ipam/api/networks |
Список сетей IPAM |
| POST | /ipam/api/networks |
Создать сеть IPAM |
| GET | /ipam/api/allocations |
Список выделений IP |
| POST | /ipam/api/allocations |
Создать выделение IP |
| GET | /templates/api/groups |
Список групп шаблонов |
| GET | /templates/api/templates |
Список шаблонов ОС |
| POST | /templates/api/templates |
Создать шаблон ОС |
| GET | /api/notifications |
Список уведомлений |
| PATCH | /api/notifications/{id}/read |
Отметить прочитанным |
| DELETE | /api/notifications/{id} |
Удалить уведомление |
| GET | /api/users |
Список пользователей (только админ) |
| POST | /api/users |
Создать пользователя (только админ) |
| GET | /settings/api/panel |
Получить настройки панели |
| PUT | /settings/api/panel |
Обновить настройки панели |
| GET | /logs/api/logs |
Получить логи аудита |
| GET | /logs/api/stats |
Статистика логов |
| GET | /api/backups/storages/{server_id} |
Список хранилищ Proxmox |
| GET | /api/backups/scan-nfs/{server_id} |
Сканировать NFS-сервер на экспорты |
| POST | /api/backups/create |
Создать копию VM/LXC |
| POST | /api/backups/restore |
Восстановить VM/LXC из копии |
| GET | /api/backups/list/{server_id} |
Список файлов копий |
| DELETE | /api/backups/{server_id}/backup |
Удалить файл копии |
| GET | /api/backups/jobs |
Список запланированных заданий |
| POST | /api/backups/jobs |
Создать запланированное задание |
| GET | /api/{server_id}/ha/status |
Статус HA для всех ВМ |
| POST | /api/{server_id}/ha/{vm_type}/{vmid}/add |
Добавить ВМ в HA-группу |
| DELETE | /api/{server_id}/ha/{vm_type}/{vmid}/remove |
Убрать ВМ из HA |
| POST | /api/sync-vms |
Принудительная синхронизация ВМ из Proxmox |
| GET | /api/servers/{id}/nodes |
Список узлов сервера |
| PUT | /api/servers/{id}/sdn/zones/{zone} |
Обновить зону SDN |
| PUT | /api/servers/{id}/sdn/vnets/{vnet} |
Обновить VNet SDN |
| DELETE | /api/servers/{id}/sdn/vnets/{vnet}/subnets/{cidr} |
Удалить подсеть SDN |
Документация Swagger
Доступна по адресу: http://localhost:8000/docs
🗂️ Рабочие области (Workspaces)
Рабочие области — это именованные группы серверов Proxmox с ограниченным доступом пользователей. Они позволяют администраторам разделять инфраструктуру и давать пользователям доступ только к их серверам.
Ключевые понятия
| Понятие | Описание |
|---|---|
| Workspace | Именованная группа с опциональным цветом и описанием |
| Default Workspace | Создаётся автоматически; все серверы по умолчанию в ней |
| Назначение сервера | Один сервер может принадлежать нескольким рабочим областям |
| Назначение пользователя | Пользователи видят только назначенные им области |
Управление рабочими областями (админ)
- Откройте Настройки → Workspaces (пункт бокового меню) или перейдите на
/workspaces - Нажмите New Workspace для создания
- Назначьте серверы на вкладке Servers внутри детали области
- Назначьте пользователей на вкладке Users
Переключение рабочих областей (боковая панель)
- Активная область показана в боковой панели под логотипом
- Кликните имя области, чтобы открыть переключатель
- Выберите область — все списки ВМ/серверов сразу фильтруются
- Выберите All Workspaces (только админ), чтобы снять фильтр
API
| Метод | Эндпоинт | Описание |
|---|---|---|
GET |
/api/workspaces |
Список областей (фильтруется для не-админов) |
POST |
/api/workspaces |
Создать область (админ) |
GET |
/api/workspaces/{id} |
Деталь области с серверами/пользователями |
PUT |
/api/workspaces/{id} |
Обновить область (админ) |
DELETE |
/api/workspaces/{id} |
Удалить область (админ) |
POST |
/api/workspaces/{id}/servers |
Добавить сервер в область |
DELETE |
/api/workspaces/{id}/servers/{server_id} |
Убрать сервер из области |
POST |
/api/workspaces/{id}/users |
Добавить пользователя в область |
DELETE |
/api/workspaces/{id}/users/{user_id} |
Убрать пользователя из области |
Передавайте заголовок X-Active-Workspace: {id} в запросах API для фильтрации ответов по области.
👤 Назначение серверов пользователю
Назначение серверов позволяет админам напрямую связывать конкретные серверы Proxmox с отдельными пользователями. В сочетании с рабочими областями это даёт тонкий контроль: пользователь видит только серверы, которые одновременно и в его рабочей области, и явно назначены ему.
Как это работает
- Пользователь принадлежит одной или нескольким рабочим областям
- Админ назначает пользователю конкретные серверы (из серверов, разделяющих хотя бы одну область с пользователем)
- Пользователь видит только пересечение: серверы-области ∩ назначенные-серверы
Управление назначениями (UI)
- Откройте страницу Пользователи
- Нажмите Edit для пользователя
- На вкладке Servers — отметьте/снимите серверы; несовместимые серверы (другая область) подсвечены
- Save — назначения применяются немедленно
REST API
| Метод | Эндпоинт | Описание |
|---|---|---|
GET |
/api/users/{id}/servers |
Назначенные серверы пользователя |
GET |
/api/users/{id}/server-assignments |
Все серверы с флагами assigned и compatible |
PUT |
/api/users/{id}/servers |
Задать серверы (заменяет текущий список); тело: {"server_ids": [1,2]} |
Возвращает 409 workspace_conflict, если какой-либо сервер не разделяет ни одной области с пользователем.
🖥️ Владелец ВМ / LXC
У любой ВМ или LXC-контейнера может быть владелец — обычный пользователь, ответственный за этот инстанс. Владелец отображается в списке ВМ.
Изоляция
Владение применяется везде, где непривилегированный пользователь видит инстансы, а не только в списке инстансов. Эндпоинты живых ресурсов — /api/resources/all (дашборд) и /api/{server_id}/resources (страница узла/сервера) — фильтруют ВМ/LXC по владельцу (сопоставляя каждый vmid с кэшем vm_instances), поэтому пользователь только с proxmox.view не может видеть инстансы других владельцев через страницу узла. Админы и роли с vm:manage освобождены от этого и видят всё.
Владелец теперь проставляется автоматически при создании (vm_create/ct_create), в том числе когда ВМ создаёт админ от имени другого пользователя — деплой инжектирует SSH-ключ именно этого владельца (объединённый с любыми вставленными вручную или взятыми из библиотеки ключами), а не ключ создавшего.
Инстансы, синхронизированные из Proxmox до появления владения, или созданные до исправления выше, имеют owner_id = NULL. Разовая миграция бэкфиллит их автоматически из deploy_tasks и audit_logs (записи vm_create/ct_create/lxc_create), но только когда все доступные данные указывают на одного и того же существующего пользователя — неоднозначные случаи (например, переиспользованный VMID) намеренно остаются без владельца. Чтобы назначить владельца тому, что осталось, запустите вспомогательный скрипт из образа бэкенда:
docker compose exec app python assign_instances_owner.py
Назначение владельца (админ)
Откройте страницу деталей ВМ → кнопка Owner → выберите пользователя → Save.
REST API
| Метод | Эндпоинт | Описание |
|---|---|---|
GET |
/api/{server_id}/vm/{vmid}/owner |
Текущий владелец + список пользователей |
PUT |
/api/{server_id}/vm/{vmid}/owner |
Задать или очистить владельца ({"user_id": null} для очистки) |
🎯 Квоты
Квоты ресурсов на пользователя ограничивают, сколько пользователь может выделить. Ограничиваются четыре метрики, каждая суммируется по неудалённым, не-шаблонным инстансам пользователя:
| Метрика | Единица | Поле квоты |
|---|---|---|
| Инстансы | количество | max_instances |
| vCPU | ядра | max_cores |
| RAM | МБ | max_memory_mb |
| Диск | ГБ | max_disk_gb |
- Без ограничений по умолчанию — пользователь без строки квоты или с пустой метрикой (
NULL) не ограничен по этой метрике. Админы и ненастроенные пользователи никогда не блокируются. - Применение — развёртывание VM/LXC, которое превысит любую метрику, отклоняется с HTTP 429 и двуязычным сообщением (
Превышена квота … / Quota exceeded …) с прогнозируемым значением и лимитом. - Источник использования — текущее использование вычисляется из кэша
vm_instances(owner_id), где RAM хранится в МБ, а диск — в ГБ (без конвертации).
Два уровня блокировки на клиенте
Реально применяет ограничение только backend'ный HTTP 429, но интерфейс теперь предупреждает заранее, используя в обоих местах одну и ту же функцию exhaustedMetrics() (features/instances/quota.ts), чтобы они не могли разойтись:
- Свободного места совсем не осталось (использовано ≥ лимита хотя бы по одной метрике) — сама точка входа «Создать инстанс» отключается, а подсказка называет, какие именно лимиты исчерпаны. Ни одна конфигурация не влезет, поэтому мастер даже не открывается.
- Место есть, но выбранная конфигурация его превысит — мастер открывается как обычно; начиная с шага конфигурации называется метрика, которая была бы превышена, а «Далее»/«Развернуть» заблокированы, пока запрос не уменьшат.
Ни одна из блокировок не применяется к админам — их личная квота не имеет отношения к инстансу, который они создают для кого-то другого, а показанные им цифры носят чисто информационный характер.
Управление квотами (админ)
Страница Пользователи → диалог квот. Живые полосы использования показывают текущее потребление против каждого лимита. Оставьте поле пустым для без ограничений. Требует право quota:manage (quota:view для чтения).
Self-service
Каждый пользователь видит свои лимиты и текущее использование на странице Профиль. Мастер создания инстанса показывает остаток квоты подсказкой на шаге конфигурации.
REST API
| Метод | Эндпоинт | Описание |
|---|---|---|
GET |
/api/users/{id}/quota |
Лимиты пользователя + текущее использование (требует quota:view) |
PUT |
/api/users/{id}/quota |
Задать лимиты; null для метрики = без ограничений (требует quota:manage) |
GET |
/api/quota |
Собственные лимиты + использование текущего пользователя (self-service) |
🔧 Устранение неполадок
Проблемы запуска
Контейнер не запускается
# Проверить логи
docker compose logs app
# Проверить статус
docker compose ps
Ошибка подключения к базе данных
# Проверить, запущена ли БД
docker compose logs db
# Перезапустить
docker compose restart db
docker compose restart app
Проблемы Proxmox
«Connection refused»
- Проверьте IP-адрес сервера
- Проверьте, что порт 8006 открыт
- Проверьте файрвол на Proxmox
«Authentication failed»
- Проверьте логин/пароль
- Используйте формат
user@pamилиuser@pve - Попробуйте создать API Token
Проблемы уведомлений
Email не отправляется
- Проверьте настройки SMTP в
backend/.env - Для порта 465 требуется SSL
- Для порта 587 требуется STARTTLS
- Проверьте «пароль приложения» для Yandex/Gmail
# Проверить переменные в контейнере
docker compose exec app env | grep SMTP
Telegram не работает
- Проверьте токен бота
- Отправьте боту
/start - Проверьте Chat ID
- Убедитесь, что бот не заблокирован
Кнопка «Тест» зависает
- Проверьте логи:
docker compose logs app --tail 50 - SMTP-сервер может быть недоступен
- Таймаут — 10 секунд
Проблемы VNC / терминала
«VNC connection failed» (QEMU)
- Проверьте, что ВМ запущена
- Убедитесь, что VNC включён в настройках узла Proxmox
- Попробуйте перезапустить ВМ
- Проверьте, что у API-пользователя Proxmox есть привилегия
VM.Console
«Connection closed» сразу при открытии VNC
- Это была известная ошибка, исправленная в v1.3.0 (noVNC получал уже открытый WebSocket вместо URL)
- Обновитесь до v1.3.0 или новее
Терминал не подключается (LXC)
- Проверьте, что контейнер запущен (не остановлен и не приостановлен)
- Проверьте, что у API-пользователя Proxmox есть привилегия
VM.Consoleна узле - Проверьте логи:
docker compose logs app --tail 50
Проблемы команд
«Guest Agent not running»
# В ВМ выполнить:
systemctl status qemu-guest-agent
systemctl start qemu-guest-agent
Команда зависает
- Таймаут — 30 секунд
- Не используйте интерактивные команды
- Проверьте, что ВМ отвечает
Проблемы производительности
Высокое использование памяти
# Перезапустить контейнеры
docker compose restart
# Очистить логи
docker system prune -f
Медленная загрузка страниц
- Увеличьте интервал обновления в настройках
- Проверьте сеть до сервера Proxmox
Проблемы с учётной записью
Админ забыл пароль
Если админ забыл пароль, его можно сбросить через командную строку:
Вариант 1: Сброс к паролю по умолчанию
# Выполнить внутри контейнера app
docker compose exec app python -c "
from app.db import get_db
from app.models import User
from app.auth import get_password_hash
db = next(get_db())
admin = db.query(User).filter(User.username == 'admin').first()
if admin:
admin.hashed_password = get_password_hash('admin123')
db.commit()
print('Admin password reset to: admin123')
else:
print('Admin user not found')
db.close()
"
Вариант 2: Задать свой пароль
# Замените YOUR_NEW_PASSWORD на нужный пароль
docker compose exec app python -c "
from app.db import get_db
from app.models import User
from app.auth import get_password_hash
db = next(get_db())
admin = db.query(User).filter(User.username == 'admin').first()
if admin:
admin.hashed_password = get_password_hash('YOUR_NEW_PASSWORD')
db.commit()
print('Admin password has been reset')
else:
print('Admin user not found')
db.close()
"
Вариант 3: Сброс пароля любого пользователя
# Замените USERNAME на нужное имя пользователя
docker compose exec app python -c "
from app.db import get_db
from app.models import User
from app.auth import get_password_hash
db = next(get_db())
user = db.query(User).filter(User.username == 'USERNAME').first()
if user:
user.hashed_password = get_password_hash('newpassword123')
db.commit()
print('Password reset for user: USERNAME')
else:
print('User not found')
db.close()
"
⚠️ Заметка о безопасности: после сброса пароля немедленно войдите и смените его на надёжный через веб-интерфейс.
❓ FAQ
Общие вопросы
В: Можно ли использовать без Proxmox? О: Нет, панель специально разработана для управления Proxmox.
В: Сколько серверов можно добавить? О: Не ограничено.
В: Поддерживается ли кластер Proxmox? О: Да, добавьте любой узел кластера.
Безопасность
В: Пароли хранятся в открытом виде? О: Нет, используется bcrypt-хэширование.
В: Как сменить SECRET_KEY?
О: Измените в .env и перезапустите. Все сессии будут инвалидированы.
Уведомления
В: Почему не приходят письма? О: Проверьте настройки SMTP, особенно порт и TLS.
В: Можно ли отключить уведомления? О: Да, в настройках уведомлений.
В: Как задать тихие часы? О: В настройках уведомлений укажите период (напр., 23:00 – 07:00).
Интеграции
В: Есть ли API для интеграции?
О: Да, REST API с документацией по адресу /docs.
В: Можно ли добавить webhooks? О: Пока нет, но запланировано в будущих версиях.
📞 Поддержка
- GitHub Issues: Создать issue
- Документация: этот файл (WIKI.ru.md)
- Changelog: CHANGELOG.ru.md
Последнее обновление: 24 июля 2026 Версия: 1.13.0