ваше сообщение коммита

This commit is contained in:
2025-11-18 22:48:13 +03:00
parent 794cf1dcee
commit 970b53e5ba
15 changed files with 1297 additions and 337 deletions

View File

@@ -139,27 +139,34 @@ app.post('/vds/check-requirements', logRequest, async (req, res) => {
const {
vdsIp,
ubuntuUser,
sshUser,
sshHost,
sshPort = 22,
sshConnectUser,
sshConnectPassword
} = req.body;
if (!vdsIp || !ubuntuUser || !sshConnectUser || !sshConnectPassword) {
// Нормализуем значения (удаляем пробелы)
const normalizedVdsIp = String(vdsIp || '').trim();
const normalizedSshHost = sshHost ? String(sshHost).trim() : undefined;
const normalizedSshConnectUser = String(sshConnectUser || sshUser || 'root').trim();
const normalizedSshConnectPassword = sshConnectPassword ? String(sshConnectPassword).trim() : undefined;
if (!normalizedVdsIp || !ubuntuUser || !normalizedSshConnectUser || !normalizedSshConnectPassword) {
return res.status(400).json({
success: false,
message: 'Необходимы параметры: vdsIp, ubuntuUser, sshConnectUser, sshConnectPassword'
});
}
log.info(`Проверка системных требований VDS: ${vdsIp}`);
log.info(`Проверка системных требований VDS: ${normalizedVdsIp}`);
const options = {
vdsIp,
sshHost,
vdsIp: normalizedVdsIp,
sshHost: normalizedSshHost,
sshPort,
sshConnectUser,
sshConnectPassword
sshConnectUser: normalizedSshConnectUser,
sshConnectPassword: normalizedSshConnectPassword
};
const result = await checkSystemRequirements(options);
@@ -199,21 +206,27 @@ app.post('/vds/transfer-encryption-key', logRequest, async (req, res) => {
sshConnectPassword
} = req.body;
if (!vdsIp || !dockerUser || !sshConnectUser || !sshConnectPassword) {
// Нормализуем значения (удаляем пробелы)
const normalizedVdsIp = String(vdsIp || '').trim();
const normalizedSshHost = sshHost ? String(sshHost).trim() : undefined;
const normalizedSshConnectUser = String(sshConnectUser || sshUser || 'root').trim();
const normalizedSshConnectPassword = sshConnectPassword ? String(sshConnectPassword).trim() : undefined;
if (!normalizedVdsIp || !dockerUser || !normalizedSshConnectUser || !normalizedSshConnectPassword) {
return res.status(400).json({
success: false,
message: 'Необходимы параметры: vdsIp, dockerUser, sshConnectUser, sshConnectPassword'
});
}
log.info(`🔐 Передача ключа шифрования на VDS: ${vdsIp}`);
log.info(`🔐 Передача ключа шифрования на VDS: ${normalizedVdsIp}`);
const options = {
vdsIp,
sshHost,
vdsIp: normalizedVdsIp,
sshHost: normalizedSshHost,
sshPort,
sshConnectUser,
sshConnectPassword
sshConnectUser: normalizedSshConnectUser,
sshConnectPassword: normalizedSshConnectPassword
};
// 1. Убеждаемся, что директория для ключа существует на VDS
@@ -312,18 +325,24 @@ app.post('/vds/setup', logRequest, async (req, res) => {
sshConnectPassword
} = req.body;
log.info(`Настройка VDS: ${vdsIp} для домена: ${domain}`);
// Нормализуем значения (удаляем пробелы)
const normalizedVdsIp = String(vdsIp || '').trim();
const normalizedSshHost = sshHost ? String(sshHost).trim() : undefined;
const normalizedSshConnectUser = String(sshConnectUser || sshUser || 'root').trim();
const normalizedSshConnectPassword = sshConnectPassword ? String(sshConnectPassword).trim() : undefined;
log.info(`Настройка VDS: ${normalizedVdsIp} для домена: ${domain}`);
// Отправляем начальный статус через WebSocket
sendWebSocketStatus(false, 'Начинаем настройку VDS...');
sendWebSocketLog('info', `🚀 Начинаем настройку VDS: ${vdsIp} для домена: ${domain}`, 'init', 0);
sendWebSocketLog('info', `🚀 Начинаем настройку VDS: ${normalizedVdsIp} для домена: ${domain}`, 'init', 0);
const options = {
vdsIp,
sshHost,
vdsIp: normalizedVdsIp,
sshHost: normalizedSshHost,
sshPort,
sshConnectUser,
sshConnectPassword
sshConnectUser: normalizedSshConnectUser,
sshConnectPassword: normalizedSshConnectPassword
};
// 0. Проверка системных требований
@@ -404,6 +423,52 @@ findtime = 3600
await execSshCommand(`chown ${dockerUser}:${dockerUser} /home/${dockerUser}/dapp/ssl/keys`, options);
log.success('Директория для ключа шифрования подготовлена');
// 9.1. Передача ключа шифрования на VDS
sendWebSocketLog('info', '🔐 Передача ключа шифрования на VDS...', 'encryption_key', 36);
log.info('🔐 Передача ключа шифрования на VDS...');
try {
// Читаем ключ шифрования с локальной машины
const encryptionKeyPath = process.env.ENCRYPTION_KEY_PATH
|| path.resolve(__dirname, '..', 'ssl', 'keys', 'full_db_encryption.key');
const encryptionKeyContent = await fs.readFile(encryptionKeyPath, 'utf8');
log.success('✅ Ключ шифрования прочитан с локальной машины');
// Создаем временный файл с ключом
const tempKeyPath = `/tmp/encryption_key_${Date.now()}.key`;
await fs.writeFile(tempKeyPath, encryptionKeyContent);
// Передаем файл на VDS через SCP
await execScpCommand(
tempKeyPath,
`/home/${dockerUser}/dapp/ssl/keys/full_db_encryption.key`,
options
);
// Удаляем временный файл
await fs.remove(tempKeyPath);
// Устанавливаем правильные права доступа к ключу на VDS
await execSshCommand(`chown ${dockerUser}:${dockerUser} /home/${dockerUser}/dapp/ssl/keys/full_db_encryption.key`, options);
await execSshCommand(`chmod 600 /home/${dockerUser}/dapp/ssl/keys/full_db_encryption.key`, options);
// Проверяем, что ключ успешно передан
const verifyResult = await execSshCommand(`ls -la /home/${dockerUser}/dapp/ssl/keys/full_db_encryption.key`, options);
if (verifyResult.code === 0) {
log.success('✅ Ключ шифрования успешно передан на VDS');
sendWebSocketLog('success', '✅ Ключ шифрования передан на VDS', 'encryption_key', 37);
} else {
throw new Error('Не удалось проверить передачу ключа шифрования');
}
} catch (error) {
log.error('❌ Ошибка передачи ключа шифрования: ' + error.message);
sendWebSocketLog('error', '❌ Ошибка передачи ключа шифрования: ' + error.message, 'encryption_key', 37);
// Продолжаем установку, но предупреждаем пользователя
log.warn('⚠️ Внимание: ключ шифрования не передан. Backend может не запуститься без ключа.');
}
// 10. Проверка и удаление системного nginx для избежания конфликтов портов
log.info('🔍 Проверка наличия системного nginx...');
const nginxCheck = await execSshCommand('systemctl list-units --type=service --state=active,inactive | grep nginx || echo "nginx not found"', options);
@@ -677,27 +742,34 @@ app.post('/vds/diagnostics', logRequest, async (req, res) => {
try {
const {
vdsIp,
sshUser,
sshHost,
sshPort = 22,
sshConnectUser,
sshConnectPassword
} = req.body;
if (!vdsIp || !sshConnectUser || !sshConnectPassword) {
// Нормализуем значения (удаляем пробелы)
const normalizedVdsIp = String(vdsIp || '').trim();
const normalizedSshHost = sshHost ? String(sshHost).trim() : undefined;
const normalizedSshConnectUser = String(sshConnectUser || sshUser || 'root').trim();
const normalizedSshConnectPassword = sshConnectPassword ? String(sshConnectPassword).trim() : undefined;
if (!normalizedVdsIp || !normalizedSshConnectUser || !normalizedSshConnectPassword) {
return res.status(400).json({
success: false,
message: 'Необходимы параметры: vdsIp, sshConnectUser, sshConnectPassword'
});
}
log.info(`Диагностика VDS: ${vdsIp}`);
log.info(`Диагностика VDS: ${normalizedVdsIp}`);
const options = {
vdsIp,
sshHost,
vdsIp: normalizedVdsIp,
sshHost: normalizedSshHost,
sshPort,
sshConnectUser,
sshConnectPassword
sshConnectUser: normalizedSshConnectUser,
sshConnectPassword: normalizedSshConnectPassword
};
// 1. Проверка статуса системы