Обновление файла
This commit is contained in:
@@ -4,7 +4,7 @@ Self-hosted панель для мульти-тенантного управле
|
|||||||
Proxmox VE через API. Backend — FastAPI (Python), frontend — React (Vite), хранилище — Postgres.
|
Proxmox VE через API. Backend — FastAPI (Python), frontend — React (Vite), хранилище — Postgres.
|
||||||
|
|
||||||
Клиенты регистрируются, выбирают шаблон и разворачивают себе VM или LXC-контейнер одной кнопкой;
|
Клиенты регистрируются, выбирают шаблон и разворачивают себе VM или LXC-контейнер одной кнопкой;
|
||||||
дальше могут запускать/останавливать/перезагружать/удалять сервер и открывать веб-консоль.
|
дальше могут запускать/останавливать/перезагружать/удалять сервер и управлять им через SSH.
|
||||||
Первый зарегистрированный пользователь автоматически становится администратором и управляет
|
Первый зарегистрированный пользователь автоматически становится администратором и управляет
|
||||||
шаблонами и списком пользователей.
|
шаблонами и списком пользователей.
|
||||||
|
|
||||||
@@ -14,7 +14,7 @@ Proxmox VE через API. Backend — FastAPI (Python), frontend — React (Vit
|
|||||||
- Шаблоны VPS: админ создаёт тарифы, привязанные к VM-шаблону (клонирование) или CT-шаблону LXC
|
- Шаблоны VPS: админ создаёт тарифы, привязанные к VM-шаблону (клонирование) или CT-шаблону LXC
|
||||||
- Клиент создаёт инстанс из шаблона — панель сама берёт свободный VMID и вызывает Proxmox API
|
- Клиент создаёт инстанс из шаблона — панель сама берёт свободный VMID и вызывает Proxmox API
|
||||||
- Действия: start / stop / shutdown / reboot / delete
|
- Действия: start / stop / shutdown / reboot / delete
|
||||||
- Веб-консоль через noVNC (websocket-прокси на backend, noVNC устанавливается из npm)
|
- Управление через SSH — IP-адрес инстанса виден в дашборде, логин/пароль задаются через cloud-init
|
||||||
- Проверка владельца во всех эндпоинтах — клиент не может управлять чужими VM
|
- Проверка владельца во всех эндпоинтах — клиент не может управлять чужими VM
|
||||||
- Всё через docker-compose, разворачивается как Custom App в TrueNAS SCALE
|
- Всё через docker-compose, разворачивается как Custom App в TrueNAS SCALE
|
||||||
- Healthcheck-эндпоинты (`/health`, `/health/ready`) и Docker-healthcheck у всех сервисов
|
- Healthcheck-эндпоинты (`/health`, `/health/ready`) и Docker-healthcheck у всех сервисов
|
||||||
@@ -27,6 +27,7 @@ Proxmox VE через API. Backend — FastAPI (Python), frontend — React (Vit
|
|||||||
- Очереди задач (Celery/Redis) — создание VPS идёт в фоне через `BackgroundTasks` FastAPI,
|
- Очереди задач (Celery/Redis) — создание VPS идёт в фоне через `BackgroundTasks` FastAPI,
|
||||||
для нескольких одновременных заявок этого достаточно, для десятков в секунду — уже нет
|
для нескольких одновременных заявок этого достаточно, для десятков в секунду — уже нет
|
||||||
- Управления сетью/IP-пулами (LXC получает адрес по DHCP, для VM выдаётся из клонированного шаблона)
|
- Управления сетью/IP-пулами (LXC получает адрес по DHCP, для VM выдаётся из клонированного шаблона)
|
||||||
|
- Веб-консоли (VNC) — для доступа к виртуальным машинам используйте SSH
|
||||||
- Alembic-миграций (сейчас `create_all()` — для прода рекомендуется добавить)
|
- Alembic-миграций (сейчас `create_all()` — для прода рекомендуется добавить)
|
||||||
|
|
||||||
## 1. Подготовка Proxmox
|
## 1. Подготовка Proxmox
|
||||||
@@ -34,11 +35,10 @@ Proxmox VE через API. Backend — FastAPI (Python), frontend — React (Vit
|
|||||||
### API-токен
|
### API-токен
|
||||||
|
|
||||||
Datacenter → Permissions → API Tokens → добавить токен для пользователя (например `root@pam`,
|
Datacenter → Permissions → API Tokens → добавить токен для пользователя (например `root@pam`,
|
||||||
в проде лучше завести отдельного пользователя с ролью `PVEVMAdmin`/кастомной ролью и без
|
в проде лучше завести отдельного пользователя с минимально нужными правами).
|
||||||
"Privilege Separation", если хотите, чтобы токен имел те же права, что и юзер).
|
|
||||||
|
|
||||||
Права, которые нужны панели: создание/клонирование/удаление VM и CT, управление питанием,
|
Права, которые нужны панели: создание/клонирование/удаление VM и CT, управление питанием,
|
||||||
`VM.Console` для консоли, `Sys.Audit` для чтения статусов задач.
|
`Sys.Audit` для чтения статусов задач.
|
||||||
|
|
||||||
### Шаблон для VM
|
### Шаблон для VM
|
||||||
|
|
||||||
@@ -81,8 +81,6 @@ ALLOW_ORIGINS=https://panel.example.com
|
|||||||
```bash
|
```bash
|
||||||
# Установите обязательные переменные:
|
# Установите обязательные переменные:
|
||||||
export POSTGRES_PASSWORD=$(openssl rand -hex 16)
|
export POSTGRES_PASSWORD=$(openssl rand -hex 16)
|
||||||
# (опционально) задайте порог логирования:
|
|
||||||
# export LOG_LEVEL=DEBUG
|
|
||||||
|
|
||||||
docker compose up -d --build
|
docker compose up -d --build
|
||||||
```
|
```
|
||||||
@@ -102,25 +100,21 @@ TrueNAS SCALE умеет запускать произвольные Docker-пр
|
|||||||
1. Скопируйте папку проекта на TrueNAS (например, в датасет `/mnt/tank/apps/vps-panel`).
|
1. Скопируйте папку проекта на TrueNAS (например, в датасет `/mnt/tank/apps/vps-panel`).
|
||||||
2. Заполните `backend/.env`, как описано выше.
|
2. Заполните `backend/.env`, как описано выше.
|
||||||
3. Из этой директории выполните `docker compose up -d --build` через shell TrueNAS
|
3. Из этой директории выполните `docker compose up -d --build` через shell TrueNAS
|
||||||
(System Settings → Shell, либо через SSH), либо оформите как Custom App, указав тот же
|
(System Settings → Shell, либо через SSH), либо оформите как Custom App.
|
||||||
`docker-compose.yml` в интерфейсе TrueNAS Apps.
|
|
||||||
4. Откройте порт 5173 наружу через reverse-proxy (например, встроенный в TrueNAS, либо
|
4. Откройте порт 5173 наружу через reverse-proxy (например, встроенный в TrueNAS, либо
|
||||||
отдельный Nginx Proxy Manager), если панель должна быть доступна клиентам извне.
|
отдельный Nginx Proxy Manager), если панель должна быть доступна клиентам извне.
|
||||||
|
|
||||||
## Консоль VNC — важное примечание
|
## Доступ к виртуальным машинам
|
||||||
|
|
||||||
Веб-консоль реализована как websocket-прокси: backend получает от Proxmox тикет
|
IP-адрес инстанса виден в дашборде и в карточке инстанса (получается через
|
||||||
(`vncproxy`) и порт, затем проксирует бинарный поток на `/api/console/ws`, а фронтенд
|
QEMU Guest Agent или LXC-интерфейсы). Для доступа:
|
||||||
рисует экран через **noVNC, установленный как npm-пакет** (`@novnc/novnc`, копируется
|
|
||||||
в `/novnc/` внутри nginx-контейнера на этапе сборки).
|
|
||||||
|
|
||||||
Proxmox исторически ожидает на `vncwebsocket` либо cookie-тикет (`PVEAuthCookie`) из обычной
|
```bash
|
||||||
браузерной сессии, либо (в более новых версиях) заголовок `Authorization: PVEAPIToken=...` —
|
ssh <cloud-init-user>@<ip-адрес>
|
||||||
в коде (`backend/app/routers/console.py`) используется второй вариант. Если на вашей версии
|
```
|
||||||
Proxmox консоль не подключается, скорее всего понадобится либо обновить PVE, либо переключить
|
|
||||||
аутентификацию панели на логин/пароль с получением `PVEAuthCookie` вместо API-токена именно
|
Логин и пароль задаются клиентом при создании инстанса (поля «Пользователь» и «Пароль»
|
||||||
для этого запроса — сама бизнес-логика (создание/старт/стоп VPS) от этого не зависит и будет
|
в форме создания — пробрасываются в cloud-init гостевой ОС).
|
||||||
работать в любом случае.
|
|
||||||
|
|
||||||
## Безопасность перед продакшеном
|
## Безопасность перед продакшеном
|
||||||
|
|
||||||
@@ -149,11 +143,10 @@ backend/
|
|||||||
templates.py — CRUD шаблонов (admin) + импорт из Proxmox
|
templates.py — CRUD шаблонов (admin) + импорт из Proxmox
|
||||||
instances.py — создание/список/действия/удаление VPS
|
instances.py — создание/список/действия/удаление VPS
|
||||||
admin.py — управление пользователями
|
admin.py — управление пользователями
|
||||||
console.py — websocket-прокси для VNC-консоли
|
|
||||||
frontend/
|
frontend/
|
||||||
src/
|
src/
|
||||||
pages/ — Login, Register, Dashboard, InstanceDetail, AdminTemplates, AdminUsers
|
pages/ — Login, Register, Dashboard, InstanceDetail, AdminTemplates, AdminUsers
|
||||||
components/ — InstanceCard, ConsoleViewer
|
components/ — InstanceCard
|
||||||
api.js — обёртка над fetch к backend
|
api.js — обёртка над fetch к backend
|
||||||
styles.css — UI-стили
|
styles.css — UI-стили
|
||||||
docker-compose.yml
|
docker-compose.yml
|
||||||
@@ -163,8 +156,13 @@ docker-compose.yml
|
|||||||
|
|
||||||
## Changelog
|
## Changelog
|
||||||
|
|
||||||
|
### 0.3.0
|
||||||
|
- 🗑 Удалена VNC-консоль — для доступа к VM используйте SSH по IP из дашборда
|
||||||
|
- 🛠 Упрощена nginx-конфигурация (убран WebSocket-прокси для VNC)
|
||||||
|
- 🛠 Уменьшен размер frontend-образа (noVNC больше не качается)
|
||||||
|
|
||||||
### 0.2.0
|
### 0.2.0
|
||||||
- 🔒 Удалён закоммиченный `backend/.env` с реальными секретами. **Смените SECRET_KEY и PVE_TOKEN_VALUE!**
|
- 🔒 Удалён закоммиченный `backend/.env` с реальными секретами
|
||||||
- 🔒 Добавлена проверка владельца во всех рутерах `instances.py`
|
- 🔒 Добавлена проверка владельца во всех рутерах `instances.py`
|
||||||
- 🔒 CORS теперь читается из `ALLOW_ORIGINS` (по умолчанию только localhost)
|
- 🔒 CORS теперь читается из `ALLOW_ORIGINS` (по умолчанию только localhost)
|
||||||
- 🔒 Backend-порт 8000 закрыт снаружи по умолчанию
|
- 🔒 Backend-порт 8000 закрыт снаружи по умолчанию
|
||||||
@@ -175,6 +173,5 @@ docker-compose.yml
|
|||||||
- 🛠 Удалены дубли функций/эндпоинтов в `proxmox_client.py` и `instances.py`
|
- 🛠 Удалены дубли функций/эндпоинтов в `proxmox_client.py` и `instances.py`
|
||||||
- 🛠 Backend запускается от non-root пользователя
|
- 🛠 Backend запускается от non-root пользователя
|
||||||
- 🛠 Multi-stage Dockerfile для backend (меньше размер образа)
|
- 🛠 Multi-stage Dockerfile для backend (меньше размер образа)
|
||||||
- 🛠 noVNC устанавливается из npm вместо загрузки с CDN
|
|
||||||
- 🛠 Добавлены healthcheck'и у всех сервисов в docker-compose
|
- 🛠 Добавлены healthcheck'и у всех сервисов в docker-compose
|
||||||
- 🛠 Структурированное логирование через `logging`
|
- 🛠 Структурированное логирование через `logging`
|
||||||
Reference in New Issue
Block a user