香港服务器搭建MinIO企业私有对象存储:S3兼容全功能方案完整配置

香港服务器搭建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 是最优解。

Telegram