Tạo Object Storage Server S3 với MinIO và Docker trên môi trường development là hướng dẫn nhanh tạo S3 giả lập trên local và hướng dẫn kết nối với S3 API bằng Nodejs đơn giản thông qua ví dụ cụ thể
MinIO là gì?
MinIO là một mã nguồn mở viết bằng Go được thiết kế cho cơ sở hạn tầng đám mây riêng, giúp bạn tự tạo một Object Storage Server giống như AWS S3, DigitalOcean Spaces, Backblaze B2, ... dùng để phục vụ lưu trữ dữ liệu với đâỳ đủ các tính năng như các dịch vụ của những tổ chức lớn đó
MinIO sẽ giúp bạn có thể tạo chức năng lưu trữ S3 cục bộ, phát triển và thử nghiệm API của mình mà không cần bất kỳ tài khoản S3 thực tế nào. Sau đó khi public sản phẩm, bạn chỉ cần thay đổi thông tin xác thực từ MinIO sang S3 mà không cần thay đổi bất kỳ mã nội bộ nào.
Cấu trúc của MinIO gồm 3 phần chính:
- MinIO Server: MinIO Server đóng vai trò là thành phần gốc. (Root Component)
- MinIO Client: cung cấp giải pháp thay thế cho các lệnh UNIX như ls, cat, cp, mirror, diff, find, v.v.
- MinIO Client SDK: cung cấp API để truy cập bất kỳ máy chủ lưu trữ đối tượng nào, gồm SDK: Jave, Go, Python, JavaScript , Net
Cài đặt MinIO với Docker
Tạo file docker-compose.yml
version: '3.0'
minio:
image: minio/minio
container_name: minio
ports:
- "9000:9000"
- "9001:9001"
command: server --console-address ":9001" /data
environment:
MINIO_ROOT_USER: minioadmin
MINIO_ROOT_PASSWORD: minioadmin
volumes:
- minio_storage:/data
volumes:
minio_storage: {}
Sau đó dùng lệnh
docker-compose up -d
Thông tin config:
- Port 9000 là endpoint S3 API
- Port 9001 là MinOI Dashboad
- MINIO_ROOT_USER: minioadmin là user
- MINIO_ROOT_PASSWORD: minioadmin lá password
Sau đó bạn mở trình duyệt http://localhost:9001/
để vào trang quản trị của MinOI
Tạo Bucket, Region và Access Keys trong MinIO
Sau khi login => chọn menu => Buckets => Click button "Create Bucket"
Tiếp tục vào trong Menu => Access Keys để tạo một key mới
Chú ý, key generate một lần nên lưu lại nó ngay sau khi tạo
Tương tự tạo Region S3 ở menu > Configuration > Region, có thể bỏ trống để giá trị mặc định là us-east-1
Sử dụng S3 từ MinIO với Nodejs
Tạo file .env
với config
S3_UPLOAD_BUCKET_NAME=for-test-bk
S3_ACCESS_KEY=minioadmin
S3_SECRET_ACCESS_KEY=minioadmin
S3_ENDPOINT_OVERRIDE=http://127.0.0.1:9000
S3_REGION=us-east-1
Sau đó cài đặt package aws-sdk,@aws-sdk/lib-storage,@aws-sdk/client-s3
Giờ có thể test API S3 với MinIO trên local với config
import { S3Client } from "@aws-sdk/client-s3";
const S3Client = new S3Client({
region: process.env.S3_REGION,
endpoint: process.env.S3_ENDPOINT_OVERRIDE,
credentials: {
accessKeyId: process.env.S3_ACCESS_KEY ?? '',
secretAccessKey: process.env.S3_SECRET_ACCESS_KEY ?? ''
},
forcePathStyle: true // important
});
Bây giờ mình sẽ test upload file vởi API S3
const uuid = v4();
const params = {
Bucket: process.env.S3_UPLOAD_BUCKET_NAME ?? '',
Key: `${uuid}/demo.jpg`,
Body: fs.createReadStream('path/to/demo.jpg')
};
const res = await new Upload({
client: S3Client,
params: params,
}).done();
Kết quả: