SSD Nodes Learn 8GB RAM — $66/năm
Hướng dẫn Matt ConnorBởi Matt Connor · Cập nhật ngày 2026-08-01

Cài MinIO trên VPS Ubuntu 24.04 cho S3 riêng

Dựng MinIO trên một VPS Ubuntu 24.04: cài binary đã xác minh, tạo systemd unit, dùng mc, tạo presigned URL và làm đích backup cho restic.

Verified Every command ran end-to-end on a fresh Ubuntu 24.04 server, July 30, 2026.

MinIO mang lại gì khi bạn tự lưu trữ object storage

MinIO là object storage tự lưu trữ, sử dụng Amazon S3 API. Trỏ restic hoặc bất kỳ S3 SDK nào vào server của bạn, thay đổi một thiết lập endpoint, rồi client sẽ không nhận ra sự khác biệt. Hướng dẫn này dựng một node trên Ubuntu 24.04: binary đã xác minh, system user riêng, systemd unit giữ root credentials bên ngoài unit file và một bucket để restic sao lưu dữ liệu vào.

S3 (simple storage service) là một HTTP API, không phải filesystem. Bạn PUT một object vào bucket dưới một key rồi GET object đó về. S3 không hỗ trợ ghi từng phần hoặc đổi tên. Các công cụ backup phù hợp với mô hình này vì object hoặc được ghi đầy đủ hoặc chưa được ghi.

Một node chỉ chứa một bản sao dữ liệu. Đó là đánh đổi bạn chấp nhận. Bạn có một S3 endpoint do mình kiểm soát với chi phí của một VPS. Đồng thời, bạn phải tự thực hiện mọi việc mà cloud provider trước đây đảm nhiệm, từ thay disk hỏng đến patch server software. Phần gần cuối sẽ nói rõ khi nào lựa chọn này phù hợp.

Trạng thái của MinIO community edition vào tháng 7 năm 2026

Đọc phần này trước khi triển khai theo hướng dẫn, vì trạng thái đã thay đổi gần đây. Vào tháng 5 năm 2025, MinIO đã gỡ các tính năng quản trị khỏi web console trong community edition. Trình duyệt hiện chỉ còn object browser, vì vậy bạn phải quản lý bucket và access key bằng client dòng lệnh mc.

Cuối năm 2025, MinIO ngừng phát hành binary community đã biên dịch sẵn. README của dự án hiện cho biết community edition chỉ được phân phối dưới dạng source code. Các URL tải xuống cũ vẫn hoạt động: vào tháng 7 năm 2026, chúng cung cấp server build RELEASE.2025-09-07T16-13-09Z và client build RELEASE.2025-08-13T08-35-41Z, đồng thời chưa có community build mới hơn. Vì vậy, binary bên dưới là binary thực và vẫn chạy được, nhưng đã bị đóng băng. Nó không có các bản sửa lỗi bảo mật được phát hành sau tháng 9 năm 2025.

Thực tế này chi phối các phần còn lại của hướng dẫn. Vì vậy, MinIO trong hướng dẫn này lắng nghe trên 127.0.0.1 và chỉ truy cập internet thông qua proxy do bạn kiểm soát. Nếu muốn theo dõi các bản sửa lỗi, hãy build từ source. README của vendor cung cấp một lệnh duy nhất, go install github.com/minio/minio@latest. Lệnh này cần Go toolchain và ghi binary vào ~/go/bin/minio. Cài binary đó vào /usr/local/bin/minio, các bước còn lại ở đây không thay đổi.

Cài binary MinIO và xác minh bản tải xuống

Tải release đã ghim và checksum được công bố. Flag -f khiến curl lỗi khi gặp lỗi HTTP thay vì lưu trang lỗi dưới tên bạn yêu cầu. Đây là cách người dùng cài nhầm một trang 404 rồi không hiểu vì sao nó không chạy được.

cd /tmp
REL=RELEASE.2025-09-07T16-13-09Z
curl -fsSL "https://dl.min.io/server/minio/release/linux-amd64/archive/minio.$REL" -o minio
curl -fsSL "https://dl.min.io/server/minio/release/linux-amd64/archive/minio.$REL.sha256sum" -o minio.sha256sum

