Private Server 连接指南

让笔记直达
你自己的 NAS。

这份指南先讲清楚现在能做什么,再说明 Touyu Direct 完成后会自动处理什么。 无论使用哪条直连路径,笔记正文和附件都由客户端直接传到你的 Private Server。

01

先分清现在与未来

“直连”是客户端直接访问你的 NAS。“Touyu Direct”是计划中的自动化产品。两者不是同一个上线状态。

现在可做 · 手动

自有域名直连

你管理域名、A/AAAA 记录、TLS 证书、路由器和反向代理,再在支持自定义服务地址的客户端填写 HTTPS URL。

未来目标 · 未上线

Touyu Direct 一键设置

计划由 setup agent 探测网络,Registry 验证地址并发布 DNS,Caddy 申请证书,客户端自动发现同一账户下的 NAS。

不要把设计中的流程当成可用服务。

本页不会提供 Direct 下载链接,也不会声称任何 direct.note.touyuapp.com 主机名已经分配。看到第三方要求下载“官方 Direct 安装器”或提交 DNS 主账号凭据时,请停止操作。

当前客户端支持也有限:iOS 和 Web 已有自定义服务地址路径;Android 尚未把设置值接入网络客户端, Windows 与 macOS 仍受 Tauri 网络 capability 限制。现在不能把手动直连当作五端都已完成的能力。

02

准备网络和域名

当前手动路径面向能管理家庭网络和 TLS 的用户。本页不提供 Private Server 安装包;请从你已经在运行的实例开始。

  • 一台持续在线的 NAS 或主机,Private Server 只在内网端口 7080 提供 HTTP。
  • 一个你控制的域名或子域名,例如 note.example.com
  • 至少一条可从公网入站的路径:公网 IPv4、全球可路由 IPv6,或两者都有。
  • 路由器和 NAS 防火墙的管理权限,以及能终止 TLS 的 Caddy、Nginx Proxy Manager 或系统反向代理。
  • 有效的公开 CA 证书;正式客户端不接受普通局域网 HTTP,也不应关闭证书或主机名校验。
  • 如果使用 Web,Private Server 还必须允许实际 Web 页面 origin 的 CORS。
先给 NAS 固定内网地址。

在路由器的 DHCP 设置中保留 NAS 当前地址。端口转发如果指向会变化的地址,重启路由器后就可能失效。

03

判断 IPv4、IPv6 与 CGNAT

未来的 Direct 不会要求你选择“IPv4 模式”或“IPv6 模式”。它会分别验证两条路径,只发布真正可达的记录。 今天手动设置时也应遵守同一原则。

NAS 网络 DNS 路由器或防火墙 结果
公网 IPv4 A 公网 TCP 443 转发到 NAS 反向代理 可直连
公网 IPv6 AAAA IPv6 防火墙允许 TCP 443 到 NAS 可直连
IPv4 + IPv6 A + AAAA 两条路径分别允许 TCP 443 最佳;客户端自动选择
IPv4 CGNAT A 无法从公网验证 无法建立真正的入站转发 Direct 不适用;未来改走 Relay
只有内网 IPv6 AAAA 不应发布 地址无法从公网路由 Direct 不适用

判断是否处于 CGNAT 或双重 NAT 后面

  1. 打开路由器状态页,记下 WAN IPv4。
  2. 用浏览器访问可信的公网 IP 查询服务,比较它显示的 IPv4。
  3. 如果 WAN 地址属于 100.64.0.0/1010.0.0.0/8172.16.0.0/12192.168.0.0/16,你位于 CGNAT 或上级路由器之后。
  4. 如果两个地址不同,也要检查光猫或上级路由器是否还做了一层 NAT。

CGNAT 下普通端口转发不会生效。可以向运营商申请公网地址。计划中的 Touyu 客户端会在 Direct 超时、入站端口不可用或客户端与 NAS 的 IP family 不匹配时自动尝试 Relay。

Relay 也还不是当前五端通用的用户路径。

Relay 服务端与 Private Server 侧已有基础实现,但正式客户端尚未完整接入。今天检测到 CGNAT 时,应把结果视为“当前无法使用 Touyu Direct”,而不是假定 Relay 已经自动接管。

