Ubuntu 部署 MinIO(API:8071 / Console:8070)与 Python 接入实战:自启动、上传、下载、图片在线访问
本文按“能落地、可复现”的标准,把 MinIO 在 Ubuntu 上的安装部署、systemd 后台自启动、mc 管理以及 Python SDK 上传/下载/在线访问(预签名与公开读)走一遍。示例目录结构与端口配置与你当前环境一致:
- Server:
/opt/minio/server/minio - Client:
/opt/minio/client/mc - Data:
/opt/minio/data - S3 API:
8071 - Console:
8070
注意:Ubuntu 系统自带
mc(Midnight Commander 文件管理器),直接输入mc会进入蓝色双栏界面。MinIO 的客户端必须使用./mc(在/opt/minio/client下)或/opt/minio/client/mc的绝对路径。
1. 目录规划与权限
1.1 目录结构
/opt/minio/ server/ # minio server 二进制 client/ # MinIO mc 二进制 data/ # 数据目录(对象存储数据)1.2 创建数据目录并设置权限
生产环境建议用专用用户运行(如 minio-user)。你的数据目录目前属于 minio-user,这是正确的方向。
sudo mkdir -p /opt/minio/datasudo chown -R minio-user:minio-user /opt/minio/datasudo chmod 750 /opt/minio/data2. 安装 MinIO Server(二进制)
在 /opt/minio/server 目录下载并赋权:
cd /opt/minio/serverwget https://dl.minio.org.cn/server/minio/release/linux-amd64/miniochmod +x minio3. 前台启动验证(API=8071 / Console=8070)
先用前台方式验证参数与端口是否正确(确保不是 systemd/权限问题):
cd /opt/minio/server
MINIO_ROOT_USER=admin MINIO_ROOT_PASSWORD='A12345678' \./minio server /opt/minio/data \ --address ":8071" \ --console-address ":8070"验证监听端口:
ss -lntp | egrep '8070|8071'访问地址:
- Console:
http://<服务器IP>:8070 - S3 API(SDK/接口):
http://<服务器IP>:8071
mc、Python SDK、S3 兼容接口全部走 8071;8070 仅用于控制台页面。
4. 安装 MinIO Client(mc)并避免“系统 mc”冲突
4.1 下载 MinIO 的 mc
cd /opt/minio/clientwget https://dl.minio.org.cn/client/mc/release/linux-amd64/mcchmod +x mc4.2 强制使用 ./mc(关键点)
- 输入
mc:走/usr/bin/mc(文件管理器) - 输入
./mc:走当前目录的 MinIO 客户端
验证版本:
cd /opt/minio/client./mc --version5. systemd 后台运行 + 开机自启动
systemd 最稳的写法:把 ExecStart 参数写清楚,不依赖拼接变量,避免“参数没展开导致启动失败”。
5.1 创建 service 文件
写入 /etc/systemd/system/minio.service:
sudo tee /etc/systemd/system/minio.service >/dev/null <<'EOF'[Unit]Description=MinIO Object StorageWants=network-online.targetAfter=network-online.target
[Service]User=minio-userGroup=minio-userWorkingDirectory=/opt/minio
Environment="MINIO_ROOT_USER=admin"Environment="MINIO_ROOT_PASSWORD=A12345678"
ExecStart=/opt/minio/server/minio server /opt/minio/data --address :8071 --console-address :8070
Restart=alwaysRestartSec=5LimitNOFILE=65536
[Install]WantedBy=multi-user.targetEOF5.2 启动并设置开机自启
sudo systemctl daemon-reloadsudo systemctl enable --now miniosudo systemctl status minio --no-pager查看日志(排障首选):
journalctl -u minio -f确认端口:
ss -lntp | egrep '8070|8071'6. 用 mc 初始化:alias、建桶、创建业务密钥、上传/下载
以下操作全部用 MinIO 的 ./mc。
6.1 绑定别名(alias)
cd /opt/minio/client
./mc alias set myminio http://127.0.0.1:8071 admin 'A12345678'./mc admin info myminio6.2 创建桶(bucket)
./mc mb myminio/images./mc ls myminio6.3 创建业务用户(AccessKey/SecretKey)
业务系统不应长期使用 root(admin),建议为每个应用创建独立 AK/SK。
./mc admin user add myminio imgapp 'ImgAppSecret@123'此时:
- AccessKey:
imgapp - SecretKey:
ImgAppSecret@123
6.4 授权(先跑通再收口)
先用 readwrite 跑通:
./mc admin policy attach myminio readwrite --user imgapp6.5 上传与下载(mc)
对象存储“目录”本质是 object key 的前缀:
# 上传./mc cp ./test.jpg myminio/images/uploads/2026/02/27/test.jpg
# 列表./mc ls myminio/images/uploads/2026/02/27/
# 下载./mc cp myminio/images/uploads/2026/02/27/test.jpg ./test-down.jpg7. Python SDK:上传、下载、图片访问
7.1 安装 SDK
pip3 install minio7.2 初始化 Client(HTTP + 8071)
endpoint 建议写
host:port,并设置secure=False(因为你当前是 http)。
from minio import Minio
client = Minio( "127.0.0.1:8071", access_key="imgapp", secret_key="ImgAppSecret@123", secure=False,)7.3 上传文件(fput_object)
from minio import Miniofrom datetime import datetime
client = Minio( "127.0.0.1:8071", access_key="imgapp", secret_key="ImgAppSecret@123", secure=False,)
bucket = "images"if not client.bucket_exists(bucket): client.make_bucket(bucket)
local_path = "/tmp/test.jpg"object_key = "uploads/{:%Y/%m/%d}/test.jpg".format(datetime.now())
client.fput_object( bucket_name=bucket, object_name=object_key, file_path=local_path, content_type="image/jpeg",)
print("uploaded:", bucket, object_key)7.4 下载文件(fget_object)
client.fget_object( bucket_name="images", object_name="uploads/2026/02/27/test.jpg", file_path="/tmp/test-down.jpg",)print("download ok")8. 图片在线访问:两种常用方案
方案 A:预签名 URL(私有桶推荐)
不开放匿名访问,通过临时 URL 直接在浏览器打开图片。
from datetime import timedelta
url = client.presigned_get_object( bucket_name="images", object_name="uploads/2026/02/27/test.jpg", expires=timedelta(minutes=30),)print(url)输出的 URL 直接用浏览器访问即可,30 分钟后失效。
方案 B:公开读(简单但有风险)
把桶设置为匿名下载:
cd /opt/minio/client./mc anonymous set download myminio/images此时图片可通过路径风格 URL 访问(无反代时):
http://<服务器IP>:8071/images/uploads/2026/02/27/test.jpg公开读适合明确“对外公开”的资源;内部系统或敏感图片建议使用预签名 URL 或在网关层做鉴权。
9. 常见问题与排查清单
9.1 输入 mc 进入蓝色界面
这是系统文件管理器。MinIO 客户端必须用:
cd /opt/minio/client./mc --version9.2 mc 连不上
确认连的是 8071(S3 API),不是 8070(Console):
ss -lntp | egrep '8070|8071'9.3 systemd 启动失败(端口不监听)
先看状态与日志:
sudo systemctl status minio --no-pagersudo journalctl -u minio -n 200 --no-pager重点检查:
/opt/minio/server/minio是否可执行minio-user是否能读写/opt/minio/data- 端口是否被占用
10. 最小可用结果(验收标准)
满足以下几点,说明部署链路完整:
systemctl status minio为 active (running)ss -lntp | egrep '8070|8071'能看到监听./mc admin info myminio返回信息- Python
fput_object上传成功,fget_object下载成功 - 预签名 URL 或公开读 URL 可以在浏览器打开图片
评论