Chuyên mục
Self Hosting

Tạo Object Storage Server với MinIO + Docker

Sau một thời gian sử dụng Hetzner Storage Box để sao lưu dữ liệu cho các trang WordPress, mình đã quyết định chia tay để tìm giải pháp mới. Mặc dù giá của bên Hetzner rất rẻ: 1TB lưu trữ có phí €2.9 / tháng, nhưng bù lại có những hạn chế khiến mình thấy không còn phù hợp.

  • Không có giao diện web để quản lý và tải file. Phải sử dụng SFTP / FTP Client hoặc Web Dav để truy cập.
  • Tốc độ kết nối về các server ở Singapore / Hong Kong không nhanh như kì vọng. Mỗi lần cần kéo file về để phục hồi dữ liệu phải chờ rất lâu.

Trong đó tốc độ chậm là lý do quan trọng nhất khiến mình phải hủy dịch vụ Storage Box của Hetzner. Giải pháp thay thế hiện tại của mình là sử dụng MinIO để tạo Object Storage Server trên VPS được đặt tại Singapore.

Bài viết này sẽ hướng dẫn cách cài đặt MinIO lên VPS để thiết lập Object Storage Server dùng để lưu trữ dữ liệu.

I. MinIO là gì?

Nói đến Object Storage, có lẽ ai cũng biết đến Amazon S3, dịch vụ lưu trữ cloud nổi tiếng nhất thế giới. Bên cạnh đó, chúng ta còn có thêm Digital Ocean Spaces, Linode Object Storage, Wasabi, Backblaze B2,… là các dịch vụ Object Storage phổ biến khác, tương thích với API của Amazon S3.

MinIO là một ứng dụng mã nguồn mở giúp bạn tự tạo một Object Storage Server cho riêng mình, dùng để phục vụ lưu trữ dữ liệu như hình ảnh, video, log files,….

Giải thích dễ hiểu hơn thì MinIO sẽ giúp bạn tạo ra một máy chủ lưu trữ (file server), giúp dễ dàng upload, download file, tương tự như khi sử dụng Google Drive, OneDrive, Dropbox… MinIO

MinIO cũng được tích hợp sẵn các hàm API để tương thích với dịch vụ Object Storage AWS S3 của Amazon. Nhờ đó chúng ta có thể upload, download file thông qua API, tiện lợi khi tích hợp vào các ứng dụng web.

Minio có thể cài đặt trên nhiều hệ điều hành như: Windows, Linux, MacOS hoặc môi trường ảo hóa như Docker.

II. Cài đặt MinIO bằng Docker

Mình sẽ cài đặt MinIO bằng Docker trên Ubuntu 20.04 cho đơn giản, gọn lẹ. Tạo thư mục mới và một file docker-compose.yml

mkdir ~/minio
cd minio
nano docker-compose.ymlCode language: Bash (bash)

Nhập vào nội dung bên dưới và lưu lại

version: '3'

services:
  minio:
    image: minio/minio
    container_name: minio
    ports:
      - "9000:9000"
      - "9001:9001"
    volumes:
      - ./storage:/data
    environment:
      MINIO_ROOT_USER: thuanbuidepchai
      MINIO_ROOT_PASSWORD: vodichtoanvutru
    command: server --console-address ":9001" /dataCode language: YAML (yaml)

Bạn cần thay đổi 2 thông số MINIO_ROOT_USERMINIO_ROOT_PASSWORD cho phù hợp.

Kích hoạt MinIO

docker-compose up -d

Mở trình duyệt và truy cập vào địa chỉ http://<IP-Server>:9001.

Đăng nhập bằng thông số MINIO_ROOT_USERMINIO_ROOT_PASSWORD đã cấu hình trước đó.

II. Tạo Bucket lưu trữ

Các đối tượng lưu trữ được MinIO quản lý theo từng Bucket, có thể được hiểu như là một thư mục trong hệt thống.

Để tạo Bucket mới, bấm vào mục Buckets ở menu bên trái, sau đó bấm tiếp vào Create Bucket +

Đặt tên cho Bucket trong mục Bucket Name và chọn thêm các tính năng nếu cần, sau đó bấm Create Bucket để tạo mới.

  • Versioning: kích hoạt tính năng lưu trữ nhiều phiên bản khác nhau của file trong bucket.
  • Object Locking: ngăn không cho xóa file.
  • Quota: giới hạn dung lượng sử dụng.
  • Retention: giới hạn số ngày lưu trữ (chỉ hiện ra khi kích hoạt Versioning).

Bạn có thể tạo thêm thư mục con bên trong Bucket bằng cách bấm vào Create new path.

Đặt tên thư mục và bấm Create.

Sau khi tạo xong, bạn có thể upload file trực tiếp lên server bằng cách bấm nút Upload.

III. Tạo Access Keys

Để truy cập vào hệ thống lưu trữ của MinIO, chúng ta cần tạo Access Keys để cấp quyền.

Bấm vào mục Access Keys ở menu bên trái, bấm vào Create access key + để tạo mới

Hệ thống sẽ tự động tạo ra Access Key và Secret Key. Bấm Create để xác nhận

