公网 HTTPS 与反向代理

在 Linux 主机用 Caddy 为独立 Server 提供一个 HTTPS 域名;后端保持回环监听,保留 Owner 登录。

本例部署条件

本例在同一台可达 Ubuntu / Debian 主机上运行 Server 0.4.1 与 Caddy,要求你拥有主机、防火墙及一个域名的管理权。这是配置示例;本次文档采集没有对外发布真实公网服务。

把 agent.example.com 和 203.0.113.10 替换为自己的服务域名和主机 IP,它们是保留示例值。不要借用 Rovai 官网域名,也不要修改官网 DNS 来跟随本教程。

Desktop 0.4.1 设置没有公共来源字段,本配方使用独立 Server。使用独立主机名的根路径,不是部署在 /rovai/ 子路径。

公网地址与后端地址

浏览器通过 HTTPS 443 连接 agent.example.com。Caddy 终止 TLS,再通过本机 HTTP 转发到 127.0.0.1:8767;后端端口不向互联网开放。
浏览器通过 HTTPS 443 连接 agent.example.com。Caddy 终止 TLS,再通过本机 HTTP 转发到 127.0.0.1:8767;后端端口不向互联网开放。 Mermaid 源文件

准备域名解析与网络入口

  1. 为服务主机名添加 A 记录,指向可达主机 IPv4。只有 IPv6 确实到达同一代理时才加 AAAA;错误 AAAA 会导致访问或证书验证失败。
  2. 在云平台与主机防火墙允许 TCP 80、443 到达 Caddy。80 用于 HTTP 跳转及证书签发。主机位于 NAT 后时需要真实可达入口;运营商级 NAT 可能无法直接托管。
  3. 不向公网开放 TCP 8767。本例代理与 Server 同机,后端可保持 127.0.0.1。
  4. 确认 80 / 443 未被其他程序占用。已有网站的主机只添加本服务配置,保留其他站点。

安装 Caddy · Ubuntu / Debian

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 chmod o+r /usr/share/keyrings/caddy-stable-archive-keyring.gpg
sudo chmod o+r /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy

使用官方软件包流程

这些命令采用 Caddy 的 Debian / Ubuntu 官方包安装方式。应用前先检查主机环境;软件包会建立 systemd 服务。已经安装 Caddy 时,沿用现有安装与配置。

启动仅本机可达的后端

rovai-server --data-dir "$HOME/.rovai-server" \
  --listen 127.0.0.1:8767 \
  --public-origin https://agent.example.com

配置相同的外部来源

修改参数前先停止旧 Server,保留原 --data-dir。--public-origin 必须匹配浏览器打开的地址,包括 https 及非默认端口;它不会改变监听 socket,也不会签发证书。

Server 由拥有智能体环境的普通账号运行,Caddy 单独运行。需要后台常驻时,使用登录维护页的服务模板,并加入本 --public-origin 参数。

在 /etc/caddy/Caddyfile 添加本服务

agent.example.com {
    reverse_proxy 127.0.0.1:8767 {
        flush_interval -1
    }
}

保留认证与实时响应

回环后端使用 HTTP,公网入口使用 HTTPS。本配置保留原 Host、Origin 和 Authorization 请求头,关闭响应缓冲以便及时转发实时内容;不要缓存已认证 API 响应。

不要把 Host 改写为 127.0.0.1,不要移除 Origin / Authorization、关闭 Rovai 登录或只代理 HTML。代理整个根路径,使 API 与实时事件保持同源。DNS 与网络条件满足后,Caddy 获取并续期公网证书。

检查并重新加载配置

sudo caddy validate --config /etc/caddy/Caddyfile --adapter caddyfile
sudo systemctl reload caddy
sudo systemctl status caddy --no-pager

从外部网络登录

  1. 证书就绪后,在普通浏览器打开 https://agent.example.com/。若浏览器报证书错误,修复解析、签发或主机名,不要跳过警告。
  2. 填写 Server 数据目录对应的 Token,进入会话查看最近执行。确认主机与项目后再发小范围请求。
  3. HTML 能打开但登录 / 实时更新失败时,检查公共来源和代理请求头;出现 502 时,确认 Server 正在指定回环端口运行。
  4. 用 journalctl -u caddy 查看代理日志,同时查看 Server 的 logs/server.log。分享诊断时不要包含 Token 与私密请求内容。

关闭公网入口

  1. 只移除新增的 agent.example.com 配置块,检查并重新加载 Caddy,保留无关站点运行。
  2. 不再需要时,删除本服务 DNS 及专门添加的防火墙 / NAT 规则。单独删 DNS 会受缓存影响,应先移除代理入口。
  3. 若希望主机也停止处理工作,再正常停止 Server。移除代理入口本身不会停止已接收的执行。