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 }; } };