Phần Secret Key sẽ chỉ ra hiện ra một lần duy nhất. Bạn cần lưu lại để sử dụng sau. Hoặc có thể bấm nút Download for import để tải thông tin về máy, sẽ cần dùng để cấu hình MinIO Client ở bước sau.

IV. Tạo Reserve Proxy cho MinIO

Mình sử dụng Nginx Proxy Manager để tạo Reverse Proxy cho MinIO theo hướng dẫn đã chia sẻ trước đây

Cần phải tạo 2 Proxy Host khác nhau:

  • minio.thuanbui.me để chuyển hướng về API (port 9000)
  • console.thuanbui.me để chuyển hướng về Console (port 9001)

Bạn cần bấm thêm vào mục SSL để tạo chứng chỉ Let’s Encrypt cho cả hai tên miền. Ngoài ra cần bổ sung thêm các thông số nâng cao ở mục Advanced của cả hai Proxy Host, theo tài liệu hướng dẫn của MinIO.

client_max_body_size 1000m;
proxy_buffering off;
ignore_invalid_headers off;Code language: Nginx (nginx)

Tiếp theo, cập nhật lại nội dung file docker-compose.yml để bổ sung thông số URL vào phần environment

MINIO_BROWSER_REDIRECT_URL: https://console.minio.thuanbui.me
MINIO_SERVER_URL: https://minio.thuanbui.me
Code language: JavaScript (javascript)

Toàn bộ nội dung file docker-compose.yml giờ sẽ như sau

version: '3'

services:
  minio:
    image: minio/minio
    container_name: minio
    ports:
      - "9000:9000"
      - "9001:9001"
    volumes:
      - ./storage:/data
    environment:
      MINIO_ROOT_USER: thuanbuidepchai
      MINIO_ROOT_PASSWORD: vodichtoanvutru
      MINIO_BROWSER_REDIRECT_URL: https://console.minio.thuanbui.me
      MINIO_SERVER_URL: https://minio.thuanbui.me
    command: server --console-address ":9001" /dataCode language: YAML (yaml)

Kích hoạt lại bằng MinIO bằng lệnh docker-compose up -d. Sau đó, dùng trình duyệt truy cập vào MinIO bằng tên miền https://console.minio.thuanbui.me. Hoặc bạn cũng có thể truy cập vào https://minio.thuanbui.me, hệ thống sẽ tự động chuyển hướng qua tên miền console.

V. Sử dụng MinIO Client

1. Cài đặt MinIO Client

Cài đặt trên EndevourOS / Arch Linux bằng lệnh sau

yay -S minio-clientCode language: Nginx (nginx)

Cài đặt trên bản Linux khác

curl https://dl.min.io/client/mc/release/linux-amd64/mc \
  --create-dirs \
  -o $HOME/minio-binaries/mc

chmod +x $HOME/minio-binaries/mc
export PATH=$PATH:$HOME/minio-binaries/Code language: Nginx (nginx)

Với macOS, Windows, tham khảo cách cài đặt MinIO Client ở đây.

2. Sử dụng MinIO Client

Dòng lệnh của MinIO client mặc định là mc. Tuy nhiên, trên EndeavourOS, nó được đổi thành mcli để tránh xung đột với Midnight Commander.

Khi kích hoạt mcli lần đầu tiên, hệ thống sẽ tự tạo các file cấu hình và hiện thông báo như bên dưới.

➜  ~ mcli
mcli: Configuration written to `/home/thuanbui/.mcli/config.json`. Please update your access credentials.
mcli: Successfully created `/home/thuanbui/.mcli/share`.
mcli: Initialized share uploads `/home/thuanbui/.mcli/share/uploads.json` file.
mcli: Initialized share downloads `/home/thuanbui/.mcli/share/downloads.json` file.
Code language: JavaScript (javascript)

Mình sẽ nhập Access key từ file credentials.json đã tải về ở bước trước đó vào máy bằng lệnh sau mcli alias import <alias-name> <json file>

mcli alias import thuanbui ~/Downloads/credentials.jsonCode language: JavaScript (javascript)

Xem danh sách bucket hiện có trên MinIO bằng lệnh mcli ls <alias-name>

  ~ mcli ls thuanbui
[2022-12-18 14:58:20 +07]     0B thuanbui/
Code language: YAML (yaml)

Xem chi tiết các file trong thư mục thuanbui.me bằng lệnh mcli ls singapore/thuanbui/thuanbui.me

  ~ mcli ls singapore/thuanbui/thuanbui.me
