transfer.sh 1.6.1 配置参数详解

逐项讲解 transfer.sh v1.6.1 全部 40 余个启动参数与环境变量:flag 与环境变量两种传参方式及同设优先级、全量参数总览、监听/存储/限流/访问控制/TLS/自动清理/日志观测分类详解与实测验证,附 systemd 生产配置模板与常见问题排障,全部行为已在 Ubuntu 22.04 实测。

transfer.sh文件分享文件传输Go2026/11/01

transfer.sh 1.6.1 配置参数详解

‍‍​​‌​‍‍​​‌​> 目标:逐项讲清 transfer.sh v1.6.1 服务端 transfersh 的全部启动参数与环境变量——两种传参方式与同设时的优先级、全量参数总览、按监听/存储/限流/访问控制/TLS/自动清理/日志观测分类的实测验证,最后给出 systemd 生产配置模板与常见问题。全部行为均已在下述环境实测验证。

一、环境信息

本文所有实测在以下环境完成:

  • 操作系统:Ubuntu 22.04.5 LTS(x86_64)
  • 组件版本:transfer.sh v1.6.1(单文件静态编译的 Go 二进制,transfersh 一个文件即服务端本体)
  • 二进制来源:官方 GitHub Releases 的 transfersh-v1.6.1-linux-amd64,sha256 校验值 46fb5ac519769bae8a626cc3f79e2101013ff13beb75d5a613b8df6970d9e27c
  • 二进制路径:/opt/transfer.sh/bin/transfersh
  • 数据目录:/opt/transfer.sh/data
  • 服务器地址:192.168.1.172(下文示例端口均为实测端口,可按需替换)

版本验证命令与实测回显:

grep PRETTY_NAME /etc/os-release; uname -m
PRETTY_NAME="Ubuntu 22.04.5 LTS"
x86_64
/opt/transfer.sh/bin/transfersh version
transfer.sh version v1.6.1

部署方式(Compose 编排)见《transfer.sh 1.6.1 Docker Compose 部署指南》;组件本身的定位与选型背景见《transfer.sh 介绍与选型指南》。本文聚焦服务端参数本身,与部署载体无关,直接在服务器上运行二进制的方式讲解。

二、前置条件

  1. transfersh 二进制已下载并校验(官方 Releases 页面获取,sha256sum 比对),放置于 /opt/transfer.sh/bin/ 并赋予执行权限:
    chmod +x /opt/transfer.sh/bin/transfersh
    
  2. 数据目录已创建(local 存储后端的落盘位置,属主为运行服务的用户):
    mkdir -p /opt/transfer.sh/data
    
  3. 规划服务端口并确认未占用(ss -ltn | grep <端口> 应无输出);
  4. 如使用 systemd 托管,准备运行用户(本文用 transfersh):
    useradd -r -s /sbin/nologin transfersh
    chown -R transfersh:transfersh /opt/transfer.sh/data
    

三、参数查看与修改方式

3.1 用 --help 查看全量参数

/opt/transfer.sh/bin/transfersh --help

实测完整回显见第四章参数总览(原文照抄)。

3.2 两种传参方式:命令行 flag 与环境变量

--help 里每个参数末尾都标注了对应的环境变量名(如 [$LISTENER]、[$PROVIDER]),两者完全等价,选一种即可。实测用环境变量方式启动(等价于 --provider local --listener :8143 --rate-limit 3 --temp-path /tmp --basedir /opt/transfer.sh/data):

PROVIDER=local LISTENER=:8143 RATE_LIMIT=3 TEMP_PATH=/tmp BASEDIR=/opt/transfer.sh/data \
  /opt/transfer.sh/bin/transfersh
[transfer.sh]2026/11/01 06:56:52 Transfer.sh server started.
using temp folder: /tmp/
using storage provider: local
[transfer.sh]2026/11/01 06:56:52 starting to listen on: :8143
[transfer.sh]2026/11/01 06:56:52 ---------------------------

启动日志会回显实际生效的临时目录、存储后端与监听地址,可用于确认参数生效。

3.3 flag 与环境变量同时设置时的优先级

