Zipline 4.8.2 配置参数详解
讲透 Zipline 4.8.2 全部配置项:环境变量与后台两层配置的覆盖机制、15 类参数实测默认值、ziplinectl read-config/export-config 排查手法、生产 .env 模板与七类常见问题。
Zipline 4.8.2 配置参数详解
目标:把 Zipline 4.8.2 的全部配置项讲透——配置分几层、从哪里看、从哪里改、每个参数管什么、默认值多少、改完怎么生效、改错了会怎样。本文所有默认值与合并结果均来自实机
ziplinectl read-config输出,所有行为类结论(大小限制、限流、命名格式、环境变量覆盖)均有实测回显支撑。
一、环境信息
- 被测版本:Zipline 4.8.2(
/api/version实测返回"details":{"version":"4.8.2","sha":"5fe2792"}) - 实机环境:Ubuntu 24.04.5 LTS(x86_64),Docker 29.9.2 + Docker Compose v5.6.1,PostgreSQL 16
- 实例地址:
http://192.168.1.172:8142(直连)/http://192.168.1.172:8143(nginx 反代) - 部署方式:Docker Compose,完整过程见 《Zipline 4.8.2 Docker Compose 部署指南》
- 配置查阅命令均在部署目录
/opt/zipline下执行;示例账号root/q1w2e3r4
二、前置条件
- 已按部署指南完成实例搭建并通过健康检查(
curl -s http://127.0.0.1:8142/api/healthcheck返回{"pass":true}); - 具备服务器上的部署目录读写权限(
.env、docker-compose.yml所在目录); - 想改「仅环境可配」的 core/datasource 类参数,需要能重启服务;想改 dashboard 类参数,需要 SUPERADMIN 账号登录后台。
三、配置的分层模型与查看/修改方式
3.1 两层配置:环境变量覆盖 dashboard
Zipline 的配置分两层,优先级为 环境变量 > Server Settings 后台(存数据库)> 内置默认值:
- 绝大多数设置可以在后台 Server Settings(路径
/dashboard/admin/settings,仅超级管理员可见)里改,值存进数据库; - 同名设置一旦用环境变量提供,环境变量覆盖数据库值,且后台里该字段变成只读;
core与datasource两类的全部选项只能通过环境变量配置,后台没有对应入口。
这个「覆盖」行为不是靠文档口头保证的,ziplinectl read-config 的 DEBUG 日志直接列出了被环境变量覆盖的键(实测回显):
[2026-11-01T08:48:07 DEBUG config.read] overridden db settings from env vars overridden=["coreTrustProxy","coreTrustedProxies","coreReturnHttpsUrls","filesRoute","filesLength","filesDefaultFormat","filesMaxFileSize","urlsRoute","urlsLength","featuresThumbnailsEnabled","featuresThumbnailsInstantaneous"]
本次实例的 .env 恰好写了这 11 个变量,日志逐一对应,无一遗漏。
3.2 查看当前生效配置:read-config
read-config 输出「Zipline 实际看到的配置」JSON(环境变量与数据库值合并后的最终态),是排「改了没生效」问题的第一工具:
docker compose exec zipline ziplinectl read-config
实测回显(节选,敏感值已打码):
{"core":{"port":3000,"hostname":"0.0.0.0","secret":"bNI6****","returnHttpsUrls":false,"defaultDomain":null,"tempDirectory":"/zipline/uploads/.tmp","trustProxy":true,"trustedProxies":["10.89.62.0/24"],"databaseUrl":"postgres://zipline:PlG0****@postgresql:5432/zipline","database":{"username":null,"password":null,"host":null,"port":null,"name":null}},
"chunks":{"max":"95mb","size":"25mb","enabled":true},
"tasks":{"deleteInterval":"30m","clearInvitesInterval":"30m","maxViewsInterval":"30m","thumbnailsInterval":"30m","metricsInterval":"30m","cleanThumbnailsInterval":"1d"},
"files":{"route":"/f","length":12,"defaultFormat":"date","disabledTypes":[],"disabledTypesDefault":null,"disabledExtensions":[],"maxFileSize":"5mb","defaultExpiration":null,"maxExpiration":null,"assumeMimetypes":false,"defaultDateFormat":"YYYY-MM-DD_HH:mm:ss","removeGpsMetadata":false,"randomWordsNumAdjectives":2,"randomWordsSeparator":"-","defaultCompressionFormat":"jpg","maxFilesPerUpload":1000,"extensionlessUrls":false},
"urls":{"route":"/s","length":8},
"datasource":{"type":"local","local":{"directory":"./uploads"}},
"ratelimit":{"enabled":true,"max":10,"window":null,"adminBypass":true,"allowList":[]}}
💡 技术拓展:read-config 里的
features.userRegistration:false是个好例子——.env里并没有写FEATURES_USER_REGISTRATION,这个 false 是此前在后台「Features」页关掉注册后存进数据库的值。它说明 read-config 展示的是合并后的最终生效值,而非单一来源。
3.3 导出可复用配置:export-config
export-config 把当前生效配置导出成环境变量格式(默认只导出与内置默认值不同的键,适合精简 .env):
docker compose exec zipline ziplinectl export-config
实测回显(节选):
TASKS_DELETE_INTERVAL="30m"
TASKS_CLEAR_INVITES_INTERVAL="30m"
TASKS_MAX_VIEWS_INTERVAL="30m"
FILES_RANDOM_WORDS_NUM_ADJECTIVES=2
FEATURES_ROBOTS_TXT=true
INVITES_LENGTH=6
WEBSITE_THEME_DARK="builtin:dark_gray"
WEBSITE_THEME_LIGHT="builtin:light_gray"
PWA_ENABLED=false
加 -y 导出成可直接嵌进 Compose 文件的 YAML 格式,加 -d 连默认值一起导出全量清单。两个开关可组合(export-config -y -d)。
3.4 修改与生效方式
| 改动类型 | 操作 | 是否需要重建 |
|---|---|---|
.env 里新增/修改环境变量 | docker compose up -d | 需要——Compose 检测到配置变化会重建服务(实测:改了 FILES_MAX_FILE_SIZE 后 up -d 输出 Recreate,重建后新值生效;配置无变化时 up -d 输出 Running,不动在跑的服务) |
| 后台 Server Settings 改动 | 保存即写库 | 多数即时生效;官方标注 Core、Chunks、Tasks、部分 Features 类「保存后需重启」,重启用 docker compose restart zipline |
换 CORE_SECRET | 改 .env 后 up -d | 全员登录态与 API Token 立即作废(见 §八 FAQ) |
⚠️ 注意一个容易踩的坑:
docker compose restart只重启进程、不会重新读取.env——环境变量是容器创建时注入的。改了.env必须up -d(触发重建)才生效,只restart的话read-config里看到的还是旧值。
四、参数总览
按 read-config 的 JSON 结构,全部配置分 15 类。类别、环境变量前缀与配置渠道对照如下:
| 类别 | 环境变量前缀 | 配置渠道 | 说明 |
|---|---|---|---|
| core | CORE_、DATABASE_ | 仅环境变量 | 端口/绑定/密钥/数据库/反代信任 |
| datasource | DATASOURCE_ | 仅环境变量 | 文件本体存储后端 |
| files | FILES_ | 环境变量或后台 | 上传路由、命名、大小、类型管控 |
| urls | URLS_ | 环境变量或后台 | 短链路由与码长 |
| chunks | CHUNKS_ | 环境变量或后台 | 分块上传 |
| tasks | TASKS_ | 环境变量或后台 | 后台定时任务周期 |
| features | FEATURES_ | 环境变量或后台 | 功能开关 |
| ratelimit | RATELIMIT_ | 环境变量或后台 | 上传/短链限流 |
| invites | INVITES_ | 环境变量或后台 | 邀请码 |
| mfa | MFA_ | 环境变量或后台 | TOTP/Passkey |
| oauth | OAUTH_ | 环境变量或后台 | 第三方登录 |
| domains | DOMAINS | 环境变量或后台 | 生成链接可选域名 |
| website | WEBSITE_ | 环境变量或后台 | 品牌与外观 |
| discord / httpWebhook | DISCORD_ / HTTP_WEBHOOK_ | 环境变量或后台 | 事件通知 |
| pwa | PWA_ | 环境变量或后台 | 可安装 Web 应用 |
必填项只有两个:CORE_SECRET 与数据库连接(DATABASE_URL,或 DATABASE_NAME/USERNAME/PASSWORD/HOST/PORT 五件套全给)。其余全部有默认值。
五、核心参数分类详解
5.1 core:连接、密钥与反代信任
| 变量 | 默认值 | 说明 |
|---|---|---|
DATABASE_URL | 无(必填) | PostgreSQL 连接串,或 pglite:///绝对路径 启用内嵌库 |
CORE_SECRET | 无(必填) | 签名会话 Cookie 与加密 API Token 的密钥,建议 openssl rand -base64 32 生成 |
CORE_PORT | 3000 | 监听端口 |
CORE_HOSTNAME | 0.0.0.0 | 绑定地址;填 socket 路径(如 /tmp/zipline.sock)可改走 UNIX socket |
CORE_RETURN_HTTPS_URLS | false | 生成链接是否用 https://;TLS 终结在反代时也要开 |
CORE_TRUST_PROXY | false | 是否信任反向代理转发的头 |
CORE_TRUSTED_PROXIES | 空 | 可信代理 IP 或 CIDR 列表 |
CORE_TEMP_DIRECTORY | ./uploads/.tmp | 分块上传的临时目录(read-config 实测显示解析为 /zipline/uploads/.tmp) |
CORE_DEFAULT_DOMAIN | 空 | 生成链接的默认域名 |
要点与实测:
- 数据库连接二选一:
DATABASE_URL与五件套同时给时DATABASE_URL优先;五件套缺任何一个,服务直接拒绝启动。 - PGlite 模式:
DATABASE_URL=pglite:///zipline/data/database可去掉 PostgreSQL 依赖,数据库落在本地目录(注意存的是元数据,不是上传文件本体;目录必须持久化挂载,且要用绝对路径)。已有 PostgreSQL 数据时改 URL 不会搬数据,要先用ziplinectl migrate-pglite迁移(见部署指南)。 - 反代信任必须配对开启:本实例经 nginx 反代访问,
.env写了CORE_TRUST_PROXY=true与CORE_TRUSTED_PROXIES=10.89.62.0/24(反代所在网段)。不配的话所有访客在限流与日志里都会被算成反代那一个 IP。read-config 实测回显"trustProxy":true,"trustedProxies":["10.89.62.0/24"]确认生效。 _FILE后缀:任何这类变量都可以写成CORE_SECRET_FILE=/run/secrets/core_secret,值从文件读取,适合把密钥挪出.env。
5.2 datasource:文件本体存哪
| 变量 | 默认值 | 说明 |
|---|---|---|
DATASOURCE_TYPE | local | local 或 s3 |
DATASOURCE_LOCAL_DIRECTORY | ./uploads | 本地目录,相对 Zipline 根目录解析,也支持绝对路径 |
DATASOURCE_S3_ACCESS_KEY_ID / ..._SECRET_ACCESS_KEY / ..._BUCKET | 无 | S3 凭证与桶名 |
DATASOURCE_S3_REGION | us-east-1 | AWS 必填真实区域;R2 用 auto 或 us-east-1;B2/Hetzner 用各自区域码 |
DATASOURCE_S3_ENDPOINT | 无 | 非 AWS 服务商必填(R2/B2/Hetzner/自建 MinIO 的地址格式见官方文档) |
DATASOURCE_S3_FORCE_PATH_STYLE | false | 自建 MinIO 等常需设 true,报访问错误先试它 |
DATASOURCE_S3_SUBDIRECTORY | 无 | 桶内前缀目录 |
本实例实测为 local 模式,read-config 回显 "datasource":{"type":"local","local":{"directory":"./uploads"}},上传的文件落在部署目录的 uploads/ 下(Compose 已把它 bind mount 出来,备份时与数据库一起备)。
💡 技术拓展:S3 兼容对象存储是文件分享服务的主流第二存储后端,常见选项与 Zipline 适配要点:
服务商 REGION ENDPOINT 备注 AWS S3 真实区域(必填) 可不设 官方主路径 Cloudflare R2 auto/us-east-1https://<account>.r2.cloudflarestorage.com无真实区域概念 Backblaze B2 开户时给定(如 us-west-004)https://s3.<region>.backblazeb2.com— 自建 MinIO 任意 http://<host>:9000通常需 FORCE_PATH_STYLE=trueZipline 用通用 AWS SDK 对接,切换后端只动
DATASOURCE_变量;存量文件不会自动搬迁,跨后端迁移要用ziplinectl import-dir(见 §5.9)。
5.3 files:上传路由、命名与大小
| 变量 | 默认值 | 实测值 | 说明 |
|---|---|---|---|
FILES_ROUTE | /u | /f | 文件直链前缀;可设 / 让文件挂根路径 |
FILES_LENGTH | 6 | 12 | random 格式的文件名长度 |
FILES_DEFAULT_FORMAT | random | date | 命名格式:random/date/uuid/name/gfycat/random-words |
FILES_MAX_FILE_SIZE | 100mb | 5mb | 单文件大小上限 |
FILES_MAX_FILES_PER_UPLOAD | 10(后台默认) | 1000 | 单次请求最多文件数 |
FILES_DEFAULT_DATE_FORMAT | YYYY-MM-DD_HH:mm:ss | 同默认 | date 格式的时间模板 |
FILES_DEFAULT_EXPIRATION / FILES_MAX_EXPIRATION | 空 | 空 | 默认/最大过期时间(相对时长如 30d) |
FILES_DISABLED_TYPES | 空 | 空 | 拒绝的 MIME 列表,如 text/html,application/javascript |
FILES_DISABLED_TYPES_DEFAULT | 空 | 空 | 不拒绝而是降格成该 MIME(如 application/octet-stream 强制下载) |
FILES_DISABLED_EXTENSIONS | 空 | 空 | 拒绝的扩展名列表,如 exe,bat,dmg |
FILES_ASSUME_MIMETYPES | false | false | 按文件内容嗅探 MIME,不信任浏览器上报;配合类型黑名单开启 |
FILES_REMOVE_GPS_METADATA | false | false | 尝试剥离图片 EXIF GPS |
FILES_DEFAULT_COMPRESSION_FORMAT | jpg | jpg | 图片压缩目标格式(webp/jpg) |
FILES_EXTENSIONLESS_URLS | false | false | 开启后直链可去掉扩展名访问 |
实测行为三连(本实例 FILES_DEFAULT_FORMAT=date、FILES_MAX_FILE_SIZE=5mb):
- date 命名生效:上传
big2m.bin返回"name":"2026-11-01_08:48:16.bin"——按YYYY-MM-DD_HH:mm:ss生成; - 重名自动加后缀:同一秒内连续上传同名结果,服务端依次命名
2026-11-01_08:48:52.txt、...-1.txt、...-2.txt,不会互相覆盖; - 超限拒绝且报错有误导性:上传 6MB 文件(超 5mb 上限)返回的不是「文件太大」,而是:
{"error":"E1062: No files in multipart/form-data request","code":1062,"statusCode":400}
multipart 解析器把超限文件静默丢弃后才报「请求里没有文件」,排障时务必用 read-config 核对 filesMaxFileSize(详见 §八 FAQ)。
5.4 urls:短链
| 变量 | 默认值 | 实测值 | 说明 |
|---|---|---|---|
URLS_ROUTE | /go | /s | 短链前缀;可设 / 挂根路径 |
URLS_LENGTH | 4 | 8 | 随机短码长度 |
实测:URLS_LENGTH=8 下创建短链返回 "code":"uNMfdrDa"(8 位);带 vanity 自定义短码时返回 "vanity":"zipline-doc"、直链 http://127.0.0.1:8142/s/zipline-doc,访问返回 302 跳转到目标地址。接口细节见 《Zipline 4.8.2 常用操作与 API 详解》。
5.5 chunks:分块上传
| 变量 | 默认值 | 说明 |
|---|---|---|
CHUNKS_ENABLED | true | 是否允许分块上传接口 |
CHUNKS_MAX | 95mb | 分块上传的整文件上限 |
CHUNKS_SIZE | 25mb | 客户端切片大小 |
read-config 实测回显 "chunks":{"max":"95mb","size":"25mb","enabled":true}。用途是让大文件绕过反代的单请求体限制(反代 client_max_body_size 只需容得下一片)。CHUNKS_MAX 与 FILES_MAX_FILE_SIZE 是两道独立的闸:前者管分块通道,后者管所有上传的文件大小上限。
5.6 tasks:后台任务周期
| 变量 | 默认值 | 说明 |
|---|---|---|
TASKS_DELETE_INTERVAL | 30m | 扫描并删除到期文件 |
TASKS_CLEAR_INVITES_INTERVAL | 30m | 清理失效邀请码 |
TASKS_MAX_VIEWS_INTERVAL | 30m | 清理达到 maxViews 的文件/短链 |
TASKS_THUMBNAILS_INTERVAL | 30m | 生成视频缩略图 |
TASKS_METRICS_INTERVAL | 30m | 汇总统计指标 |
TASKS_CLEAN_THUMBNAILS_INTERVAL | 1d | 清理孤儿缩略图 |
取值用相对时长写法(30m、1d、2h 这类 ms 格式)。改动需重启生效。依赖「定时过期删除」功能时注意:deletesAt 到期不是即时删除,最坏要等一个 TASKS_DELETE_INTERVAL 周期。
5.7 features:功能开关
| 变量 | 默认值 | 实测值 | 说明 |
|---|---|---|---|
FEATURES_USER_REGISTRATION | true | 后台置 false | 开放注册;关开后配合 invites 做邀请制 |
FEATURES_OAUTH_REGISTRATION | true | false(后台) | 注册时显示 OAuth 按钮 |
FEATURES_IMAGE_COMPRESSION | true | true | 允许图片压缩 |
FEATURES_ROBOTS_TXT | true | true | 输出 robots.txt |
FEATURES_HEALTHCHECK | true | true | 开启 /api/healthcheck 端点 |
FEATURES_DELETE_ON_MAX_VIEWS | true | true | 达到最大查看次数即删除(关则只 404) |
FEATURES_THUMBNAILS_ENABLED | false | true | 视频缩略图(依赖 ffmpeg;图片缩略图官方不支持) |
FEATURES_THUMBNAILS_NUM_THREADS | 4 | 4 | 缩略图 worker 线程数,负载高调小 |
FEATURES_THUMBNAILS_FORMAT | jpg | jpg | 缩略图格式 |
FEATURES_THUMBNAILS_INSTANTANEOUS | false | true | 上传后立即生成,不等定时任务 |
FEATURES_METRICS_ENABLED | true | true | 统计指标采集(后台 metrics 页与 /api/stats) |
FEATURES_METRICS_ADMIN_ONLY | false | false | 仅管理员可看统计 |
FEATURES_VERSION_CHECKING | true | true | 版本自检,/api/version 的 isLatest 靠它 |
⚠️ 事实纠偏:v4.8.2 源码中没有 Prometheus
/metrics端点(实测curl http://127.0.0.1:8142/metrics返回的是 Next.js 页面 HTML,不是指标文本)。FEATURES_METRICS_*控制的是内置统计(/api/stats接口与后台图表页),不要按 Prometheus 方案去接抓取器。
5.8 ratelimit:限流
| 变量 | 默认值 | 实测值 | 说明 |
|---|---|---|---|
RATELIMIT_ENABLED | true | true | 总开关 |
RATELIMIT_MAX | 10 | 10 | 每窗口请求数(作用于 /api/upload 与 /api/user/urls) |
RATELIMIT_WINDOW | 空(=60000ms) | 空 | 窗口毫秒数 |
RATELIMIT_ADMIN_BYPASS | true | true | 管理员豁免 |
RATELIMIT_ALLOW_LIST | 空 | 空 | IP 白名单(官方注明当前版本不生效) |
两组对照实测(默认 max=10、窗口 1 分钟):
- SUPERADMIN Token 一分钟内连续 12 次上传:全部
200——adminBypass 生效; - 普通用户(demo,USER 角色)会话连续 12 次上传:前 10 次
200,第 11、12 次:
{"error":"Rate limit exceeded, retry in 1 minute","statusCode":429}
分块上传只有第一片计入限流;续传片带有效 token 不消耗额度。
5.9 其余类别(invites/mfa/oauth/domains/website/webhook/pwa)
这些类别参数较多但都是「开关 + 字符串」型,列关键项(默认值均出自 read-config 实测):
- invites:
INVITES_ENABLED=true、INVITES_LENGTH=6。邀请制实例的配方:关掉FEATURES_USER_REGISTRATION、保持 invites 开启,后台生成邀请码发人。 - mfa:
MFA_TOTP_ENABLED=false(默认关)、MFA_TOTP_ISSUER=Zipline;Passkey 三件套MFA_PASSKEYS_ENABLED/RP_ID/ORIGIN必须与实例域名匹配才能注册成功。 - oauth:每家四件套
OAUTH_<PROVIDER>_CLIENT_ID/CLIENT_SECRET/REDIRECT_URI,回调 URI 约定为https://<实例>/api/auth/oauth/<provider>;通用 OIDC 另需AUTHORIZE_URL/USERINFO_URL/TOKEN_URL,可选END_SESSION_URL做单点登出。OAUTH_LOGIN_ONLY=true可禁掉本地密码登录。 - domains:
DOMAINS=zip.example.com,zip2.example.com,用户在上传时可下拉选域名(每个域名都必须在 DNS 上指向本实例)。 - website:
WEBSITE_TITLE=Zipline、WEBSITE_TITLE_LOGO、WEBSITE_LOGIN_BACKGROUND(_BLUR)、WEBSITE_THEME_DEFAULT=system、WEBSITE_THEME_DARK=builtin:dark_gray、WEBSITE_THEME_LIGHT=builtin:light_gray(后两值即本实例实测值)、WEBSITE_EXTERNAL_LINKS(JSON 数组)、WEBSITE_DEFAULT_AVATAR/WEBSITE_TOS(服务器本地路径)。 - discord / httpWebhook:
DISCORD_WEBHOOK_URL等通知类变量与HTTP_WEBHOOK_ON_UPLOAD/ON_SHORTEN,消息模板支持{file.name}{:zipline}形式的变量与修饰符(::upper、::bytes、::utc等)。 - pwa:
PWA_ENABLED=false(默认关,read-config 实测一致);开启需把 favicon 文件放进public/目录。
ziplinectl import-dir <目录> 配合 datasource 变量还能把一批存量本地文件导入(或换后端时拷进 S3),详见 §5.10。
5.10 ziplinectl:配置相关的命令行工具
镜像内置 ziplinectl 管理命令(在 Compose 服务里执行:docker compose exec zipline ziplinectl <子命令>),与配置相关的实测输出:
| 子命令 | 用途 | 实测要点 |
|---|---|---|
read-config | 输出合并后的最终配置 JSON | 见 §3.2 |
export-config -y -d | 导出 env/YAML 配置 | 见 §3.3 |
list-users | 列出全部用户 JSON | 实测返回 root(SUPERADMIN)与 demo(USER)两条记录 |
set-user <属性> <值> | 改用户属性(提权/重置) | 用于忘记超管密码时自救 |
import-dir <目录> | 把目录文件导入当前 datasource | 非递归;-i 指定归属用户、-f 指定文件夹、--skip-db 保留原记录 |
migrate-pglite <目录> | PG 数据迁到 PGlite 目录 | 迁移期间必须先停服务 |
upgrade-pglite | 原地升级 PGlite 库 | 同上,先停服务 |
list-users 实测回显(节选):
[{"id":"x48cfnti1ir8atu0qbnha9oa","username":"root","role":"SUPERADMIN"},{"id":"nqcbgnte8j43i2a92nuzosu1","username":"demo","role":"USER"}]
六、生产配置模板
以下为公网单实例 + nginx 反代 + PostgreSQL 的推荐 .env(示例值可直接替换;密码类请用 openssl rand -base64 32 现生成):
# ---- 必填 ----
POSTGRESQL_PASSWORD=<数据库密码>
CORE_SECRET=<openssl rand -base64 32 生成>
# ---- 对外形态 ----
CORE_RETURN_HTTPS_URLS=true
CORE_TRUST_PROXY=true
CORE_TRUSTED_PROXIES=<反代IP或CIDR>
CORE_DEFAULT_DOMAIN=zip.example.com
# ---- 文件策略(按容量与风险偏好)----
FILES_MAX_FILE_SIZE=100mb
FILES_MAX_FILES_PER_UPLOAD=10
FILES_ROUTE=/u
FILES_DEFAULT_FORMAT=random
FILES_LENGTH=6
FILES_ASSUME_MIMETYPES=true
FILES_DISABLED_TYPES=text/html,application/javascript
FILES_DISABLED_EXTENSIONS=exe,bat,dmg
FILES_REMOVE_GPS_METADATA=true
# ---- 短链 ----
URLS_ROUTE=/go
URLS_LENGTH=4
# ---- 注册策略:邀请制 ----
FEATURES_USER_REGISTRATION=false
INVITES_ENABLED=true
# ---- 缩略图(视频)----
FEATURES_THUMBNAILS_ENABLED=true
FEATURES_THUMBNAILS_NUM_THREADS=2
# ---- 限流 ----
RATELIMIT_ENABLED=true
RATELIMIT_MAX=10
RATELIMIT_WINDOW=60000
RATELIMIT_ADMIN_BYPASS=true
DEBUG=zipline
配套要点:DATABASE_URL 由 Compose 用 POSTGRESQL_PASSWORD 拼装(见部署指南),不要在 .env 里重复写死;反代上 client_max_body_size 至少等于 FILES_MAX_FILE_SIZE,走分块上传则只需容下 CHUNKS_SIZE。
七、常见问题
- 改了
.env没生效——restart不重读.env,必须docker compose up -d触发重建;用read-config核对最终值,并看 DEBUG 行里overridden=[...]是否包含你改的键。 - 后台某个设置框是灰的——该键已被同名环境变量覆盖(§3.1 机制),想回后台管理就删掉
.env里那行再重建。 - 上传大文件报
E1062: No files in multipart/form-data request——大概率是超FILES_MAX_FILE_SIZE,multipart 解析器静默丢件后报「没有文件」;核对read-config的filesMaxFileSize,或改走分块上传接口。 - 所有访客共享同一份限流额度 / 日志里 IP 全是反代地址——
CORE_TRUST_PROXY没开或CORE_TRUSTED_PROXIES没包含反代网段,改完up -d重建。 - 换
CORE_SECRET后全员掉线、Token 全失效——设计如此:Cookie 签名与 Token 加密都派生自它。先公告再换,换后各自重新登录、重新生成 Token。 - 限流白名单加了 IP 没用——官方明确
RATELIMIT_ALLOW_LIST在当前版本不生效(read-config 里能看到键,行为未实装)。 - 按 Prometheus 抓
/metrics拿到一堆 HTML——v4 没有 Prometheus 端点,统计走/api/stats接口或后台 metrics 页。
八、参考链接
- 官方配置总览:https://zipline.diced.sh/docs/config
- 官方 Core 配置:https://zipline.diced.sh/docs/config/core
- 官方 Datasource 配置:https://zipline.diced.sh/docs/config/datasource
- 官方 Settings 配置:https://zipline.diced.sh/docs/config/settings
- 官方 ziplinectl 文档:https://zipline.diced.sh/docs/guides/ctl
- 同系列:《Zipline 介绍与选型指南》、《Zipline 4.8.2 Docker Compose 部署指南》、《Zipline 4.8.2 常用操作与 API 详解》