Files
electron/admin-server1/controllers/healthController.js
T
2026-08-08 00:15:48 +03:00

165 lines
6.3 KiB
JavaScript

const axios = require('axios');
const mysql = require('mysql2/promise');
const WebSocket = require('ws');
const iconv = require('iconv-lite');
const logger = require('../logger');
exports.checkDb = async (req, res) => {
// 📊 Статус прямого подключения (админка -> БД)
let adminToDbStatus = {
status: 'offline',
message: 'Test not performed'
};
try {
// ✅ Конфигурация для MySQL (правильный синтаксис)
const dbConfig = {
host: process.env.MYSQL_HOST || 'localhost',
user: process.env.MYSQL_USER || 'root',
password: process.env.MYSQL_PASSWORD || '',
database: process.env.MYSQL_DATABASE || 'test',
port: process.env.MYSQL_PORT || 3306,
connectionLimit: 1,
connectTimeout: 15000,
waitForConnections: true,
queueLimit: 0
};
logger.info(`[DB CHECK] Проверка подключения к MySQL: ${dbConfig.host}:${dbConfig.port}/${dbConfig.database}`);
// 🔌 Создаем пул соединений (правильный синтаксис для mysql2)
const pool = mysql.createPool(dbConfig);
// 🔍 Получаем соединение из пула
const connection = await pool.getConnection();
// ✅ Выполняем тестовый запрос (правильный синтаксис)
const [rows] = await connection.query('SELECT 1 as result');
// ✅ Успешно!
adminToDbStatus = {
status: 'online',
message: '✅ Прямое подключение к MySQL успешно',
dbType: 'MySQL',
host: dbConfig.host,
database: dbConfig.database
};
logger.info(`[DB CHECK] ✅ Успешное подключение к MySQL`);
// Освобождаем соединение
connection.release();
// Закрываем пул
await pool.end();
} catch (error) {
logger.error(`[DB CHECK] ❌ Ошибка подключения к MySQL:`, error.message);
adminToDbStatus = {
status: 'offline',
message: `❌ Ошибка подключения: ${error.message}`,
dbType: 'MySQL',
errorCode: error.code || 'UNKNOWN'
};
if (error.code === 'ECONNREFUSED') {
adminToDbStatus.diagnostic = 'Сервер MySQL не запущен или недоступен. Проверьте, запущен ли MySQL.';
} else if (error.code === 'ER_ACCESS_DENIED_ERROR') {
adminToDbStatus.diagnostic = 'Неверный логин или пароль. Проверьте MYSQL_USER и MYSQL_PASSWORD в .env';
} else if (error.code === 'ER_BAD_DB_ERROR') {
adminToDbStatus.diagnostic = 'База данных не существует. Проверьте MYSQL_DATABASE в .env';
} else if (error.code === 'ENOTFOUND') {
adminToDbStatus.diagnostic = 'Хост не найден. Проверьте MYSQL_HOST в .env';
}
}
let backendToDbStatus = {
status: 'offline',
message: 'Test not performed'
};
try {
const backendUrl = process.env.BACKEND_URL || 'http://localhost:3001';
const response = await axios.get(`${backendUrl}/api/db-status`, {
timeout: 3000,
validateStatus: false // Не выбрасывать ошибку при статусе != 200
});
if (response.status === 200 && response.data && response.data.status === 'ok') {
backendToDbStatus = {
status: 'online',
message: '✅ Бэкенд успешно подключен к БД',
details: response.data
};
} else {
backendToDbStatus = {
status: 'offline',
message: '⚠️ Бэкенд сообщил об ошибке',
details: response.data || { status: 'unknown' }
};
}
} catch (error) {
logger.error(`[DB CHECK] ❌ Ошибка связи с бэкендом:`, error.message);
backendToDbStatus = {
status: 'offline',
message: `❌ Не удалось связаться с бэкендом: ${error.message}`
};
}
// 📤 Отправляем результат
res.json({
timestamp: new Date().toISOString(),
adminToDb: adminToDbStatus,
backendToDb: backendToDbStatus,
environment: {
nodeVersion: process.version,
platform: process.platform,
envFile: process.env.NODE_ENV || 'development'
}
});
};
exports.checkStatus = async (req, res) => {
try {
const backendUrl = process.env.BACKEND_URL || 'http://localhost:3001';
await axios.get(`${backendUrl}/api/test`, {
timeout: 2000
});
res.json({
status: 'online',
message: 'Сервер работает',
timestamp: new Date().toISOString()
});
} catch (error) {
logger.error(`[STATUS] ❌ Ошибка проверки статуса:`, error.message);
res.json({
status: 'offline',
message: 'Сервер недоступен',
error: error.message,
timestamp: new Date().toISOString()
});
}
};
exports.testDbConnection = async () => {
try {
const dbConfig = {
host: process.env.MYSQL_HOST || 'localhost',
user: process.env.MYSQL_USER || 'root',
password: process.env.MYSQL_PASSWORD || '',
database: process.env.MYSQL_DATABASE || 'test',
port: process.env.MYSQL_PORT || 3306,
connectionLimit: 1,
connectTimeout: 5000
};
const pool = mysql.createPool(dbConfig);
const connection = await pool.getConnection();
await connection.query('SELECT 1');
connection.release();
await pool.end();
return { success: true, message: 'Подключение успешно' };
} catch (error) {
return { success: false, message: error.message };
}
};