Files
Proxmox-VPS-Panel/README.md
T

128 lines
8.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Proxmox VPS Panel
Минимальная self-hosted панель для мульти-тенантного управления VPS (VM и LXC) на вашем
Proxmox VE через API. Backend — FastAPI (Python), frontend — React (Vite), хранилище — Postgres.
Клиенты регистрируются, выбирают шаблон и разворачивают себе VM или LXC-контейнер одной кнопкой;
дальше могут запускать/останавливать/перезагружать/удалять сервер и открывать веб-консоль.
Первый зарегистрированный пользователь автоматически становится администратором и управляет
шаблонами и списком пользователей.
## Возможности MVP
- Регистрация/логин (JWT), роли admin / client
- Шаблоны VPS: админ создаёт тарифы, привязанные к VM-шаблону (клонирование) или CT-шаблону LXC
- Клиент создаёт инстанс из шаблона — панель сама берёт свободный VMID и вызывает Proxmox API
- Действия: start / stop / shutdown / reboot / delete
- Веб-консоль через noVNC (websocket-прокси на backend)
- Всё через docker-compose, разворачивается как Custom App в TrueNAS SCALE
## Чего нет в MVP (сознательно, чтобы не раздувать первую версию)
- Поддержки нескольких Proxmox-нод/кластеров одновременно (сейчас один `PVE_NODE` в конфиге)
- Биллинга и лимитов по ресурсам на пользователя
- Очереди задач (Celery/Redis) — создание VPS идёт в фоне через `BackgroundTasks` FastAPI,
для нескольких одновременных заявок этого достаточно, для десятков в секунду — уже нет
- Управления сетью/IP-пулами (LXC получает адрес по DHCP, для VM выдаётся из клонированного шаблона)
## 1. Подготовка Proxmox
### API-токен
Datacenter → Permissions → API Tokens → добавить токен для пользователя (например `root@pam`,
в проде лучше завести отдельного пользователя с ролью `PVEVMAdmin`/кастомной ролью и без
"Privilege Separation", если хотите, чтобы токен имел те же права, что и юзер).
Права, которые нужны панели: создание/клонирование/удаление VM и CT, управление питанием,
`VM.Console` для консоли, `Sys.Audit` для чтения статусов задач.
### Шаблон для VM
Создайте одну VM с cloud-init образом (Ubuntu/Debian cloud image), настройте её и переведите
в шаблон (`qm template <vmid>`). Полученный VMID указывается в панели как `source_vmid` шаблона.
### Шаблон для LXC
Скачайте официальный CT-шаблон через Proxmox (Node → local (storage) → CT Templates → Download),
например `debian-12-standard_12.7-1_amd64.tar.zst`. В панели укажите его как `source_template`
в формате `local:vztmpl/имя_файла.tar.zst`.
## 2. Настройка backend
Скопируйте `backend/.env.example` в `backend/.env` и заполните:
```
PVE_HOST=https://<ip-вашего-proxmox>:8006
PVE_NODE=pve
PVE_TOKEN_NAME=root@pam!panel
PVE_TOKEN_VALUE=<значение токена>
SECRET_KEY=<случайная строка>
```
## 3. Запуск
```bash
docker compose up -d --build
```
Frontend будет на `http://<host>:5173`, backend API — на `http://<host>:8000`.
Первый, кто зарегистрируется на `/register`, станет администратором — заходите первым сами.
## 4. Установка на TrueNAS SCALE
TrueNAS SCALE умеет запускать произвольные Docker-приложения ("Apps → Discover Apps → Custom App"
либо через "Launch Docker Compose", если версия TrueNAS это поддерживает). Проще всего:
1. Скопируйте папку проекта на TrueNAS (например, в датасет `/mnt/tank/apps/vps-panel`).
2. Заполните `backend/.env`, как описано выше.
3. Из этой директории выполните `docker compose up -d --build` через shell TrueNAS
(System Settings → Shell, либо через SSH), либо оформите как Custom App, указав тот же
`docker-compose.yml` в интерфейсе TrueNAS Apps.
4. Откройте порт 5173 наружу через reverse-proxy (например, встроенный в TrueNAS, либо
отдельный Nginx Proxy Manager), если панель должна быть доступна клиентам извне.
## Консоль VNC — важное примечание
Веб-консоль реализована как websocket-прокси: backend получает от Proxmox тикет
(`vncproxy`) и порт, затем проксирует бинарный поток на `/console/ws`, а фронтенд рисует
экран через noVNC (`@novnc/novnc`, подключается с CDN).
Proxmox исторически ожидает на `vncwebsocket` либо cookie-тикет (`PVEAuthCookie`) из обычной
браузерной сессии, либо (в более новых версиях) заголовок `Authorization: PVEAPIToken=...`
в коде (`backend/app/routers/console.py`) используется второй вариант. Если на вашей версии
Proxmox консоль не подключается, скорее всего понадобится либо обновить PVE, либо переключить
аутентификацию панели на логин/пароль с получением `PVEAuthCookie` вместо API-токена именно
для этого запроса — сама бизнес-логика (создание/старт/стоп VPS) от этого не зависит и будет
работать в любом случае.
## Безопасность перед продакшеном
- Смените `SECRET_KEY` и пароль Postgres по умолчанию
- Ограничьте `allow_origins` в `backend/app/main.py` конкретным доменом фронтенда
- Закройте порт 8000 (backend) наружу, оставьте доступ только через nginx фронтенда
- Используйте отдельного Proxmox-пользователя с минимально необходимыми правами для токена
панели, а не `root@pam`
## Структура проекта
```
backend/
app/
main.py — точка входа FastAPI
config.py — переменные окружения
models.py — таблицы: User, Template, Instance
proxmox_client.py — вся логика вызовов Proxmox API (proxmoxer)
routers/
auth.py — регистрация / логин
templates.py — CRUD шаблонов (admin)
instances.py — создание/список/действия/удаление VPS
admin.py — управление пользователями
console.py — websocket-прокси для VNC-консоли
frontend/
src/
pages/ — Login, Register, Dashboard, InstanceDetail, AdminTemplates, AdminUsers
components/ — InstanceCard, ConsoleViewer
api.js — обёртка над fetch к backend
docker-compose.yml
```