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.
Mục Lục
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.yml
Code 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" /data
Code language: YAML (yaml)
Bạn cần thay đổi 2 thông số MINIO_ROOT_USER
và MINIO_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_USER
và MINIO_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" /data
Code 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-client
Code 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.json
Code 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.gz
Code 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 0s
Code 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.
Mình làm như bạn hướng dẫn upload file thành công lên bằng Minio Console nhưng không thể preview file (file ảnh) cũng như không thể tải file đã tải lên lại về máy
Cho mình hỏi nếu làm như hiện tại thì sau này docker có bị phình ra quá lớn không bạn? Và phương hướng để mình sao lưu dữ liệu trên Minio này thế nào. Cám ơn bạn.
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.
Mình chưa gặp lỗi này bao giờ. Nhưng thấy có người đã báo lỗi và cách sửa lỗi ở đây: https://stackoverflow.com/a/20978945. Chạy lệnh:
sudo ntpdate ntp.ubuntu.com
để đồng bộ đồng hồ trên server lại cho chính xác.Cấu hình tối thiểu để chạy minio là như nào nhỉ ad
Bạn xem ở đây: https://min.io/docs/minio/windows/operations/checklists/hardware.html
Mình thì chạy trên con Storage VPS cùi bắp thấy vẫn ngon lành.
hello,
Mình config minio và Nginx Proxy Manager theo hướng dẫn này nhưng không hoạt động báo lỗi 502 Bad Gateway. Có thể do nguyên nhân là config này chỉ có giao thức HTTP INTERNAL bên ngoài lại chạy HTTPS nên lỗi. Bạn có thể support được không?
https://thuanbui.me/tao-object-storage-server-voi-minio-docker/
Trân trọng,
Có thể bạn đã làm sai bước nào đó. Mình đang thiết lập Minio và dùng NPM để làm Reverse Proxy theo hướng trong bài, chạy ổn định mấy năm nay.