MinIO对象存储在VPS上

当应用程序需要存储大文件——照片、视频、日志、备份——时,你面临选择:Amazon S3(昂贵)或本地服务器存储(不可扩展)。对象存储是解决方案MinIO是最佳选择——与S3 API兼容、成本大幅降低、运行在你自己的VPS上,无需按GB/月支付费用。

为什么选择MinIO而不是Amazon S3

Amazon S3是云存储的行业标准。然而,S3按GB/月计价(称为"按使用付费")。上传10TB/月意味着额外支付约$200。加上从泰国到AWS新加坡数据中心的延迟导致速度下降5-10倍。MinIO解决了这些问题。

前置要求

目录结构

~/minio/
├── docker-compose.yml
├── .env
└── data/                    # 对象存储目录(Docker外)

第一步 — 创建MinIO目录

mkdir -p ~/minio/data
cd ~/minio
chmod 700 data

第二步 — 创建.env配置文件

.env文件存储凭证和环境变量。

cat > .env << 'EOF'
MINIO_ROOT_USER=minioadmin
MINIO_ROOT_PASSWORD=YourSecurePassword123!
MINIO_SERVER_URL=https://minio.example.com:9000
MINIO_BROWSER_REDIRECT_URL=https://minio.example.com:9001
EOF

自定义:

第三步 — 创建docker-compose.yml

cat > docker-compose.yml << 'EOF'
version: '3.8'

services:
  minio:
    image: minio/minio:latest
    container_name: minio-server
    restart: unless-stopped
    env_file: .env
    ports:
      - "9000:9000"
      - "9001:9001"
    volumes:
      - ./data:/data
      - ./certs:/root/.minio/certs:ro
    command: server /data --console-address ":9001"
    networks:
      - minio-net

networks:
  minio-net:
    driver: bridge
EOF

第四步 — 配置SSL证书

MinIO需要PEM格式的SSL证书。首先检查是否存在Let's Encrypt证书。

# 检查现有证书
ls -la /etc/letsencrypt/live/minio.example.com/

# 如果不存在,安装certbot
sudo apt-get install certbot python3-certbot-nginx -y
sudo certbot certonly --standalone -d minio.example.com

获得证书后,将其复制到MinIO:

# 创建MinIO证书目录
mkdir -p ~/minio/certs

# 复制证书文件
sudo cp /etc/letsencrypt/live/minio.example.com/fullchain.pem ~/minio/certs/public.crt
sudo cp /etc/letsencrypt/live/minio.example.com/privkey.pem ~/minio/certs/private.key

