多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

xyOps 接入 Tailscale Serve 与 Tailnet 身份认证实战指南

xyOps 接入 Tailscale Serve 与 Tailnet 身份认证实战指南 【免费下载链接】xyopsThe next generation of Cronicle: open-source job scheduling, visual workflows, server monitoring, alerting, and incident response.项目地址https://gitcode.com/gh_mirrors/xy/xyops点击查看免费下载xyOpsCronicle 的下一代开源版本作业调度、可视化工作流、服务器监控、告警与事件响应平台与 Tailscale Serve 是天作之合Tailscale 以可信头trusted headers方式为 xyOps 提供 SSO 身份认证并可通过 Tailscale 的 capabilities 机制自动为 xyOps 用户分配权限与角色。本文将带你从零开始在自有 Tailnet 上完成 xyOps 的 SSO 配置、命令行 Serve 部署以及基于 Docker Compose 的 Tailscale sidecar 容器化部署并深入源码验证其底层实现。读完本文你将掌握Tailscale 头映射与用户名清理、capabilities 授权 JSON 的精确语法、base URL / hostname / HTTPS 集群参数配置、tailscale serve启动命令以及一套开箱即用的 sidecar Docker Compose 编排方案。概览xyOps 如何与 Tailscale 协作xyOps 的 SSO 采用可信头trusted headers实现前置的认证工具先完成用户认证再把一组特殊的 HTTP 头转发给 xyOpsxyOps 检测到这些头后自动创建/更新用户账户并建立自己的会话。Tailscale Serve 正是以这种方式转发头的认证工具之一详见 docs/sso.md。集成链路为用户访问 Tailscale Serve 提供的 HTTPS 地址 → Tailscale 完成 Tailnet 身份认证 → 转发可信头到 xyOps默认端口 5522→ xyOps 依据头创建用户、赋权并建立会话。Tailscale 承担了认证与 TLSxyOps 只信任来自本地代理的可信头。动手之前请务必先通读 xyOps SSO 指南其中介绍的header_map、cleanup_username、admin_bootstrap、logout_url、whitelist等概念下文都会直接引用。Header Map把 Tailscale 头映射为 xyOps 用户属性xyOps 通过sso.json通常位于/opt/xyops/conf/sso.jsonDocker 部署时可映射到宿主机其他位置中的header_map对象把传入的可信头映射到标准用户属性username、full_name、email、avatar、groups。因为不同认证工具使用的头名称各不相同这个映射给了配置完全的灵活性。针对 Tailscale Serve应按如下方式配置 SSO Header Mapheader_map: { username: Tailscale-User-Login, full_name: Tailscale-User-Name, email: Tailscale-User-Login, avatar: Tailscale-User-Profile-Pic, groups: Tailscale-App-Capabilities }注意这里username与email都取自Tailscale-User-LoginTailscale 用户的登录名本质上就是一个邮箱地址头像取自Tailscale-User-Profile-Pic组信息则取自Tailscale-App-Capabilities——这个头专门承载 capabilities见下文Capabilities一节。更省事的方式使用preset如果不愿手写头映射可以只开启 SSO 并把preset设为tailscalexyOps 会自动替你配置好 header map以及其他相关项。通过环境变量启用XYOPS_SSO__enabledtrue XYOPS_SSO__presettailscale从源码可以确认这个预设的真实内容。在 lib/sso.js 中ssoSetup()维护了一张ssoPresets表Tailscale 预设不仅包含上文的完整 header_map还自动把logout_url设为/api/app/sso_logoutthis.ssoPresets { tailscale: { header_map: { username: Tailscale-User-Login, full_name: Tailscale-User-Name, email: Tailscale-User-Login, avatar: Tailscale-User-Profile-Pic, groups: Tailscale-App-Capabilities }, logout_url: /api/app/sso_logout } };预设会在每次 SSO 请求处理时与当前配置合并Tools.mergeHashes因此你可以用显式配置覆盖预设中的任何字段实现预设为底、按需覆盖。UsernamesTailscale 用户名如何翻译成 xyOps 用户名Tailscale 传入的用户名本质上是一个邮箱地址如john.smithexample.com而 xyOps 的用户名是不含域名的。请阅读 SSO Header Cleanup 一节理解用户名清理规则cleanup_username默认true会提取之前的部分剥离所有非法字符仅保留字母数字、点、短横线与下划线并转为小写。例如John.Smithexample.com→john.smith。这隐含一个假设你的用户都使用公司邮箱、共享同一邮箱域名因此邮箱前缀可以作为用户名。如果你希望使用完整邮箱作为用户名可把cleanup_username设为false此时非法字符会被替换为下划线并整体小写John.Smithexample.com→john.smith_example.com。cleanup_full_name则从邮箱前缀提取展示名把点替换为空格并对单词做首字母大写john.smithexample.com→John Smith。这最适合first.last格式的邮箱。由于各家 IdP/代理发出的头千差万别官方建议先用回显工具passthrough echo server确认真实收到的头再配置header_map。Admin Bootstrap快速把自己提升为管理员集成初期例如 IdP 还没下发组信息时可以使用 SSO Admin Bootstrap 特性把指定用户名自动提升为完全管理员。在sso.json中设置你的精确用户名即可admin_bootstrap: your-username注意用户名必须与清理后的结果完全一致见上文cleanup_username。这是一个一次性快捷通道每次登录触发时xyOps 都会在活动日志activity log中记录一条醒目的警告提醒你在配置完成、IdP 组映射生效后移除该字段。从 lib/sso.js 可以看到实现细节命中用户时直接把user.privileges置为{ admin: 1 }并调用logActivity(warning, ...)写入警告日志。Capabilities用 Tailscale 授权自动分配 xyOps 角色与权限Tailscale 可以转发其所谓的 capabilities能力授权在 xyOps 侧翻译为权限与角色。简而言之你可以在 Tailscale 的策略文件中配置 capability grants让 xyOps 用户自动获得合适的权限/角色。配置步骤如下登录 Tailscale Admin Console点击 Access Controls访问控制标签页点击 JSON EditorJSON 编辑器。首先创建一个名为tag:xyops的新标签并把它加入tagOwners段tagOwners: { tag:xyops: [your-emaildomain.com] }接着在 JSON 编辑器里找到grants数组不存在则新建把下面的 grant 加入数组grants: [ { src: [autogroup:admin], dst: [tag:xyops], app: { xyops.io/cap/ts: [ {privileges: [admin], roles: []} ], } } ]这个 grant 会把autogroup:adminTailscale 为你自动创建的管理员组可随时在 Visual Editor → Groups 子标签中查看与新建组中的所有成员自动提升为 xyOps 完全管理员。app段是整个 JSON 的关键语法必须分毫不差app: { xyops.io/cap/ts: [ {privileges: [admin], roles: []} ], }xyops.io/cap/ts是 xyOps 解析传入头时查找的唯一键必须精确为xyops.io/cap/ts值必须是如上所示的对象数组。对象内部属性会被直接透传给 xyOpsprivileges子数组可包含任意合法 xyOps 权限 ID例如adminadmin权限授予完全访问、隐含所有其他权限roles子数组可包含任意合法 xyOps 角色 ID角色由管理员在 xyOps 中创建。加法语义与 replace 模式默认情况下角色与权限以加法additive方式应用到用户记录SSO 同步永远不会移除已有角色或权限。这样你仍然可以在 xyOps Admin UI 中手动维护用户的角色与权限两者互不冲突。如果你希望 Tailscale 成为用户角色/权限的唯一事实来源single source of truth则把 SSO 的 replace_roles 与 replace_privileges 设为true——它们会用来自 Tailscale capabilities 可信头的值替换全部用户角色/权限并且在每次用户登录与会话刷新时执行同步抹掉 xyOps 中任何本地改动。编辑完 JSON 后务必点击 Tailscale Admin Console 中的 Save 按钮保存策略。源码视角capabilities 如何被解析在 lib/sso.js 中可以看到 capabilities 头的完整解析逻辑。xyOps 先判断groups头是否为 JSON 对象格式正则^\{[\S\s]\}$若是则解析 JSON并使用sso.ts_cap_id || xyops.io/cap/ts作为键名默认即xyops.io/cap/ts也支持通过ts_cap_id自定义对数组中的每个 capability 对象分别合并groups追加到原始组列表、privileges逐项写入user.privileges[priv] 1与roles追加到用户角色数组处理完后用Set对角色去重若命中replace_roles/replace_privileges会先清空对应字段再写入特殊规则一旦用户获得admin权限其余所有权限会被清除只保留{ admin: 1 }。Base URL告诉 xyOps 自己的 Tailnet 地址xyOps 需要知道托管应用的 base URL以便在出站邮件、web hooks 等场景中生成自引用链接。为此把 base_app_url 配置属性设为 Tailscale 提供的应用 URL。主机名 当前机器名 你的自定义 Tailnet 域名示例base_app_url: https://joemax.taild89302.ts.net或通过环境变量XYOPS_base_app_urlhttps://joemax.taild89302.ts.net另外如果你计划添加远程 satellite 服务器xyOps 需要知道自己以什么主机名向集群宣告即 satellite 如何回连到主 conductor 服务器。此时要在配置顶层添加hostname属性设为你机器的 Tailnet 主机名hostname: joemax.taild89302.ts.net或通过环境变量XYOPS_hostnamejoemax.taild89302.ts.net默认情况下 xyOps 使用当前机器的本地主机名因此这里要用特殊的 Tailnet 主机名覆盖它。作为参考conductor 主机名是 xyOps 的永久网络身份默认值来自操作系统报告的主机名在 Docker 中则来自容器 hostname见 docs/hosting.md。HTTPS让 satellite 走 443 安全通道假设你的 Tailnet 已启用 Tailscale HTTPS强烈推荐这意味着 Tailscale Serve只支持指向应用的 HTTPS URL。因此还需要额外设置几个配置属性以便添加 satellite 服务器并让它们也通过 HTTPS 通信satellite.config.securetruesatellite.config.port443或通过环境变量XYOPS_satellite__config__securetrue XYOPS_satellite__config__port443从 docs/config.md 的默认值可以看出xySat 默认以port: 5522、secure: false连接 conductor即 HTTP/ws://改为 443 secure: true后satellite 将使用 HTTPS/wss://连接与 Tailscale 的强制 HTTPS 策略保持一致。Serve启动 Tailscale ServexyOps 配置完成并启用 SSO 后用下面的命令行参数启动 Tailscale Servetailscale serve --accept-app-capsxyops.io/cap/ts 5522特殊的--accept-app-capsxyops.io/cap/ts参数指示 Tailscale 把Tailscale-App-CapabilitiesHTTP 头随所有入站请求一起转发——这正是 xyOps 用来应用用户权限与角色的头见上文 Capabilities 一节。在浏览器打开应用之前先去 Tailscale Admin Console 的 Machine List机器列表给承载 xyOps 的机器加上tag:xyops标签。注意首次访问 Tailscale 提供的 HTTPS 应用地址时Tailscale 需要短暂时间来签发 TLS 证书如果收到超时错误稍等几秒刷新即可这是正常现象。Logout处理部分登出的 Tailscale 特性当用户点击 xyOps UI 中的 Logout 按钮时xyOps 会删除该用户的会话数据与 cookie。但对于 Tailscale 这类 SSO 提供方我们无法把用户彻底登出——他们仍然连接并认证在自己的 Tailnet 中只要浏览器导航回应用就会立刻重新登录这是设计使然。因此Tailscale SSO 的最佳处理方式是把 logout_url 设为下面的值它会给用户显示一条描述部分登出情况的提示信息XYOPS_SSO__logout_url/api/app/sso_logout如果使用preset特性启用 Tailscale见上文logout_url会被自动设置为该值——这正是 lib/sso.js 中预设对象里logout_url字段的由来。Security安全加固安全加固方面把 SSO IP Whitelist 设置为只接受来自 localhost 的可信头——因为 Tailscale Serve 正是这样路由流量的whitelist: [127.0.0.1, ::1/128]白名单也可以通过环境变量指定此时使用 IP 和/或 CIDR 的 CSV 列表XYOPS_SSO__whitelist127.0.0.1,::1/128从 lib/sso.js 可以看到whitelist兼容数组与 CSV 字符串两种形式最终会构建为pixl-acl的 ACL 实例每次 SSO 请求都会先做ssoWhitelist.check(request.socket.remoteAddress)检查不匹配的 IP 直接拒绝并返回 SSO 错误页。默认白名单还包含常见内网网段10.0.0.0/8、172.16.0.0/12、192.168.0.0/16、fd00::/8等生产环境建议收紧到实际的代理来源地址。最后务必删除 xyOps 首次安装时自动创建的 stock admin 管理员账户。虽然使用 SSO 时该账户技术上不可达但删除它最安全——它默认带有一个不安全的密码。SidecarDocker Compose 双容器部署Tailscale 有一个非常酷的特性让 xyOps 作为自己 Tailnet 上的专用节点运行在 Docker 容器中。做法是把 Tailscale 作为 sidecar 容器与 xyOps 容器并排运行由 Tailscale 统一处理 DNS、TLS 与请求代理包括转发可信头用于自动登录与权限/角色分配。本小节给出开箱即用的完整方案。Tailscale Admin 准备首先登录 Tailscale Admin Console然后按上文 Capabilities 一节在 Tailnet 策略文件中添加 grant让 xyOps 能为用户自动分配权限与角色创建一个 Auth Key认证密钥。注意Auth Key 默认会过期参见 Tailscale 的 Key Expiry 机制。如需长期访问可以禁用密钥过期并给机器添加标签。Host Setup确保宿主机已安装 Docker、Docker CLI 与 Docker Compose 并处于运行状态。然后在宿主机上为 xyOps 创建一个目录并进入其中——它只需要存放几个配置文件以及供容器使用的卷映射目录。Env File在宿主目录中创建.env文件内容如下# Tailscale Configuration TS_AUTHKEYYOUR_TAILSCALE_AUTHKEY TS_HOSTxyops.taild89302.ts.net TZAmerica/Los_Angeles把TS_AUTHKEY改成你刚在 Tailscale 控制台创建的 Auth Key把TS_HOST改成你自己的 Tailnet 域名保留xyops.前缀域名可在 Tailscale Admin Console 的 DNS 标签页查看把TZ改成你本地的时区这样 xyOps 会在你的午夜进行日志轮转与每日统计重置。Docker Compose在宿主目录中创建compose.yaml文件内容如下configs: ts-serve: content: | {TCP:{443:{HTTPS:true}}, Web:{$${TS_CERT_DOMAIN}:443: {Handlers:{/: {Proxy:http://127.0.0.1:5522,AcceptAppCaps:[xyops.io/cap/ts]}}}}, AllowFunnel:{$${TS_CERT_DOMAIN}:443:false}} services: # Tailscale Sidecar Configuration tailscale: image: tailscale/tailscale:latest container_name: tailscale-xyops # Name for local container management hostname: xyops # Name used within your Tailscale environment environment: TS_AUTHKEY: ${TS_AUTHKEY} TS_STATE_DIR: /var/lib/tailscale TS_SERVE_CONFIG: /config/serve.json TS_USERSPACE: false TS_ENABLE_HEALTH_CHECK: true # Enable healthcheck endpoint: /healthz TS_LOCAL_ADDR_PORT: 127.0.0.1:41234 # The addr:port for the healthz endpoint TS_ACCEPT_DNS: true # Use Tailscale MagicDNS TS_AUTH_ONCE: true configs: - source: ts-serve target: /config/serve.json volumes: - ./ts-config:/config # Config folder used to store Tailscale files - ./ts-state:/var/lib/tailscale # Tailscale requirement devices: - /dev/net/tun:/dev/net/tun cap_add: - net_admin healthcheck: test: [CMD, wget, --spider, -q, http://127.0.0.1:41234/healthz] interval: 1m timeout: 10s retries: 3 start_period: 10s restart: unless-stopped xyops01: image: ghcr.io/pixlcore/xyops:latest container_name: xyops01 network_mode: service:tailscale # Use Sidecar init: true restart: unless-stopped environment: XYOPS_xysat_local: true XYOPS_hostname: ${TS_HOST} XYOPS_masters: ${TS_HOST} XYOPS_base_app_url: https://${TS_HOST} XYOPS_satellite__config__secure: true XYOPS_satellite__config__port: 443 XYOPS_SSO__enabled: true XYOPS_SSO__preset: tailscale XYOPS_SSO__whitelist: 127.0.0.1,::1/128 TZ: ${TZ} volumes: - xy-data:/opt/xyops/data - ./xyops01-conf:/opt/xyops/conf - /var/run/docker.sock:/var/run/docker.sock depends_on: tailscale: condition: service_healthy volumes: xy-data:这份文件通常不需要修改但有以下几点说明XYOPS_xysat_local环境变量会让 xyOps 在同一容器内后台启动 xySat这样你立刻就能开始运行作业——非常适合测试与家庭实验室home lab但不建议用于生产/var/run/docker.sock绑定是可选挂载它允许 xyOps 启动自己的容器即用于 Docker Plugin 与 Plugin Marketplace顶层configs.ts-serve正是 Tailscale Serve 的配置TCP 443 启用 HTTPSWeb段把$${TS_CERT_DOMAIN}:443的/代理到http://127.0.0.1:5522并声明AcceptAppCaps: [xyops.io/cap/ts]——与 CLI 版tailscale serve --accept-app-capsxyops.io/cap/ts 5522完全等价侧车容器通过network_mode: service:tailscale与 Tailscale 共享网络命名空间xyOps 只在本机回环地址127.0.0.1:5522暴露服务外部全部流量由 Tailscale 容器接管。Start Up执行下面的命令启动全部服务-d参数让其在后台运行docker compose up -d在浏览器加载应用之前先去 Tailscale Admin Console 的 Machine List机器列表给这台新机器添加tag:xyops标签也可以在这里禁用密钥过期。然后在你喜欢的浏览器中访问TS_HOST对应的 URL例如https://xyops.taild89302.ts.net/与 CLI 部署一样首次访问 URL 时 Tailscale 需要短暂时间签发 TLS 证书请耐心等待几秒。小结至此两条 Tailnet 集成路径都已打通其一在已有 xyOps 实例前用tailscale serve命令行暴露应用配合header_map/preset、capabilities grant、base_app_url/hostname/satellite.config参数与白名单加固其二用 sidecar 容器方案让 Tailscale 容器与 xyOps 容器共享网络由 Tailscale 统一处理认证、DNS、TLS 与可信头转发开箱即得一套自带 SSO 与权限自动分配的安全部署。两条路径共享同一套可信头与 capabilities 解析引擎lib/sso.js因此你在 Admin Console 中配置的头映射、组映射与替换语义完全一致可以放心地从小规模实验平滑过渡到生产部署。赞分享【免费下载链接】xyopsThe next generation of Cronicle: open-source job scheduling, visual workflows, server monitoring, alerting, and incident response.项目地址https://gitcode.com/gh_mirrors/xy/xyops点击查看免费下载相关推荐openclaw-cn 网关集成 Tailscale Serve/Funnel 实战指南从 Tailnet 私网到公网 HTTPSopenclaw cn 网关集成 Tailscale Serve/Funnel 实战指南从 Tailnet 私网到公网 HTTPS openclaw cn 的人工智能AI Agent即时通讯后端本地部署语音Higress 连接 Nacos 实现微服务动态路由三步搞定Higress 连接 Nacos 实现微服务动态路由三步搞定 服务实例一变你还得手动改网关配置、等它重启生效高峰期扩容尤其折磨人。Higress 接上 NAPI网关后端云原生LLM 网关人工智能MCP 服务GHelper华硕笔记本风扇曲线、显卡直连、性能模式一次配好GHelper华硕笔记本风扇曲线、显卡直连、性能模式一次配好 官方奥创服务太多、内存吃太多 官方 Armoury Crate奥创功能是全的代价是一堆常桌面应用系统编程上一篇终极Anno 1800模组加载器完整指南高效XML合并与智能补丁技术下一篇3大核心技术突破Anno 1800 Mod Loader如何彻底改变游戏模组开发体验创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表