Files
DLE/backend/routes/moduleDeployment.js

167 lines
5.9 KiB
JavaScript
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.

/**
* Copyright (c) 2024-2025 Тарабанов Александр Викторович
* All rights reserved.
*
* This software is proprietary and confidential.
* Unauthorized copying, modification, or distribution is prohibited.
*
* For licensing inquiries: info@hb3-accelerator.com
* Website: https://hb3-accelerator.com
* GitHub: https://github.com/HB3-ACCELERATOR
*/
const express = require('express');
const router = express.Router();
/**
* Endpoint для деплоя модулей с данными из базы данных
* POST /api/module-deployment/deploy-module-from-db
*/
router.post('/deploy-module-from-db', async (req, res) => {
try {
const { dleAddress, moduleType } = req.body;
if (!dleAddress || !moduleType) {
return res.status(400).json({
success: false,
error: 'Адрес DLE и тип модуля обязательны'
});
}
console.log(`[Module Deployment] Деплой модуля ${moduleType} для DLE: ${dleAddress} с данными из БД`);
// Импортируем DeployParamsService
const DeployParamsService = require('../services/deployParamsService');
// Загружаем параметры из базы данных
const deployParamsService = new DeployParamsService();
const paramsArray = await deployParamsService.getLatestDeployParams(1);
if (!paramsArray || paramsArray.length === 0) {
return res.status(400).json({
success: false,
error: 'Параметры деплоя не найдены в базе данных'
});
}
const params = paramsArray[0]; // Берем первый (последний) элемент
// Проверяем, что модуль поддерживается
const supportedModules = ['treasury', 'timelock', 'reader', 'hierarchicalVoting'];
if (!supportedModules.includes(moduleType)) {
return res.status(400).json({
success: false,
error: `Неподдерживаемый тип модуля: ${moduleType}. Поддерживаемые: ${supportedModules.join(', ')}`
});
}
// Устанавливаем переменные окружения из базы данных
if (params.privateKey || params.private_key) {
process.env.PRIVATE_KEY = params.privateKey || params.private_key;
}
const ApiKeyManager = require('../utils/apiKeyManager');
const etherscanKey = ApiKeyManager.getAndSetEtherscanApiKey(params);
if (etherscanKey) {
}
// Запускаем деплой модулей через скрипт
const { spawn } = require('child_process');
const path = require('path');
const scriptPath = path.join(__dirname, '../scripts/deploy/deploy-modules.js');
const deploymentId = params.id || 'latest';
console.log(`[Module Deployment] Запускаем скрипт деплоя с deploymentId: ${deploymentId}`);
const child = spawn('node', [scriptPath, '--deployment-id', deploymentId, '--module-type', moduleType], {
cwd: path.join(__dirname, '..'),
stdio: 'pipe'
});
let stdout = '';
let stderr = '';
child.stdout.on('data', (data) => {
stdout += data.toString();
console.log(`[Deploy Script] ${data.toString().trim()}`);
});
child.stderr.on('data', (data) => {
stderr += data.toString();
console.error(`[Deploy Script Error] ${data.toString().trim()}`);
});
// Отправляем немедленный ответ о запуске деплоя
res.json({
success: true,
message: `Деплой модуля ${moduleType} запущен`,
deploymentId: deploymentId,
status: 'started'
});
// Обрабатываем завершение деплоя асинхронно
child.on('close', (code) => {
if (code === 0) {
console.log(`[Module Deployment] Деплой модуля ${moduleType} успешно завершен`);
// Здесь можно добавить WebSocket уведомление о завершении
} else {
console.error(`[Module Deployment] Ошибка при деплое модуля ${moduleType}: код ${code}`);
// Здесь можно добавить WebSocket уведомление об ошибке
}
});
child.on('error', (error) => {
console.error(`[Module Deployment] Ошибка запуска скрипта деплоя:`, error);
res.status(500).json({
success: false,
error: `Ошибка запуска скрипта деплоя: ${error.message}`
});
});
} catch (error) {
console.error('[Module Deployment] Ошибка при деплое модуля из БД:', error);
res.status(500).json({
success: false,
error: 'Ошибка при деплое модуля: ' + error.message
});
}
});
/**
* Endpoint для получения статуса деплоя модулей
* GET /api/module-deployment/deployment-status
*/
router.get('/deployment-status', async (req, res) => {
try {
const { dleAddress } = req.query;
if (!dleAddress) {
return res.status(400).json({
success: false,
error: 'Адрес DLE обязателен'
});
}
// Здесь можно добавить логику для проверки статуса деплоя
// Например, проверка файлов результатов деплоя
res.json({
success: true,
message: 'Статус деплоя получен',
dleAddress: dleAddress,
status: 'completed' // или 'in_progress', 'failed'
});
} catch (error) {
console.error('[Module Deployment] Ошибка получения статуса деплоя:', error);
res.status(500).json({
success: false,
error: 'Ошибка получения статуса деплоя: ' + error.message
});
}
});
module.exports = router;