香港服务器搭建MinIO企业私有对象存储:S3兼容全功能方案完整配置
AWS S3 在中国大陆访问受限,阿里云 OSS 的数据在国内合规有限制,自建 FTP 功能太弱。MinIO 是完全 S3 API 兼容的开源对象存储,所有 AWS SDK 和 S3 工具(boto3/mc/s3cmd)无需修改代码即可直接使用,同时支持多用户 IAM 权限、版本控制、生命周期策略、跨区域复制等企业特性,是香港服务器私有化对象存储的首选方案。
一、MinIO 单节点部署(开发/中小规模)
<code"># Docker 部署(推荐)
mkdir -p /data/minio/{data,config}
docker run -d \
--name minio \
--restart unless-stopped \
-p 127.0.0.1:9000:9000 \ # S3 API 端口
-p 127.0.0.1:9001:9001 \ # Web Console 端口
-v /data/minio/data:/data \
-e MINIO_ROOT_USER=admin \
-e MINIO_ROOT_PASSWORD=MinioAdmin2026! \
-e MINIO_BROWSER_REDIRECT_URL=https://console.yourdomain.com \
quay.io/minio/minio:latest \
server /data --console-address ":9001"
# 验证
curl http://localhost:9000/minio/health/live
# 返回 200 OK 说明正常<code"># Nginx 反向代理(双域名:API + Console)
# /etc/nginx/sites-available/minio
# S3 API 端点
server {
listen 443 ssl http2;
server_name s3.yourdomain.com;
ssl_certificate /etc/letsencrypt/live/s3.yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/s3.yourdomain.com/privkey.pem;
# 允许大文件上传(对象存储核心需求)
client_max_body_size 0;
proxy_request_buffering off;
location / {
proxy_pass http://127.0.0.1:9000;
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;
# MinIO 需要这些头
proxy_connect_timeout 300;
proxy_http_version 1.1;
proxy_set_header Connection "";
chunked_transfer_encoding off;
}
}
# Web Console
server {
listen 443 ssl http2;
server_name console.yourdomain.com;
ssl_certificate /etc/letsencrypt/live/console.yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/console.yourdomain.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:9001;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
}二、mc 客户端配置与操作
<code"># 安装 MinIO Client(mc) wget https://dl.min.io/client/mc/release/linux-amd64/mc chmod +x mc && mv mc /usr/local/bin/ # 配置别名 mc alias set hkminio https://s3.yourdomain.com admin MinioAdmin2026! # 基本操作 mc mb hkminio/myapp-files # 创建存储桶 mc ls hkminio # 列出所有存储桶 mc cp /local/file.pdf hkminio/myapp-files/ # 上传文件 mc cp hkminio/myapp-files/file.pdf /tmp/ # 下载文件 mc ls hkminio/myapp-files # 列出文件 mc rm hkminio/myapp-files/file.pdf # 删除文件 # 同步目录到 MinIO mc mirror /var/www/uploads hkminio/myapp-files/uploads/ # 查看存储统计 mc du hkminio/myapp-files # 存储桶大小 mc stat hkminio/myapp-files/file.pdf # 文件元数据
三、Python boto3 集成(S3 完全兼容)
<code">import boto3
from botocore.config import Config
# 创建 MinIO 客户端(S3 兼容,只需改 endpoint_url)
s3 = boto3.client(
's3',
endpoint_url='https://s3.yourdomain.com',
aws_access_key_id='admin',
aws_secret_access_key='MinioAdmin2026!',
config=Config(signature_version='s3v4'),
region_name='us-east-1', # MinIO 忽略此值但 boto3 要求
)
# ── 上传文件 ──
s3.upload_file(
'/path/to/local/file.pdf',
'myapp-files', # 存储桶名
'documents/file.pdf', # 对象键(文件在桶中的路径)
ExtraArgs={
'ContentType': 'application/pdf',
'Metadata': {'uploaded-by': 'user-123'},
}
)
# ── 生成预签名 URL(临时下载链接,无需暴露凭证)──
presigned_url = s3.generate_presigned_url(
ClientMethod='get_object',
Params={'Bucket': 'myapp-files', 'Key': 'documents/file.pdf'},
ExpiresIn=3600, # 1小时有效
)
# ── 生成预签名上传 URL(前端直传,不经过后端)──
presigned_post = s3.generate_presigned_post(
'myapp-files',
'uploads/${filename}',
Fields={'Content-Type': 'image/jpeg'},
Conditions=[
['content-length-range', 0, 10 * 1024 * 1024], # 最大10MB
],
ExpiresIn=3600
)
# 前端用此 URL 直接 POST 上传文件到 MinIO
# 不经过你的服务器,节省带宽
# ── 多部分上传(大文件)──
mpu = s3.create_multipart_upload(Bucket='myapp-files', Key='large-file.zip')
# ... 分片上传 ...
s3.complete_multipart_upload(Bucket='myapp-files', Key='large-file.zip',
UploadId=mpu['UploadId'], MultipartUpload={'Parts': parts})四、用户权限管理(IAM Policy)
<code"># 创建只读用户(只能下载,不能删除)
mc admin user add hkminio readonly_user ReadOnlyPass2026!
# 创建自定义 IAM 策略
cat > /tmp/readonly-policy.json << 'EOF' { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:GetObject", "s3:ListBucket"], "Resource": [ "arn:aws:s3:::myapp-files/*", "arn:aws:s3:::myapp-files" ] } ] } EOF mc admin policy create hkminio readonly-policy /tmp/readonly-policy.json mc admin policy attach hkminio readonly-policy --user readonly_user # 创建应用专用用户(只能访问特定前缀) cat > /tmp/app-policy.json << 'EOF'
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:*"],
"Resource": [
"arn:aws:s3:::myapp-files/uploads/myapp/*",
"arn:aws:s3:::myapp-files"
]
}
]
}
EOF
mc admin user add hkminio myapp_user AppPass2026!
mc admin policy create hkminio myapp-policy /tmp/app-policy.json
mc admin policy attach hkminio myapp-policy --user myapp_user五、版本控制与生命周期管理
<code"># 启用存储桶版本控制(防止误删,可恢复历史版本)
mc version enable hkminio/myapp-files
# 查看文件历史版本
mc ls --versions hkminio/myapp-files/documents/important.pdf
# 恢复到特定版本
mc cp --version-id "version-id-string" \
hkminio/myapp-files/documents/important.pdf \
hkminio/myapp-files/documents/important-restored.pdf
# 配置生命周期规则(自动归档/删除)
cat > /tmp/lifecycle.json << 'EOF'
{
"Rules": [
{
"ID": "delete-old-temp-files",
"Status": "Enabled",
"Filter": {"Prefix": "temp/"},
"Expiration": {"Days": 7}
},
{
"ID": "expire-old-versions",
"Status": "Enabled",
"NoncurrentVersionExpiration": {"NoncurrentDays": 30}
}
]
}
EOF
mc ilm import hkminio/myapp-files < /tmp/lifecycle.json
mc ilm ls hkminio/myapp-files六、分布式部署(高可用)
<code"># MinIO 分布式模式(4台服务器,纠删码保护)
# 每台服务器执行相同命令,MinIO 自动组成集群
# /etc/systemd/system/minio.service(4节点示例)
[Service]
ExecStart=/usr/local/bin/minio server \
http://minio{1...4}.internal:9000/data{1...2} \
--console-address ":9001"
Environment="MINIO_ROOT_USER=admin"
Environment="MINIO_ROOT_PASSWORD=MinioCluster2026!"
Environment="MINIO_VOLUMES=/data{1...2}"
# 分布式模式特性:
# - 4台服务器,任意1台宕机,数据仍可读写
# - 2台宕机,数据只读(保护模式)
# - 3台宕机,服务不可用七、监控与告警
<code"># MinIO 内置 Prometheus 指标 # http://s3.yourdomain.com/minio/v2/metrics/cluster # 关键指标: # minio_bucket_usage_object_total - 各桶文件数量 # minio_bucket_usage_total_bytes - 各桶存储量 # minio_s3_requests_total - API 请求量 # minio_s3_errors_total - 错误率 # minio_node_disk_free_bytes - 磁盘剩余空间 # 配置磁盘告警(当剩余 < 20% 时告警) mc admin prometheus generate hkminio > /etc/prometheus/minio.yml
八、总结
MinIO 在香港服务器上实现了与 AWS S3 100% API 兼容的私有对象存储——现有使用 boto3、aws cli、s3cmd 的代码只需改一行 endpoint_url 即可迁移。数据完全自主可控,带宽不限(香港 VPS 带宽通常按套餐固定收费,而不是按 GB 计费),大量文件传输时成本远低于 AWS S3。对于需要 S3 兼容存储但数据不能出境的企业,香港 MinIO 是最优解。