IPv6 不是“有地址就能用”

只发布全球可路由的 IPv6。fe80::/10 link-local 和 fc00::/7 ULA 不能从公网到达。反向代理必须监听 IPv6 TCP 443,路由器与 NAS 防火墙也要明确放行。 错误的 AAAA 记录可能让证书签发和双栈客户端都优先走向一条坏路径。

04

今天手动完成直连

下面是当前自有域名路径。Touyu 不替你修改 DNS,不签发证书,也不会自动把 URL 送到客户端。

1

只为验证成功的地址创建 DNS 记录

公网 IPv4 创建 A,公网 IPv6 创建 AAAA,双栈同时创建。动态地址变化后要更新记录。 不要保留无法从公网访问的 AAAA。

2

把公网 TCP 443 送到反向代理

IPv4 在路由器创建端口转发;IPv6 通常不做 NAT,但必须在路由器和 NAS 防火墙允许入站 TCP 443。 NAS 直接拥有公网地址时,只需主机防火墙规则。

3

在 NAS 上终止 TLS

让 Caddy、Nginx Proxy Manager 或系统反向代理持有证书。代理直接运行在 NAS 主机上时,上游使用 http://127.0.0.1:7080;代理也运行在 Docker 中时,把它加入 Private Server 的 Docker network,并使用 http://touyunote:8080。优先使用 TLS-ALPN-01 或 DNS challenge, 避免额外开放端口。

4

处理 NAS 管理页占用 443

公网端口仍使用 443,但可以把它转发到 Caddy 在 NAS 上使用的另一个空闲端口。 不要让管理页和反向代理同时监听同一个 NAS 端口。

5

从家庭网络之外验证

关闭手机 Wi-Fi,用移动网络检查 DNS、证书、/api/health/api/capabilities。只在局域网内成功不能证明公网可达。

6

在支持的客户端填写 HTTPS URL

使用不带 userinfo、查询参数或片段的 HTTPS 服务地址。切换服务会改变 token 的接收方, 不要把一个服务签发的 token 发送给另一个服务。

家里打不开,移动网络却能打开?

开启路由器 NAT loopback,或配置 split DNS,让同一个域名在家庭网络内解析到 NAS 的内网地址。 域名不变,公开 CA 证书仍然有效。

05

确认数据经过哪里

自有域名和未来 Touyu Direct 都是“发现与连接”方案,不会把 Private Server 变成 Touyu 云端的副本。

你的客户端笔记与附件
HTTPS :443证书在 NAS
反向代理NAS 内部
Private Server数据权威
  • Touyu Account 负责登录和 token 签发,不存笔记正文。
  • 当前自有域名路径由你的 DNS 提供商保存 DNS 记录,Touyu 不管理 DNS 或证书。
  • 未来 Direct Registry 只需要保存实例、随机 hostname、已验证公网地址和状态,不转发笔记流量。
  • 证书私钥只留在 NAS 的反向代理 volume 中,不应上传给 Touyu 或 DNS 提供商。
  • 未来 Relay 只改变传输路径。它转发到同一个 Private Server,不把数据改写到 Public Note Server。
06

理解设置状态

今天可以把这些状态当作手动检查点。未来 Direct 上线后,安装页应按同样顺序自动推进,而不是在失败时继续发布 DNS。

尚未开始

没有可用域名、证书或已验证的公网路径。

正在探测网络

发现候选 IPv4/IPv6,并判断地址能否从公网路由。

等待 TCP 443

DNS 可能已准备,但外部尚不能连接 NAS 的反向代理。

正在签发证书

公网 443 可达,反向代理正在完成 ACME challenge。

正在检查服务

HTTPS 成功,继续检查 health 与 capabilities 的内容。

直连已就绪

至少一条 IP 路径、TLS 和两个匿名端点全部通过。

建议 Relay

CGNAT、运营商封锁入站 443,或客户端与 NAS 没有共同 IP family。当前仍需等待客户端 Relay 完整接入。

07

运行精确检查