So sánh hai hash, và chỉ so sánh các hash.

published=$(awk '{print $1}' minio.sha256sum)
downloaded=$(sha256sum minio | awk '{print $1}')
[ "$published" = "$downloaded" ] && echo "checksum ok"

Không dùng sha256sum -c minio.sha256sum ở đây. Nhãn được ghi sau hash trong file đó là minio.RELEASE.2025-09-07T16-13-09Z, còn chúng ta đã lưu bản tải xuống với tên minio, nên -c tìm một file không tồn tại. Lệnh này báo No such file or directory rồi báo WARNING: 1 listed file could not be read. Điều đó trông giống một bản tải xuống bị hỏng, nhưng thực tế không phải vậy. Nhãn chỉ là tên. Hash mới là phần cung cấp cơ sở bảo đảm.

Cần hiểu rõ kiểm tra này chứng minh điều gì. Binary và hash đến từ cùng một vendor qua cùng một kết nối, nên nếu khớp thì bản tải xuống đầy đủ và không bị hỏng hoặc bị thay đổi trong quá trình truyền. Điều đó không chứng minh vendor đáng tin cậy. Đây là vấn đề khác, và không có lệnh sha256sum nào giải quyết được.

sudo install -o root -g root -m 755 minio /usr/local/bin/minio
minio --version

minio --version in minio version RELEASE.2025-09-07T16-13-09Z rồi in thêm một vài dòng build. Permission denied ở đây có nghĩa là mode không đúng, còn command not found có nghĩa là /usr/local/bin không có trong PATH của bạn.

Tạo user hệ thống và thư mục dữ liệu

MinIO nhận các lượt upload từ network, vì vậy không nên chạy dưới quyền root. Tạo cho MinIO một account không có thư mục home và không có login shell.

sudo groupadd -r minio-user
sudo useradd -M -r -g minio-user -s /usr/sbin/nologin minio-user
sudo mkdir -p /var/lib/minio/data
sudo chown -R minio-user:minio-user /var/lib/minio
sudo chmod 750 /var/lib/minio

-r tạo một account hệ thống với UID nhỏ hơn 1000, nhờ đó account này nằm ngoài phạm vi dành cho người dùng thông thường. -M bỏ qua việc tạo thư mục home, vì account không bao giờ đăng nhập thì không cần thư mục này. Kiểm tra kết quả bằng id minio-userstat -c '%U %a' /var/lib/minio. Lệnh này sẽ in ra minio-user 750.

Thư mục dữ liệu phải cho user đó quyền ghi, không chỉ quyền đọc. Khi khởi động lần đầu, MinIO tạo một thư mục .minio.sys bên trong volume để lưu cấu hình riêng. Vì vậy, nếu thư mục thuộc quyền sở hữu của root, MinIO sẽ thoát trong lúc khởi động với thông báo kết thúc bằng permission denied. Quy tắc này cũng áp dụng cho mọi service bạn chạy theo cách này. user service theo nguyên tắc đặc quyền tối thiểu trên VPS giải thích chi tiết vấn đề này.

Đặt thông tin xác thực root trong file môi trường

Thông tin xác thực root có quyền truy cập mọi bucket, nên không được đặt trong unit file vì file này có quyền đọc cho mọi người. Trước tiên, hãy tạo file với mode phù hợp rồi mới ghi nội dung vào. Như vậy, mật khẩu không bao giờ nằm trong file có thể đọc được, dù chỉ trong chốc lát.

sudo install -o root -g root -m 600 /dev/null /etc/default/minio
printf 'MINIO_ROOT_USER=minio-root\nMINIO_ROOT_PASSWORD=%s\nMINIO_VOLUMES="/var/lib/minio/data"\nMINIO_OPTS="--address 127.0.0.1:9000 --console-address 127.0.0.1:9001"\n' "$(openssl rand -base64 24)" | sudo tee /etc/default/minio > /dev/null
sudo sed -n 's/^MINIO_ROOT_PASSWORD=//p' /etc/default/minio