同一参数既有环境变量又有 flag 时,flag 优先。实测验证:环境变量 RATE_LIMIT=100 配合 flag --rate-limit 2 启动,随后连续下载同一文件:

RATE_LIMIT=100 /opt/transfer.sh/bin/transfersh \
  --provider local --basedir /opt/transfer.sh/data --listener :8142 --rate-limit 2 &
for i in 1 2 3 4; do curl -s -o /dev/null -w "dl$i: HTTP %{http_code}\n" http://127.0.0.1:8142/fzsvVtAgMe/prio.txt; done
dl1: HTTP 200
dl2: HTTP 200
dl3: HTTP 429
dl4: HTTP 429

第 3 个请求即被限流,证明生效的是 flag 的 2(每分钟 2 个请求)而非环境变量的 100。排查"限流没生效"类问题时优先检查是否有 flag 被环境变量覆盖(或反之)。

四、参数总览

以下是 transfersh --help 的完整实测回显(v1.6.1),即全部可配置参数的一手清单:

NAME:
transfer.sh - transfer.sh

DESCRIPTION:
Easy file sharing from the command line

USAGE:
transfer.sh [flags] command [arguments...]

COMMANDS:
version  
help, h  Shows a list of commands or help for one command

FLAGS:
--listener value                     127.0.0.1:8080 (default: "127.0.0.1:8080") [$LISTENER]
--profile-listener value             127.0.0.1:6060 [$PROFILE_LISTENER]
--force-https                        (default: false) [$FORCE_HTTPS]
--tls-listener value                 127.0.0.1:8443 [$TLS_LISTENER]
--tls-listener-only                  (default: false) [$TLS_LISTENER_ONLY]
--tls-cert-file value                 [$TLS_CERT_FILE]
--tls-private-key value               [$TLS_PRIVATE_KEY]
--temp-path value                    path to temp files (default: "/tmp") [$TEMP_PATH]
--web-path value                     path to static web files [$WEB_PATH]
--proxy-path value                   path prefix when service is run behind a proxy [$PROXY_PATH]
--proxy-port value                   port of the proxy when the service is run behind a proxy [$PROXY_PORT]
--email-contact value                email address to link in Contact Us (front end) [$EMAIL_CONTACT]
--ga-key value                       key for google analytics (front end) [$GA_KEY]
--uservoice-key value                key for user voice (front end) [$USERVOICE_KEY]
--provider value                     s3|gdrive|local [$PROVIDER]
--s3-endpoint value                   [$S3_ENDPOINT]
--s3-region value                    (default: "eu-west-1") [$S3_REGION]
--aws-access-key value                [$AWS_ACCESS_KEY]
--aws-secret-key value                [$AWS_SECRET_KEY]
--bucket value                        [$BUCKET]
--s3-no-multipart                    Disables S3 Multipart Puts (default: false) [$S3_NO_MULTIPART]
--s3-path-style                      Forces path style URLs, required for Minio. (default: false) [$S3_PATH_STYLE]
--gdrive-client-json-filepath value   [$GDRIVE_CLIENT_JSON_FILEPATH]
--gdrive-local-config-path value      [$GDRIVE_LOCAL_CONFIG_PATH]
--gdrive-chunk-size value            (default: 16) [$GDRIVE_CHUNK_SIZE]
--storj-access value                 Access for the project [$STORJ_ACCESS]
--storj-bucket value                 Bucket to use within the project [$STORJ_BUCKET]
--rate-limit value                   requests per minute (default: 0) [$RATE_LIMIT]
--purge-days value                   number of days after uploads are purged automatically (default: 0) [$PURGE_DAYS]
--purge-interval value               interval in hours to run the automatic purge for (default: 0) [$PURGE_INTERVAL]
--max-upload-size value              max limit for upload, in kilobytes (default: 0) [$MAX_UPLOAD_SIZE]
--lets-encrypt-hosts value           host1, host2 [$HOSTS]
--log value                          /var/log/transfersh.log [$LOG]
--basedir value                      path to storage [$BASEDIR]
--clamav-host value                  clamav-host [$CLAMAV_HOST]
--perform-clamav-prescan             perform-clamav-prescan (default: false) [$PERFORM_CLAMAV_PRESCAN]
--virustotal-key value               virustotal-key [$VIRUSTOTAL_KEY]
--profiler                           enable profiling (default: false) [$PROFILER]
--http-auth-user value               user for http basic auth [$HTTP_AUTH_USER]
--http-auth-pass value               pass for http basic auth [$HTTP_AUTH_PASS]
--http-auth-htpasswd value           htpasswd file http basic auth [$HTTP_AUTH_HTPASSWD]
--http-auth-ip-whitelist value       comma separated list of ips allowed to upload without being challenged an http auth [$HTTP_AUTH_IP_WHITELIST]
--ip-whitelist value                 comma separated list of ips allowed to connect to the service [$IP_WHITELIST]
--ip-blacklist value                 comma separated list of ips not allowed to connect to the service [$IP_BLACKLIST]
--cors-domains value                 comma separated list of domains allowed for CORS requests [$CORS_DOMAINS]
--random-token-length value          (default: 10) [$RANDOM_TOKEN_LENGTH]
--help, -h                           show help
--version, -v                        print the version

