Soulter's Blog
The world is your canvas!
1.9k words

使用 Frp、Cloudflare 和 Caddy 轻松让你的边缘设备上云

看到这个标题是否在想:这不是轻轻松松吗?边缘设备通过 frp 内网穿透到一个公网服务器,公网服务器上的 Caddy 反代一下穿透过来的流量,再在 Cloudflare(或任何 DNS 服务商)上配一下 DNS 解析不就行了?

确实是这样 🤓,但是这是一个固定的工作流,如果边缘设备要同时起很多 HTTP 服务,重复的工作就很麻烦。于是我开发了一个 Orion 工具,可以一键完成上面的任务。预期效果是:

在没有公网 IP 的边缘设备上运行下面脚本:

1
orion serve -n my_service -p 8000 -- ./your_service

运行之后,即可在 https://my_service.example.com 上访问到这个服务。

也可以在边缘设备上查看已经运行的服务以及健康情况:

1
2
3
4
5
6
7
soulter@ubuntu:~/orion-linux-arm64-v0.0.2$ ./bin/orion list
PROCESS STATUS PID CONFIG LOG
frpc running 7471 /home/soulter/.orion/frpc.toml /home/soulter/.orion/logs/frpc.log
frps not-configured - - -

NAME STATUS FRPS PUBLIC PORT DOMAIN CONFIG
my_service running ok ok 38399 my_service.example.com /home/soulter/.orion/frpc.toml

过程

1
Browser -> Cloudflare DNS -> Caddy -> frps(vhostHTTPPort) -> frpc -> local service

FRP

frp 支持 HTTP 模式,可以在 frp 客户端中用 type = "http" 注册一个代理并指定 customDomains,frp 服务端就可以通过 HTTP 的 Host 头把请求路由到对应的边缘服务。

frp 客户端的代理配置大概长这样:

1
2
3
4
5
6
[[proxies]]
name = "jetson-orin-nano-llamacpp"
type = "http"
localIP = "127.0.0.1"
localPort = 38399
customDomains = ["llamacpp.example.com"]

需要在 frp 服务端中配置 vhostHTTPPort,这个参数是专门用来接收 HTTP 请求的监听端口。

DNS

在 Cloudflare 等 DNS 解析服务商中配置通配符域名,比如 *.example.com,并解析到 frp 服务器的机器公网 IP。这样之后新增新的子域名时就不需要重新配置 DNS 了。

Web Server

如果只有 frp,其实也可以直接把 vhostHTTPPort 暴露出去,设置 vhostHTTPPort=80 即可。使用 Web Server 会更加优雅一些。这里我使用了 Caddy,它是一个更好用的类似 nginx, apache 的 Web Server,它的配置文件非常现代化,不像 nginx.conf 那样复杂,并且最大的优点是可以可以自动申请并续期 Let’s Encrypt 通配符证书。

因为通配符证书需要 DNS Challenge,所以这里我用了 Caddy 的 Cloudflare DNS 能力。配置大概是这样:

1
2
3
4
5
6
7
8
9
10
11
{
acme_dns cloudflare <cloudflare_api_token>
}

*.edge.soulter.top {
tls {
dns cloudflare <cloudflare_api_token>
}

reverse_proxy 127.0.0.1:<vhostHTTPPort>
}

Orion

Orion 其实就是一个很简单的 frp wrapper,在配置好 Caddy、Cloudflare 之后,使用 Orion 可以一键部署边缘服务,类似:

1
2
orion up -n my_service -p 8000 # 后台运行模式
orion serve -n my_service -p 8000 -- ./your_service # 前台运行模式,会自动带起服务进程,Ctrl + C 之后服务进程和 frp 同时结束和清除

然后就能直接访问:

1
https://my-service.example.com

Orion 默认使用的 vhostHTTPPort 是 38399,因此 Caddy 那里的 reverse_proxy 的端口直接写 38399 即可。

开源地址:https://github.com/Soulter/orion

Comments