MinIO 本地对象存储怎么给团队验收?控制台和临时上传链接用 cpolar 安全开放一次
前后端联调文件上传,最烦的不是把服务跑起来,而是“我本地能传,你那边看不到”。头像、附件、AI 数据集这些链路,只在开发机上自测一遍不够,产品、前端、后端都要看一眼:Bucket 里有没有对象、接口拿到的 URL 能不能访问、上传权限有没有收住。
这篇就按一次真实验收来走:本地用 Docker Compose 部署 MinIO,创建专门的测试 Bucket、测试账号和访问密钥,再验证控制台、S3 API、预签名上传链接。需要外部同事访问时,用 cpolar 临时开一个 HTTPS 入口,验收完马上关掉。
这里别把它当普通文件共享来用。本文主角只有三个:MinIO、S3 API、临时上传验收。
1 什么是 MinIO?这篇里它负责什么
MinIO 是一个兼容 S3 API 的对象存储服务。开发阶段用它的好处很直接:不用等云上存储资源审批,也不用把测试文件塞进业务服务器目录里。
在这篇文章里,MinIO 只承担一件事:模拟团队后续要接入的对象存储。前端上传头像、后端生成预签名 URL、AI 服务读取数据集文件,这些动作都落到同一个测试 Bucket 里看结果。
这一步要提前划清边界:
- 只创建测试 Bucket,不拿生产 Bucket 做演示。
- 只上传脱敏图片、空白 PDF、示例 CSV,不上传真实用户文件。
- 不把后台 root 账号、AccessKey、SecretKey 写到页面里。
- cpolar 只用于短时间验收,不长期开放 MinIO 后台。
2 环境准备:Docker、目录和端口先定好
本文用 Docker Compose 部署,机器上需要提前装好 Docker。MinIO 默认用两个端口:9000是 S3 API,9001是控制台页面。
先准备一个目录,后面的配置和数据都放这里:
mkdir -p ~/minio-acceptance/minio-data cd ~/minio-acceptance写入docker-compose.yml:
cat > docker-compose.yml <<'EOF' services: minio: image: quay.io/minio/minio:latest container_name: minio-acceptance command: server /data --console-address ":9001" environment: MINIO_ROOT_USER: minioadmin MINIO_ROOT_PASSWORD: minioadmin123456 ports: - "9000:9000" - "9001:9001" volumes: - ./minio-data:/data restart: unless-stopped EOF提醒一下,MINIO_ROOT_PASSWORD至少要 8 位。这里用的是本地验收密码,跑完这篇就可以删掉;如果你要在团队测试环境长期放着,别沿用这个示例密码。
启动 MinIO:
docker compose up -d看容器状态:
docker ps --filter name=minio-acceptance浏览器打开:
http://127.0.0.1:9001用minioadmin / minioadmin123456登录。能看到 MinIO 控制台首页,就说明服务已经跑起来了。
这张图适合放控制台首页。读者看到 Bucket、Object Browser、Access Keys 这类入口,后面的验收动作就有位置感了。
3 创建测试 Bucket、测试账号和访问密钥
现在不要急着把后台地址发给同事。先把验收资源单独隔离出来,避免大家误操作到别的 Bucket。
3.1 创建测试 Bucket
在 MinIO 控制台左侧进入Object Browser,点击Create Bucket,Bucket 名称填:
team-acceptance创建后进入这个 Bucket,上传一个脱敏测试文件,比如:
avatar-demo.png如果上传后列表里能看到文件名、大小和更新时间,说明控制台写入链路没问题。这里建议只放 1~3 个小文件,排错时更清楚,不要一上来拖一整个目录进去。
3.2 创建测试账号
root 账号只用于初始化。给团队验收时,要建一个权限收窄的测试账号。
在控制台进入Identity相关菜单,创建用户:
用户名:acceptance-user 密码:Acceptance@123456接着给这个用户绑定只访问team-acceptance的策略。控制台可以创建 Policy;如果你更喜欢命令行,也可以用 MinIO Client 来做。
这里用mc的容器版本,避免本机额外装工具。因为mc配置存在容器里,命令会把 alias、建桶、建用户放在同一次执行里完成,复制时不要拆开只跑中间一行。
写入一份只允许访问测试 Bucket 的策略文件:
cat > acceptance-policy.json <<'EOF' { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::team-acceptance" ] }, { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject", "s3:DeleteObject" ], "Resource": [ "arn:aws:s3:::team-acceptance/*" ] } ] } EOF把策略加到 MinIO,并创建测试用户:
docker run --rm --network container:minio-acceptance -v "$PWD:/work" --entrypoint sh minio/mc -c ' mc alias set local http://127.0.0.1:9000 minioadmin minioadmin123456 && mc mb --ignore-existing local/team-acceptance && mc admin policy create local acceptance-policy /work/acceptance-policy.json && mc admin user add local acceptance-user Acceptance@123456 && mc admin policy attach local acceptance-policy --user acceptance-user '这一步不是为了“多建一个账号”凑流程,而是为了确认权限边界。验收同事只应该碰测试 Bucket,不能看到后台 root 权限。
如果命令提示用户已经存在,说明你之前跑过初始化。可以先删掉旧测试用户再重建,或者直接沿用这次验收的测试账号:
docker run --rm --network container:minio-acceptance --entrypoint sh minio/mc -c ' mc alias set local http://127.0.0.1:9000 minioadmin minioadmin123456 && mc admin user remove local acceptance-user '这里不要把minioadmin发给同事。管理员账号只留给负责验收环境的人,用来查对象、看策略、清理测试数据。
4 验证 S3 API:上传、列表、下载都跑一遍
控制台能打开,只代表页面没问题。文件上传链路要交给业务系统使用,S3 API 也要单独测。
这里用 AWS CLI 来验证。没有安装的话,macOS 可以用brew install awscli,Ubuntu 可以用sudo apt-get install -y awscli;装好后再准备一个测试文件:
cat > demo-profile.txt <<'EOF' this is a minio acceptance file EOF配置临时环境变量,注意这些值只在本地终端里用,不要写进前端页面:
export AWS_ACCESS_KEY_ID=acceptance-user export AWS_SECRET_ACCESS_KEY='Acceptance@123456' export AWS_DEFAULT_REGION=us-east-1上传文件:
aws --endpoint-url http://127.0.0.1:9000 s3 cp demo-profile.txt s3://team-acceptance/demo-profile.txt列出 Bucket 内容:
aws --endpoint-url http://127.0.0.1:9000 s3 ls s3://team-acceptance/下载验证:
aws --endpoint-url http://127.0.0.1:9000 s3 cp s3://team-acceptance/demo-profile.txt downloaded-demo-profile.txt cat downloaded-demo-profile.txt如果这里报AccessDenied,先检查用户是否绑定了acceptance-policy;如果报连接失败,先看docker ps里容器是否还在,以及9000端口有没有被别的服务占用。
这轮验证建议让后端同事也跑一次。原因很简单:业务服务后面接的不是控制台,而是 S3 SDK。只要cp、ls、下载三件事都能走通,后端再换成 Java、Go、Node.js SDK 时,排查范围就会收窄到代码参数,而不是对象存储本身。
5 生成预签名 URL:让前端只拿临时上传入口
真实业务里,前端不应该拿对象存储的 AccessKey 和 SecretKey。更稳的做法是后端生成一个短时间有效的预签名 URL,前端只用这个 URL 上传指定文件。
这里用 Python 和 boto3 演示。安装依赖:
python3 -m pip install boto3写一个生成上传链接的脚本:
cat > presign_put.py <<'EOF' import boto3 s3 = boto3.client( "s3", endpoint_url="http://127.0.0.1:9000", aws_access_key_id="acceptance-user", aws_secret_access_key="Acceptance@123456", region_name="us-east-1", ) url = s3.generate_presigned_url( ClientMethod="put_object", Params={ "Bucket": "team-acceptance", "Key": "uploads/avatar-from-presign.png", "ContentType": "image/png", }, ExpiresIn=3600, HttpMethod="PUT", ) print(url) EOF生成链接:
UPLOAD_URL=$(python3 presign_put.py) echo "$UPLOAD_URL"准备一个测试图片文件。如果手头没有图片,也可以先放一个小文件做链路验证,但Content-Type要和脚本里保持一致:
printf 'png upload acceptance demo' > avatar-from-presign.png用预签名 URL 上传:
curl -X PUT -H "Content-Type: image/png" --upload-file avatar-from-presign.png "$UPLOAD_URL"回到 MinIO 控制台,进入team-acceptance/uploads/,能看到avatar-from-presign.png,这条上传链路就打通了。
这张图适合放对象列表,重点截出uploads/avatar-from-presign.png。团队验收时,这比口头说“我上传成功了”更有说服力。
划重点:预签名 URL 可以发给前端同事测试,但 AccessKey 和 SecretKey 不发。链接有效期在脚本里是3600秒,验收窗口结束后,不要继续把旧链接放在群里流转。
如果要验收附件上传,可以把Key改成uploads/contract-demo.pdf,把ContentType改成application/pdf。如果要验收 AI 数据集上传,可以把Key改成datasets/sample.csv,把ContentType改成text/csv。这里每次只测一种文件类型,别把头像、PDF、CSV 混在同一轮里测,出错时更容易定位。
6 用 cpolar 开临时 HTTPS 入口给同事验收
如果同事和你不在同一个局域网,127.0.0.1:9001他们打不开。这个时候再用 cpolar,把本地 MinIO 的控制台或 S3 API 临时映射出去。
cpolar 的 HTTP 隧道命令很短。映射控制台端口:
cpolar http 9001命令输出里会出现一个公网 HTTPS 地址,把这个地址发给需要看控制台页面的同事。免费随机公网地址 24 小时内会变化,适合这种短时间演示;如果要固定二级子域名,需要基础套餐或以上。
更推荐的验收方式是:控制台只给内部负责人看,前端同事拿预签名 URL 测上传。需要外部访问 S3 API 时,再单独开9000。注意同一台机器不要同时开一堆前台隧道,验收一个端口就开一个端口:
cpolar http 9000拿到 cpolar 的 HTTPS 地址后,把presign_put.py里的endpoint_url改成公网入口,例如:
endpoint_url="https://你的随机地址.cpolar.cn"重新生成上传链接,再发给前端同事测试。这里别把9001控制台地址、root 账号和测试用户密码一起扔到群里;验收上传链路,用预签名 URL 就够了。
发给同事的信息建议只保留三项:验收目标、上传链接、文件类型要求。例如“请用 PUT 上传一张 png 到这个链接,Content-Type 使用 image/png”。越少越安全,也越不容易把后台权限误传出去。
如果外部同事打开链接报错,按这个顺序查:
- 本机
http://127.0.0.1:9000或http://127.0.0.1:9001是否正常。 - cpolar 前台命令是否还在运行。
- 预签名 URL 里的 endpoint 是否已经换成 cpolar 的 HTTPS 地址。
- 上传时的
Content-Type是否和生成签名时一致。
还有一个容易忽略的点:不要把控制台和 API 验收混在同一个群公告里。控制台验收看的是“对象是否落桶、权限是否收住”,API 验收看的是“业务上传动作是否完成”。两类信息分开发,参与人更少,权限也更清楚。
如果团队里有产品或测试同事只需要确认图片是否上传成功,让负责人截图对象列表就行,不要额外发控制台账号。对象存储后台一旦被当成普通管理页面转发,后面很难追踪是谁删了测试文件。
7 验收结束后怎么收口
临时验收最怕“开完没人关”。MinIO 后台不是公开网盘,测试账号也不是长期给大家共用的入口。
验收结束后,按顺序做收口:
# 停掉 cpolar 前台隧道:在运行 cpolar 的终端按 Ctrl+C # 停掉本地 MinIO cd ~/minio-acceptance docker compose down如果要连测试数据一起清掉:
rm -rf ~/minio-acceptance/minio-data生产环境不要照搬这套临时开放方式。正式上线要走固定域名、HTTPS 网关、业务鉴权、对象生命周期策略和审计日志;AccessKey 由后端服务持有,前端只拿业务接口返回的临时上传入口。
8 总结
这套流程跑完后,你已经有了一个可验收的 MinIO 本地对象存储:控制台能看到 Bucket,S3 API 能上传下载,预签名 URL 能让前端在不接触密钥的情况下完成上传。cpolar 只在团队短时间验收时提供 HTTPS 入口,不承担长期生产访问。
关键步骤就三件事:
- 用 Docker Compose 启动 MinIO,固定
9000作为 S3 API、9001作为控制台。 - 创建
team-acceptance测试 Bucket 和acceptance-user测试账号,把权限限制在验收范围内。 - 用预签名 URL 验证头像、附件、AI 数据集上传链路,需要外部同事参与时再临时开启 cpolar。
我更建议把这篇当成“上线前链路验收模板”,而不是对象存储入门笔记。团队把测试 Bucket、临时账号、预签名上传、验收后关闭入口这几件事养成习惯,后面接云上 S3、私有对象存储或正式网关时,排错会轻松很多。