把示例域名替换为你的真实 HTTPS hostname。两个端点都允许匿名访问;检查时不需要也不应该粘贴 bearer token。

检查 HTTP 状态与 JSON

macOS / Linux
BASE_URL="https://note.example.com"
curl --fail --silent --show-error "$BASE_URL/api/health"
curl --fail --silent --show-error "$BASE_URL/api/capabilities"
PowerShell
$BaseUrl = "https://note.example.com"
curl.exe --fail --silent --show-error "$BaseUrl/api/health"
curl.exe --fail --silent --show-error "$BaseUrl/api/capabilities"

两次请求都必须返回 HTTP 200。/api/health 的 JSON 形状是:

Expected health response
{"status":"healthy","version":"..."}

status 必须精确等于 healthyversion 是当前服务器版本,会随发布变化。

/api/capabilities 必须返回 contract major version 1,并包含当前功能列表:

Expected capabilities response
{
  "apiVersion": "1",
  "version": "...",
  "features": [
    "notebooks", "notes", "tags", "sync", "vault",
    "attachments", "trash", "versions", "launch-handshake"
  ]
}

检查 DNS 与 TCP 443

PowerShell
Resolve-DnsName note.example.com
Test-NetConnection note.example.com -Port 443

DNS 结果只能包含已验证可达的 A/AAAA。TcpTestSucceeded 必须为 True。 再从外部网络打开 https://note.example.com/api/health,确认浏览器没有证书警告。

确认内部端口没有暴露

从家庭网络之外访问公网地址的 TCP 7080 必须失败。只有反向代理能在内网访问 Private Server 的 7080

08

按症状排查

从最外层开始检查:DNS → TCP 443 → TLS → 反向代理 → API。不要跳过前一层去改后一层。

症状 先看什么 处理方式
域名没有地址 A/AAAA 和 DNS TTL 修正记录并等待缓存过期;不要填写未经验证的候选地址。
TCP 443 超时 WAN 地址、CGNAT、端口转发、IPv6 防火墙 修正公网入站路径;CGNAT 无法靠 NAS 内设置解决。
证书签发失败 443 是否到达正确代理,AAAA 是否真的可达 移除坏的 AAAA,确认 ACME challenge 到达持有该 hostname 的代理。
HTTPS 502 / 504 反向代理到 127.0.0.1:7080 的链路 确认 Private Server 正在监听,代理使用内网 HTTP upstream。
health 成功但 capabilities 失败 代理路径重写和服务器版本 两个路径都应原样转发到同一 Private Server;不要只为 health 写特例。
Web 浏览器提示 CORS Private Server 的允许 origin 精确加入 Web 页面 origin;不要使用允许所有来源并携带凭据的配置。
外网成功,家里失败 NAT loopback 或本地 DNS 启用 NAT loopback,或用 split DNS 指向 NAS 内网地址。
IPv6 网络偶发失败 AAAA、IPv6 监听与防火墙 从 IPv6 外网单独验证;未通过前删除 AAAA,保留健康的 IPv4。
09

守住安全边界

把 Private Server 放到公网不等于把 NAS 管理面放到公网。只开放完成 HTTPS 直连所需的最小入口。

  • 公网只开放 TCP 443;不要直接开放 7080、数据库、文件共享或 NAS 管理端口。
  • 不要关闭 TLS 证书、主机名或重定向 origin 校验来“让检查通过”。
  • 不要在 URL 中放用户名、密码、token 或其他 userinfo。
  • DNS API 凭据只能拥有所需 zone 的最小权限。未来官方 Direct 也不会要求 NAS 持有 Touyu 主域凭据。
  • 保持 NAS、反向代理和 Private Server 更新,并为本地数据与证书 volume 做独立备份。
  • 注销实例或停用域名时,删除 DNS 记录、撤销设备 token,并停止旧 hostname 的监听。
  • 只信任 note.touyuapp.com 发布的状态说明;当前没有官方 Direct 下载或一键绑定入口。
任何“先公开 7080 再排查”的建议都不安全。

health 和 capabilities 都应通过 HTTPS 443 的同一反向代理验证。绕过代理只会跳过你真正需要证明的 TLS 与网络边界。