tee cắt ngắn file hiện có thay vì tạo lại file, nên mode vẫn là 600 và owner vẫn là root. Đây là chủ ý. systemd đọc EnvironmentFile dưới quyền root trước khi hạ quyền xuống User=. Vì vậy, service account không bao giờ cần tự đọc thông tin xác thực của mình. Sau khi service chạy, hãy kiểm tra bằng sudo -u minio-user cat /etc/default/minio. Lệnh đó phải in ra Permission denied.

Bạn cần biết 2 hành vi của MinIO trước khi khởi động. Nếu môi trường không có MINIO_ROOT_USERMINIO_ROOT_PASSWORD, MinIO không từ chối khởi động. Nó khởi động với thông tin xác thực mặc định được tài liệu ghi rõ là minioadmin:minioadmin. Đây là cặp thông tin đầu tiên mà mọi scanner thử, trong khi MinIO vẫn trông hoàn toàn bình thường. Nếu mật khẩu có dưới 8 ký tự, MinIO sẽ từ chối. MinIO thoát ngay khi khởi động và báo thông tin xác thực không hợp lệ, vì access key cần ít nhất 3 ký tự còn secret key cần ít nhất 8 ký tự.

MINIO_VOLUMES là đường dẫn dữ liệu, còn MINIO_OPTS chứa các flag. Bind vào 127.0.0.1 có nghĩa là chưa có gì bên ngoài VPS này truy cập được S3 API. Đây là mặc định phù hợp. Sau đó, bạn sẽ chủ động mở quyền truy cập thông qua một proxy có certificate.

Viết systemd unit

Tạo /etc/systemd/system/minio.service:

[Unit]
Description=MinIO object storage
Documentation=https://github.com/minio/minio
Wants=network-online.target
After=network-online.target

[Service]
User=minio-user
Group=minio-user
EnvironmentFile=/etc/default/minio
ExecStart=/usr/local/bin/minio server $MINIO_VOLUMES $MINIO_OPTS
Restart=always
RestartSec=5
LimitNOFILE=65536
NoNewPrivileges=true

[Install]
WantedBy=multi-user.target

Không có - ở đầu EnvironmentFile. Đây là chủ ý, không phải lỗi đánh máy. Khi có dấu gạch ngang, systemd bỏ qua file bị thiếu và vẫn khởi động MinIO. Vì vậy, file bị xóa hoặc đường dẫn bị viết sai có thể âm thầm để lại một server chạy bằng minioadmin:minioadmin. Khi không có dấu gạch ngang, file bị thiếu sẽ làm unit lỗi trước khi MinIO chạy, và journalctl -u minio sẽ hiển thị Failed to load environment files: No such file or directory. Một unit từ chối khởi động dễ được phát hiện hơn một server âm thầm chấp nhận mật khẩu mặc định.

$MINIO_VOLUMES$MINIO_OPTS cố ý không đặt trong dấu ngoặc kép, vì systemd tách các biến không được trích dẫn theo khoảng trắng thành các argument riêng. Nhờ đó, 4 từ trong MINIO_OPTS trở thành 4 argument truyền cho minio server. LimitNOFILE=65536 tăng giới hạn file descriptor, vì mỗi connection đang mở và mỗi data file đang mở sử dụng 1 descriptor. Giá trị mặc định 1024 sẽ không đủ khi tải tăng.

sudo systemctl daemon-reload
sudo systemctl enable --now minio
systemctl is-active minio
curl -fsS -o /dev/null -w '%{http_code}\n' http://127.0.0.1:9000/minio/health/live

is-active phải in ra active, và health endpoint phải trả về 200. journalctl -u minio -n 20 --no-pager hiển thị địa chỉ API mà server đang listen. Nếu unit liên tục restart, systemd sẽ dừng thử và ghi log Start request repeated too quickly. Điều đó có nghĩa là MinIO thoát trong mỗi lần thử. Lý do nằm ở các dòng ngay trước thông báo đó, vì vậy hãy đọc ngược lên.

