66 lines
2.5 KiB
TypeScript
66 lines
2.5 KiB
TypeScript
import { Client } from 'minio';
|
|
|
|
// Инициализация MinIO клиента через переменные окружения
|
|
// Добавьте в .env:
|
|
// MINIO_ENDPOINT=localhost
|
|
// MINIO_PORT=9000
|
|
// MINIO_USE_SSL=false
|
|
// MINIO_ACCESS_KEY=your_access_key
|
|
// MINIO_SECRET_KEY=your_secret_key
|
|
// MINIO_BUCKET_PREFIX=ospab
|
|
|
|
const {
|
|
MINIO_ENDPOINT,
|
|
MINIO_PORT,
|
|
MINIO_USE_SSL,
|
|
MINIO_ACCESS_KEY,
|
|
MINIO_SECRET_KEY
|
|
} = process.env;
|
|
|
|
export const minioClient = new Client({
|
|
endPoint: MINIO_ENDPOINT || 'localhost',
|
|
port: MINIO_PORT ? parseInt(MINIO_PORT, 10) : 9000,
|
|
useSSL: (MINIO_USE_SSL || 'false') === 'true',
|
|
accessKey: MINIO_ACCESS_KEY || 'minioadmin',
|
|
secretKey: MINIO_SECRET_KEY || 'minioadmin'
|
|
});
|
|
|
|
export function buildPhysicalBucketName(userId: number, logicalName: string): string {
|
|
const prefix = process.env.MINIO_BUCKET_PREFIX || 'ospab';
|
|
return `${prefix}-${userId}-${logicalName}`.toLowerCase();
|
|
}
|
|
|
|
export function isMinioAuthError(err: unknown): boolean {
|
|
if (!err || typeof err !== 'object') return false;
|
|
const message = (err instanceof Error ? err.message : String(err)).toLowerCase();
|
|
return message.includes('invalidaccesskeyid') || message.includes('accesskeyid') || message.includes('invalid access key') || message.includes('signaturedoesnotmatch') || message.includes('signature does not match');
|
|
}
|
|
|
|
export function isMinioNoSuchBucketError(err: unknown): boolean {
|
|
if (!err || typeof err !== 'object') return false;
|
|
const message = (err instanceof Error ? err.message : String(err)).toLowerCase();
|
|
return message.includes('nosuchbucket') || message.includes('notfound') || message.includes('no such bucket');
|
|
}
|
|
|
|
export async function ensureBucketExists(bucketName: string, region: string): Promise<void> {
|
|
try {
|
|
const exists = await minioClient.bucketExists(bucketName);
|
|
if (!exists) {
|
|
await minioClient.makeBucket(bucketName, region);
|
|
}
|
|
} catch (err: unknown) {
|
|
if (isMinioAuthError(err)) {
|
|
// Provide a more actionable error message for auth issues
|
|
const e = new Error(`MinIO authentication failed for endpoint ${MINIO_ENDPOINT}:${MINIO_PORT}. Check MINIO_ACCESS_KEY/MINIO_SECRET_KEY environment variables.`);
|
|
(e as any).code = 'MINIO_AUTH_ERROR';
|
|
throw e;
|
|
}
|
|
if (isMinioNoSuchBucketError(err)) {
|
|
const e = new Error(`MinIO bucket error: bucket ${bucketName} not found or inaccessible.`);
|
|
(e as any).code = 'MINIO_BUCKET_NOT_FOUND';
|
|
throw e;
|
|
}
|
|
throw err;
|
|
}
|
|
}
|