Administrator
发布于 2026-04-26 / 0 阅读
0

在 UNRAID 上为 OpenClaw 容器启用 Tailscale Serve

我在 UNRAID 上用 Docker 跑 OpenClaw,一直是通过内网 IP 加端口号访问管理界面。后来想在外面也能连上,就试了 Tailscale Serve。UNRAID 的 Docker 模板自带 Tailscale 集成字段,配起来不复杂——但我踩了一个坑:每次容器更新重建后,Tailscale 设备身份就丢了,得重新认证、生成新设备。

这篇文章记录持久化配置的完整方案,如果你也在 UNRAID 上跑 OpenClaw 并且想用 Tailscale 远程访问,照着来能少踩一次认证。

现象:重启一次,多一台设备

第一次配置时我填好了 UNRAID 模板里的 Tailscale 字段,容器跑起来后 https://openclaw.tail06328.ts.net​ 能正常访问。看起来一切正常。

然后我更新了 OpenClaw 镜像,容器重建。再启动时发现 Tailscale 把我当成一台全新的设备——认证流程从头来。打开 Tailscale 管理后台一看,设备列表里多了一台 openclaw​,旧的那台还挂着但已离线。

每次镜像更新、容器重建、参数修改重启,只要容器重新创建,Tailscale 就当你换了设备。在管理后台手动删旧机器也很烦。

排查:状态文件去哪了

Tailscale 的设备身份存在一个文件里:tailscaled.state​。默认位置是 /var/lib/tailscale/tailscaled.state​。

进容器看看:

docker exec openclaw ls -la /var/lib/tailscale/
# 只有日志文件,没有 .state

问题很清楚了——/var/lib/tailscale​ 这个目录在容器层,容器删除它就没了。所以每次容器重建,Tailscale 从零开始生成新设备密钥对,认证流程从头来。

解决思路很简单:把 /var/lib/tailscale​ 映射到宿主机的一个持久目录。

配置:UNRAID 模板的正确填法

UNRAID 的 Docker 模板在高级视图下有几个 Tailscale 专属字段,不需要进容器跑命令。改三个地方就够了。

第一步:创建宿主机目录并加卷映射

mkdir -p /mnt/disk1/appdata/openclaw/tailscale_state

我用具体磁盘路径(/mnt/disk1/​)而不是 /mnt/user/​,避免 FUSE 文件系统层可能带来的锁问题。Tailscale 的 tailscaled.state​ 对文件锁有要求,直接走磁盘更稳。

然后在 UNRAID Docker 页面编辑 OpenClaw 容器,添加一行 Path 映射:

配置项

Container Path

​/var/lib/tailscale​

Host Path

​/mnt/disk1/appdata/openclaw/tailscale_state​

Access Mode

Read/Write

第二步:填高级视图里的 Tailscale 字段

在 UNRAID Docker 模板编辑页面,切换到高级视图(右上角开关),往下拉找到 Tailscale 相关的三个字段:

Tailscale State Directory:填 /var/lib/tailscale​

这是容器内的路径——跟上面加的卷映射目标一致。注意这里填的是容器内路径,不是宿主机路径。填错了的话,Tailscale 会把状态文件写到容器层,持久化就白做了。

Tailscale Hostname:填一个固定名,比如 openclaw​

这个名决定了你的访问域名:https://openclaw.tail06328.ts.net​。如果不填或者每次随机,域名就会变,书签和客户端都得跟着改。

Tailscale Auth Key(可选):如果你在 Tailscale 管理后台生成过 Reusable Auth Key,填进去就能跳过手动认证。生成位置:Tailscale Admin Console → Settings → Keys → Generate auth key,类型选 Reusable,不设过期时间。留空的话,容器启动后需要去 Tailscale 后台手动点一下认证链接。

第三步:Tailscale 后台预备

在填模板之前,Tailscale 管理后台要开两项设置。都在 https://login.tailscale.com/admin/dns​ 页面:

  • MagicDNS:勾上。这让你的 Tailnet 内能用主机名解析设备,*.ts.net​ 域名才能正常工作。

  • HTTPS Certificates:勾上。Tailscale 会自动给设备签发 Let's Encrypt 证书,浏览器访问不会报不安全。

两项都是开关,打开就行,不需要额外操作。

权限注意

如果容器加了 PUID=1000​、PGID=100​ 环境变量(匹配 node​ 用户),需要在宿主机设一下权限:

chown 1000:100 /mnt/disk1/appdata/openclaw/tailscale_state

如果容器以 --user root​ 运行且 Privileged=true​(OpenClaw 的常见配置),不需要这步——root 写入没问题。Tailscale 需要创建 TUN 设备,所以 Privileged=true​ 是必须的,这点 OpenClaw 的 UNRAID 模板默认就已经开了。

验证:配好之后长什么样

改完模板参数启动容器,看日志:

Enabling Serve! See https://tailscale.com/kb/1312/serve
Available within your tailnet:
https://openclaw.tail06328.ts.net/
|-- proxy http://localhost:18789
Serve started and running in the background.

出现这几行说明 Tailscale Serve 已启用。检查宿主机状态目录:

ls /mnt/disk1/appdata/openclaw/tailscale_state/
# tailscaled.state     ← 这个文件出现了,设备身份已持久化
# tailscaled.log1.txt

有 tailscaled.state​ 就成功了。现在可以模拟重建验证:

docker stop openclaw && docker rm openclaw
# 在 UNRAID 上重新启动容器(模板参数不变)

启动后应该看不到 tailscale up​ 这样的初始化日志,说明它读到了已有的 tailscaled.state​,认证跳过了。去 Tailscale 后台确认设备数量没增加。

客户端别忘了 DNS

服务器配好之后,还有一个步骤在客户端。手机、笔记本上的 Tailscale 应用里,把 "Use Tailscale DNS settings" 打开。不开的话客户端不会用 MagicDNS 解析 *.ts.net​ 域名。

最后

整个过程的核心就一步:/var/lib/tailscale​ 必须通过卷映射落到宿主机持久存储。剩下的 Hostname、Auth Key 这些,虽然有用,但即使不配也只是每次手动认证一下、域名随机一点——不至于整套重来。

UNRAID 的 Docker 模板把这些 Tailscale 字段都放在高级视图里,填对了之后容器重建多少次都不需要重新认证。另外两个容易漏的:客户端的 DNS 开关要在手机/电脑上的 Tailscale 应用里手动打开,宿主机目录权限要跟容器运行用户匹配。这两样有一个不对,都会表现为「配好了但连不上」或者日志里报权限错误。

全部搞定之后,你在外面用手机连上 Tailscale,打开 https://openclaw.tail06328.ts.net​ 就能管理 OpenClaw,全程 HTTPS,不需要暴露任何端口到公网。对没有公网 IP 的家庭宽带来说,这个方案比端口转发和 DDNS 都省心得多。