diff --git a/frontend/src/lib/minio.ts b/frontend/src/lib/minio.ts index 4c79530..af88d7d 100644 --- a/frontend/src/lib/minio.ts +++ b/frontend/src/lib/minio.ts @@ -1,22 +1,27 @@ import { S3Client, HeadBucketCommand, CreateBucketCommand, PutBucketPolicyCommand, PutObjectCommand, DeleteObjectCommand, GetObjectCommand, ListObjectsV2Command } from '@aws-sdk/client-s3'; -const endpointHost = process.env.MINIO_ENDPOINT || 'localhost'; -const port = Number.parseInt(process.env.MINIO_PORT || '9000', 10); -const useSSL = process.env.MINIO_USE_SSL === 'true'; +// Prioriza as novas variáveis S3_*, mas mantém MINIO_* para compatibilidade +const endpointHost = process.env.S3_ENDPOINT || process.env.MINIO_ENDPOINT || 'localhost'; +const port = Number.parseInt(process.env.S3_PORT || process.env.MINIO_PORT || '9000', 10); +const useSSL = (process.env.S3_USE_SSL || process.env.MINIO_USE_SSL) === 'true'; const protocol = useSSL ? 'https' : 'http'; -const endpointUrl = `${protocol}://${endpointHost}:${port}`; -console.log(`[MinIO] Configurando cliente: ${endpointHost}:${port} (SSL: ${useSSL})`); +// Para S3 externos (como RustFS), o endpointUrl pode não precisar da porta se for padrão (80/443) +const endpointUrl = (port === 80 || port === 443) + ? `${protocol}://${endpointHost}` + : `${protocol}://${endpointHost}:${port}`; -export const bucketName = process.env.MINIO_BUCKET_NAME || 'occto-images'; +console.log(`[S3/MinIO] Configurando cliente: ${endpointUrl} (SSL: ${useSSL})`); + +export const bucketName = process.env.S3_BUCKET_NAME || process.env.MINIO_BUCKET_NAME || 'occto-images'; export const s3Client = new S3Client({ region: 'us-east-1', endpoint: endpointUrl, forcePathStyle: true, credentials: { - accessKeyId: process.env.MINIO_ACCESS_KEY || 'admin', - secretAccessKey: process.env.MINIO_SECRET_KEY || 'adminpassword', + accessKeyId: process.env.S3_ACCESS_KEY || process.env.MINIO_ACCESS_KEY || 'admin', + secretAccessKey: process.env.S3_SECRET_KEY || process.env.MINIO_SECRET_KEY || 'adminpassword', }, }); @@ -42,6 +47,7 @@ export const minioClient = { } catch (error: unknown) { const err = error as { $metadata?: { httpStatusCode?: number } }; if (err?.$metadata?.httpStatusCode === 404) return false; + if (err?.$metadata?.httpStatusCode === 403) return true; // Sem permissão para HeadBucket, mas pode existir if (err?.$metadata?.httpStatusCode === 301) return true; // Bucket existe mas outra região throw error; } @@ -60,7 +66,11 @@ export const minioClient = { }, async setBucketPolicy(bucket: string, policy: string) { - await s3Client.send(new PutBucketPolicyCommand({ Bucket: bucket, Policy: policy })); + try { + await s3Client.send(new PutBucketPolicyCommand({ Bucket: bucket, Policy: policy })); + } catch (error) { + console.warn('Aviso: Não foi possível definir a política do bucket. Verifique as permissões do seu provedor S3.', error); + } }, async putObject(bucket: string, key: string, body: Buffer | Uint8Array | string, size?: number, metadata?: MetadataMap) { @@ -96,6 +106,7 @@ export async function ensureBucketExists() { try { const exists = await minioClient.bucketExists(bucketName); if (!exists) { + console.log(`Tentando criar o bucket ${bucketName}...`); await minioClient.makeBucket(bucketName); const policy = { @@ -114,6 +125,6 @@ export async function ensureBucketExists() { console.log(`Bucket ${bucketName} criado e política pública aplicada.`); } } catch (error) { - console.error('Erro ao garantir existência do bucket MinIO:', error); + console.error('Erro ao garantir existência do bucket S3:', error); } }