Chắc các bạn đã từng nghe nói tới dịch vụ Amazon S3 nổi tiếng của AWS (Amazon Web Services). Đây là dịch vụ lưu trữ cloud (Object Storage) nổi tiếng nhất thế giới hiện nay. Bài viết này, mình sẽ hướng dẫn các bạn tạo một Object Storage Server riêng cho mình để lưu trữ hình ảnh, video, file sử dụng Minio.
Minio là gì?
Minio là mã nguồn mở Object Storage, tương thích với Amazon S3, Kubernetes và được thiết kế để phục vụ lưu trữ dữ liệu như ảnh, video, file….
- Phát triển bởi: MinIO, Inc
- Phiên bản ổn định: 18/10/2020
- Repository: github.com/minio/minio
- Được viết bằng Go
Loại: Object storage
- License Apache License 2.0
- Website: min.io
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.
Hướng dẫn cài đặt Object Storage Server bằng Minio (Trên CentOS 7)
Việc cài đặt được thực hiện đơn giản với các bước sau đây:
Bước 1: Download minio script về
wget https://dl.min.io/server/minio/release/linux-amd64/minio
Bước 2: Thêm quyền thực thi cho script
sudo chmod +x minio
Bước 3: Tạo thư mục và gán chủ sở hữu là user mà bạn đang sử dụng
sudo mkdir /opt/data sudo chown -R $USER:$USER /opt/data
Bước 4: Cài đặt Object Storage Server
MINIO_ACCESS_KEY=<access_key> MINIO_SECRET_KEY=<secret_key> ./minio server /opt/data &
- <access_key>: Access Key
- <secret_key>: Secret Key
Bạn cần lưu 2 key này để đăng nhập vào Server. Các bạn có thể coi đó như là 2 key như là user/password. hoặc tự động gen thông qua website: https://randomkeygen.com/
Bước 5: Đăng nhập
Sau đó chúng ta truy cập mino server với đường dẫn: https://<server_ip>:9000
Nhập thông tin <access_key> và <secret_key> để đăng nhập
Sau khi đăng nhập thành công, chúng ta vào được trang quản lý của Minio Server
Chúng ta có thể thực hiện upload và quản lý files thông qua trình duyệt. Hoặc có thể sử dụng api tương thích với Amazon S3 để upload file.
Vui lòng tham khảo bài viết sau:
Thiết lập tên miền + HTTPS cho Minio Server
Các bước thực hiện bao gồm:
- Cấu hình DNS trỏ về Minio Server
- Cài đặt Let’s Encrypt (SSL Miễn phí)
- Chạy Minio Server với PM2
- Cài đặt và cấu hình Nginx Server
- Tạo bucket và public bucket ra ngoài
1. Cấu hình DNS trỏ về Minio Server
Để sử dụng tên miền với Minio Server, chúng ta truy cập vào trang quản trị DNS của tên miền => Tạo bản ghi A => Trỏ về địa chỉ IP của Server
VD: Mình tạo bản ghi A và trỏ về địa chỉ IP sử dụng CloudFlare
2. Cài đặt Let’s Encrypt trên server (CentOS 7)
Hầu hết các trang web đều đang sử dụng https và các trình duyệt sẽ cảnh báo bảo mật nếu website của bạn không sử dụng kết nối bảo mật https nên chúng ta cài đặt chứng chỉ SSL miễn phí từ Let’s Encrypt. Bài viết này sẽ hướng dẫn cài đặt Let’s Encrypt trên CentOS 7. Nếu các bạn sử dụng Debian hay Ubuntu thì vui lòng tham khảo bài viết sau: “Hướng dẫn cài đặt SSL miễn phí Let’s Encrypt” hoặc chuyên nghiệp hơn là mua chứng chỉ tại Namecheap.
Để cài Let’s Encrypt trên CentOS 7 chúng ta thực hiện các lệnh bên dưới để cài đặt Certbot
sudo yum install epel-release sudo yum update sudo yum install certbot-nginx
Tiếp theo là phát hành SSL cho domain của chúng ta
certbot certonly --standalone -d <your_domain> --staple-ocsp -m <your_email> --agree-tos
- <your_domain>: Là tên miền của bạn. VD: test.vinasupport.com
- <your_email>: Email của bạn
Sau khi chạy lệnh trên, SSL sẽ được phát hành được lưu tại đường dẫn: /etc/letencrypt/live/<your_domain>
3. Chạy Minio Server với PM2
PM2 là gì? Mặc định Minio sẽ chạy dưới dạng command line. Nhưng mình muốn chạy nó như 1 server có thể start/stop/restart được nên mình sử dụng PM2 để giữ nó chạy online 24/7. Để cài đặt PM2 các bạn vui lòng tham khảo bài viết: “Giữ ứng dụng chạy online 24/7 với PM2”
Mình tạo 1 script là: start_minio.sh với nội dung như sau:
#!/bin/bash export MINIO_DOMAIN=<your_domain> export MINIO_ACCESS_KEY=<access_key> export MINIO_SECRET_KEY=<secret_key> /opt/minio server /opt/data --console-address 127.0.0.1:9000
Sau đó chạy các lệnh sau để PM2 sử dụng các script này quản lý Minio
sudo pm2 start /opt/scripts/start_minio.sh sudo pm2 save sudo pm2 startup systemd
4. Cài đặt và cấu hình Nginx Server
Mình có thử chạy command của Minio cung cấp để bind tới cổng của 443 của máy chủ để chạy HTTPS nhưng không hiểu sao mình không thể truy cập tên miền kiểu https://domain.com mà phải truy cập kiểu http://domain.com:443 mới vào được. Chinh vì vậy mình setup Minio Server ở địa chỉ http://127.0.0.1:9000 và setup 1 Nginx Server và proxy pass tới địa chỉ của Minio Server.
Cài đặt Nginx Server (CentOS 7)
sudo yum install nginx
Cấu hình 1 https server, sửa file: /etc/nginx/nginx.conf
Sửa phần block server https như sau:
# Settings for a TLS enabled server. # server { listen 443 ssl http2 default_server; listen [::]:443 ssl http2 default_server; server_name _; root /usr/share/nginx/html; ssl_certificate /etc/letsencrypt/live/test.vinasupport.com/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/test.vinasupport.com/privkey.pem; # managed by Certbot # # ssl_certificate "/etc/pki/nginx/server.crt"; # ssl_certificate_key "/etc/pki/nginx/private/server.key"; # ssl_session_cache shared:SSL:1m; # ssl_session_timeout 10m; # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on; # # # Load configuration files for the default server block. # include /etc/nginx/default.d/*.conf; # location / { proxy_pass http://127.0.0.1:9000; } # # error_page 404 /404.html; # location = /404.html { # } # # error_page 500 502 503 504 /50x.html; # location = /50x.html { # } }
Sau đó khởi động lại nginx server
5. Tạo bucket và public bucket ra ngoài
Mặc định các file, ảnh, … trong bucket của Minio các bạn chỉ có thể share và download chứ ko có link trực tiếp. Để tạo link trực tiếp (Direct Link) chúng ta cần thực hiện public bucket.
Các bạn cần 1 công cụ có tên là mc, được Mino cung cấp miễn phí tạo đây: https://docs.min.io/docs/minio-client-complete-guide.html
Trên Linux Server các bạn có thể tải về bằng command wget và đưa nó vào thư mục /usr/bin để nó hoạt động như 1 command.
wget https://dl.min.io/client/mc/release/linux-amd64/mc chmod +x mc sudo cp mc /usr/bin
Sau đó chúng ta sử dụng mc để tạo và public bucket ra ngoài
# add your host: mc config host add {hostName} {url} {apiKey} {apiSecret} mc config host add minio http://127.0.0.1:9000 <access_key> <secret_key> # create bucket: mc mb {host}/{bucket} mc mb minio/uploads # change bucket policy: mc policy {policy} {host}/{bucket} mc policy set public minio/uploads
Ở đây mình tạo 1 alias name là “minio” và public bucket “uploads”
Bạn có thể kiểm tra lại bằng lệnh sau:
mc config host ls
Nguồn vinasupport.com