VERSION:
v1.6.1

按用途分组索引(详见第五章):

分组参数
监听与网络入口--listener、--tls-listener、--tls-listener-only、--force-https、--lets-encrypt-hosts、--proxy-path、--proxy-port
存储后端与数据--provider、--basedir、--temp-path、--s3-*、--gdrive-*、--storj-*
上传限制与令牌--max-upload-size、--random-token-length、--rate-limit
自动清理--purge-days、--purge-interval
访问控制--ip-whitelist、--ip-blacklist、--http-auth-user、--http-auth-pass、--http-auth-htpasswd、--http-auth-ip-whitelist、--cors-domains
安全扫描--clamav-host、--perform-clamav-prescan、--virustotal-key
TLS--tls-listener、--tls-cert-file、--tls-private-key、--force-https、--lets-encrypt-hosts
日志与观测--log、--profiler、--profile-listener
前端与反代--web-path、--proxy-path、--proxy-port、--email-contact、--ga-key、--uservoice-key

五、核心参数分类详解

5.1 监听与网络入口(--listener)

--listener 是主服务监听地址,默认 127.0.0.1:8080——只监听本机回环,对外提供服务必须显式改为 :端口 或 0.0.0.0:端口,否则外部无法访问。这是"服务起了但连不上"的头号原因。

--tls-listener 默认 127.0.0.1:8443,配置证书文件后成为独立的 HTTPS 监听口,与 --listener 可并存(同一进程双端口),实测同时启动两个监听:

/opt/transfer.sh/bin/transfersh --provider local --basedir /opt/transfer.sh/data \
  --listener :8141 --tls-listener :8146 \
  --tls-cert-file /etc/transfer.sh/tls.crt --tls-private-key /etc/transfer.sh/tls.key
[transfer.sh]2026/11/01 04:39:18 Transfer.sh server started.
using temp folder: /tmp/
using storage provider: local
[transfer.sh]2026/11/01 04:39:18 starting to listen on: :8141
[transfer.sh]2026/11/01 04:39:18 starting to listen for TLS on: :8146
[transfer.sh]2026/11/01 04:39:18 ---------------------------

两个监听口的服务能力完全一致(上传/下载均可),TLS 口的行为验证见 5.7。

5.2 存储后端与数据目录(--provider、--basedir、--temp-path)

--provider 支持四种存储后端:local(本地磁盘)、s3(含 MinIO,配合 --s3-path-style)、gdrive(Google Drive)、storj。注意 --help 文案只写了 s3|gdrive|local,v1.6.1 实际已支持 storj(--storj-access/--storj-bucket 参数存在,配置不完整时的启动报错也可证,见下)。

--provider local 时 --basedir 必填,缺失直接拒绝启动:

/opt/transfer.sh/bin/transfersh --provider local --listener :8144
2026/11/01 07:08:35 basedir not set.

--provider 取值非法或对应凭据缺失时同样拒绝启动,实测三次不完整配置的启动报错(三条来自三次独立启动尝试):