Để tăng mức cô lập, thêm ProtectSystem=fullProtectHome=true vào section [Service]. Cả hai cần mount namespace do kernel của host cung cấp. Trên các môi trường container virtualisation dùng chung kernel với host, chẳng hạn OpenVZ hoặc LXC, chúng có thể lỗi, khiến unit báo status=226/NAMESPACE. Xóa 2 dòng đó thì unit sẽ khởi động. Bản thân unit là unit thông thường. systemd services và timer trên VPS trình bày các directive còn lại.

Cài đặt mc và xác minh quy trình hai chiều

MinIO client là mc. Không cài bằng apt install mc. Gói đó là Midnight Commander, một trình quản lý tệp không liên quan đến MinIO.

cd /tmp
curl -fsSL https://dl.min.io/client/mc/release/linux-amd64/mc -o mc
curl -fsSL https://dl.min.io/client/mc/release/linux-amd64/mc.sha256sum -o mc.sha256sum
[ "$(awk '{print $1}' mc.sha256sum)" = "$(sha256sum mc | awk '{print $1}')" ] && echo "checksum ok"
sudo install -o root -g root -m 755 mc /usr/local/bin/mc

Đăng ký server dưới dạng alias, rồi di chuyển một object qua server đó.

MINIO_PASS=$(sudo sed -n 's/^MINIO_ROOT_PASSWORD=//p' /etc/default/minio)
mc alias set local http://127.0.0.1:9000 minio-root "$MINIO_PASS"
mc mb local/backups
echo "hello object storage" > /tmp/hello.txt
mc cp /tmp/hello.txt local/backups/hello.txt
mc ls local/backups
mc cat local/backups/hello.txt

mc ls phải liệt kê hello.txt cùng kích thước của nó, còn mc cat phải in ra hello object storage. Quy trình hai chiều này là bằng chứng thực tế cho thấy server hoạt động, vì nó tạo ra cùng các yêu cầu S3 có chữ ký mà mọi client khác sẽ tạo. mc admin info local sẽ in trạng thái server nếu bạn muốn kiểm tra thêm.

Chạy thêm một lần kiểm tra ngay bây giờ, khi máy vẫn còn trống.

mc alias set defaultcheck http://127.0.0.1:9000 minioadmin minioadmin

Lệnh này phải thất bại. Nếu lệnh chạy thành công, file môi trường chưa được truyền vào process và server đang chạy bằng thông tin xác thực mặc định. Hãy sửa việc đó trước khi bất kỳ thành phần nào khác truy cập máy.

mc lưu các alias trong ~/.mc/config.json dưới dạng văn bản thuần, nên các thông tin xác thực đó nằm trong thư mục home của người chạy lệnh. Chạy mc dưới sudo sẽ đặt thông tin xác thực root vào /root/.mc/config.json. Chỉ giữ alias root trên một tài khoản quản trị viên và cấp cho mỗi ứng dụng một key riêng.

Cấp một object bằng presigned URL

Presigned URL là một liên kết HTTPS thông thường có chữ ký và thời hạn hết hiệu lực. Bất kỳ ai có liên kết đều có thể tải object đó mà không cần tài khoản hoặc client.

mc share download --expire 12h local/backups/hello.txt

Kết quả chứa X-Amz-SignatureX-Amz-Expires trong query string. Có hai điểm thường khiến người dùng bất ngờ. Liên kết được tạo từ endpoint trong alias bạn đã dùng, nên alias trên 127.0.0.1 tạo ra liên kết chỉ máy này mới mở được: hãy tạo alias thứ hai trên hostname public để dùng cho các liên kết bạn định gửi. Ngoài ra, không có nút thu hồi. Chữ ký vẫn hợp lệ cho đến khi hết hạn, nên thời hạn ngắn là biện pháp kiểm soát duy nhất bạn có. 7 ngày là thời hạn tối đa mà định dạng chữ ký S3 cho phép.

Cấp cho restic key và bucket riêng

Thông tin xác thực của root có thể đọc và xóa mọi bucket, vì vậy backup job không được giữ chúng. Tạo một bucket, một policy chỉ áp dụng cho bucket đó và một user không có quyền nào khác.

