V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
cathedrel
V2EX  ›  程序员

请未来的首富帮我写个能跑起来的 caddy 2 的 Caddyfile,不是我懒,详见内文

  •  
  •   cathedrel · 2021-01-30 05:55:48 +08:00 · 7377 次点击
    这是一个创建于 1399 天前的主题,其中的信息可能已经有所发展或是发生改变。

    放狗搜了两天,网上的例子基本都是 v1 版本的配置方式,跟 v2 不通用,caddy 官网的文档太简单我看不懂。。。

    家里面自己一个人用的 debian 10 文件服务器,目标是用 caddy 开 webdav,下载了官网带 webdav 模块的文件,安装配置成功,Caddyfile 很简单的 3 行配置可以跑起来:

    nas.local

    root * /mnt/nas

    file_server browse

    这样的配置文件可以实现在家里另一台电脑上浏览器里输入 nas.local 即可网页形式浏览 nas 上的文件,而且是自动跳转 https 的( caddy 自己的证书)

    然后我想加上全局的验证和 webdav 功能就无论如何不能成功:

    nas.local

    basicauth / name pass

    root * /mnt/nas

    file_server browse

    webdav /dav {

    scope /mnt/nas

    modify true

    }

    用 journalctl -xef -u caddy.service 查看错误,name 有问题,scope 有问题,modify 有问题,可是网上找来找去找不到没问题的模板。。。

    请未来的首富帮忙写个 caddy v2 的配置文件吧,或者用非程序员也能懂的白话文指出问题在哪儿,谢谢了,好人一生平安,好人必成首富

    54 条回复    2021-09-04 06:29:56 +08:00
    hymzhek
        1
    hymzhek  
       2021-01-30 07:43:47 +08:00   ❤️ 1
    Showfom
        2
    Showfom  
       2021-01-30 08:02:23 +08:00 via iPhone
    额 不会 caddy 倒是换 nginx 的话我会- -
    hash
        3
    hash  
       2021-01-30 08:19:59 +08:00   ❤️ 10
    换 Nginx 吧, caddy 这种号称小白也能上手的我就没上过手,每次都觉得自己是个傻子后放弃
    squkw
        4
    squkw  
       2021-01-30 08:46:55 +08:00   ❤️ 1
    我上个月刚配置了一次,大概这样
    使用 caddy hash-password 把密码加密
    {
    order webdav last
    }
    nas.local {
    encode zstd gzip
    root * /mnt/nas
    basicauth {
    root 加密后的密码
    }
    webdav {
    root /mnt/nas
    }
    }
    wancaibida
        5
    wancaibida  
       2021-01-30 10:10:44 +08:00 via iPhone
    实话说 caddy 的文档真的坑
    boris93
        6
    boris93  
       2021-01-30 10:28:21 +08:00 via Android
    换回 nginx 吧
    我用过 caddy 1,这玩意要把插件一起编译进去,这个太坑了
    文档也真的是太少
    GreatFinger
        7
    GreatFinger  
       2021-01-30 10:50:34 +08:00 via Android
    如果实在不熟悉 caddyfile 可以用 nginx adapter
    matrix67
        8
    matrix67  
       2021-01-30 11:08:56 +08:00   ❤️ 1
    别用 caddy 了,推荐 https://github.com/hacdias/webdav,go 二进制丢上去就可以用。配置文件简单多了

    webdav --config /root/webdev/webdev.json

    {
    "address": "0.0.0.0",
    "port": 10086,
    "auth": true,
    "tls": true,
    "cert": "/root/webdev/webdav.pem",
    "key": "/root/webdev/webdav.key",
    "prefix": "/",
    "users": [
    {
    "username": "user",
    "password": "yourpassword",
    "modify": false,
    "scope": "/mnt"
    }
    ]
    }
    darksword21
        9
    darksword21  
       2021-01-30 11:10:22 +08:00
    我之前也是用 caddy v1,后来 v2 出来之后不知道为什么看不懂,又学了 nginx 换掉了
    Qzier
        10
    Qzier  
       2021-01-30 11:35:36 +08:00   ❤️ 1
    caddy v1 的配置挺简单的,和 nginx 很像,而且官网文档详细,v2 版本改成 json 后,语法不一样不说,连个详细文档都没有了,我还是继续用 v1 版本。
    hotsymbol
        11
    hotsymbol  
       2021-01-30 12:04:26 +08:00
    别用 Caddy 了,换 Nginx 吧
    imydou
        12
    imydou  
       2021-01-30 12:54:03 +08:00   ❤️ 1
    skyrem
        13
    skyrem  
       2021-01-30 13:02:47 +08:00 via Android
    v2 个个都是人才,说话又好听
    hanxiV2EX
        14
    hanxiV2EX  
       2021-01-30 13:23:34 +08:00 via Android
    直接用 v1 吧
    felixin
        15
    felixin  
       2021-01-30 14:17:55 +08:00 via Android
    traefik
    Alphagocc
        16
    Alphagocc  
       2021-01-30 15:08:01 +08:00
    Caddy 2 默认不支持 webdav
    用 xcaddy 加上那个 1 楼那个 webdav 插件重新编译。
    编译倒是 go 环境一装,命令一敲,全自动。
    另外 caddy2 支持 caddy1 的 Caddyfile
    cathedrel
        17
    cathedrel  
    OP
       2021-01-30 16:58:22 +08:00
    @Showfom
    @hash
    @boris93
    @GreatFinger
    @hotsymbol
    @imydou

    Nginx 我也是完全不会,两个都不会的东西我想学个新一点的简单一点的吧,谁知道 caddy 的文档这么坑!
    labulaka521
        18
    labulaka521  
       2021-01-30 17:11:10 +08:00
    同没看懂 放弃🐶
    cathedrel
        19
    cathedrel  
    OP
       2021-01-30 17:17:17 +08:00
    @squkw 谢谢首富!你这个配置可以跑起来!
    boris93
        20
    boris93  
       2021-01-30 17:18:24 +08:00 via iPhone
    @cathedrel 都不会的话,选知名度高的那个,至少社区丰富
    cathedrel
        21
    cathedrel  
    OP
       2021-01-30 17:19:39 +08:00
    @squkw
    就是有个 webdav 的问题:我在另一台 linux 的桌面电脑上想用 Nemo 直接连接 Nas 的 webdav 服务,一直不行,提示“HTTP 错误:对方发送了致命 TLS 警报:内部错误”

    journalctl -xef -u caddy.service 的话显示有这么一句:
    cathedrel
        22
    cathedrel  
    OP
       2021-01-30 17:20:26 +08:00
    @squkw
    "logger":"tls","msg":"stapling OCSP","error":"no OCSP stapling for [nas.local]: no OCSP server specified in certificate"

    不知道是不是自签证书的问题,有解决办法吗?
    cathedrel
        23
    cathedrel  
    OP
       2021-01-30 17:22:19 +08:00
    @boris93 也是看在 caddy 的配置文件确实不难的前提下选了这货试试,谁知道文档那么坑
    cathedrel
        24
    cathedrel  
    OP
       2021-01-30 17:22:53 +08:00
    @matrix67 这个看起来也不错,收藏了,谢谢
    WordTian
        25
    WordTian  
       2021-01-30 18:31:53 +08:00 via Android
    2 的文档确实坑,用这货转发 http 代理的请求都转发不了,坑的一匹
    matrix67
        26
    matrix67  
       2021-01-30 18:56:09 +08:00   ❤️ 1
    @cathedrel 自签证书

    mkdir /root/webdev

    openssl req -x509 -nodes -days 720 -newkey rsa:2048 -keyout webdav.key -out webdav.pem
    huiyifyj
        27
    huiyifyj  
       2021-01-30 19:07:48 +08:00
    看来不止是我一个人觉得 caddy 的文档难懂 🌚
    ruimz
        28
    ruimz  
       2021-01-30 20:44:20 +08:00
    @Alphagocc caddy2 不支持 caddy1 的 Caddyfile 。光是官网列出来的变化就有这么多 https://caddyserver.com/docs/v2-upgrade#caddyfile
    cathedrel
        29
    cathedrel  
    OP
       2021-01-30 22:29:21 +08:00
    @matrix67 我把 caddy 的 webdav 功能关了,尝试用你推荐的这个项目,服务器端可以运行起来,显示 Listening on [::]:xxxxx,但是客户端一直连接不了,提示:

    HTTP 错误:无法连接:没有到主机的路由

    配置文件是这样的:

    address: 0.0.0.0

    port: 9999

    auth: true

    tls: true

    cert: /opt/webdav/tls.pem

    key: /opt/webdav/tls.key

    prefix: /

    users:

    - username: admin

    password: admin

    scope: /mnt/nas

    modify: true


    防火墙开放了 9999 端口,也能 ping 通 nas.local 或者其 IP,但还是说没有到主机的路由,把 firewalld 关了也是一样,奇怪了,哪里不对吗?
    missdeer
        30
    missdeer  
       2021-01-30 23:14:21 +08:00
    就是从 nginx 转到 caddy v1 再转回 nginx 的,太坑了
    wym0823
        31
    wym0823  
       2021-01-30 23:58:01 +08:00 via Android
    chfs 这个小工具你值得拥有
    matrix67
        32
    matrix67  
       2021-01-31 09:27:00 +08:00   ❤️ 1
    @cathedrel

    1. 你如果配置是 9999 的话,那么服务端执行 webdav --config webdev.yaml, 应该显示的是 Listening on [::]:9999 到这一步应该都是没问题的。

    2. 客户端一直连接不了,HTTP 错误:无法连接:没有到主机的路由。 这应该是网络上有问题,应该还没到应用层面上。

    3. 你能 ping 通 nas.local,那么接下来就要测试一下 telnet nas.local.ip 9999 如果没打出 Escape character is '^]'. 一直是 Trying xxxx 说明有问题。 这个时候要服务器端和客户端连边都抓一下包看看,看看是哪边的防火墙的问题。

    4. 如果 3 这步是好的,那接下来调试都可以看 webdav 输出了。

    我感觉,是不是你的 config 没生效,显示 Listening on [::]:xxxxx 肯定不对,你要确认显示的是 Listening on [::]:9999. 因为 config 没生效,所以你客户端连服务器 9999 就不通了。
    docx
        33
    docx  
       2021-01-31 10:43:09 +08:00
    没什么特定需求的话,用还是 v1 吧。
    v2 我也看不太懂,改的什么玩意。
    matrix67
        34
    matrix67  
       2021-01-31 10:45:34 +08:00   ❤️ 1
    @matrix67

    还有这个项目的防御式编程做的也不太好,比如 config 写到 a.yaml 然后执行 webdav --config b.yaml, 它竟然服务能起来,而且是在高位端口随机取一个,而不是报 config 文件没找到。这可真是坑的一批

    当然它吞配置好像按照 环境变量、配置文件等等优先级来的,但是明显指定一个不存在的 config 能起来真是让我觉得很奇怪 2333
    squkw
        35
    squkw  
       2021-01-31 11:10:10 +08:00   ❤️ 1
    @cathedrel 我自己是没开 https 。所以没遇到你的问题,第一个大括号里面加一行 auto_https off
    dingyaguang117
        36
    dingyaguang117  
       2021-01-31 15:35:48 +08:00 via iPhone   ❤️ 1
    Caddy 文档真垃圾,除了自动维护 https 证书
    cathedrel
        37
    cathedrel  
    OP
       2021-01-31 18:18:31 +08:00
    @matrix67 是的,这玩意也确实有点坑,一开始我 webdav --config webdev.config (对,.config,就跟着它 github 学的),总是显示一个随机的端口,我还在想这要怎么设置防火墙呢?后来试着用你的.json 方式,它才显示我指定的端口,这才明白是它的问题不是我的问题,但是新问题又来了:不管它是运行在随机端口还是我指定的端口,依然“HTTP 错误:无法连接:没有到主机的路由”,关了 firewalld 也是这样,同一时间 ping nas.local 或者 ping IP 都是通的,奇怪了耶,下面怎么抓包?
    matrix67
        38
    matrix67  
       2021-01-31 18:36:06 +08:00   ❤️ 1
    @cathedrel

    在你客户端 telnet nas.local.ip 9999 这个输出的是啥
    cathedrel
        39
    cathedrel  
    OP
       2021-01-31 18:45:34 +08:00
    @matrix67

    Server lookup failure: nas.local:10001:telnet, 未知的名称或服务

    或者:

    Server lookup failure: 192.168.1.123:10001:telnet, 未知的名称或服务

    很奇怪,明明可以 ping 通 nas.local 或者其 IP,同一时间这台电脑上 ssh [email protected] 都连接成功的,nas 上的防火墙也关了,这问题大概出在哪儿??

    前面用 caddy 做 webdav 服务器的时候连接时是报证书错误,难不成是这个 webdav 项目在网络广播上有什么问题??
    matrix67
        40
    matrix67  
       2021-01-31 19:33:16 +08:00   ❤️ 1
    @cathedrel 这就很奇怪了。

    或者客户端上面有没有防火墙。
    cathedrel
        41
    cathedrel  
    OP
       2021-01-31 20:11:42 +08:00
    @matrix67 主操作电脑是 manjaro,默认安装了 ufw,我刚刚看了一下,“家庭”是关闭的,“公共的”和“办公室”是开启的,但是所有的“传出”都是默认允许的,“传入”被禁止,这应该完全不影响吧?
    matrix67
        42
    matrix67  
       2021-01-31 20:53:27 +08:00   ❤️ 1
    @cathedrel ufw 没玩过,默认传入被禁止,也就是 server 端的回包会被 rst 掉?

    你可以先放通这个规则试试
    matrix67
        43
    matrix67  
       2021-01-31 20:54:31 +08:00   ❤️ 1
    @cathedrel 老哥加油啊,哈哈,我能不能成为首富就靠你啦!!
    YouLMAO
        44
    YouLMAO  
       2021-01-31 22:09:06 +08:00 via Android
    中国的首富,是一种诅咒死亡的话
    cathedrel
        45
    cathedrel  
    OP
       2021-01-31 22:57:34 +08:00
    @matrix67 这会发现之前完全不能连接是服务器的防火墙问题,真是奇怪,明明给 firewalld 开了 10001 端口,也 reload 了,但就是连不上,现在我是 disable firewalld 然后重启系统再运行 webdav --config webdev.json,能连上了!一开始提示证书机构未知,接受证书后就说“请确认您的用户信息”,意思用户名或者密码错误,我在 json 里面设置的很简单啊,怎么回事?

    服务器上的输出:

    2021/01/31 22:41:39 http: TLS handshake error from 192.168.1.10:36796: read tcp 192.168.1.123:10001->192.168.1.10:36796: read: connection reset by peer

    json 里面关于 user 的如下:

    "users": [

    {

    "username": "admin",

    "password": "ooadmin",

    "modify": true,

    "scope": "/mnt/nas"

    }

    ]

    }

    用户名 admin 密码 ooadmin,怎么也不可能打错,这又是什么奇怪的问题?

    还有个奇怪的点:webdav 客户端用 nas.local 是连不上的,必须用 ip 才能连上,但是同一台电脑里 ssh 和 ping 都可以连上 nas.local,怪事频出啊
    cathedrel
        46
    cathedrel  
    OP
       2021-01-31 23:16:27 +08:00
    @matrix67 另外,台式机的防火墙不关是开启还是关闭还是开启状态下完全允许传入传出,webdav 都是这样德行
    cathedrel
        47
    cathedrel  
    OP
       2021-01-31 23:53:27 +08:00
    @matrix67 又在手机上试了一下(前面全部是在电脑上试的),连不上,不管是 nas.local 或者 IP,都连不上,手机上也没有更多的提示,服务器端也是完全没有任何接入的提示,我现在怀疑这个 webdav 服务端可能有点什么问题,不过它的 issue 页面又好像没什么那么多吐槽的,太奇怪了
    qinghon
        48
    qinghon  
       2021-02-01 00:27:59 +08:00 via Android   ❤️ 1
    突然有点奇怪为啥 nginx 没人写个插件自动维护 https
    cathedrel
        49
    cathedrel  
    OP
       2021-02-01 06:58:17 +08:00
    @squkw 你好首富,头大,问题一个接一个

    我的配置文件就照抄的你在 4 楼的样子,只是 basicauth 上面加了一行 file_server browse,运行起来就只能是在浏览器里浏览文件,webdav 客户端一直说请确认用户信息,好像是用户名和密码对不上的意思,可是很简单的用户名和密码不可能错(就 123 ),而且浏览器的页面就是这个用户名和密码进去的,这是什么问题呢? webdav 可以 /需要另外设置登入信息吗?
    matrix67
        50
    matrix67  
       2021-02-01 09:37:25 +08:00
    @YouLMAO #44 哈哈哈哈哈
    matrix67
        51
    matrix67  
       2021-02-01 09:41:18 +08:00
    @cathedrel #45

    > webdav 客户端用 nas.local 是连不上的,必须用 ip 才能连上
    这个问题是你客户端 dns 解析的问题。

    > TLS handshake error
    这个是你客户端 ssl 没选上的问题。 你先把服务端 https 那些都选项都删了,只使用 http 试试。要是能连上,再 debug ssl 问题。
    reed2020
        52
    reed2020  
       2021-02-01 09:59:41 +08:00
    caddy2 的文档和配置真是一言难尽,caddy1 还挺好的
    squkw
        53
    squkw  
       2021-02-01 20:12:41 +08:00   ❤️ 1
    @cathedrel 应该不是密码的问题,我觉得是不能在同一个端口开启 file_server 和 webdav,你再添加一块
    nas.local:8080 {
    file_server browse
    root * /mnt/nas
    basicauth {
    root 加密后的密码
    }
    }

    或者 webdav 的用另一个端口,反正不能都用一个端口
    keling
        54
    keling  
       2021-09-04 06:29:56 +08:00
    @squkw 谢谢,按照你的修改下可以了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5235 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 05:44 · PVG 13:44 · LAX 21:44 · JFK 00:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.