Cài MinIO trên VPS Ubuntu 24.04 cho S3 API
Tự host 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.
Bạn nhận được gì khi tự host object storage với MinIO
MinIO là object storage tự host và hỗ trợ 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, và client sẽ không nhận ra sự khác biệt. Hướng dẫn này dựng một node duy nhất trên Ubuntu 24.04: binary đã được xác minh, một system user riêng, một systemd unit không để root credentials trong 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 theo một key rồi GET object đó về. S3 không hỗ trợ ghi từng phần hoặc rename. Các công cụ backup phù hợp với mô hình này vì một object hoặc được ghi đầy đủ, hoặc chưa được ghi.
Một node chỉ giữ một bản sao dữ liệu. Đây 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í tương đương một VPS, nhưng cũng phải tự thực hiện mọi việc mà cloud provider trước đây đảm nhiệm, từ thay disk bị hỏng đến patch server software. Phần gần cuối sẽ nêu rõ khi nào đánh đổi này là phù hợp.
Trạng thái MinIO Community Edition vào tháng 7 năm 2026
Hãy đọc phần này trước khi triển khai dựa trên nội dung bên dưới, vì gần đây MinIO đã thay đổi. 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 hãy 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 Edition đã biên dịch sẵn. README của dự án hiện ghi rằng 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ật, có thể chạy được, nhưng đã bị đóng băng. Binary này 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 ảnh hưởng đến toàn bộ hướng dẫn còn lại. 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 một proxy do bạn kiểm soát. Nếu muốn theo dõi các bản sửa lỗi mới, hãy build từ source. README của vendor đưa ra một command duy nhất là go install github.com/minio/minio@latest. Command này cần Go toolchain và ghi binary vào ~/go/bin/minio. Hãy cài binary đó vào /usr/local/bin/minio; mọi bước khác trong hướng dẫn này không thay đổi.
Cài binary MinIO và xác minh bản tải xuống
Tải bản release đã ghim cùng checksum do nhà phát hành công bố. Cờ -f khiến curl thất bạ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à nguyên nhân khiến nhiều người cài nhầm một trang 404 rồi không hiểu tại 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.sha256sumSo 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 thành 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, khiến bạn tưởng 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 nhà cung cấp qua cùng một kết nối, nên hash khớp chứng minh bản tải xuống đầy đủ và không bị hỏng hoặc thay đổi trong quá trình truyền. Kiểm tra này không chứng minh nhà cung cấp đáng tin cậy. Đó là một vấn đề khác và không có lệnh sha256sum nào giải quyết được vấn đề đó.
sudo install -o root -g root -m 755 minio /usr/local/bin/minio
minio --versionminio --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 nằm trên PATH của bạn.
Tạo system user và thư mục dữ liệu
MinIO nhận tệp tải lên 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 system account với UID nhỏ hơn 1000, nhờ đó account này nằm ngoài dải thường dùng cho người dù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-user và bằng stat -c '%U %a' /var/lib/minio; lệnh này phải 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 áp dụng cho mọi service bạn chạy theo cách này. Bài viết về system user theo nguyên tắc đặc quyền tối thiểu trên VPS trình bày đầy đủ cách thực hiện.
Đặ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 vào mọi bucket, vì vậy không được đặt trong unit file, vốn 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, password không bao giờ nằm trong một 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/miniotee 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=, nên 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 xác nhận bằng sudo -u minio-user cat /etc/default/minio. Lệnh đó phải in ra Permission denied.
Trước khi khởi động, cần biết 2 hành vi của MinIO. Khi không có MINIO_ROOT_USER và MINIO_ROOT_PASSWORD trong environment, 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 nhận là minioadmin:minioadmin. Đây là cặp thông tin đầu tiên mà mọi scanner thử, nhưng MinIO vẫn trông hoàn toàn bình thường trong lúc đó. Password ngắn hơn 8 ký tự sẽ bị 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 nghĩa là hiện tại không có gì bên ngoài VPS này có thể truy cập S3 API. Đây là thiết lập mặc định phù hợp. Sau đó, bạn có thể chủ động mở 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.targetKhô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 khiến bạn có một server chạy trên minioadmin:minioadmin. Khi không có dấu gạch ngang, file bị thiếu sẽ làm unit fail trước khi MinIO chạy, và journalctl -u minio 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 nhiều so với một server âm thầm chấp nhận mật khẩu mặc định.
$MINIO_VOLUMES và $MINIO_OPTS được cố ý để không có dấu ngoặc kép, vì systemd tách các biến không có dấu ngoặc kép theo khoảng trắng thành các argument riêng. Nhờ đó, 4 từ trong MINIO_OPTS trở thành 4 argument của minio server. LimitNOFILE=65536 tăng giới hạn file descriptor, vì mỗi connection đang mở và mỗi file dữ liệu đang mở đều dùng 1 descriptor; giới hạn mặc định 1024 sẽ hết khi tải tăng cao.
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/liveis-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 ở mỗi lần thử. Nguyên nhân được in trong các dòng phía trên thông báo đó, vì vậy hãy đọc ngược lên.
Để tăng mức cô lập, thêm ProtectSystem=full và ProtectHome=true vào section [Service]. Cả hai đều cần mount namespace từ kernel của host. Trên các môi trường container virtualization dùng chung kernel với host, chẳng hạn OpenVZ hoặc LXC, chúng có thể fail và unit sẽ báo status=226/NAMESPACE. Xóa 2 dòng đó thì unit sẽ khởi động. Bản thân unit là một unit thông thường; systemd service và timer trên VPS trình bày các directive còn lại.
Cài đặt mc và kiểm tra một vòng truyền dữ liệu
MinIO client là mc. Không cài nó 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 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.txtmc ls phải liệt kê hello.txt cùng kích thước của object, còn mc cat phải in ra hello object storage. Vòng truyền dữ liệu này là bằng chứng thực tế rằng 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 in trạng thái server nếu bạn muốn kiểm tra thêm.
Thực hiện thêm một lần kiểm tra ngay bây giờ, khi máy vẫn chưa có dữ liệu.
mc alias set defaultcheck http://127.0.0.1:9000 minioadmin minioadminLệnh này phải fail. Nếu lệnh chạy thành công, file môi trường chưa được truyền đến process và server đang chạy bằng credentials mặc định. Hãy sửa việc đó trước khi có bất kỳ thành phần nào khác truy cập máy.
mc lưu alias trong ~/.mc/config.json dưới dạng plain text, nên các credentials đó nằm trong home directory của người chạy lệnh. Chạy mc dưới sudo sẽ đặt credentials của root vào /root/.mc/config.json. Chỉ giữ alias root trên một tài khoản administrator và cấp cho mỗi ứng dụng một key riêng.
Cấp phát một object bằng presigned URL
Presigned URL là một liên kết HTTPS thông thường có kèm chữ ký và thời hạn. Bất kỳ ai có liên kết này đều có thể tải object đó mà không cần account hoặc client.
mc share download --expire 12h local/backups/hello.txtOutput chứa X-Amz-Signature và X-Amz-Expires trong query string. Có hai điểm thường khiến người dùng bất ngờ. Link được tạo từ endpoint trong alias bạn đã dùng, nên alias trên 127.0.0.1 sẽ tạo ra link chỉ máy này mới mở được: hãy tạo thêm một alias trên hostname public cho các link bạn định gửi. Ngoài ra, không có nút revoke. 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 key và bucket riêng cho restic
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ó thêm 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-backupMinIO có sẵn policy 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 là arn:aws:s3:::restic để thao tác liệt kê bucket hoạt động, và một lần là arn:aws:s3:::restic/* cho các object bên trong bucket. Trong S3, bucket và object là hai resource riêng biệt, nên policy chỉ ghi một trong hai sẽ thất bại theo cách dễ khiến bạn tưởng client bị lỗi.
Hãy kiểm tra giới hạn trước khi tin dùng.
mc alias set resticuser http://127.0.0.1:9000 restic-backup "$RESTIC_KEY"
mc ls resticuser/restic
mc ls resticuser/backupsLệnh ls đầu tiên thành công và lệnh thứ hai thất bại với Access Denied. Một policy chưa được kiểm tra 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 của 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 snapshotsrestic init yêu cầu mật khẩu repository. Mật khẩu đó mã hóa repository, vì vậy MinIO chỉ lưu ciphertext; nếu mất mật khẩu thì cũng mất backup. Một tiến trình được systemd timer khởi chạy không có terminal để nhập mật khẩu, nên hãy đặt RESTIC_PASSWORD_FILE thành file mode 600 cho các backup theo lịch.
Có một quy tắc đặt repository 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 khôi phục sau một rm lỗi, chứ không bảo vệ trước vấn đề nào khác. MinIO node nên nằm trên một máy khác, tốt nhất là ở một region khác. backup restic trên VPS trình bày cách lập lịch và quản lý retention dựa trên cấu hình này.
Kết thúc TLS bằng nginx
MinIO chạy trên localhost, nên nginx là bề mặt public. Trước tiên, hãy cấp chứng chỉ như mô tả trong Cấp chứng chỉ 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 xóa giới hạn body mặc định 1 MB; nếu không, mọi upload lớn hơn sẽ bị từ chối bằng 413 Request Entity Too Large trước khi MinIO nhận được request. proxy_request_buffering off truyền thẳng upload đến backend, vì mặc định nginx ghi toàn bộ request vào file tạm trước, khiến một object lớn cần gấp đôi dung lượng đĩa. proxy_set_header Host $http_host là dòng dễ bỏ sót: chữ ký S3 bao gồm header Host, nên proxy viết lại header này sẽ khiến mọi request thất bại với SignatureDoesNotMatch, trong khi access log vẫn hiển thị một request bình thường đã đến server.
Cũng phải khai báo tên public của MinIO để các liên kết do MinIO tạo trỏ đến proxy thay vì localhost.
echo 'MINIO_SERVER_URL=https://s3.example.com' | sudo tee -a /etc/default/minio
sudo systemctl restart minioFirewall chỉ cần vài rule. Cho phép SSH và HTTPS, đồng thời không tạo rule nào cho cổng 9000 và 9001, vì đị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 nào nên dùng S3 thực sự
Một node ở đây nghĩa là một ổ đĩa và 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 cao. Trong deployment không có bản sao thứ hai, nên độ bền của mọi object chính là độ bền của ổ đĩa trên một VPS. Các tính năng giả định backend phân tán có erasure coding, trong đó có bucket replication và object locking, dành cho deployment nhiều ổ đĩa. Vì vậy, không được hứa hẹn với bất kỳ ai về chính sách lưu giữ bất biến trên setup này.
Mô hình này phù hợp để làm target cho restic trên một VPS thứ hai ở region khác, cũng như làm S3 endpoint cho công việc phát triển và artifact của CI, trong đó việc mất một bucket chỉ khiến bạn phải build lại và không gây hậu quả nào khác. Mô hình này cũng phù hợp cho upload của người dùng trong một ứng dụng nhỏ, miễn là bạn tự chịu trách nhiệm về kế hoạch khôi phục và đã thực sự kiểm thử việc restore.
Hãy chọn S3 managed 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 bị gọi lúc 03:00 vì một ổ đĩa đã đầy. Build bị đóng băng là một lý do thực tế khác. Tính đến July 2026, binary community được biên dịch sẵn có từ September 2025 và không còn nhận bản sửa lỗi, nên việc chạy binary này đồng nghĩa với chấp nhận tình trạng đó; lựa chọn còn lại là build từ source và tự theo dõi project.
Có một giới hạn cần nói rõ vì vấn đề này thường được hỏi. Object storage không phải là database. Mỗi lần ghi sẽ thay thế toàn bộ object, nên đặt một file SQL đang được sử dụ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 một VPS mô tả cách tách này.
Các tình huống lỗi và thông báo bạn sẽ thấy
Unit fail ngay sau systemctl enable --now. Đọc journalctl -u minio -n 30 --no-pager. Failed to load environment files: No such file or directory 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 nghĩa là service account không có quyền ghi vào thư mục dữ liệu. Hãy kiểm tra để chắc chắn 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 tiến trình. Xác nhận unit có chứa EnvironmentFile=/etc/default/minio, chạy sudo systemctl daemon-reload, rồi restart 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 thì không thay đổi gì.
Address already in use khi khởi động. Một tiến trình khác đang giữ port 9000. Tìm tiến trình đó bằng sudo ss -ltnp | grep :9000 trước khi đổi port của MinIO.
Upload lớn hơn 1 MB fail qua proxy. nginx đã trả về 413 Request Entity Too Large và MinIO chưa 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 trên đường từ client đến MinIO đã sửa header Host, vố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 nằm ngoài khoảng 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à có tồn tại. Key này được giới hạn cho 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 trên một node có đủ cho backup thực tế không?
Nó đủ để làm đích restic trên một máy riêng với dữ liệu mà nó bảo vệ. Nhưng nó không đủ nếu là bản sao duy nhất của bạn. Mô hình triển khai với một drive không có parity, nên bên trong MinIO không có bản sao thứ hai. Nếu disk trên VPS đó mất dữ liệu thì các object cũng mất. Hãy giữ thêm một đích thứ hai ở nơi khác và khôi phục từ cả hai đích í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 file checksum nhưng không thấy, nên báo No such file or directory và WARNING: 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.
Web console 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 trình duyệt object trong giao diện web. Hiện bucket và user được quản lý bằng client mc, với các command như mc admin user add và mc 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ừ CLI.
Làm cách nào để trỏ restic đến MinIO làm backend S3?
Đặt AWS_ACCESS_KEY_ID và AWS_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ó quyền trong một bucket không có quyền tạo bucket. restic mã hóa mọi thứ bằng password riêng của repository trước khi upload. Vì vậy, MinIO chỉ lưu ciphertext và không bao giờ thấy các 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 tầng 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 truyền bên trong request. Dùng proxy trên port 443 với certificate từ certbot là cách đơn giản nhất để thực hiện việc này. 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.crt và private.key. Tuy nhiên, service account khi đó 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 thay đổi.