Edgeweir
部署

端口、反向代理与可信代理

控制台端口、反向代理、节点通道透传与客户端 IP 的配置。

端口

端口协议内容暴露方式约束
3000/TCPHTTPWeb UI、/rpc、/api/v1、/healthz、/install.sh、/downloads/*;节点通道的 WebSocket 入口 /node-channel反向代理(可终结 TLS),或直接暴露节点安装时从 EDGEWEIR_PUBLIC_URL 下载 /install.sh 与 /downloads/*,节点主机须能访问该地址。/node-channel 默认关闭,见 节点通道的 WebSocket 入口。
8443/TCPTLS 1.2 及以上,HTTP/2 或 HTTP/1.1,Connect-RPC节点通道(节点与区域探针)直接暴露,或四层透传8443 必须四层透传;代理终结 TLS 会使节点与探针的 CA 校验与 mTLS 失败。无法对外开放时改用 WebSocket 入口。
5432/TCPPostgreSQL内置数据库不发布仅 Compose 网络内可达。
8123/TCPHTTPClickHouse(analytics profile)不发布仅 Compose 网络内可达。

监听与发布变量

变量默认值作用
HOST0.0.0.0进程的 Web 监听地址。
PORT3000进程的 Web 监听端口。
NODE_API_HOST空,取 HOST进程的节点通道监听地址。
NODE_API_PORT8443进程的节点通道监听端口。
EDGEWEIR_HTTP_PORT127.0.0.1:3000(compose.yml)Compose 发布的 Web 端口,可带绑定地址。
EDGEWEIR_NODE_API_PORT8443Compose 发布的节点通道端口,可带绑定地址。
EDGEWEIR_NODE_API_HOST0.0.0.0只用于 compose.baota-host.yml:节点通道的监听地址,作为 NODE_API_HOST。

各编排文件的取值:

编排进程监听宿主机端口
compose.yml镜像默认值 0.0.0.0:3000、0.0.0.0:8443端口映射 ${EDGEWEIR_HTTP_PORT}:3000(默认 127.0.0.1:3000)、${EDGEWEIR_NODE_API_PORT}:8443(默认所有接口)
compose.baota.yml镜像默认值端口映射 127.0.0.1:${EDGEWEIR_HTTP_PORT}:3000(EDGEWEIR_HTTP_PORT 只能是数字)、${EDGEWEIR_NODE_API_PORT}:8443
compose.baota-host.yml(host 网络)HOST=127.0.0.1、PORT=${EDGEWEIR_HTTP_PORT}、NODE_API_HOST=${EDGEWEIR_NODE_API_HOST}(默认 0.0.0.0)、NODE_API_PORT=${EDGEWEIR_NODE_API_PORT}无端口映射;两个端口变量只能是数字

compose.yml 的 Web 端口默认只在本机可达,由宿主机反向代理对外:Docker 发布的端口绕过 ufw、firewalld 等主机防火墙。不经代理直接访问时设置 EDGEWEIR_HTTP_PORT=3000。

节点通道地址与证书

节点通道地址是节点与区域探针连接节点通道的地址,即安装命令中的 --server。在 系统设置 的「节点通道」卡片中修改,保存即生效,不重启控制台。取值顺序:

顺序来源卡片中的标记
1系统设置 中保存的地址已保存
2EDGEWEIR_NODE_API_URL环境变量
3https://<EDGEWEIR_PUBLIC_URL 的主机名>:<NODE_API_PORT>;EDGEWEIR_NODE_API_WEBSOCKET=true 时为 wss://<EDGEWEIR_PUBLIC_URL 的主机[:端口]>(EDGEWEIR_PUBLIC_URL 为明文 HTTP 时 ws://)默认

清空输入框并保存后回到 2、3。格式为 https://主机[:端口](节点通道端口),或 wss://主机[:端口]、ws://主机[:端口](Web 端口上的 WebSocket 入口),不含路径、查询参数与账号;端口省略时为 443(ws:// 为 80)。

变量默认值作用
EDGEWEIR_NODE_API_URLhttps://<EDGEWEIR_PUBLIC_URL 的主机名>:<NODE_API_PORT>系统设置 中没有保存地址时的节点通道地址。
EDGEWEIR_NODE_API_WEBSOCKETfalsetrue:默认地址改为 WebSocket 入口 wss://<EDGEWEIR_PUBLIC_URL 的主机[:端口]>,且入口始终开放。
EDGEWEIR_NODE_API_HOSTNAMES空节点通道证书的额外名称,逗号分隔的 DNS 名或 IP。
  • 节点通道的服务端证书由内部 CA 签发,名称包括:localhost、127.0.0.1、::1、容器主机名、EDGEWEIR_NODE_API_URL 的主机名(未设置时为默认地址的主机名)、EDGEWEIR_NODE_API_HOSTNAMES 的全部条目、系统设置 中保存的地址的主机名或 IP,以及此前生效过的节点通道地址的主机名或 IP(保留最近 32 个)。
  • 在 系统设置 保存地址后,每个控制台实例立即为新名称重新签发证书,新握手使用新证书,已建立的连接不受影响;修改环境变量后重启生效。
  • 已注册的节点与探针一直使用注册时记录的 server_url 与 TLS 服务器名(/var/lib/edgeweir-node/identity.json),修改地址不会改变它们:旧地址需保持可用(旧名称留在证书中),或在节点上重新注册。
  • CA 指纹(SHA-256)出现在启动日志 node channel listening 的 caSha256、系统设置 的「CA 指纹」、安装命令的 --ca-sha256。
场景设置
宿主机发布端口不是 8443,例如 EDGEWEIR_NODE_API_PORT=9443在 系统设置 填写 https://<主机名>:9443,或设置 EDGEWEIR_NODE_API_URL:默认值使用进程监听端口 NODE_API_PORT,不是发布端口。
部署后才有节点通道的公网地址(平台后加的 Anycast IP、TCP 代理)地址可用后在 系统设置 填写,再生成安装命令。
平台只转发 HTTP(Render),或 8443 无法对外开放使用 WebSocket 入口。
节点经其他名称或 IP 连接(内网地址、负载均衡名称)将该名称加入 EDGEWEIR_NODE_API_HOSTNAMES。
节点通道域名的 DNS 在 Cloudflare该记录关闭代理(仅 DNS):Cloudflare 代理的 HTTPS 端口包括 8443,会终结 TLS,节点报 CA pin mismatch。
更换节点通道地址在 系统设置 修改;已注册的节点继续连接旧地址,旧地址需保持可用。
更换 EDGEWEIR_NODE_API_URL 的主机名(系统设置中没有保存地址)将旧主机名保留在 EDGEWEIR_NODE_API_HOSTNAMES:已注册节点按注册时记录的名称校验证书。

反向代理 Web 控制台

nginx
server {
  listen 443 ssl;
  server_name cdn-admin.example.com;
  # ssl_certificate     ...;
  # ssl_certificate_key ...;
  location / {
    proxy_pass http://127.0.0.1:3000;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
}
项目要求
EDGEWEIR_PUBLIC_URL代理对外的地址,例如 https://cdn-admin.example.com。登录校验请求来源;协议为 https 时会话 Cookie 带 Secure。
EDGEWEIR_TRUSTED_PROXIES代理连接控制台时使用的来源地址,见 可信代理与客户端 IP。
转发头控制台只读取 X-Forwarded-For 与 X-Real-IP,且仅在 TCP 对端可信时读取。

节点通道四层透传

8443 需要经 nginx 统一入口时,使用 stream 四层透传。

  1. 将节点通道改到本机端口 18443:

    部署设置
    compose.yml、compose.baota.yml.env:EDGEWEIR_NODE_API_PORT=127.0.0.1:18443
    进程直接监听(pnpm dev、非容器运行)NODE_API_HOST=127.0.0.1、NODE_API_PORT=18443
    compose.baota-host.yml.env:EDGEWEIR_NODE_API_HOST=127.0.0.1、EDGEWEIR_NODE_API_PORT=18443;不写在 compose.override.yml:宝塔 / aaPanel 以 docker compose -f 执行编排时不读取它,见 baota.md

    EDGEWEIR_NODE_API_URL 保持对外的 :8443。

    docker compose up -d
  2. 在 nginx 主配置的 http { } 块之外加入:

    nginx
    stream {
      server {
        listen 8443;
        proxy_pass 127.0.0.1:18443;
        proxy_timeout 1h;   # 节点通道长连接(WatchConfig 流)
      }
    }

    不写 ssl、proxy_ssl、proxy_protocol:只转发 TCP。listen 8443; 只监听 IPv4,节点通道域名有 AAAA 记录时再加 listen [::]:8443;。主配置已有 stream 块时(宝塔 / aaPanel 见 baota.md)把 server 放进已有的块;发行版软件包把 stream 编译为动态模块时(如 Debian 的 libnginx-mod-stream)先安装并加载该模块。

  3. 检查并重载 nginx:

    nginx -t && nginx -s reload
  4. 验证:

    openssl s_client -connect cdn-admin.example.com:8443 -servername cdn-admin.example.com </dev/null 2>/dev/null \
      | openssl x509 -noout -issuer

    预期:签发者含 Edgeweir Node Channel CA。出现其他签发者表示 TLS 被中间设备终结。系统设置 的「节点通道」卡片中的连接检查做同样的检查,从控制台所在网络连接节点通道地址,见 节点通道连接检查。

节点通道的 WebSocket 入口

平台只转发 HTTP(如 Render),或 8443 无法对外开放时,节点经 Web 端口上的 WebSocket 入口连接节点通道。

项目说明
地址节点通道地址为 wss://<主机>[:端口],Web 端口经 HTTP 访问时为 ws://;通常就是 EDGEWEIR_PUBLIC_URL 的主机与端口。节点连接 <地址>/node-channel,WebSocket 子协议 edgeweir-node-channel
TLS节点通道的 TLS 在 WebSocket 内运行,由控制台终结;CA 指纹固定与 mTLS 与 8443 相同,代理或 CDN 只转发 TLS 记录。wss:// 地址本身的证书由节点与 install.sh 按系统根证书校验,须由公共 CA 签发
开放条件EDGEWEIR_NODE_API_WEBSOCKET=true;或生效的节点通道地址是 wss://、ws://;或在 系统设置 保存地址时,此前生效的或新保存的地址是这样的地址(经入口注册的节点改地址后仍能连接)。其余情况返回 404
拒绝带 Origin 头的请求(浏览器)返回 403;没有请求子协议 edgeweir-node-channel 返回 400
普通请求GET /node-channel 在入口开放时返回 426,关闭时返回 404;install.sh 以 426 判断可达
来源地址节点详情的「连接来源地址」为 WebSocket 请求的客户端地址,按 可信代理与客户端 IP 解析
节点版本edgeweir-node 0.2.0 及以上;install.sh 拒绝用更早的版本经 wss://、ws:// 地址注册
  1. 设置节点通道地址,任选其一:

    • 系统设置 的「节点通道」填写 wss://cdn-admin.example.com,保存;立即生效。
    • 设置 EDGEWEIR_NODE_API_WEBSOCKET=true 并重启控制台:未设置 EDGEWEIR_NODE_API_URL、系统设置 中也没有保存地址时,默认地址为 wss://<EDGEWEIR_PUBLIC_URL 的主机[:端口]>。
  2. 控制台前有反向代理时,转发 /node-channel 的 WebSocket 升级。nginx:

    nginx
    location = /node-channel {
      proxy_pass http://127.0.0.1:3000;
      proxy_http_version 1.1;
      proxy_set_header Host $host;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_read_timeout 1h;   # 节点通道长连接(WatchConfig 流)
      proxy_send_timeout 1h;
    }
  3. 验证:

    curl -s -o /dev/null -w '%{http_code}\n' https://cdn-admin.example.com/node-channel

    预期:426。系统设置 的「节点通道」连接检查经 WebSocket 完成 TLS 握手,显示「连接正常」。

可信代理与客户端 IP

审计日志的 IP 与认证接口限速使用控制台解析出的客户端 IP。

条件客户端 IP
EDGEWEIR_TRUSTED_PROXIES 为空(默认)TCP 对端地址;忽略全部转发头。
TCP 对端不在列表中TCP 对端地址;忽略全部转发头。
TCP 对端在列表中,请求带 X-Forwarded-For从右向左遍历,跳过列表中的地址,取第一个不在列表中的地址。
TCP 对端在列表中,无 X-Forwarded-ForX-Real-IP;缺失时为 TCP 对端地址。
  • 格式:逗号分隔的 IP 或 CIDR,例如 172.18.0.1 或 10.0.0.0/24。IPv4 映射的 IPv6 地址(::ffff:192.0.2.1)按 IPv4 处理。
  • 条目无法解析时控制台拒绝启动:EDGEWEIR_TRUSTED_PROXIES: not an IP address or CIDR range: <条目>。
  • 认证接口限速计数保存在 PostgreSQL,多个实例共享,重启不清零。
部署代理到控制台的来源地址EDGEWEIR_TRUSTED_PROXIES
无反向代理—空
宿主机 nginx → compose.yml / compose.baota.yml 发布的 127.0.0.1:3000Docker 网络 edgeweir_default 的网关该网关地址
宿主机 nginx → compose.baota-host.yml(host 网络)127.0.0.1 或 ::1127.0.0.1,::1(该文件的默认值)

查询网关地址:

docker network inspect edgeweir_default --format '{{range .IPAM.Config}}{{.Gateway}}{{end}}'

只写入代理实际使用的地址。列表中的地址可以为任意客户端声明 IP;信任整个私网网段或客户端可直接进入的网段会使限速与审计 IP 失效。

验证:经代理登录一次,查询最近的审计记录:

docker compose exec -T postgres psql -U edgeweir -d edgeweir \
  -c "select occurred_at, action, ip from audit_log order by id desc limit 5"

预期:ip 为浏览器的公网地址,而不是网关地址。

排障

现象原因处理
审计记录的 ip 均为网关地址(如 172.18.0.1)EDGEWEIR_TRUSTED_PROXIES 未设置,或与实际网关不一致(重建 Compose 网络后网关可能变化)查询网关,更新 EDGEWEIR_TRUSTED_PROXIES,执行 docker compose up -d。
启动失败:EDGEWEIR_TRUSTED_PROXIES: not an IP address or CIDR range条目不是 IP 或 CIDR修正条目。
3000 可从公网直接访问EDGEWEIR_HTTP_PORT 不带绑定地址(例如 3000),或使用的是旧版 compose.yml(在所有接口发布)设置 EDGEWEIR_HTTP_PORT=127.0.0.1:3000,或更新 compose.yml。
install.sh:answers 404: the console's WebSocket entry is closed节点通道地址是 wss://、ws://,但控制台的入口未开放,或该地址指向其他服务在 系统设置 保存该地址,或设置 EDGEWEIR_NODE_API_WEBSOCKET=true,见 节点通道的 WebSocket 入口。
install.sh:cannot reach the node channel WebSocket entry节点主机连不上 Web 端口,wss:// 地址的证书不受系统根证书信任,或反向代理没有转发 /node-channel在节点上执行 curl -v https://<主机>/node-channel;按上文配置反向代理。
节点注册或连接失败—见 接入节点排障。
在 GitHub 上编辑

本页目录