困困鱼 看这里

    35

2025-11-12T21:37:05.749+08:00 INFO 7 --- [com.kunkunyu.backup.webdav.reconciler.SynchronizationReconciler-1] o.apache.http.impl.execchain.RetryExec : I/O exception (java.net.SocketException) caught when processing request to {s}->https://dav.inmark.dev:443: Broken pipe 2025-11-12T21:37:05.750+08:00 INFO 7 --- [com.kunkunyu.backup.webdav.reconciler.SynchronizationReconciler-1] o.apache.http.impl.execchain.RetryExec : Retrying request to {s}->https://dav.inmark.dev:443

明白了,你目前 Broken pipe 依然存在,说明问题已经不是简单的端口或 URL 问题,而是 Sardine 与 Caddy HTTPS 反代 WebDAV 的兼容性问题

结合你目前的配置和日志,这里是分析与可行方案:


1️⃣ 问题本质

  1. Sardine + HTTP/2 反代

    • 默认 Caddy HTTPS 使用 HTTP/2(ALPN: h2),Sardine 的 HttpClient 有时无法正确处理 PUT 上传大文件 → Broken pipe。

  2. Caddy 反代可能没有开启 WebDAV 所需的全部 HTTP 方法

    • WebDAV 常用方法: PROPFIND, PUT, DELETE, MKCOL

    • Caddy 默认 reverse_proxy 支持这些,但 HTTP/2 上传有时仍会中断。

  3. 大文件上传/超时

    • 如果 Halo 上传备份较大,HTTP/2 可能在等待响应或 TCP 窗口溢出时断开。


2️⃣ 推荐解决方案

🔹 方案 A:强制 Caddy 反代使用 HTTP/1.1

在 Caddyfile 中修改 dav.inmark.dev

https://dav.inmark.dev {
    reverse_proxy 127.0.0.1:8080 {
        transport http {
            versions 1.1
        }
    }
}
  • 这样 Sardine 上传时会走 HTTP/1.1,而不是 HTTP/2 → 避免 Broken pipe。

  • 如果你已经试过还是不行,可能是 Caddy 或容器防火墙的问题。


🔹 方案 B:直接使用 HTTP(开发/内网环境)

  • 让 Sardine 直接访问 WebDAV 容器,不经过 Caddy:

https://127.0.0.1:8080/backup/file.zip
  • 这样可以确认问题是 Caddy 反代 还是 WebDAV/Sardine 本身


🔹 方案 C:使用小文件测试

  • 先用 1~2MB 的文件测试:

curl -u admin:admin -T test.zip http://127.0.0.1:8080/test.zip
  • 如果小文件上传成功,说明问题是 大文件 + HTTP/2 反代 导致 Broken pipe。


🔹 方案 D:调整 Sardine / HttpClient 超时

Sardine 默认连接和写入超时可能太短,大文件上传时会断开:

Sardine sardine = SardineFactory.begin(account, password);
sardine.enablePreemptiveAuthentication(account, password);
sardine.setReadTimeout(0);   // 无限等待
sardine.setConnectTimeout(0); // 无限等待

🔹 方案 E:直接部署 WebDAV 容器在 HTTPS

  • 给 WebDAV 容器自己配置 HTTPS(不用反代 Caddy),Sardine 直接访问:

    • bytemark/webdav 可以自己配置 TLS

    • 避免 HTTP/2 反代问题


3️⃣ 结论与建议

从日志和你的情况来看:

  • 核心问题:Sardine + Caddy HTTPS (HTTP/2) 上传大文件 → Broken pipe

  • 最快验证方式

    1. 小文件上传测试 → 成功说明 WebDAV 正常

    2. Sardine URL 直接指向 WebDAV 容器 HTTP → 如果成功,问题就在 Caddy 反代

  • 最终解决方案

    • 强制 Caddy 使用 HTTP/1.1(推荐)

    • 或者绕开 Caddy 反代直接访问 WebDAV

    • 或者让 WebDAV 自身支持 HTTPS(避免 Sardine + HTTP/2 反代)


我可以帮你写一个 Caddy + WebDAV 完整配置示例
保证 Halo / Sardine 上传大文件不会再 Broken pipe,同时支持 HTTPS 和端口 :443

你希望我直接写吗?

消息盒子

# 暂无消息 #

只显示最新10条未读和已读信息