从源码构建
如果你需要自定义构建(例如带插件),构建Caddy有多种方式:
要求:
- Go 1.20或更高版本
Package Support Files一节包含给这类用户的说明:已在Debian衍生系统上通过APT安装Caddy,但仍需要自定义构建可执行文件用于生产运维。
Git
要求:
- 已安装Go(见上文)
克隆仓库:
git clone "https://github.com/caddyserver/caddy.git"
如果你没有git,也可以从GitHub下载源码压缩包。每个发布版本也提供源码快照。
构建:
cd caddy/cmd/caddy/
go build
Go程序很容易交叉编译到其他平台。只需设置不同的GOOS、GOARCH和/或GOARM环境变量。(详见go文档)
例如,当你当前不在Windows上时,编译Windows版Caddy:
GOOS=windows go build
类似地,当你当前不在Linux或ARMv6上时,编译Linux ARMv6版:
GOOS=linux GOARCH=arm GOARM=6 go build
xcaddy
xcaddy命令是构建带版本信息和/或插件Caddy的最简单方式。
要求:
- 已安装Go(见上文)
- 确保
xcaddy在你的PATH中
你不需要下载Caddy源码(它会自动完成)。
然后,构建Caddy(包含版本信息)只需:
xcaddy build
若要携带插件构建,使用--with:
xcaddy build \
--with github.com/caddyserver/nginx-adapter
--with github.com/caddyserver/ntlm-transport@v0.1.1
如你所见,可以通过@语法指定插件版本。版本可以是tag名、commit SHA或分支。
使用xcaddy的跨平台编译方式与go命令一致。例如,为macOS交叉编译:
GOOS=darwin xcaddy build
Docker
你可以使用:builder镜像,快速构建带自定义模块的新Caddy二进制:
FROM caddy:<version>-builder AS builder RUN --mount=type=cache,target=/go/pkg/mod \ --mount=type=cache,target=/root/.cache/go-build \ xcaddy build \ --with github.com/caddyserver/nginx-adapter \ --with github.com/hairyhenderson/caddy-teapot-module@v0.0.3-0 FROM caddy:<version> COPY --from=builder /usr/bin/caddy /usr/bin/caddy
请将<version>替换为当前最新Caddy版本作为起点。
注意第二个FROM指令:它只是把新构建的二进制覆盖到常规caddy镜像上,因此产物镜像会小很多。
构建阶段用xcaddy构建并注入指定模块,过程与上文一致。--mount=type=cache,target=/go/pkg/mod和--mount=type=cache,target=/root/.cache/go-build分别用于缓存Go模块依赖和构建产物,可显著加速后续构建。该参数是Docker特性,不是xcaddy特性。
若使用Docker Compose,请参见我们推荐的compose.yml及使用说明。
Package support files for custom builds for Debian/Ubuntu/Raspbian
该流程旨在:运行自定义caddy二进制的同时,保留caddy软件包中的支持文件。
该流程让用户可以继续利用官方包中的默认配置、systemd服务文件和bash补全。
要求:
流程:
sudo dpkg-divert --divert /usr/bin/caddy.default --rename /usr/bin/caddy
sudo mv ./caddy /usr/bin/caddy.custom
sudo update-alternatives --install /usr/bin/caddy caddy /usr/bin/caddy.default 10
sudo update-alternatives --install /usr/bin/caddy caddy /usr/bin/caddy.custom 50
sudo systemctl restart caddy
说明:
-
dpkg-divert会把/usr/bin/caddy二进制移动到/usr/bin/caddy.default,并设置diversion,以防后续软件包再向该路径安装文件。 -
update-alternatives会创建到/usr/bin/caddy的符号链接,指向你期望的caddy二进制。 -
systemctl restart caddy会停止默认版本Caddy服务并启动自定义版本。
你可以执行下面命令并按屏幕提示,在默认/自定义caddy二进制之间切换;完成后重启Caddy服务。
update-alternatives --config caddy
完成上述配置后,你可运行caddy upgrade来升级Caddy。它会尝试按你当前构建中的同款插件组合,下载带最新Caddy版本的新构建,然后替换当前二进制。