698 字
3 分钟

Docker-Compose 自部署 MinIO S3 对象存储服务

MinIO 是个开源的对象存储服务器,兼容 Amazon S3 API。MinIO 在大数据、云计算和容器化环境中广泛应用,为应用程序提供了可靠、高效的对象存储服务。很多项目都支持 S3 接口,Lobe-Chat、思源笔记、Obsidian 的 Self-hosted LiveSync 插件都能用它做数据同步。因此自部署一个 MinIO 单节点 S3 对象存储服务器,自己用起来也方便许多。


环境准备#

先确认有 Docker:

Terminal window
docker -v
docker-compose -v

如果没有 Docker 或 Docker Compose,装一下:

Terminal window
# 安装 Docker
curl -sSL https://get.docker.com/ | sh
systemctl start docker
systemctl enable docker
# 安装 Docker Compose
curl -L https://github.com/docker/compose/releases/download/v2.9.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# 赋予 docker-compose 执行权限
chmod +x /usr/local/bin/docker-compose

部署#

创建目录:

Terminal window
mkdir -p /opt/minio/{s3_data,config}
cd /opt/minio

docker-compose.yml:

version: "3.5"
services:
minio:
image: minio/minio:RELEASE.2025-04-22T22-12-26Z
container_name: minio
restart: always
ports:
- "9000:9000" # API
- "9001:9001" # 控制台
environment:
TZ: "Asia/Shanghai"
MINIO_ROOT_USER: "admin" # 可以改成你的用户名
MINIO_ROOT_PASSWORD: "your-strong-password" # 换成强密码
MINIO_CORS_ALLOW_ORIGIN: "*"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
interval: 30s
timeout: 10s
retries: 5
start_period: 60s
volumes:
- ./s3_data:/data
- ./config:/root/.minio
command: "server /data --console-address :9001 --address :9000"

启动:

Terminal window
docker-compose up -d

等几分钟容器完全启动,浏览器访问控制台:

http://你的服务器IP:9001

用你设置的用户名密码登录。

API 地址是:

http://你的服务器IP:9000

日常维护#

Terminal window
# 停止
docker-compose down
# 重启
docker-compose restart
# 更新镜像
docker-compose pull
docker-compose up -d
# 查看日志
docker-compose logs -f minio

排查问题#

访问不了先检查防火墙:

Terminal window
# Ubuntu/Debian
sudo ufw allow 9000/tcp
sudo ufw allow 9001/tcp
# CentOS/RHEL
sudo firewall-cmd --add-port=9000/tcp --permanent
sudo firewall-cmd --add-port=9001/tcp --permanent
sudo firewall-cmd --reload

看端口占用:

Terminal window
netstat -tlnp | grep :9000
netstat -tlnp | grep :9001

检查容器状态:

Terminal window
docker ps | grep minio

Nginx 反向代理#

准备工作#

  1. 防火墙开放 80 和 443 端口
  2. 准备两个二级域名, DNS 记录指向你的服务器 IP:
    • api.your-domain.com → 你的服务器 IP
    • console.your-domain.com → 你的服务器 IP

配置#

Debian/Ubuntu 保存到 /etc/nginx/sites-available/minio,CentOS/RHEL 保存到 /etc/nginx/conf.d/minio.conf:

# API
server {
listen 80;
server_name api.your-domain.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name api.your-domain.com;
ssl_certificate /etc/ssl/certs/your-domain.crt;
ssl_certificate_key /etc/ssl/private/your-domain.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512;
ssl_prefer_server_ciphers on;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options DENY;
location / {
proxy_pass http://localhost: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;
proxy_connect_timeout 300;
proxy_http_version 1.1;
proxy_set_header Connection "";
chunked_transfer_encoding off;
}
}
# Console
server {
listen 80;
server_name console.your-domain.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name console.your-domain.com;
ssl_certificate /etc/ssl/certs/your-domain.crt;
ssl_certificate_key /etc/ssl/private/your-domain.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512;
ssl_prefer_server_ciphers on;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options DENY;
location / {
proxy_pass http://localhost:9001;
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_set_header X-Forwarded-Prefix /;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;
}
}

申请 SSL 证书#

推荐用 Let’s Encrypt:

Terminal window
# Debian/Ubuntu
sudo apt install certbot python3-certbot-nginx
sudo certbot certonly --nginx -d api.your-domain.com -d console.your-domain.com
# CentOS/RHEL
sudo dnf install certbot python3-certbot-nginx
sudo certbot certonly --nginx -d api.your-domain.com -d console.your-domain.com

证书在 /etc/letsencrypt/live/your-domain.com/,包含 fullchain.pemprivkey.pem

改 Nginx 配置里的证书路径:

ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;

测试并重载:

Terminal window
sudo nginx -t
sudo systemctl reload nginx

现在用 HTTPS 访问:

  • API: https://api.your-domain.com
  • 控制台: https://console.your-domain.com

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!

赞助
Docker-Compose 自部署 MinIO S3 对象存储服务
https://blog.moewah.com/posts/2877/
作者
GoWah
发布于
2025-01-14
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
GoWah
Hello, I'm GoWah.
分类
标签
站点统计
文章
160
分类
9
标签
350
总字数
301,106
运行时长
0
最后活动
0 天前

目录