# 设置正确的权限
sudo chown $USER:$USER ~/minio/certs/*
chmod 600 ~/minio/certs/*

第五步 — 安装Nginx反向代理

MinIO直接运行在9000/9001端口。使用Nginx通过标准HTTPS 443端口代理这些端口。

cat > /etc/nginx/sites-available/minio.conf << 'EOF'
upstream minio_s3 {
    server localhost:9000;
}

upstream minio_console {
    server localhost:9001;
}

server {
    listen 443 ssl http2;
    server_name minio.example.com;

    ssl_certificate /etc/letsencrypt/live/minio.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/minio.example.com/privkey.key;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    client_max_body_size 5000M;

    # S3 API端点
    location / {
        proxy_pass https://minio_s3;
        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 600;
        proxy_send_timeout 600;
        proxy_read_timeout 600;
    }

    # MinIO控制台(Web UI)
    location /minio/ {
        proxy_pass https://minio_console/;
        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;
    }
}

server {
    listen 80;
    server_name minio.example.com;
    return 301 https://$server_name$request_uri;
}
EOF

# 启用配置
sudo ln -s /etc/nginx/sites-available/minio.conf /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx

第六步 — 启动MinIO

cd ~/minio
docker-compose up -d
docker-compose logs -f minio

当你看到 All go.min.js, go.min.css files were cached 时,MinIO已成功启动。

✅ 测试SSL: 在浏览器中打开 https://minio.example.com:9001https://minio.example.com/minio — 你应该看到MinIO登录页面。

第七步 — 访问MinIO控制台并创建存储桶

在浏览器中导航到 https://minio.example.com:9001

登录后,点击"Buckets"→"Create Bucket"。

或者,使用MinIO客户端(mc)命令:

# 将MinIO添加为别名
mc alias set minio https://minio.example.com:9000 minioadmin YourSecurePassword123! --api S3v4

# 创建存储桶
mc mb minio/mybucket

# 启用版本控制(可选但推荐)
mc version enable minio/mybucket

第八步 — 为Web应用配置CORS

如果你的Web应用需要直接从浏览器上传文件到MinIO,必须启用CORS。

cat > cors.json << 'EOF'
{
  "CORSRules": [
    {
      "AllowedOrigins": ["https://yourapp.com"],
      "AllowedMethods": ["GET", "PUT", "POST", "DELETE", "HEAD"],
      "AllowedHeaders": ["*"],
      "MaxAgeSeconds": 3000
    }
  ]
}
EOF

mc cors set --config-file cors.json minio/mybucket

从应用程序连接

PHP + Laravel

// config/filesystems.php
'minio' => [
    'driver' => 's3',
    'key' => env('AWS_ACCESS_KEY_ID'),
    'secret' => env('AWS_SECRET_ACCESS_KEY'),
    'region' => 'us-east-1',
    'bucket' => env('AWS_BUCKET'),
    'url' => env('AWS_URL'),
    'endpoint' => env('AWS_ENDPOINT'),
    'use_path_style_endpoint' => true,
];
// .env
AWS_ACCESS_KEY_ID=minioadmin
AWS_SECRET_ACCESS_KEY=YourSecurePassword123!
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=mybucket
AWS_ENDPOINT=https://minio.example.com:9000
AWS_URL=https://minio.example.com:9000

Python

from minio import Minio

client = Minio(
    "minio.example.com:9000",
    access_key="minioadmin",
    secret_key="YourSecurePassword123!",
    secure=True
)

# 上传文件
client.fput_object("mybucket", "myobject", "local_file.txt")

# 下载文件
client.fget_object("mybucket", "myobject", "downloaded_file.txt")

Node.js

const Minio = require('minio');

const minioClient = new Minio.Client({
    endPoint: 'minio.example.com',
    port: 9000,
    useSSL: true,
    accessKey: 'minioadmin',
    secretKey: 'YourSecurePassword123!'
});

// 上传文件
minioClient.fPutObject('mybucket', 'myobject', 'local_file.txt', (err, etag) => {
    if (err) return console.log(err);
    console.log('File uploaded successfully!');
});

故障排查常见问题

MinIO启动失败 — 数据目录错误

# 检查权限
ls -la ~/minio/data
chmod 700 ~/minio/data

# 检查日志
docker-compose logs minio

# 重启
docker-compose restart minio

从应用程序连接时出现SSL证书错误

# 如果过期,更新证书
sudo certbot renew --force-renewal

# 复制更新的证书
sudo cp /etc/letsencrypt/live/minio.example.com/fullchain.pem ~/minio/certs/public.crt
sudo cp /etc/letsencrypt/live/minio.example.com/privkey.pem ~/minio/certs/private.key

# 重启MinIO
docker-compose down
docker-compose up -d

Nginx 413错误 — 请求实体太大

# 增加nginx配置中的client_max_body_size
client_max_body_size 5000M;  # 根据需要调整

需要用于MinIO对象存储的VPS?

AsiaGB提供具有SSD存储和完全root访问权的Linux VPS,非常适合生产MinIO部署。从500泰铢/月起,提供20GB+SSD存储和99%正常运行时间保证。

立即开始使用AsiaGB

查看泰国VPS主机全部套餐 →