165 lines
6.3 KiB
JavaScript
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 };
|
|
}
|
|
}; |