news 2026/9/10 18:36:01

croc 如何部署加密存储传输服务并配置下载与过期策略?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
croc 如何部署加密存储传输服务并配置下载与过期策略?

croc 如何部署加密存储传输服务并配置下载与过期策略?

【免费下载链接】crocEasily and securely send things from one computer to another :crocodile: :package:项目地址: https://gitcode.com/GitHub_Trending/cr/croc

本文解决的任务是:在自有服务器上部署 croc 的统一 Web 服务croc-web,启用它的加密存储传输(stored transfers)模式,并配置服务端的下载次数上限与过期时长策略,使发送方上传的密文文件可以按策略被下载或自动删除。适用对象是需要自建服务的运维者:croc-web是随发布单独发布的 Linux amd64 二进制,也可以从源码构建(需要 Go 1.27+)。存储模式默认关闭,只有显式配置存储目录后才会启用。

准备条件

  1. 获取croc-web二进制:从项目发布中获取 Linux amd64 构建版本,或在仓库根目录执行make build-web从源码构建。该目标会先构建并嵌入前端资源,再编译出croc-web;部署后的croc-web二进制不需要额外的静态文件目录。
  2. 准备一个持久化、私有的存储目录,只允许 croc 服务账户读写。存储目录会被服务端加独占锁,不要将多个进程指向同一目录。
  3. 准备一个 HTTPS 反向代理,TLS 证书保留在代理侧。

存储传输是 croc 的可选异步模式:发送方在本地用随机 256 位主密钥加密文件,服务上只存放密文;协议名为croc-store-v1,清单与每个 4 MiB 分块都使用 AES-256-GCM。完整协议、隐私边界和状态机定义见 src/docs/STORED_TRANSFERS.md。

启动服务并启用存储

最小可执行启动命令(文档中的示例域名为files.example.com,替换为你的公开主机名):

croc-web \ --bind 127.0.0.1:9014 \ --store-dir /var/lib/croc/store \ files.example.com

参数说明:

  • --bind 127.0.0.1:9014:本地监听地址。不指定时默认就是127.0.0.1:9014,即面向 HTTPS 反向代理部署。
  • --store-dir /var/lib/croc/store:存储目录。加上它才会启用存储模式;目录要求持久、私有、仅 croc 服务账户可写。
  • 末尾的files.example.com:网站 origin,生成的浏览器分享链接使用浏览器加载页面时所用的 origin。

服务启动时会从元数据重建配额与未完成上传的计数,之后每分钟清扫未完成、已过期和终态记录。以非特权账户运行服务;监控磁盘剩余空间和 HTTP429/507响应;将密文排除在备份之外,否则"下载耗尽即删除"的语义会被备份恢复破坏。

配置下载次数与过期策略

服务端通过以下标志限制每个传输可请求的策略上限(默认值来自 src/docs/STORED_TRANSFERS.md 与 src/webcli/webcli.go,两者一致):

