112 lines
3.8 KiB
JavaScript
112 lines
3.8 KiB
JavaScript
/**
|
||
* Утилита для отладки 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
|
||
};
|
||
|