2026/11/01 04:25:51 storj-access not set.
2026/11/01 04:25:51 gdrive-client-json-filepath not set.
2026/11/01 04:25:51 Provider not set or invalid.

--temp-path(默认 /tmp)用于上传过程中的临时落盘,启动日志 using temp folder: /tmp/ 即其回显。大文件上传时确保该分区有足够空间。

local 后端的落盘结构为「--basedir 下每个上传一个以随机 token 命名的一级子目录,目录内是文件本体 + 同名 .metadata 元数据文件」,元数据是单行 JSON,实测内容示例:

{"ContentType":"","ContentLength":50,"Downloads":0,"MaxDownloads":-1,"MaxDate":"2026-11-02T06:49:47.761965554Z","DeletionToken":"eR4MJDEL5aY7ElAoVGz0","Encrypted":false,"DecryptedContentType":""}

了解该结构有助于排查过期、下载数等行为(它们的真实状态都记录在这里)。

5.3 上传限制与链接令牌(--max-upload-size、--random-token-length、--rate-limit)

--max-upload-size:单文件上传上限,单位 KB,默认 0(不限制)。实测设为 5(即 5KB)后:10KB 文件上传被拒、3KB 文件正常:

curl -s -w '\nHTTP:%{http_code}\n' --upload-file big.bin http://127.0.0.1:8137/big.bin   # 10KB
Request Entity Too Large

HTTP:413
http://127.0.0.1:8137/cdNNrlEEnW/small.bin
HTTP:200

--random-token-length:下载链接中随机 token 的长度,默认 10(如 fYdpkLW5X8)。实测改为 4 后链接明显变短(X-Url-Delete 响应头可见 token 部分):

X-Url-Delete: http://192.168.1.172:8139/Bmqj/short.txt/6MtryP1N

token 越短链接越好记,但被碰撞/穷举的风险越高,公网服务建议保持默认 10。

--rate-limit:全站每分钟请求数上限,默认 0(不限制)。实测环境变量 RATE_LIMIT=3 启动后,连续下载同一文件 5 次:

dl1: HTTP 200
dl2: HTTP 200
dl3: HTTP 200
dl4: HTTP 429
dl5: HTTP 429

计数按分钟滑动窗口对所有请求生效(含下载与上传),触发后返回 429。与环境变量同设时 flag 优先(实证见 3.3)。

5.4 自动清理(--purge-days、--purge-interval)

两个参数必须同时配置且都大于 0 才启用自动清理(只配其一不生效):

  • --purge-days:上传文件保留天数,超过即被清理;
  • --purge-interval:清理巡检的间隔,单位小时。

源码实现语义(v1.6.1):清理器用固定间隔的 ticker 驱动——第一次巡检发生在服务启动后 --purge-interval 小时,之后每隔同样时间一次;local 后端的清理判定依据是文件修改时间(mtime),早于"当前时间减 --purge-days 天"的文件被删除。注意两点推论:

  1. 改完参数不会立刻清理,最多要等一个完整 interval 周期;
  2. 清理看的是文件系统 mtime,不是元数据里的 MaxDate——手工搬动过数据目录会改变清理结果。

实测验证(--purge-days 1 --purge-interval 1,独立数据目录):上传后把数据目录内该文件的 mtime 回拨到 2 天前:

-rw------- 1 root root 186 Oct 30 06:53 /tmp/purge-data/Fblmxc2i6a/purgetest.txt.metadata
-rw------- 1 root root 13 Oct 30 06:53 /tmp/purge-data/Fblmxc2i6a/purgetest.txt

等待启动后第一个巡检周期(实测首跳时刻=启动时间+interval,本例约 1 小时)后检查数据目录,超期的文件本体与 .metadata 均被删除,空目录会保留(清理只删文件),实测结论与源码语义一致。

另一种"过期"是单次上传级别的 Max-Days / Max-Downloads(在 curl 上传时通过请求参数指定,不属于启动参数),与本章的服务级 purge 互不冲突:前者只影响单个链接的可用性(过期后下载返回 404,实测见《transfer.sh 1.6.1 curl 上传下载命令详解》),后者批量清理磁盘文件。

