由于之前为博客网站搭建了 Umami 统计工具,并计划将 Vaultwarden 服务从 Homelab 迁移到服务器上运行,以便在外网访问自己的 Vaultwarden 服务,我开始学习使用 Caddy 来获取 SSL 证书。通过将网站绑定到我在 Cloudflare 上的域名中,我可以更方便地管理和访问这些服务。
我的服务器系统为:Debian 12
Caddy
这是 Caddy的官网
安装Caddy
安装该软件包后, Caddy 会作为名为 caddy
的 systemd 服务自动启动和运行
稳定版本:
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy
如果执行命令有报错的话,不妨先执行一下apt-get update
先
然后我们运行
caddy
没有报错的话就是安装成功了
运行Caddy
caddy run
和 systemctl start caddy
是启动 Caddy 的两种不同方法
-
caddy run
: 通常用于开发、调试或测试环境中,因为她会直接将输出打印到终端, 便于查看日志和调试信息。也不会将 Caddy 当作系统服务来管理, 它只是在当前会话中启动 Caddy 可以通过Ctrl + C
停止 -
systemctl start caddy
: 会将 Caddy 作为一个系统服务来启动。通过 systemctl 启动的服务可以由系统自动管理,包括在系统启动时自动启动、记录日志、监控状态等
我这里用的是caddy run
以及 caddy start
等。Caddy 也有 Command Line页面来解释每个命令的作用和意思
如果你打算用 Caddy 自带的服务管理框架的时候,你运行caddy start
或者caddy run
的时候可能会碰到一下报错
我猜测是 systemctl
已经启动了 caddy 服务,使用 Caddy 自带的服务管理框架启动的时候,因为systemctl
已经启动了caddy服务, 所以将caddy的 API 端口给占用了,所以我们只需要netstat -tulp | grep 2019
,找到占用的进程号
然后使用kill -9 2804
将它 kill 掉(2804是我的进程号,这里要改成自己的)
这个时候我们再使用caddy start
就不会报错咯
然后可以直接通过 IP 在浏览器中访问的到网页
Caddy的基础配置
进入 caddy 配置文件的目录
cd /etc/caddy
更改caddy端口
如果你服务器的80端口和443端口给占用了,可以将caddy的https
和http
端口给更改,只需要在Caddyfile
中添加。Caddy社区回答
{
https_port 8443
http_port 8080
local_certs
}
添加 Module dns.providers.cloudflare
[NON-STANDARD]此模块不随 Caddy 一同提供。您可以通过使用 xcaddy 或我们的下载页面添加它。非标准模块可能由社区开发,并不受 Caddy 项目的官方支持或维护。
Custom builds:https://github.com/caddy-dns/cloudflare
Custom builds: xcaddy build --with github.com/caddy-dns/cloudflare
Go的安装
选择好自己的系统,右键复制地址
回到终端中执行
wget https://go.dev/dl/go1.22.5.linux-amd64.tar.gz #后面为你刚刚在浏览器中复制的地址
- 删除之前的Go 安装文件已经将刚刚下载好的包解压到 /usr/local
rm -rf /usr/local/go && tar -C /usr/local -xzf go1.22.5.linux-amd64.tar.gz
- 将 /usr/local/go/bin 添加到PATH环境变量之中
export PATH=$PATH:/usr/local/go/bin
- 输入以下命令来验证是否成功安装Go
go version
安装xcaddy
前提条件: 已安装Go
你可以从源代码构建xcaddy
go install github.com/caddyserver/xcaddy/cmd/xcaddy@latest
对于 Debian, Ubuntu和 Raspbian,可以直接从官方的 Cloudsmith 仓库获取 xcaddy
包 (我选的是这个方法)
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/xcaddy/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-xcaddy-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/xcaddy/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-xcaddy.list
sudo apt update
sudo apt install xcaddy
构建 dns.providers.cloudflare 模块
我选择回到/etc/caddy/
目录下运行, 因为会生成一个执行文件
xcaddy build --with github.com/caddy-dns/cloudflare
创建 Cloudflare 的 tokens
- 登录 Cloudflare 并转到要使用Caddy的域名
- 向下滑之后右边你会看到标题为 “API” 的部分, 点击 “Get your API token”
- 然后点击 “Create Token”
- 在 “User API Tokens” 页面,滑动到底部, 点击 “Create Custom Token”
- 给你的Token 命名, 然后添加两个 “Permissions”
- Zone - Zone - Read
- Zone - DNS -Edit
- 然后点击 “Continue to summary”, 现在就能看到您的API token了,然后将它复制下来
Caddyfile编写
可以将Caddyfile
文件里面的内容全部注释掉或者删掉,因为我的Umami
服务是在3000
端口运行的,所以要reverse_proxy 127.0.0.1:3000
。
以下是我的Caddyfile(example.com要换成你的域名)
example.com {
reverse_proxy 127.0.0.1:3000
tls {
dns cloudflare {env.CLOUDFLARE_API_TOKEN}
}
}
然后在终端中输入之前拿到的Cloudflare API token
export CLOUDFLARE_API_TOKEN="your-api-token"
这个环境变量只在当前的终端会话中有效,一旦你关闭了终端或者退出了登录,这个环境变量就会失效。
如果你希望在每次登录时自动设置这个环境变量,可以将它添加到你的 shell 配置文件中,比如 .bashrc
或 .bash_profile
运行
在/etc/caddy/
文件夹下执行./caddy run
启动(如果有报错大概率是端口冲突,前面有解决方法)。
在 Cloudflare 中添加好记录,就可以尝试访问了 访问成功!!
参考文档
- Caddy官方文档
- https://samedwardes.com/blog/2023-11-19-homelab-tls-with-caddy-and-cloudflare/
- https://roelofjanelsinga.com/articles/using-caddy-ssl-with-cloudflare/
- https://developers.cloudflare.com/fundamentals/api/how-to/create-via-api/
- https://caddyserver.com/docs/modules/dns.providers.cloudflare
- https://www.youtube.com/watch?v=WgUV_BlHvj0
- https://github.com/caddy-dns/cloudflare
Comments: