Storage UI 的所有服务端配置都来自环境变量。存储凭据只保留在服务端,不会被打包进浏览器代码。
本地开发时,复制示例文件并编辑:
cp .env.example .env.local部署到托管平台(Vercel、Docker 等)时,在该平台的环境变量设置里配置相同的变量。
应用设置
| 变量 | 默认值 | 说明 |
|---|---|---|
NEXT_PUBLIC_APP_URL | localhost:3000 | 应用的公开访问地址。 |
NEXT_PUBLIC_BASE_PATH | (根路径) | 从子路径提供服务,如 /drive,并会把 / 重定向到该路径。 |
NEXT_PUBLIC_ASSET_PREFIX | (无) | 仅当静态资源由独立域名提供时才需要设置。 |
认证
同时设置用户名和密码即可开启内置登录页;任一为空则应用保持开放访问。
AUTH_USERNAME=admin
AUTH_PASSWORD=change-me
AUTH_SECRET=a-long-random-string
| 变量 | 是否必需 | 说明 |
|---|---|---|
AUTH_USERNAME | 登录时必需 | 登录用户名。 |
AUTH_PASSWORD | 登录时必需 | 登录密码。 |
AUTH_SECRET | 推荐 | 用于签名会话 Cookie。不设置时会用密码作为签名密钥,因此改密码会让所有人退出登录。 |
会话有效期为 7 天。登录页还可以再加一层人机验证,见下方 Turnstile。
存储连接
每个连接是一组带编号的变量,从 STORAGE_1_* 到 STORAGE_50_*。用户仍可在界面中运行时添加更多连接。一组变量具体用到哪些,取决于它的服务商。S3 及各种兼容服务共用一套,WebDAV 用另一套。
S3 及兼容服务
当一个连接的 BUCKET、ACCESS_KEY_ID 和 SECRET_ACCESS_KEY 都已设置后即会加载(部分服务商还需 REGION 或 ENDPOINT,见下)。
| 变量 | 是否必需 | 说明 |
|---|---|---|
STORAGE_n_BUCKET | 必需 | 存储桶名称。 |
STORAGE_n_ACCESS_KEY_ID | 必需 | Access Key ID(腾讯云 SecretId、B2 keyID)。 |
STORAGE_n_SECRET_ACCESS_KEY | 必需 | Secret Access Key(腾讯云 SecretKey、B2 application key)。 |
STORAGE_n_PROVIDER | 否(s3) | 存储服务商,见下方列表。 |
STORAGE_n_NAME | 否 | 侧边栏显示名称,默认使用桶名。 |
STORAGE_n_REGION | 视服务商 | alibaba、tencent、backblaze-b2 必需;r2 忽略;S3 默认 auto。 |
STORAGE_n_ENDPOINT | 视服务商 | minio 必需;其他 S3 兼容服务商可选覆盖。 |
STORAGE_n_ACCOUNT_ID | 仅 R2 | Cloudflare 账户 ID(R2 据此推导 endpoint)。 |
STORAGE_n_FORCE_PATH_STYLE | 否 | 路径风格寻址。minio 默认 true,其他默认 false。 |
STORAGE_n_PUBLIC_BASE_URL | 否 | 用于文件链接的公开或 CDN 地址。 |
STORAGE_n_READ_ONLY | 否 | 设为 true 时禁用该桶的所有修改操作。 |
支持的服务商有 s3、r2、alibaba、tencent、backblaze-b2、minio、s3-compatible。
务必填写真实 region。
STORAGE_1_PROVIDER=s3
STORAGE_1_NAME=Production
STORAGE_1_BUCKET=my-bucket
STORAGE_1_REGION=us-east-1
STORAGE_1_ACCESS_KEY_ID=...
STORAGE_1_SECRET_ACCESS_KEY=...
WebDAV
适用于 Nextcloud、ownCloud、Apache mod_dav 以及大多数 NAS。没有桶的概念,只有 ENDPOINT 是必需的。
STORAGE_8_PROVIDER=webdav
STORAGE_8_NAME=Nextcloud
STORAGE_8_ENDPOINT=https://cloud.example.com/remote.php/dav/files/alice
STORAGE_8_USERNAME=alice
STORAGE_8_PASSWORD=...
STORAGE_8_ROOT=/Photos
| 变量 | 是否必需 | 说明 |
|---|---|---|
STORAGE_n_PROVIDER | 必需 | 固定填 webdav。 |
STORAGE_n_ENDPOINT | 必需 | WebDAV collection 地址。 |
STORAGE_n_USERNAME | 否 | 用户名,未设置时回退到 ACCESS_KEY_ID。 |
STORAGE_n_PASSWORD | 否 | 密码,未设置时回退到 SECRET_ACCESS_KEY。 |
STORAGE_n_AUTH_TYPE | 否 | 认证方式,见下方说明。 |
STORAGE_n_ROOT | 否 | 只浏览服务器上的该目录,默认为 collection 根目录。 |
STORAGE_n_NAME | 否 | 侧边栏显示名称,默认使用服务器地址。 |
STORAGE_n_PUBLIC_BASE_URL | 否 | 用于文件链接的公开地址,见下方说明。 |
STORAGE_n_READ_ONLY | 否 | 设为 true 时禁用该连接的所有修改操作。 |
AUTH_TYPE 可填 password(设置了用户名时的默认值)、basic(与 password 是同一种方式的另一个名字)、digest、auto(先匿名尝试,再按服务器返回的挑战方式重试)、none。填了无法识别的值会被忽略并输出警告。
与 S3 系服务商有两点不同。
- WebDAV 始终经由本应用的服务端中转,不受设置里「直接从浏览器请求」开关的影响,因此服务端需要能访问该 WebDAV 主机。地址在内网时参见下方的 内网地址。
- 不设置
PUBLIC_BASE_URL时,文件内容由服务端流式转发,而不是走签名直链。如果有一个指向同一批文件的公开 HTTP 地址,填进去即可获得直接预览链接。
内网地址
| 变量 | 默认值 | 说明 |
|---|---|---|
ALLOW_PRIVATE_ENDPOINTS | false | 允许界面中添加的连接指向内网地址。 |
生产环境下,用户在界面中添加的连接不允许指向内网地址,因为服务端会代用户去请求该地址。被拦截的包括 localhost、*.local、*.internal,以及环回、链路本地、运营商级 NAT 网段和 10.0.0.0/8、172.16.0.0/12、192.168.0.0/16 这几个私有网段。
ALLOW_PRIVATE_ENDPOINTS=true
确实需要连接局域网 NAS 或同一网络内其他容器时再打开。有两种情况本来就不受影响。
STORAGE_n_*连接是部署者自己配的,不做该校验,因此只用环境变量配置存储桶的自托管部署无需设置这一项。- 本地开发不受限制,只有以
NODE_ENV=production运行时才会生效。
Turnstile
为登录页添加 Cloudflare Turnstile 人机验证。先在 Cloudflare 控制台创建一个 Widget,然后同时设置两个密钥。
TURNSTILE_SITE_KEY=0x4AAAAAAA...
TURNSTILE_SECRET_KEY=0x4AAAAAAA...
| 变量 | 是否必需 | 说明 |
|---|---|---|
TURNSTILE_SITE_KEY | 验证时必需 | Widget 的 Site Key,会下发到浏览器,非机密。 |
TURNSTILE_SECRET_KEY | 验证时必需 | Widget 的 Secret Key,仅在服务端使用。 |
两个都设置时验证才会生效;只设置其中一个时验证保持关闭,并会在日志中输出警告。该验证作用于登录页,因此未配置 AUTH_USERNAME 和 AUTH_PASSWORD 时不会生效。
两个密钥都在运行时读取,不参与构建,因此同一个 Docker 镜像可以配任意一组密钥,更换后重启即可生效。