first commit
This commit is contained in:
@@ -0,0 +1,165 @@
|
||||
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 };
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user