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