/** * Утилита для отладки MinIO */ const config = require('../config'); const { log } = require('../middleware/logger'); /** * Вывести информацию о MinIO конфигурации */ function printMinioConfig() { log('info', '🗄️ MinIO Configuration:', { enabled: config.minio.enabled, endpoint: config.minio.endpoint, port: config.minio.port, useSSL: config.minio.useSSL, bucket: config.minio.bucket, region: config.minio.region, publicUrl: config.minio.publicUrl || '(auto)', publicBucket: config.minio.publicBucket }); // Показать пример URL const protocol = config.minio.useSSL ? 'https' : 'http'; const port = config.minio.port === 80 || config.minio.port === 443 ? '' : `:${config.minio.port}`; const exampleUrl = `${protocol}://${config.minio.endpoint}${port}/${config.minio.bucket}/posts/example-123456789.jpg`; log('info', '📸 Пример URL файла:', { url: exampleUrl }); // Проверки const warnings = []; if (config.minio.port === 9001 || config.minio.port === 9901) { warnings.push('⚠️ ПОРТ 9001/9901 - это консоль MinIO! Используйте порт 9000 для API'); } if (!config.minio.publicBucket) { warnings.push('⚠️ Bucket не публичный! Установите MINIO_PUBLIC_BUCKET=true или настройте политику доступа'); } if (config.minio.accessKey === 'minioadmin') { warnings.push('⚠️ Используются дефолтные credentials! Создайте Service Account в MinIO Console'); } if (warnings.length > 0) { warnings.forEach(warning => log('warn', warning)); } else { log('info', '✅ Конфигурация выглядит правильно'); } } /** * Тестовая функция для проверки доступности URL */ async function testImageUrl(imageUrl) { try { const https = require('https'); const http = require('http'); const url = require('url'); const parsedUrl = url.parse(imageUrl); const client = parsedUrl.protocol === 'https:' ? https : http; return new Promise((resolve, reject) => { client.get(imageUrl, (res) => { log('info', 'Проверка URL:', { url: imageUrl, statusCode: res.statusCode, contentType: res.headers['content-type'], contentLength: res.headers['content-length'] }); if (res.statusCode === 200) { resolve(true); } else if (res.statusCode === 403) { log('error', '❌ 403 Forbidden - Bucket не публичный или нет прав доступа'); resolve(false); } else if (res.statusCode === 404) { log('error', '❌ 404 Not Found - Файл не существует'); resolve(false); } else { log('warn', `⚠️ Неожиданный статус: ${res.statusCode}`); resolve(false); } }).on('error', (err) => { log('error', '❌ Ошибка подключения к MinIO:', { error: err.message, code: err.code }); if (err.code === 'ECONNREFUSED') { log('error', '💡 MinIO недоступен. Проверьте:'); log('error', ' 1. MinIO запущен?'); log('error', ' 2. Порт правильный? (9000 для API, не 9001/9901)'); log('error', ' 3. Firewall разрешает подключение?'); } reject(err); }); }); } catch (error) { log('error', 'Ошибка тестирования URL:', { error: error.message }); return false; } } module.exports = { printMinioConfig, testImageUrl };