nakama/backend/utils/minioDebug.js

112 lines
3.8 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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