mc mb local/restic
cat > /tmp/restic-rw.json <<'EOF'
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:ListBucket", "s3:GetBucketLocation"],
      "Resource": ["arn:aws:s3:::restic"]
    },
    {
      "Effect": "Allow",
      "Action": ["s3:GetObject", "s3:PutObject", "s3:DeleteObject"],
      "Resource": ["arn:aws:s3:::restic/*"]
    }
  ]
}
EOF
RESTIC_KEY=$(openssl rand -base64 24)
mc admin policy create local restic-rw /tmp/restic-rw.json
mc admin user add local restic-backup "$RESTIC_KEY"
mc admin policy attach local restic-rw --user restic-backup

MinIO có policy tích hợp readwrite. Dùng policy này sẽ ngắn hơn một lệnh, nhưng nó cấp toàn quyền truy cập vào mọi bucket trên server. Policy trên cố ý ghi tên bucket hai lần: một lần dưới dạng arn:aws:s3:::restic để lệnh liệt kê bucket hoạt động, và một lần dưới dạng arn:aws:s3:::restic/* cho các object bên trong bucket. Trong S3, bucket và object là các resource riêng biệt, nên policy chỉ ghi một trong hai sẽ lỗi theo cách khiến bạn tưởng client bị hỏng.

Hãy kiểm tra giới hạn trước khi tin tưởng policy đó.

mc alias set resticuser http://127.0.0.1:9000 restic-backup "$RESTIC_KEY"
mc ls resticuser/restic
mc ls resticuser/backups

Lệnh ls đầu tiên thành công và lệnh thứ hai thất bại với Access Denied. Policy chưa được kiểm thử chỉ là phỏng đoán.

Bây giờ trỏ restic vào bucket. restic đọc thông tin xác thực S3 từ các biến môi trường AWS tiêu chuẩn, nên không có file thông tin xác thực riêng cho restic.

sudo apt install -y restic
export AWS_ACCESS_KEY_ID=restic-backup
export AWS_SECRET_ACCESS_KEY="$RESTIC_KEY"
restic -r s3:http://127.0.0.1:9000/restic init
restic -r s3:http://127.0.0.1:9000/restic backup /etc
restic -r s3:http://127.0.0.1:9000/restic snapshots

restic init yêu cầu nhập password cho repository. Password này mã hóa repository, nên MinIO chỉ lưu ciphertext. Nếu mất password, bạn sẽ mất backup. Một run được systemd timer khởi chạy không có terminal để nhập password, vì vậy hãy đặt RESTIC_PASSWORD_FILE thành file có mode 600 cho các backup theo lịch.

Có một quy tắc về vị trí quan trọng hơn mọi lệnh ở trên. Đặt repository restic trên cùng VPS với dữ liệu mà nó bảo vệ chỉ giúp bạn tránh một rm, chứ không bảo vệ khỏi rủi ro nào khác. Node MinIO nên nằm trên một máy khác, lý tưởng là ở một region khác. backup restic trên VPS trình bày cách lập lịch và cấu hình retention dựa trên thiết lập này.

Kết thúc TLS bằng nginx

MinIO chạy trên localhost, nên nginx là bề mặt công khai. Trước tiên, hãy cấp certificate như mô tả trong Cấp certificate Let's Encrypt bằng certbot và nginx, sau đó dùng server block này.

server {
    listen 443 ssl;
    server_name s3.example.com;

    ignore_invalid_headers off;
    client_max_body_size 0;
    proxy_buffering off;
    proxy_request_buffering off;

    location / {
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_connect_timeout 300;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        chunked_transfer_encoding off;
        proxy_pass http://127.0.0.1:9000;
    }
}

Một số dòng trong đó rất quan trọng. client_max_body_size 0 gỡ giới hạn mặc định 1 MB cho request body. Nếu không gỡ, nginx sẽ từ chối mọi upload lớn hơn bằng 413 Request Entity Too Large trước khi MinIO nhận được request. proxy_request_buffering off truyền trực tiếp upload qua upstream. Nếu dùng mặc định, nginx sẽ ghi toàn bộ request vào file tạm trước. Khi đó, một object lớn cần gấp đôi dung lượng đĩa. proxy_set_header Host $http_host là phần dễ bỏ sót: chữ ký S3 bao gồm header Host. Vì vậy, proxy rewrite header này sẽ khiến mọi request thất bại với SignatureDoesNotMatch, dù access log vẫn cho thấy request đến bình thường.

Đồng thời, hãy khai báo public name cho MinIO để các link do MinIO tạo ra trỏ đến proxy thay vì localhost.

echo 'MINIO_SERVER_URL=https://s3.example.com' | sudo tee -a /etc/default/minio
sudo systemctl restart minio

Firewall chỉ cần vài rule. Cho phép SSH và HTTPS. Không tạo rule nào cho port 9000 và 9001, vì một địa chỉ bind vào 127.0.0.1 không thể truy cập từ máy khác, bất kể firewall được cấu hình thế nào. Kiến thức cơ bản về firewall ufw trên VPS có các lệnh cần dùng.

Khi MinIO một node là đủ và khi bạn cần S3 thực sự

Một node ở đây nghĩa là một ổ đĩa không có parity. Tài liệu của MinIO mô tả layout này phù hợp cho việc kiểm thử và các workload nhỏ không yêu cầu tính sẵn sàng. Deployment không có bản sao thứ hai, nên độ bền của mỗi object phụ thuộc hoàn toàn vào độ bền của ổ đĩa VPS đó. Các tính năng yêu cầu backend phân tán dùng erasure coding, trong đó có bucket replication và object locking, chỉ dành cho deployment nhiều ổ đĩa. Vì vậy, không được hứa với bất kỳ ai về retention policy bất biến trên setup này.

Đây là lựa chọn phù hợp làm target restic trên một VPS thứ hai ở region khác, cũng như làm S3 endpoint cho công việc development và artifact của CI, nơi mất một bucket chỉ khiến bạn phải build lại và không gây thêm hậu quả. Nó cũng phù hợp cho user upload trong một ứng dụng nhỏ, miễn là bạn sở hữu recovery plan và đã thực sự kiểm thử việc restore.

Hãy chọn managed S3 khi hợp đồng hoặc cơ quan quản lý yêu cầu object lock hay độ bền multi-region, hoặc khi bạn không muốn là người nhận alert lúc 03:00 vì một ổ đĩa đã đầy. Bản build bị đóng băng cũng là một lý do thực tế khác. Tính đến July 2026, community binary được biên dịch sẵn có từ September 2025 và không nhận bản sửa lỗi nào, nên chạy bản này nghĩa là chấp nhận tình trạng đó, hoặc tự build từ source và tự theo dõi project.

Có một ranh giới cần nêu rõ vì vấn đề này thường xuất hiện. Object storage không phải database. Mỗi lần ghi sẽ thay thế toàn bộ object, nên đặt file SQL đang hoạt động trên bucket S3 vừa chậm vừa không an toàn. Hãy giữ database trên local disk và backup nó vào bucket: chạy SQLite trong production trên VPS mô tả cách tách này.

Các chế độ lỗi và thông báo bạn sẽ thấy

Unit bị lỗi ngay sau systemctl enable --now. Đọc journalctl -u minio -n 30 --no-pager. Failed to load environment files: No such file or directory có nghĩa là /etc/default/minio bị thiếu hoặc đường dẫn của nó bị ghi sai trong unit. Thông báo kết thúc bằng permission denied có nghĩa là tài khoản dịch vụ không có quyền ghi vào thư mục dữ liệu. Hãy kiểm tra để stat -c '%U' /var/lib/minio/data in ra minio-user.

minioadmin:minioadmin vẫn đăng nhập được. File môi trường chưa được truyền đến process. Xác nhận unit có EnvironmentFile=/etc/default/minio, chạy sudo systemctl daemon-reload, sau đó khởi động lại service. MinIO chỉ đọc root credentials một lần khi khởi động, nên chỉnh sửa file đó mà không restart sẽ không có tác dụng.

Address already in use khi khởi động. Một process khác đang giữ port 9000. Tìm process đó bằng sudo ss -ltnp | grep :9000 trước khi đổi port của MinIO.

Upload lớn hơn 1 MB bị lỗi qua proxy. nginx trả về 413 Request Entity Too Large và MinIO không nhận được request. Đặt client_max_body_size 0 trong server block.

SignatureDoesNotMatch. Secret key bị sai hoặc một thành phần giữa client và MinIO đã sửa header Host, là phần được dùng để tạo chữ ký.

RequestTimeTooSkewed. Đồng hồ trên client hoặc server bị sai. Mỗi request S3 đều chứa timestamp và sẽ bị từ chối nếu lệch quá 15 phút. Kiểm tra timedatectl và xác nhận time synchronisation đang hoạt động.

Access Denied trên bucket mà bạn biết là đang tồn tại. Key được giới hạn cho một bucket khác. In các quyền mà policy thực sự cho phép bằng mc admin policy info local restic-rw rồi so sánh tên bucket trong các dòng resource.

FAQ

MinIO chạy một node có đủ cho backup thực tế không?

Có, nếu MinIO được dùng làm target cho restic trên một máy khác với máy chứa dữ liệu được bảo vệ. Tuy nhiên, không nên dùng nó làm bản sao duy nhất. Deployment dùng một ổ đĩa không có parity, nên MinIO không có bản sao thứ hai bên trong. Nếu VPS đó mất dữ liệu trên ổ đĩa, các object cũng mất. Hãy giữ thêm một target ở nơi khác và khôi phục từ cả hai target ít nhất một lần để xác nhận quy trình hoạt động.

Vì sao sha256sum -c không chạy được với file checksum của MinIO?

Vì nhãn sau hash trong file đó ghi tên release là minio.RELEASE.2025-09-07T16-13-09Z, còn file bạn tải xuống thường có tên minio. sha256sum -c tìm file có tên được ghi trong checksum file nhưng không tìm thấy, rồi báo No such file or directoryWARNING: 1 listed file could not be read. File tải xuống không bị lỗi. Hãy so sánh trực tiếp các chuỗi hash và bỏ qua nhãn đó, vì nhãn không có ý nghĩa bảo mật.

Giao diện web quản trị MinIO đã đi đâu?

MinIO đã xóa các tính năng quản trị khỏi console của community edition vào tháng 5 năm 2025, chỉ giữ lại object browser trong giao diện web. Hiện nay, bạn quản lý bucket và user bằng client mc, với các command như mc admin user addmc admin policy attach. Đây là cách được hỗ trợ trong community edition, không phải workaround. Vì vậy, hướng dẫn này thực hiện mọi thao tác từ command line.

Làm cách nào để trỏ restic đến MinIO làm backend S3?

Đặt AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY thành access key của MinIO và secret tương ứng, sau đó dùng repository string có dạng s3:https://s3.example.com/restic, trong đó phần tử cuối cùng của path là tên bucket. Trước tiên, hãy tạo bucket bằng mc mb, vì key chỉ được cấp quyền trong một bucket không có quyền tạo bucket. restic mã hóa mọi dữ liệu bằng repository password riêng trước khi upload. Vì vậy, MinIO chỉ lưu ciphertext và không bao giờ thấy file của bạn.

Tôi có phải chạy MinIO phía sau nginx không?

Bạn cần TLS (bảo mật lớp truyền tải) khi client không chạy trên cùng máy, vì credential S3 và dữ liệu object đều được truyền trong request. Dùng proxy trên port 443 với certificate do certbot cấp là cách đơn giản nhất. Cách này cũng tách việc gia hạn certificate khỏi MinIO. MinIO cũng có thể tự terminate TLS nếu bạn trỏ --certs-dir đến một directory chứa public.crtprivate.key. Tuy nhiên, khi đó service account cần quyền read đối với private key đã được gia hạn. Đây là phần việc bổ sung nhưng kết quả không khác.

#minio#s3#object-storage#self-hosted#vps