import * as Minio from 'minio' // MinIO 配置 - 从环境变量读取 export const minioConfig = { endPoint: process.env.MINIO_ENDPOINT || 'localhost', port: parseInt(process.env.MINIO_PORT || '9000'), useSSL: process.env.MINIO_USE_SSL === 'true', accessKey: process.env.MINIO_ACCESS_KEY || '', secretKey: process.env.MINIO_SECRET_KEY || '' } export const BUCKET_NAME = process.env.MINIO_BUCKET_NAME || 'winupdate' // 验证配置 if (!minioConfig.accessKey || !minioConfig.secretKey) { console.error('❌ MinIO 配置不完整,请检查环境变量 MINIO_ACCESS_KEY 和 MINIO_SECRET_KEY') } // 创建 MinIO 客户端 export const minioClient = new Minio.Client(minioConfig) // 测试连接并确保 bucket 存在 export async function initializeMinIO(): Promise { try { // 测试连接 await minioClient.listBuckets() console.log('✅ MinIO 连接成功') // 检查 bucket 是否存在 const bucketExists = await minioClient.bucketExists(BUCKET_NAME) if (!bucketExists) { console.log(`❌ Bucket "${BUCKET_NAME}" 不存在`) return false } console.log(`✅ Bucket "${BUCKET_NAME}" 存在`) return true } catch (error) { console.error('❌ MinIO 连接失败:', error) return false } } // 测试上传小文件 export async function testMinIOUpload(): Promise { try { const testData = Buffer.from('Hello MinIO! This is a test file.') const objectName = `test/test-${Date.now()}.txt` await minioClient.putObject(BUCKET_NAME, objectName, testData) console.log(`✅ 测试文件上传成功: ${objectName}`) // 测试下载 const stream = await minioClient.getObject(BUCKET_NAME, objectName) const chunks: Buffer[] = [] return new Promise((resolve, reject) => { stream.on('data', (chunk) => chunks.push(chunk)) stream.on('end', () => { const downloadedData = Buffer.concat(chunks) if (downloadedData.toString() === testData.toString()) { console.log('✅ 测试文件下载成功') // 清理测试文件 minioClient.removeObject(BUCKET_NAME, objectName).catch(console.error) resolve(true) } else { console.log('❌ 测试文件下载数据不匹配') resolve(false) } }) stream.on('error', (error) => { console.error('❌ 测试文件下载失败:', error) reject(error) }) }) } catch (error) { console.error('❌ MinIO 测试失败:', error) return false } }