标志默认值用途
--store-max-transfer1GiB单次传输最大明文字节数(上限2GiB
--store-quota5GiB所有传输占用的密文总上限
--store-min-free512MiB磁盘必须保留的剩余空间
--store-max-files100单次传输最大常规文件数
--store-downloads1发送方可请求的最大验证下载次数
--store-max-expiration0发送方可选生命周期的上限;0表示不设策略上限
--store-create-rate5每客户端 IP 每小时允许的创建数
--store-active-uploads2每客户端 IP 并发未完成上传数
--store-trusted-proxy可重复的受信反向代理 CIDR

下载与过期这两项还可以通过环境变量配置:CROC_STORE_DOWNLOADSCROC_STORE_MAX_EXPIRATION;显式命令行标志优先于环境变量。

过期值的格式规则(由 src/store/expiration.go 中的解析逻辑定义):

  • 使用整数的m(分钟)、h(小时)、d(天)、w(周)单位,最小为 1 分钟;
  • 服务端上限为0或空表示允许任意有限时长;
  • 发送方请求超过服务端上限的值会被静默降低到上限;
  • 被接受的时长在传输创建时固化,之后修改策略不会改变已创建传输的有效期。

web/README.md 给出的一个完整示例(文档示例,可直接作为配置参考):

croc-web \ --bind 127.0.0.1:9014 \ --store-dir /var/lib/croc/store \ --store-max-transfer 1GiB \ --store-quota 5GiB \ --store-min-free 512MiB \ --store-max-expiration 2w \ getcroc.com

字节类标志接受整数加BKBMBGBTBKiBMiBGiBTiB后缀。

发送方在上传时逐项指定自己请求的值(不能超过服务端上限):

croc send --store --store-url https://files.example.com --store-downloads 3 --store-expiration 3d photo.jpg document.pdf

其中--store-url用于指向自托管服务,也可以用环境变量CROC_STORE_URL设置。不传--store-expiration时默认一天,从上传成功完成时起算。传输在"配置的下载次数用完"与"选定寿命到期"两者先发生者被删除。

反向代理要求

将整个 origin 放到 HTTPS 后面,并把所有路径代理到同一个croc-web进程,包括/api/v1/store/ws、Web 静态资源和存储分享路由。代理需保留原始Host头,并且不要缓存 API。服务端返回的完整端点见 web/README.md:/(网站)、/config.js/healthz/ws,以及配置了--store-dir时的/api/v1/store/transfers

--store-trusted-proxy只在反向代理会重写客户端转发头(如X-Forwarded-For)的基础设施上配置,可重复传入多个 CIDR;不可信的转发头会被忽略,限流直接使用 socket 对端地址。

验证部署

按顺序做两个检查:

  1. 健康检查。croc-web暴露GET /healthz,本机验证:
wget -qO- http://127.0.0.1:9014/healthz >/dev/null

项目自带的 disco.json 中 web 服务的健康检查用的就是这一条命令。

  1. 走一遍完整的存储传输链路:
  • 发送方执行上一节的croc send --store ...命令,输出应包含:浏览器链接(形如https://files.example.com/s/<id>#v1.<key>)、一个croc-store-v1...CLI token、精确的过期时间和一个可传给croc --revoke的传输 ID。核对过期时间是否符合你设置的--store-max-expiration策略。
  • 接收方运行croc,在提示处粘贴 token 或链接;非交互场景用环境变量避免 token 出现在进程列表中:
CROC_STORE_TOKEN='croc-store-v1....' croc --out ./received

接收端会先解密清单展示文件名与大小,确认后下载分块、逐块认证、对每个完整文件做 SHA-256 校验,全部通过后才提交一次允许下载。最后一个允许的下载提交后,密文立即删除。

  • 在传输仍可用时,发送方可以用croc --revoke <transfer-id>主动撤销;CLI 的撤销凭据以0600权限保存在 croc 配置目录中。

行为边界与运行限制

  • 下载是独占的:传输被某个接收方 claim 后锁定最长 30 分钟(随分块读取续期),因此配置的下载次数是逐个兑现,而不是并发。
  • 终态(consumedrevokedexpired)的密文立即删除,只留一个小 tombstone 24 小时,让调用方得到稳定的终态结果。
  • 浏览器链接中的#片段(解密密钥)不会进入 HTTP 请求、Referer或服务端日志,但完整链接仍是 bearer 秘密:任何能读到它的人都可以解密文件并占用一次下载。通过私密渠道分享。
  • 存储模式只接受常规文件,文本消息只支持直连模式;服务能得知连接元数据、密文长度、声明的文件/分块数等配额信息,但无法从存储数据得知文件名、内容或主密钥。
  • 服务对存储目录持有独占锁,指向同一目录的第二个进程无法启动;扩容不是靠多进程共享目录实现的。

可选:用容器部署

仓库根目录的 Dockerfile 同时构建croccroc-web,以nobody用户运行;入口脚本 croc-entrypoint.sh 在web子命令下支持以下环境变量映射:STORE_DIR--store-dirSITE_URL→ 位置参数、CROC_PASS--passCROC_RELAY_PORTS(或CROC_PORTS)→--ports。disco.json 中 web 服务的配置是:

web --debug --bind 0.0.0.0:8080 --store-dir /www/croc/storage

并将命名卷croc-store挂到/www/croc/storage,使密文与元数据在容器替换后保留。README.md 的 Deployment 一节说明该卷还有防并发机制:web 服务额外发布 TCP 端口 9020 映射到未使用的容器端口 65535,Disco 会因端口冲突先停掉持有卷的旧实例再启动新实例,端口 9020 本身不承载应用流量,应保持被防火墙封锁。若走 Disco 部署,CROC_RELAY_PORTS必须与 disco.json 中 relay 服务的publishedPorts保持一致,且服务器防火墙需放行对应 relay 端口。

部署完成后,日常运维关注两点:磁盘剩余空间是否逼近--store-min-free,以及 HTTP429/507是否出现——前者表示配额或保留空间策略在拒绝新传输,后者通常对应配额耗尽。

【免费下载链接】crocEasily and securely send things from one computer to another :crocodile: :package:项目地址: https://gitcode.com/GitHub_Trending/cr/croc

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/10 18:35:42

迁移学习实战:用Transformers库微调预训练模型的完整指南

迁移学习这四个字&#xff0c;在我刚开始接触深度学习时还是个偏学术的概念&#xff0c;现在却几乎成了每个做 NLP 项目的人的日常。而 Hugging Face 的 Transformers 库&#xff0c;更是把预训练模型的加载、微调、部署全部封装成了顺手得不能再顺手的 API。但越是这样&#x…

作者头像 李华
网站建设 2026/9/10 18:35:42

xhEditor PDF导入集成:实现文本高亮与注释的完整方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/10 18:32:26

从System.out到Logback:Java日志与Git版本控制实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/10 18:30:58

GE 内存冲突分析与处理机制

GE 内存冲突分析与处理机制 【免费下载链接】ge GE&#xff08;Graph Engine&#xff09;是面向昇腾的图编译器和执行器&#xff0c;提供了计算图优化、多流并行、内存复用和模型下沉等技术手段&#xff0c;加速模型执行效率&#xff0c;减少模型内存占用。 GE 提供对 PyTorch、…

作者头像 李华