把 Jellyfin、Immich 等自托管应用分享给亲友
通过 Tailscale 分享已有媒体应用,为指定人员设置期限,或发送公开的浏览器访客链接。
要把 Jellyfin 或 Immich 分享给亲友,可用 TSLink 注册运行中的应用、获取准确私有地址,再向每个人的 Tailscale 登录账户授予有期限的权限。私有访问者需要先安装 Tailscale。Tailnet 之外的人可接受一次 gateway 设备共享,访问多个路由应用。只用浏览器的访客则使用明确公开、有期限的访客链接;链接可转发,不能证明身份。
TSLink 代理已有应用。安装、配置、备份与安全仍由你负责,包括应用账户与认证。主机必须保持唤醒和联网。TSLink 是独立项目,并非由 Tailscale 制作或背书。
Jellyfin
TSLink 的 jellyfin recipe 目标为 http://127.0.0.1:8096。Jellyfin 可选 HTTPS 端口 8920 不是该 recipe 的目标。在本地完成初始设置,保留用户登录,Base URL 留空,将实际 TSLink 来源 IP 加入 Jellyfin 的 Known Proxies。见此版本的 recipe。
安装 TSLink,另行运行 Jellyfin,再预览并应用:
tslink apps share jellyfin --allow you@example.com
tslink apps share jellyfin --allow you@example.com --yes
tslink url jellyfin --wait将 you@example.com 换成自己的实际 Tailscale 登录账户。若主机映射不同,在两条 recipe 命令中都加入 --proxy 127.0.0.1:<host-port>。按提示完成入网或管理员设备审批。注册不证明应用可用;邀请前先打开返回地址,测试应用。
Immich
immich recipe 直接访问原生 HTTP:http://127.0.0.1:2283。在本地完成首个管理员设置,保留 Immich 登录。使用独立主机名的根路径,将 TSLink 返回的准确 URL 填入移动客户端的服务器地址。见此版本的 recipe。
tslink apps share immich --allow you@example.com
tslink apps share immich --allow you@example.com --yes
tslink url immich --waitRecipe 保留已有注册。两个 recipe 都保留规范外部 Host;请核对应用的主机名与 Origin 设置。Immich 上传仍受 TSLink 默认 32 MiB 请求体上限和 30 秒请求体无进展超时约束。大文件或慢速上传需选择合适的有限请求限制;TSLink 不会备份照片库。
选择谁可以访问
自己的设备
- 按上面的 recipe 注册应用并完成入网,保留自己的
--allow登录账户。 - 在手机、平板或其他访问设备安装 Tailscale,登录自己的 tailnet,完成所需审批并保持连接。Tailnet 策略必须允许访问应用。
- 在浏览器打开
tslink url jellyfin --wait或tslink url immich --wait返回的准确地址,或填入兼容客户端的服务器地址设置。按应用要求登录。
给指定的人设置期限
-
对于已有的 tailnet 成员,使用其实际 Tailscale 登录账户:
bash tslink people add alice@example.com --apps jellyfin,immich --for 7d -
发送准确应用地址。Alice 安装 Tailscale、使用获授权账户登录,再按 tailnet 网络策略打开地址。保留各应用自己的账户与登录。
-
用
tslink people list --json查看授权。提前结束访问可运行tslink people remove alice@example.com。移除与到期拒绝新请求,无需停止应用或守护进程;已接受的流可能继续,已交付的数据无法收回。见人员分享。
首次人员授权会将所选应用设为按人限制;上面的 owner --allow 规则保留你的访问。未列出的调用者需要有效授权或明确的旧 allow 规则。
通过 gateway 模式邀请 tailnet 之外的人
-
启用私有 portal,为已注册的应用添加路由:
bash tslink portal enable --owner you@example.com --gateway tslink portal route add jellyfin tslink portal route add immich tslink portal route list --json tslink status --urls -
对于新访问者,授予权限并生成 gateway 邀请:
bash tslink people add bob@example.com --apps jellyfin,immich --for 7d --invite --print-links --qr创建邀请需存储用户自己的 Tailscale API token;使用标准输入登录方式。生成的消息由你发送。邀请链接属于持有即能使用的凭证,请私下发送。此处
--qr输出的二维码指向 gateway 主页,不是邀请链接;邀请二维码需加--qr-invite @gateway。已存在的人员使用people update,不要重复people add。 -
Bob 安装 Tailscale,以获授权账户登录,接受 gateway 设备共享,并保持连接。随后打开主页或 status 返回的准确路由 URL。每条路由使用 gateway 主机名上的独立 HTTPS 端口,不要猜地址。
-
后续修改路由应用授权无需再次邀请。非路由应用仍需单独共享,默认逐应用分享也继续可用。入网、网络策略、失效邀请恢复和兼容限制见 gateway 模式。
Gateway 各端口属于不同浏览器 origin,但共用 cookie,不能隔离应用 cookie。保留应用认证,验证每个应用的代理与 Origin 行为。TCP、Funnel 和访客链接应用不能成为 gateway 路由。
只用浏览器的访客链接
-
选择一个没有 gateway 路由的 HTTP 代理应用。若已按上面的 gateway 路径配置,选择访客模式前先移除该应用路由;不要将两条路径组合使用。先验证应用认证与私有应用节点入网状态。
-
明确创建有截止时间的公开链接:
bash tslink guest create jellyfin --for 3d --public --print-link加
--pin可通过隐藏终端输入 PIN,并另行发送。用status与doctor核实实际 Funnel 可用性;创建操作本身只保存配置。 -
私下发送原始链接。访客只需浏览器;设置了 PIN 就输入 PIN。这是可转发的公开链接凭证,不能验证人的身份,也不承诺兼容原生客户端。
-
用
tslink guest list --json找到 ID,再用tslink guest revoke <id>结束访问。受跟踪流的取消及撤销边界见访客链接。文件、文件夹与原始 TCP 不会通过 TSLink 公开。
分享前检查
HTTPS 应用名称会出现在公开证书日志中,请选择愿意让别人看到的名称。Tailscale 策略与应用认证仍然适用。先检查 tslink status --json 和 tslink doctor --json,再让目标接收者实际访问;后端健康不证明接收者可达。
相关:Gateway 模式 · 人员分享与撤销 · 浏览器访客链接 · 应用 recipes。
来源:TSLink v0.2.0 apps.md、people.md、portal.md、guest-links.md 与 README。