[2022-12-18 18:51:32 +07] 5.0MiB STANDARD backup_2022-12-18-1851_Thun_Bi_5cc307e742eb-db.gz
[2022-12-18 20:48:37 +07] 5.1MiB STANDARD backup_2022-12-18-2048_Thun_Bi_b4b47fc1e995-db.gz
[2022-12-19 00:48:52 +07] 5.0MiB STANDARD backup_2022-12-19-0048_Thun_Bi_75b908c819d7-db.gz
[2022-12-19 04:48:52 +07] 5.0MiB STANDARD backup_2022-12-19-0448_Thun_Bi_1564814d801c-db.gz
[2022-12-19 08:49:09 +07] 5.0MiB STANDARD backup_2022-12-19-0848_Thun_Bi_6dacb0d8b843-db.gz
[2022-12-19 12:49:30 +07] 5.1MiB STANDARD backup_2022-12-19-1249_Thun_Bi_1c4f5701888b-db.gz
[2022-12-19 16:48:20 +07] 5.1MiB STANDARD backup_2022-12-19-1648_Thun_Bi_b0eacdc244c6-db.gz
[2022-12-19 17:11:52 +07] 9.4MiB STANDARD backup_2022-12-19-1705_Thun_Bi_afc6236670df-others.zip
[2022-12-19 17:06:09 +07]  85MiB STANDARD backup_2022-12-19-1705_Thun_Bi_afc6236670df-plugins.zip
[2022-12-19 17:06:14 +07] 3.2MiB STANDARD backup_2022-12-19-1705_Thun_Bi_afc6236670df-themes.zip
[2022-12-19 17:11:39 +07] 381MiB STANDARD backup_2022-12-19-1705_Thun_Bi_afc6236670df-uploads.zip
[2022-12-19 20:48:24 +07] 5.1MiB STANDARD backup_2022-12-19-2048_Thun_Bi_a71426e1ee47-db.gz
[2022-12-20 00:48:36 +07] 5.0MiB STANDARD backup_2022-12-20-0048_Thun_Bi_39c41bca75fa-db.gz
[2022-12-20 04:48:38 +07] 5.0MiB STANDARD backup_2022-12-20-0448_Thun_Bi_6810e19aa00b-db.gz
[2022-12-20 08:48:52 +07] 5.0MiB STANDARD backup_2022-12-20-0848_Thun_Bi_121c45153445-db.gzCode language: YAML (yaml)

Để sao lưu thư mục hiện tại trên máy lên MinIO, sử dụng lệnh mcli mirror <source> <target>

  ~ mcli mirror frigate singapore/thuanbui/frigate
.../storage/frigate.db-wal: 153.98 KiB / 153.98 KiB ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 408.79 KiB/s 0sCode language: YAML (yaml)

Tham khảo thêm chi tiết cách sử dụng MinIO Client theo hướng dẫn ở đây: Documentation.

VI. Cấu hình MinIO trên Updraft

Mục đích chính của mình khi thiết lập Object Storage Server bằng MinIO là để sao lưu các trang WordPress bằng plugin Updraft Plus. Truy cập vào phần Settings, chọn S3-Compatible (Generic), nhập vào thông tin

  • S3 Access Key: dùng thông số đã tạo ở bước III
  • S3 Secrete Key: dùng thông số đã tạo ở bước III
  • S3 location: điền tên bucket đã tạo ở bước II. Có thể gõ thêm tên thư mục con bên trong bucket.
  • S3 end-point: điền IP của máy chủ hoặc tên miền đã cấu hình ở bước IV.

Bấm vào nút Test S3 Settings để kiểm tra kết nối. Nếu thấy hiện ra thông báo như dưới đây nghĩa là Updraft đã kết nối thành công đến server MinIO.

Nếu sử dụng địa chỉ IP của server ở phần S3 end-point, bạn cần phải kéo xuống dưới, bấm vào nút Show expert settings để mở các thiết lập nâng cao, sau đó tick chọn vào 2 mục Do not verify SSL certificates và Disable SSL entirely where possible. Sau đó bấm Save changes.

Updraft Plus sẽ tự động sao lưu database / plugins / themes /… lên server MinIO theo cấu hình được thiết lập.

Chúc bạn cài đặt và cấu hình thành công MinIO.

Nếu bài viết của mình mang đến thông tin, kiến thức hữu ích cho bạn, đừng ngại mời mình ly bia để có thêm động lực chia sẻ nhiều hơn nữa. Cám ơn bạn!

Lưu ý: Nếu bạn cần hỗ trợ kỹ thuật, vui lòng gửi câu hỏi trực tiếp ở phần Thảo luận bên dưới, mình sẽ trả lời sớm. Đừng mò vào hỏi trong fanpage Yêu Chạy Bộ, sẽ không có phản hồi đâu!

Bởi Thuận Bùi

Runner at Yêu Chạy Bộ. Blogger at Ba Lô & Dép Lào. Web Developer at TB's Blog.
Follow me: Facebook / Instagram

7 trả lời trong “Tạo Object Storage Server với MinIO + Docker”

Dữ liệu của Minio được map vào thư mục bạn đã cấu hình trong file docker-compose.yml. Lưu càng nhiều thì nó càng phình ra thôi. Còn sao lưu dữ liệu thì bạn có thể dùng Borg, Restic,…

Anh ơi, cho em hỏi với ạ. Em đã làm theo anh hướng dẫn nhưng gặp phải lỗi “the difference between the request time and the current time is too large” khi call api get bucket. Em đã tra gg nhưng chưa giải quyết được. Hi vọng anh sẽ cho em vài định hướng để giải quyết vấn đề với ạ, em cám ơn anh.

Trả lời Thắng Hủy

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *