Сделана логика создания вм на сервере, управления нет
This commit is contained in:
@@ -0,0 +1,4 @@
|
|||||||
|
-- AlterTable
|
||||||
|
ALTER TABLE `server` ADD COLUMN `diskTemplate` VARCHAR(191) NULL,
|
||||||
|
ADD COLUMN `node` VARCHAR(191) NULL,
|
||||||
|
ADD COLUMN `proxmoxId` INTEGER NULL;
|
||||||
@@ -33,12 +33,15 @@ model Server {
|
|||||||
userId Int
|
userId Int
|
||||||
tariffId Int
|
tariffId Int
|
||||||
osId Int
|
osId Int
|
||||||
status String @default("stopped") // running, stopped, etc
|
status String @default("stopped")
|
||||||
createdAt DateTime @default(now())
|
createdAt DateTime @default(now())
|
||||||
updatedAt DateTime @updatedAt
|
updatedAt DateTime @updatedAt
|
||||||
user User @relation(fields: [userId], references: [id])
|
user User @relation(fields: [userId], references: [id])
|
||||||
tariff Tariff @relation(fields: [tariffId], references: [id])
|
tariff Tariff @relation(fields: [tariffId], references: [id])
|
||||||
os OperatingSystem @relation(fields: [osId], references: [id])
|
os OperatingSystem @relation(fields: [osId], references: [id])
|
||||||
|
node String?
|
||||||
|
diskTemplate String?
|
||||||
|
proxmoxId Int?
|
||||||
}
|
}
|
||||||
|
|
||||||
model User {
|
model User {
|
||||||
|
|||||||
@@ -9,31 +9,35 @@ const prisma = new PrismaClient();
|
|||||||
router.use(authMiddleware);
|
router.use(authMiddleware);
|
||||||
|
|
||||||
router.get('/proxmox-status', async (req, res) => {
|
router.get('/proxmox-status', async (req, res) => {
|
||||||
const status = await checkProxmoxConnection();
|
try {
|
||||||
res.json(status);
|
console.log('Попытка подключения к серверу Proxmox...');
|
||||||
|
const status = await checkProxmoxConnection();
|
||||||
|
console.log('Статус подключения к Proxmox:', status);
|
||||||
|
res.json(status);
|
||||||
|
} catch (err) {
|
||||||
|
console.error('Ошибка подключения к Proxmox:', err);
|
||||||
|
res.status(500).json({ error: 'Ошибка подключения к Proxmox' });
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
router.post('/create', async (req, res) => {
|
router.post('/create', async (req, res) => {
|
||||||
try {
|
try {
|
||||||
const { tariffId, osId } = req.body;
|
const { tariffId, osId } = req.body;
|
||||||
// Получаем userId из авторизации
|
|
||||||
const userId = req.user?.id;
|
const userId = req.user?.id;
|
||||||
if (!userId) return res.status(401).json({ error: 'Нет авторизации' });
|
if (!userId) return res.status(401).json({ error: 'Нет авторизации' });
|
||||||
|
|
||||||
// Получаем тариф и ОС
|
|
||||||
const tariff = await prisma.tariff.findUnique({ where: { id: tariffId } });
|
const tariff = await prisma.tariff.findUnique({ where: { id: tariffId } });
|
||||||
const os = await prisma.operatingSystem.findUnique({ where: { id: osId } });
|
const os = await prisma.operatingSystem.findUnique({ where: { id: osId } });
|
||||||
if (!tariff || !os) {
|
if (!tariff || !os) {
|
||||||
return res.status(400).json({ error: 'Тариф или ОС не найдены' });
|
return res.status(400).json({ error: 'Тариф или ОС не найдены' });
|
||||||
}
|
}
|
||||||
|
|
||||||
// Проверяем баланс пользователя
|
|
||||||
const user = await prisma.user.findUnique({ where: { id: userId } });
|
const user = await prisma.user.findUnique({ where: { id: userId } });
|
||||||
if (!user) return res.status(404).json({ error: 'Пользователь не найден' });
|
if (!user) return res.status(404).json({ error: 'Пользователь не найден' });
|
||||||
if (user.balance < tariff.price) {
|
if (user.balance < tariff.price) {
|
||||||
return res.status(400).json({ error: 'Недостаточно средств на балансе' });
|
return res.status(400).json({ error: 'Недостаточно средств на балансе' });
|
||||||
}
|
}
|
||||||
|
|
||||||
// 1. Создаём сервер на Proxmox
|
|
||||||
let proxmoxResult;
|
let proxmoxResult;
|
||||||
try {
|
try {
|
||||||
proxmoxResult = await createProxmoxContainer({ os, tariff, user });
|
proxmoxResult = await createProxmoxContainer({ os, tariff, user });
|
||||||
@@ -45,7 +49,6 @@ router.post('/create', async (req, res) => {
|
|||||||
return res.status(500).json({ error: 'Сервер не создан на Proxmox', details: proxmoxResult });
|
return res.status(500).json({ error: 'Сервер не создан на Proxmox', details: proxmoxResult });
|
||||||
}
|
}
|
||||||
|
|
||||||
// 2. Списываем средства
|
|
||||||
await prisma.user.update({
|
await prisma.user.update({
|
||||||
where: { id: userId },
|
where: { id: userId },
|
||||||
data: {
|
data: {
|
||||||
@@ -55,7 +58,6 @@ router.post('/create', async (req, res) => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// 3. Создаём запись о сервере в БД
|
|
||||||
const node = process.env.PROXMOX_NODE;
|
const node = process.env.PROXMOX_NODE;
|
||||||
const diskTemplate = process.env.PROXMOX_DISK_TEMPLATE;
|
const diskTemplate = process.env.PROXMOX_DISK_TEMPLATE;
|
||||||
const server = await prisma.server.create({
|
const server = await prisma.server.create({
|
||||||
@@ -79,8 +81,8 @@ router.post('/create', async (req, res) => {
|
|||||||
// GET /api/server — получить все серверы пользователя
|
// GET /api/server — получить все серверы пользователя
|
||||||
router.get('/', async (req, res) => {
|
router.get('/', async (req, res) => {
|
||||||
try {
|
try {
|
||||||
// TODO: получить userId из авторизации (req.user)
|
const userId = req.user?.id;
|
||||||
const userId = 1; // временно
|
if (!userId) return res.status(401).json({ error: 'Нет авторизации' });
|
||||||
const servers = await prisma.server.findMany({
|
const servers = await prisma.server.findMany({
|
||||||
where: { userId },
|
where: { userId },
|
||||||
include: {
|
include: {
|
||||||
@@ -99,8 +101,8 @@ router.get('/', async (req, res) => {
|
|||||||
// GET /api/server/:id — получить один сервер пользователя по id
|
// GET /api/server/:id — получить один сервер пользователя по id
|
||||||
router.get('/:id', async (req, res) => {
|
router.get('/:id', async (req, res) => {
|
||||||
try {
|
try {
|
||||||
// TODO: получить userId из авторизации (req.user)
|
const userId = req.user?.id;
|
||||||
const userId = 1; // временно
|
if (!userId) return res.status(401).json({ error: 'Нет авторизации' });
|
||||||
const serverId = Number(req.params.id);
|
const serverId = Number(req.params.id);
|
||||||
const server = await prisma.server.findFirst({
|
const server = await prisma.server.findFirst({
|
||||||
where: { id: serverId, userId },
|
where: { id: serverId, userId },
|
||||||
@@ -114,4 +116,4 @@ router.get('/:id', async (req, res) => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
export default router;
|
export default router;
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 209 KiB |
Reference in New Issue
Block a user