5.5 访问控制(ip 白/黑名单、HTTP Basic 认证、CORS)

--ip-whitelist / --ip-blacklist:按客户端源 IP 精确匹配的连接级放行/拒绝名单(逗号分隔,不能写网段)。实测 --ip-whitelist 127.0.0.1:

curl -s -o /dev/null -w "HTTP %{http_code}\n" http://127.0.0.1:8144/          # 白名单内
HTTP 200
curl -s -w "\nHTTP %{http_code}\n" http://10.89.58.3:8144/ | tail -2          # 本机另一网络接口地址,白名单外

HTTP 403

非白名单源一律 403 Forbidden(黑名单同理拒绝)。两个要点:

  1. 匹配是逐 IP 精确匹配,多网卡服务器要放行本机访问需把每个接口地址都写进去;
  2. 客户端 IP 取值信任 X-Forwarded-For 请求头——实测对黑名单 IP 的请求伪造 X-Forwarded-For: 8.8.8.8 后上传成功(HTTP 200)。因此 ip 黑白名单只应在服务前没有不可信访问者能直连时使用,或部署在会清洗 XFF 的可信反代之后(配合 --proxy-path/--proxy-port)。

--http-auth-user / --http-auth-pass:全局 HTTP Basic 认证(上传/下载都要带凭据)。实测 admin/q1w2e3r4 三种请求结果:

无凭据            → Not authorized / HTTP 401
admin:badpass    → Not authorized / HTTP 401
admin:q1w2e3r4   → HTTP 200

--http-auth-htpasswd:改用 htpasswd 文件认证(支持多用户,apr1/bcrypt 等哈希由 go-htpasswd 库解析)。生成方式:

openssl passwd -apr1 -salt ts161salt q1w2e3r4

文件每行一条 用户名:哈希,实测内容:

admin:$apr1$ts161sal$6CNCex5SESDLSuqclsqZ50

配置后实测:无凭据 401、正确凭据 200、错误凭据 401。user/pass 与 htpasswd 可以同时配置,校验时两者任一通过即放行。

--http-auth-ip-whitelist:认证白名单——名单内的源 IP 完全免认证。实测对 --http-auth-user admin --http-auth-pass q1w2e3r4 --http-auth-ip-whitelist 127.0.0.1 的实例,本机回环地址不带任何凭据上传成功(HTTP 200),外部地址仍要求凭据。适合"本机脚本免认证、外部需密码"的场景。

