81 lines
2.5 KiB
TypeScript
81 lines
2.5 KiB
TypeScript
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<boolean> {
|
|
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<boolean> {
|
|
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
|
|
}
|
|
}
|