存储策略
这一篇覆盖"文件存到哪"的两层
管理 -> 存储策略—— 文件真正存到哪里(本地 / S3 / 远程节点)管理 -> 策略组—— 用户或团队上传时命中哪条存储策略
用户和团队不是直接绑存储策略,而是绑策略组;策略组再按规则把上传分到具体策略。
第一次启动后默认会有什么
新部署实例第一次启动后,系统会自动准备:
- 默认本地存储策略
Local Default - 默认策略组
Default Policy Group
什么都不改的话:新用户自动绑默认策略组,再由默认策略组把上传分到默认本地存储策略。系统管理员创建新团队时,没手动指定就用默认策略组。
当前支持的三类存储
| 类型 | 说明 |
|---|---|
local | 文件存到本地目录 |
s3 | 文件存到 S3 或兼容对象存储(MinIO / R2 / B2 / OSS / COS 等) |
remote | 文件通过内部远程存储协议写到另一台 AsterDrive 从节点 |
只改存储策略 vs 还要改策略组
- 只想改"文件最终落到哪种存储后端" —— 看存储策略
- 想让不同用户、团队、文件大小走不同路线 —— 策略组也要配
后台典型操作顺序:
- 创建或测试好存储策略
- 创建策略组规则
- 把用户或团队绑定到目标策略组
存储策略的常见选项
| 项目 | 作用 |
|---|---|
| 名称 | 后台显示名 |
| 驱动类型 | local、s3 或 remote |
| 连接信息 | 本地目录 / S3 endpoint、bucket、密钥 / 绑定的远程节点 |
| 单文件大小上限 | 允许上传的最大文件;0 = 不限 |
| 分片大小 | 大文件上传时每一片的大小 |
| 默认策略 | 新建默认组或默认分流规则会优先使用 |
| 附加选项 | 本地内容去重、S3 上传/下载方式、远程上传/下载方式等 |
三类存储怎么选
local
适合单机、NAS、文件直接落本地磁盘。
内容去重默认关闭
开启后:上传完成后再读一遍临时文件并算内容指纹,相同内容复用同一份底层文件,省盘。
保持关闭:上传路径更直接,不会多一次全文件读取,相同内容会分别存。
家用、单机部署多半不需要去重;多人重复传相同素材的小团队可以开。
s3
适合文件放到 MinIO、AWS S3 或其他兼容对象存储。
remote
适合把控制面留在主控节点,把真实对象落点拆到另一台 AsterDrive 从节点。
要点先记住三件事:
- 策略本身只绑定远程节点,不再单独填 endpoint 或 access key
- follower 真正把对象写到哪里,由远程节点详情里的默认接收落点决定
- 远程下载支持
relay_stream和presigned - 远程上传支持
relay_stream和presigned;其中presigned需要浏览器能直达从节点
要真正用起来,先到 管理 -> 远程节点 把节点登记好,并确保它已经接入、启用、配置了可访问的 base_url,还至少有一个已应用的默认接收落点。完整流程看 远程节点。
S3 的上传方式
服务端流式中继 relay_stream
浏览器先把文件传给 AsterDrive,服务端再中继到 S3。正常路径不落本地临时目录,也不做内容去重。
适合浏览器到 S3 之间网络不稳,或者你想让所有出入口都经过应用节点。
Presigned 直传 presigned
浏览器直接上传到 S3 / MinIO。不大于分片大小时单次上传,更大的文件自动走 S3 分片上传。
用 presigned 前先配 CORS
对象存储那一侧要配好浏览器上传的 CORS:
- 允许上传来源
- 允许
PUT ExposeHeaders包含ETag
不配 CORS,浏览器直接报跨域错误。
S3 的下载方式
服务端中继下载 relay_stream
AsterDrive 先从对象存储读,再把字节流回传给浏览器。适合需要由应用节点继续控制响应头、同源下载行为或下游网络策略的场景。
Presigned 重定向 presigned
AsterDrive 先做权限校验,再把浏览器重定向到一个短时效的 S3 GET URL。下载带宽和长连接压力交给对象存储,但响应头和缓存行为也更多落到对象存储这一侧。
当前边界要清楚
- 登录态文件下载、团队下载、分享下载 —— 按存储策略分流
- 公开直链
/d/...—— 默认 inline 仍走服务端响应;追加?download=1后会复用附件下载分流,命中presigned时返回重定向 - 预览链路
/pv/...—— 仍然走服务端响应,不会重定向 - 分享下载次数 —— 在生成可用下载响应后计数;命中
304不增加
用 presigned 下载前确认:
- 客户端网络能直连对象存储
- 对象存储允许返回期望的
Content-Disposition/Content-Type - 你已经接受下载缓存行为更多由对象存储响应头决定
远程节点的上传方式
纯流式转发 relay_stream
浏览器先把文件传给主控节点,主控节点再直接流式转发到从节点。
中间不生成完整文件中转副本,但链路强依赖浏览器到主控、主控到从节点两段网络都稳定。
Presigned 直传 presigned
浏览器直接把文件上传到从节点。
这样能减轻主控节点的上传压力,但前提是浏览器能访问从节点,而且从节点要正确暴露上传所需的响应头。
远程节点的接收落点
远程存储策略解决的是“主控把流量发给哪台 follower”。
接收落点解决的是“这台 follower 收到对象后写到哪里”。
入口在:
管理 -> 远程节点 -> 打开某台节点 -> 主控指定的接收落点当前接收落点支持:
local:写到 follower 本地目录s3:写到 follower 能访问的对象存储
local 接收落点的基础路径只能填相对路径,最终会落在 follower 的 server.follower.managed_ingress_local_root 下面。
如果没有默认接收落点,远程写入会被拒绝;如果默认接收落点还在“等待应用”或“应用失败”,也不要急着把生产流量切过去。
远程节点的下载方式
服务端中继下载 relay_stream
主控节点先从从节点拉对象,再把字节流回传给浏览器。
适合需要继续由主控端掌控响应头、同源下载行为或下游网络策略的场景。
Presigned 重定向 presigned
AsterDrive 先做权限校验,再把浏览器重定向到一个短时效的从节点下载地址。
这样能减轻主控节点的下载带宽压力,但最终响应头和缓存行为会更多落到从节点这一侧。
策略组怎么理解
策略组 = 一组有序规则。每条规则指定:
- 命中哪条存储策略
- 优先级
- 适用的文件大小范围
最简单的策略组只有一条规则:任意大小的文件都走 Local Default。
更常见的进阶组合:
- 小文件走本地存储(响应快、不用过外网)
- 大文件走 S3 / MinIO(节省本地磁盘)
- 某些团队单独走远程节点(把控制面和真实落点拆开)
- 某些团队绑定独立策略组,和个人空间分开走
用之前一定注意这几件事
- 本地存储目录长期部署建议写绝对路径;如果写相对路径,先确认服务进程的工作目录
- 本地策略默认关内容去重;要省盘才开
presigned上传前配好对象存储 CORSpresigned下载前确认客户端能直连对象存储,并接受带宽从 AsterDrive 节点转移到对象存储- 远程策略先确认绑定的远程节点已经接入、启用,
base_url可达,并且有已应用的默认接收落点 - 远程
presigned上传/下载前,确认浏览器能直连从节点 - 本地存储 / 服务端临时处理路径要留够本地临时目录空间
- S3 的两种上传方式都不做内容去重
- 单文件大小限制、策略组规则、用户/团队配额都会影响上传成败
哪些修改不要直接做
已经有文件写入的策略,不要改这些
- 本地目录
- Bucket
- Endpoint
- 绑定的远程节点
旧文件按原位置读取,直接改位置 = 已有文件全部找不到。
更稳的做法:
- 新建一条策略
- 迁移旧数据
- 把用户或团队切到新策略所在的策略组
日常维护
- 至少保留一条可用的默认存储策略
- 至少保留一个启用中的默认策略组
- 保存前先做一次连接测试
- 给不同用户/团队分配不同存储路线时,到
管理 -> 用户或管理 -> 团队里绑策略组