--cors-domains:允许跨域的域名列表。关键细节:必须写完整 Origin(含协议,如 http://example.com),且精确匹配。实测 --cors-domains 'http://example.com,http://192.168.1.172:8134' 后:

匹配 Origin 的上传响应头:

HTTP/1.1 100 Continue
HTTP/1.1 200 OK
Access-Control-Allow-Origin: http://example.com

OPTIONS 预检请求响应:

HTTP/1.1 200 OK
Access-Control-Allow-Methods: PUT
Access-Control-Allow-Origin: http://example.com

不匹配的 Origin(如 http://evil.com)请求本身仍 200,但响应中不会出现 Access-Control-Allow-Origin 头,浏览器侧会被拦截。常见错误是只写裸域名 example.com(无协议)——永远不会匹配,浏览器报 CORS 错误。

5.6 TLS 与 HTTPS(--tls-listener、--tls-cert-file、--tls-private-key、--force-https、--lets-encrypt-hosts)

5.1 已展示双监听配置。HTTPS 口验证(自签证书场景 curl 加 -k):

curl -sk -w '\nHTTP:%{http_code}\n' --upload-file hello.txt https://192.168.1.172:8146/tlsfile.txt
https://192.168.1.172:8146/ordcqqgQ2V/tlsfile.txt
HTTP:200

--force-https 把 HTTP 口的所有请求 308 重定向到 HTTPS 口(所以两者要一起配置):

HTTP/1.1 308 Permanent Redirect
Location: https://192.168.1.172:8146/plain.txt
Content-Length: 0

--tls-listener-only 让服务只保留 TLS 监听、关闭明文口。--lets-encrypt-hosts 提供 ACME 自动证书(填域名,如 share.example.com),要求域名能解析到本机且 80/443 可达,实测用假域名时服务正常启动、证书签发会在 ACME 环节失败——生产使用需真实域名与公网可达性。

5.7 安全扫描(--virustotal-key、--clamav-host、--perform-clamav-prescan)

transfer.sh 内置对 /<文件名>/virustotal 与 /<文件名>/clamav 两类扫描上传端点的支持(把文件提交给第三方扫描服务,按结果决定是否存储)。

VirusTotal:需配置 --virustotal-key(官网申请的 API key)。未配 key 时调用该端点实测返回 500:

invalid character '<' looking for beginning of value

HTTP:500

服务端日志同步记录了提交动作(无 key 时提交失败):

[transfer.sh]2026/11/01 06:49:48 Submitting to VirusTotal: hello.txt 50 
[transfer.sh]2026/11/01 06:49:50 scanid: , resource: , permalink: , md5: 
[transfer.sh]2026/11/01 06:49:50 192.168.1.172:35964 - - [2026-11-01T06:49:50Z] "PUT /hello.txt/virustotal HTTP/1.1" 500  "" "curl/8.5.0"

ClamAV:--clamav-host 指向 clamd 的 TCP 地址(如 127.0.0.1:3310),--perform-clamav-prescan 开启后对所有上传先扫描再入库,检出病毒即拒绝。需要环境内已有 clamd 服务,本文未单独实测该链路。

普通上传(不带 virustotal/clamav 后缀)不受这两个参数影响。

5.8 日志与观测(--log、--profiler、--profile-listener)

--log:日志落盘文件路径(默认 /var/log/transfersh.log)。日志包含启动信息与每条请求的访问记录(含来源 IP、方法、路径、状态码、UA),排障时直接定位问题请求,实测片段:

[transfer.sh]2026/11/01 06:49:47 Error metadata: maxDate expired
[transfer.sh]2026/11/01 06:49:47 192.168.1.172:35948 - - [2026-11-01T06:49:47Z] "GET /usvdNeBMoS/expired.txt HTTP/1.1" 404  "" "curl/8.5.0"

注意运行用户需对该路径有写权限,否则日志不落盘(服务本身不受影响)。

--profiler:开启 Go pprof 性能剖析端点。这里有一个 v1.6.1 的实现细节需要特别提醒:剖析端点固定监听 :6060,--profile-listener 参数实际上不生效。实测 --profiler --profile-listener :8148 启动日志明确写着:

[transfer.sh]2026/11/01 07:09:34 Profiled listening at: :6060

随后 :8148 无任何监听,而 :6060 的 pprof 端点正常工作:

curl -s -o /dev/null -w 'HTTP %{http_code}\n' http://127.0.0.1:6060/debug/pprof/
HTTP 200

两个结论:想用 pprof 就按 :6060 访问;--profile-listener 想改端口是改不动的(防暴露考虑,不要把 6060 暴露到公网)。

5.9 前端与反代(--web-path、--proxy-path、--proxy-port 等)

  • --web-path:自定义静态页面目录(替换内置的网页界面),用于品牌定制;不配置时使用二进制内置页面。
  • --proxy-path / --proxy-port:服务部署在反向代理之后时,告知真实对外路径前缀与端口,服务据此生成正确的绝对链接(如 X-Url-Delete 头);同时反代需正确传递 X-Forwarded-For,ip 黑白名单的判定才会基于真实客户端 IP(见 5.5 的伪造风险提醒)。
  • --email-contact / --ga-key / --uservoice-key:纯前端展示项——页面 Contact Us 链接邮箱、Google Analytics、UserVoice 挂件,不影响服务功能,按需配置。

六、生产配置模板(systemd 托管 + 参数组合建议)

推荐用 systemd 托管 transfersh 进程。/etc/systemd/system/transfersh.service 模板:

[Unit]
Description=transfer.sh file sharing service
After=network.target

[Service]
User=transfersh
Group=transfersh
ExecStart=/opt/transfer.sh/bin/transfersh \
  --listener :8080 \
  --provider local \
  --basedir /opt/transfer.sh/data \
  --temp-path /tmp \
  --log /var/log/transfersh.log \
  --max-upload-size 102400 \
  --rate-limit 120 \
  --random-token-length 10 \
  --purge-days 14 \
  --purge-interval 6
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

参数选值依据(均对应第五章实测行为):

参数建议值理由
--listener :8080显式监听全部地址默认 127.0.0.1:8080 对外不可访问(5.1)
--provider local --basedirlocal + 专用数据目录单机自托管最简形态,目录属主给 transfersh 用户
--max-upload-size按需(示例 100MB)防止磁盘被单次大上传打满,单位 KB
--rate-limit按负载设定全站每分钟请求上限,超限 429(5.3)
--random-token-length保持 10链接不可枚举,缩短有穷举风险(5.3)
--purge-days + --purge-interval成对配置(14 天/6 小时)只配其一不生效;首跳在启动后一个 interval(5.4)
--log落盘到专用路径访问日志排障依赖(5.8)

启用与验证:

systemctl daemon-reload
systemctl enable --now transfersh
systemctl status transfersh --no-pager | head -5

如需认证再追加 --http-auth-user admin --http-auth-pass q1w2e3r4(或 --http-auth-htpasswd),如需 HTTPS 追加 TLS 三件套参数(5.6/5.5)。本文参数与部署载体无关,若采用其他部署形态,参数传入口径见《transfer.sh 1.6.1 Docker Compose 部署指南》第四章。

七、常见问题

Q1:启动直接退出,报 basedir not set. --provider local 必须同时给 --basedir(5.2)。补上即可。

Q2:启动报 Provider not set or invalid. --provider 没传或拼写错误;传了 s3/gdrive/storj 但对应凭据参数缺失也会得到类似的 xxx not set. 报错(5.2)。

Q3:设置了 --rate-limit 但好像没生效 检查是否被环境变量与 flag 同设干扰——flag 优先(3.3)。另外限流按"每分钟全站请求数"计数,单发请求测不出来,需连发复现。

Q4:--profile-listener 指定的端口没有监听 v1.6.1 的 pprof 端点固定 :6060,--profile-listener 不生效(5.8)。

Q5:ip-blacklist 拉黑了某 IP 但它还能上传 该客户端可能伪造了 X-Forwarded-For 头——IP 判定信任 XFF(5.5)。把服务放进会清洗 XFF 的可信反代之后,或改用认证方案。

Q6:Max-Days 传了负数报 400,传超大值却不报错? 负值返回 400 Invalid MaxDate, make sure Max-Days is smaller than 290 years;数值大到溢出 int64 时会被静默忽略(上传仍 200,但过期限制实际未设置,X-Remaining-Days 显示 n/a)。这是 v1.6.1 对参数解析边界的真实行为,业务上需对 Max-Days 取值做前置校验。请求级 Max-Days/Max-Downloads 的完整行为见《transfer.sh 1.6.1 curl 上传下载命令详解》。

Q7:配了 --cors-domains 浏览器仍报 CORS 错误 域名必须带协议完整写出(如 http://example.com),裸域名不匹配(5.5)。

Q8:配了 --purge-days 文件没被清理 确认 --purge-interval 也已配置且大于 0(两者缺一不生效);确认已等待至少一个完整 interval 周期(首跳在启动后 N 小时,5.4)。

Q9:服务起了但外部访问不通 检查 --listener 是否还是默认 127.0.0.1:8080(5.1),改为 :端口 后重启。

八、参考链接

  • 本系列:《transfer.sh 介绍与选型指南》https://www.quzuo.net/document/nn7i2cwAAhTV、《transfer.sh 1.6.1 Docker Compose 部署指南》https://www.quzuo.net/document/k8d8smHJIjJx、《transfer.sh 1.6.1 curl 上传下载命令详解》https://www.quzuo.net/document/izkelRSBTntz
  • 官方仓库:https://github.com/dutchcoders/transfer.sh(README 含参数表)
  • 版本发布页:https://github.com/dutchcoders/transfer.sh/releases/tag/v1.6.1