香港服务器搭建Minio对象存储:替代七牛/阿里云OSS的私有化方案

为什么要自建对象存储?

七牛、阿里云 OSS、腾讯 COS 这类公有云对象存储有三个明显痛点:按流量计费难以预估成本数据托管在第三方存在隐私风险海外访问速度不稳定。对于有一定规模的业务,在香港服务器自建 Minio,一次性投入,数据完全自主,流量成本可控。

Minio 是 S3 兼容的开源对象存储,支持 AWS SDK 直接接入,迁移成本极低。


一、用 Docker 部署 Minio(推荐方式)

# 创建数据目录
mkdir -p ~/minio/data

# 运行 Minio 容器
docker run -d \
  --name minio \
  -p 9000:9000 \
  -p 9001:9001 \
  -v ~/minio/data:/data \
  -e "MINIO_ROOT_USER=your_admin_user" \
  -e "MINIO_ROOT_PASSWORD=StrongPassword123!" \
  --restart unless-stopped \
  quay.io/minio/minio server /data --console-address ":9001"

参数说明:
9000 是 API 端口(应用上传下载文件用),9001 是 Web 控制台端口。


二、配置 Nginx 反向代理

sudo nano /etc/nginx/sites-available/minio
# Minio API 端口
server {
    listen 80;
    server_name storage.your-domain.com;

    # 忽略客户端请求体大小限制(允许上传大文件)
    client_max_body_size 0;

    location / {
        proxy_pass http://127.0.0.1:9000;
        proxy_http_version 1.1;
        proxy_set_header Host $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_buffering off;
        proxy_request_buffering off;
    }
}

# Minio 控制台
server {
    listen 80;
    server_name minio-console.your-domain.com;

    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;
    }
}
sudo ln -s /etc/nginx/sites-available/minio /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx

# 申请 SSL 证书
sudo certbot --nginx -d storage.your-domain.com -d minio-console.your-domain.com

三、防火墙配置

# 不直接对外暴露 9000/9001 端口,通过 Nginx 80/443 访问
# 确保这两个端口没有开放到公网
sudo ufw deny 9000
sudo ufw deny 9001

四、创建 Bucket 和访问密钥

访问 https://minio-console.your-domain.com,用管理员账号登录控制台:

  1. Buckets → Create Bucket,填写 bucket 名称(如 myapp-uploads
  2. Access Keys → Create Access Key,生成应用专用的 Access Key 和 Secret Key
  3. 根据需要设置 Bucket 访问策略(公开读 / 私有读写)

五、与 WordPress 集成

安装 WP Offload Media Lite 插件,将 WordPress 媒体文件自动上传到 Minio:

  1. 插件设置中选择"Amazon S3 Compatible"
  2. 填入 Minio 的 Endpoint:https://storage.your-domain.com
  3. 填入 Access Key 和 Secret Key
  4. 选择对应的 Bucket
  5. 开启"从 S3 提供文件",WordPress 上传的图片将直接通过 Minio 提供

六、与 Python / Node.js 应用集成

Minio 完全兼容 AWS S3 SDK,只需修改 endpoint 即可:

# Python(boto3)
import boto3

s3 = boto3.client(
    's3',
    endpoint_url='https://storage.your-domain.com',
    aws_access_key_id='your_access_key',
    aws_secret_access_key='your_secret_key',
)

# 上传文件
s3.upload_file('local_file.jpg', 'myapp-uploads', 'remote/path/file.jpg')

# 生成预签名下载链接(有效期1小时)
url = s3.generate_presigned_url('get_object',
    Params={'Bucket': 'myapp-uploads', 'Key': 'remote/path/file.jpg'},
    ExpiresIn=3600
)
// Node.js(@aws-sdk/client-s3)
const { S3Client, PutObjectCommand } = require("@aws-sdk/client-s3");

const s3 = new S3Client({
  endpoint: "https://storage.your-domain.com",
  region: "us-east-1",  // Minio 需要填写但不使用,任意值即可
  credentials: {
    accessKeyId: "your_access_key",
    secretAccessKey: "your_secret_key",
  },
  forcePathStyle: true,  // Minio 必须开启 path-style
});

总结

Minio 私有化对象存储的核心优势:S3 完全兼容(现有代码几乎零改动)、数据完全自主、流量费用可控、香港节点访问速度稳定。部署完成后,可以替代七牛、阿里云 OSS 用于图片存储、文件上传、静态资源分发等场景。

自建 Minio 需要足够的存储空间,IDC.Net 香港独立服务器提供大容量 SSD 配置,月付 299 元起,CN2 GIA 直连大陆,文件上传下载速度快,支付宝 / USDT 付款,免 KYC 实名。

THE END