copyparty 1.20.26 配置参数详解
copyparty 1.20.26 配置体系逐项实测:-a 账户与同密码限制、-v 卷挂载与权限字母矩阵(r/w/m/d/A 逐项 403/201 验证)、-e2d 索引、缩略图/转码参数、--xau 事件钩子、--ban-pw 封禁实测、--cgen 生成配置文件与 ?reload=cfg 热重载闭环。
copyparty 1.20.26 配置参数详解
目标:逐项拆解 copyparty 1.20.26 的配置体系——命令行参数(账户
-a、卷-v、索引-e2d*、媒体、事件钩子、安全)与配置文件([global]/[accounts]/[/卷])两大入口,每一项配置都给出"修改后在浏览器/curl 上的可验证结果"。实测环境与安装步骤见《Ubuntu 22.04 安装 copyparty 1.20.26 指南》,版本检索日期 2026-10-26。
一、参数体系总览
1.1 两种配置方式
copyparty 的全部能力都能通过命令行参数表达;当卷和账户多起来后,改用配置文件更易维护。两者关系:
- 命令行方式:
python3 copyparty-sfx.py -a admin:q1w2e3r4 -v /srv/party:/files:r:rwmda,admin; - 配置文件方式:把同样的内容写成
/etc/copyparty/cpp.conf,用-c /etc/copyparty/cpp.conf加载; - 支持多次
-c叠加多个配置文件(帮助原文:-c PATH: config file to load, REPEATABLE)。
两套写法的对应关系可以自动转换——copyparty 内置 --cgen:用当前命令行参数启动时加上它,就会把等效的配置文件内容打印出来而不是启动服务。实测以 -a admin:q1w2e3r4 -v /srv/party/pub:/pub:r:rwmda,admin -p 3923 调用 --cgen,输出的核心部分(实测回显):
[global]
name: fileserver
...
[accounts]
admin: q1w2e3r4
[/pub]
/srv/party/pub
accs:
rg: *
rwmdga: admin
flags:
...
这个输出就是本文 4.x 节配置文件语法的权威样例来源。
1.2 帮助体系
copyparty 的 CLI 帮助分主题(实测 --help 主题表):
--help:总览(约 1700 行,含全部参数清单);--help-accounts:权限字母(ACL)详解;--help-auth:客户端登录方式(?pw=、PW:请求头、Basic Auth);--help-hooks:事件钩子脚本语法;--help-urlform:URL 与表单参数;--help-thumbs:缩略图参数;--help-deps:可选依赖说明。
1.3 端口与服务开关
-p PORT:HTTP 端口,默认 3923;--ftp 3921/--ftps 3990:FTP/FTPS;--sftp 3922:SFTP;--smb 3945:SMB/CIFS;--tftp 3969:TFTP;-i 0.0.0.0:监听地址;--unix-sock PATH:改用 Unix 套接字;-z/--ztier:日志级别控制(-z系列减少输出)。
修改端口验证:-p 8080 启动后启动日志出现 now serving @ http://0.0.0.0:8080/,浏览器访问相应端口即生效。
二、账户与卷:-a 与 -v
2.1 -a:账户定义
-a 用户名:密码,可重复出现定义多账户。实测规则:
- 不同账户不得使用相同密码,否则拒绝启动(实测回显):
LOG 08:03:12 CRIT: accounts [admin] and [uploader] have the same password; this is not supported - 账户需要在某个卷的权限组里被引用,否则有启动告警:
LOG 08:03:12 CRIT: account [uploader] is not mentioned in any volume definitions - 通配账户
*表示"所有人"(含未登录访客),写在 accs 里即匿名权限。
2.2 -v:卷挂载语法
-v 源路径:URL路径:权限组,权限组...,可重复。每个"权限组"是 权限字母集合:账户列表 的组合,用冒号分隔:
-v /srv/party/pub:/pub:r:rwmda,admin
# 磁盘目录 URL 权限组1 权限组2
# ↑ ↑
# r 给 * rwmda 给 admin
即"两层结构":URL 路径之后跟若干个"权限:账户"对,前一组通常给 *(匿名),后一组给具名账户。写权限的额外约束:帮助原文 w = write: upload files; need r to see the uploads——写权限组若不带 r,上传者无法浏览目录内容。
2.3 权限字母逐项验证
--help-accounts 的字母表(节选)与逐项实测结果:
| 字母 | 含义(帮助原文摘要) | 实测验证方式与结果 |
|---|---|---|
| r | read: list files | 匿名 GET /pub/ → 200,列出 readme.txt、sample.bin |
| w | write: upload files(需 r 才能看见所传文件) | 匿名 PUT /drop/anon.txt → 201 Created |
| m | move/rename/delete;目标卷需 w | admin 对仅有 rw 的 /pub 发起 WebDAV MOVE → 401(无 m 权限);对含 A 的 /drop MOVE → 201 |
| d | delete files | admin 对仅有 rw 的 /pub 发 DELETE → 403;对含 A 的 /drop 发 DELETE → 200 |
| g | download files but cannot see folder contents | 未实测(只读下载场景) |
| h | upload but cannot see folder contents | 未实测(收件箱场景可用 w 替代) |
| . | list folder contents but cannot download | 未实测(目录可见性细分) |
| a | admin: move/rename/delete + read/write,含隐藏文件 | 组合使用 |
| A | 全部权限(含隐藏文件管理) | admin 在 /drop(A,admin)删除/改名全部成功 |
一个容易误判的行为实测记录:匿名向 w 权限的 /drop 上传 anon.txt 后,匿名 GET /drop/anon.txt 返回 200——但返回的不是文件内容,而是该目录的上传界面(页面元信息里 perms: ['write'])。写卷对匿名的语义是"能传、能看上传界面、不能列目录也取不到文件内容",并非传统意义上的"上传后可下载"。
2.4 登录方式与验证
--help-auth 列出三种客户端登录方式,实测全部可用:
- URL 参数:
?pw=q1w2e3r4(不区分账户名时按密码反查账户); - Basic Auth:
curl -u admin:q1w2e3r4 ...; PW:请求头:-H 'PW: q1w2e3r4'。
区分"认证失败"与"无权限"的实测结论:写操作对错误凭据和正确凭据都返回 403(认证失败回退为匿名身份,匿名同样无写权限)。要验证某个密码是否有效,用 ?pw= 建会话后观察是否签发登录 Cookie,或直接用写操作+已知权限矩阵判定。
三、索引与卷标志(volflags)
3.1 -e2d 系列索引
-e2d:开启文件数据库索引(搜索、去重、上传撤销的基础);-e2ds:开启索引 + 启动时扫描变化部分;-e2dsa:开启索引 + 启动时全量扫描。
实测:-e2dsa 启动后日志出现 [db] created file-db: N volumes, N threads;管理员在 URL 追加 ?scan 可触发重扫(需要管理员权限,匿名调用实测返回 403)。
3.2 常用卷标志
卷标志可写在 -v 的最后(CLI 形式)或配置文件 flags: 段。常用的有:
--nodupe:关闭上传去重(默认开启时同哈希文件以符号链接复用,节省磁盘);--share:允许生成分享链接;d2d(目录项展示相关)、--dots(显示隐藏文件)等。
钩子类卷标志见第五节。
四、媒体参数与资源限制
4.1 缩略图参数
--th-size:缩略图分辨率档位(如256);--th-fov:缩略图生成数量上限策略;--th-clear-db:清空缩略图缓存库。
实测:安装 Pillow + ffmpeg 后(安装步骤见 B1 篇),对 /pics/test.png 请求 ?th=x:
th: 200 type: image/webp size: 2412
对音频文件 /music/test.mp3 请求 ?th=x 得到频谱图:
th: 200 type: image/webp size: 9552
未装 Pillow 时同一请求返回 SVG 占位图(type: image/svg+xml,368 字节)——这是判断依赖是否就绪的快速探针。
4.2 音频转码参数
--q-opus 128:opus 转码码率;--q-mp3 q2:mp3 转码质量档。
实测:单文件转码统一走缩略图端点,URL 参数 ?th=opus / ?th=mp3:
th=opus: 200 type: audio/ogg; codecs=opus size: 57912
th=mp3: 200 type: audio/mpeg size: 16741
下载文件头 OggS 魔数确认真实 opus 流。注意 ?ab=opus 这类猜测写法无效(实测返回原 mp3 文件)。
4.3 资源限制
copyparty 的"资源限制"不包含带宽限速——实测遍历 --help 全文,无 rate/speed/throttle 类参数。实际可用的限制手段:
--nc NUM:单 IP 最大并发连接数(默认 64);--df 10Gi:磁盘剩余空间低于阈值时拒绝写入;--ban-pw 9,60,1440:密码错误封禁(次数,最短封禁秒数,最长封禁秒数);--ban-url/--ban-scan:对恶意路径/扫描行为的封禁。
4.4 封禁实测
对 -a admin:q1w2e3r4 的服务连续用错误密码访问(默认第 9 次错误后封禁):
try 1: 200
try 2: 200
...
try 9: 200
try 10: 403
第 10 次起直接 403(封禁生效,IP 进入临时黑名单)。生产环境建议保留默认值或按需收紧。
五、事件钩子(--xa* 系列)
5.1 钩子类型与参数
--help-hooks 的类型清单:--xau(上传后)、--xab(上传前)、--xam(移动后)、--xar(重命名后)、--xad(删除后)、--xco(复制后)等。脚本第 1 个参数为事件对象(上传后场景为落盘文件的绝对路径)。
5.2 实测:上传后钩子
写一个记录脚本:
cat > /opt/copyparty/on-upload.sh <<'EOF'
#!/bin/bash
echo "$(date +%T) UPLOADED: $1" >> /tmp/hook.log
EOF
chmod +x /opt/copyparty/on-upload.sh
以 --xau '/opt/copyparty/on-upload.sh' 启动,随后上传一个文件,/tmp/hook.log 实测出现:
08:05:41 UPLOADED: /srv/party/drop/hook-test.txt
5.3 配置文件方式的坑
把 --xau 写在配置文件 [global] 段(或 CLI 全局)时,实测启动日志出现:
LOG 08:06:43 CRIT: cannot enable [xau] for volume "/" because this requires e2d/e2ds/e2dsa
原因是全局钩子要挂到内部根卷 / 上,而根卷没有开索引。处理:为承载卷开启 -e2d 系列索引,或把钩子以卷标志形式写进具体卷的 flags: 段(同样需该卷开启索引)。
六、配置文件实战与热重载
6.1 配置文件结构
--cgen 生成 + 手工整理后的生产配置(实测可用):
[global]
name: fileserver
[accounts]
admin: q1w2e3r4
uploader: q1w2e3r5
[/pub]
/srv/party/pub
accs:
r: *
rwmda: admin
[/drop]
/srv/party/drop
accs:
w: *
rwmda: admin
[/pics]
/srv/party/pics
accs:
r: *
rwmda: admin
[/music]
/srv/party/music
accs:
r: *
rwmda: admin
结构要点:[global] 放全局参数;[accounts] 一行一个账户;[/URL] 段第一行是磁盘路径,accs: 下每行"权限字母: 账户列表",flags: 下放卷标志。启动:python3 copyparty-sfx.py -c /etc/copyparty/cpp.conf。
6.2 热重载
修改配置文件后无需重启服务:管理员访问 http://<host>:3923/?reload=cfg&pw=<管理员密码> 即可。实测在 [accounts] 新增 admin2 并将其加入 /pub 的 rwmda 组,触发 reload 后日志回显:
LOG 08:07:41 reloading config
LOG 08:07:41 reload #1 scheduled: first scan before writing the new db - this may take a while
LOG 08:07:41 reload #1 running
随后用新账户上传验证:
=== admin2 写 /pub(reload 前不存在,成功即证明热重载生效)===
201
密码修改同样即时生效(新密码可登录、旧密码失效),无需重启服务。
七、参数速查清单
| 参数 | 作用 | 实测要点 |
|---|---|---|
-a user:pass | 定义账户 | 不同账户密码必须不同;账户需被卷引用 |
-v src:url:perms | 挂载卷与 ACL | 权限组结构 字母组:账户;写权限默认不可见所传文件 |
-p PORT | HTTP 端口(默认 3923) | 修改后日志 now serving @ http://0.0.0.0:PORT/ |
-e2d / -e2ds / -e2dsa | 文件索引 | 搜索/去重/钩子的基础;?scan 触发重扫 |
--th-size 等缩略图参数 | 缩略图策略 | 无 Pillow 时返回 SVG 占位图 |
--q-opus / --q-mp3 | 转码码率/质量 | ?th=opus 请求转码流,?ab= 无效 |
--xau 脚本 等 | 事件钩子 | 需所在卷开启 e2d 索引 |
--nc NUM | 单 IP 并发连接上限 | 默认 64 |
--df 10Gi | 磁盘预留水位 | 低于阈值拒绝写入 |
--ban-pw 9,60,1440 | 密码错误封禁 | 实测第 10 次错误起 403 |
-c PATH | 加载配置文件 | 可叠加;配合 ?reload=cfg 热重载 |
--cgen | 由命令行参数生成配置文件 | 学习配置语法的最快途径 |
带宽限速方面再次强调:copyparty 1.20.26 未提供限速参数,流量管控需在系统层或反向代理层实现。下一篇《copyparty 1.20.26 常用 CLI 命令详解》给出服务端参数矩阵与 curl/WebDAV 客户端命令的完整清单。