跳到主要内容

Tailscale 集成

从任何设备私密、加密地访问 Open WebUI。无需开放端口,无需管理证书。

Tailscale 在您的设备之间创建了一个基于 WireGuard 的网状 VPN(“tailnet”)。每台设备都会获得一个稳定的主机名,例如 my-server.tail1234.ts.net,并且 Tailscale 可以自动配置受信任的 HTTPS 证书。您的 Open WebUI 实例保持完全私有,仅供您 tailnet 上的设备访问。

何时使用 Tailscale

当您希望在设备之间进行私密的、经过身份验证的访问,而不将 Open WebUI 暴露给公共互联网时,Tailscale 是理想之选。非常适合个人配置、小型团队,或者随时随地从您的手机或笔记本电脑访问家庭服务器。


前提条件

要求详情
Open WebUI在本地运行,端口为 8080(默认)
Tailscale 账户个人使用免费,见 tailscale.com
已安装 Tailscale运行 Open WebUI 的服务器和任何客户端设备上均已安装

快速开始

1. 安装 Tailscale

Mac App Store 下载,或者:

brew install tailscale

2. 连接服务器

在运行 Open WebUI 的机器上:

sudo tailscale up

您的机器会获得一个 tailnet 主机名,例如 my-server.tail1234.ts.net。使用以下命令找到它:

tailscale status

3. 访问 Open WebUI

在同一 tailnet 上的任何设备,打开:

http://my-server.tail1234.ts.net:8080

此连接已由 WireGuard 进行端到端加密。对于需要 HTTPS 的浏览器功能(例如语音通话),请继续阅读下一节。


使用 Tailscale 实现 HTTPS

Tailscale 可以为您的 tailnet 主机名配置受信任的 Let's Encrypt 证书,无需反向代理。

有关完整的 HTTPS 设置步骤(证书生成、tailscale serve、配置 WEBUI_URL),请参阅专用参考指南:

👉 使用 Tailscale 的 HTTPS

简短版本:

# 直接将 HTTPS 流量代理到 Open WebUI
sudo tailscale serve https / http://localhost:8080

您的实例现在可以在 https://my-server.tail1234.ts.net 访问,并带有有效的 TLS 证书。


通过 Tailscale 进行身份认证 (SSO)

Tailscale Serve 可以作为身份验证反向代理。当请求通过 tailscale serve 时,Tailscale 会自动使用已验证用户的邮箱地址设置 Tailscale-User-Login 标头。Open WebUI 可以信任此标头作为单点登录机制。您 tailnet 上的用户将自动登录,而不需要单独的 Open WebUI 密码。

运作原理

  1. 一个 Tailscale 边车 (sidecar) 容器与 Open WebUI 并行运行
  2. Tailscale Serve 将 HTTPS 流量代理到 Open WebUI 并注入身份标头
  3. Open WebUI 读取 Tailscale-User-LoginTailscale-User-Name 以识别用户
  4. 用户在首次访问时将自动注册并登录

Docker Compose 设置

创建一个 tailscale/serve.json 文件,配置 Tailscale Serve 代理到 Open WebUI:

{
    "TCP": {
        "443": {
            "HTTPS": true
        }
    },
    "Web": {
        "${TS_CERT_DOMAIN}:443": {
            "Handlers": {
                "/": {
                    "Proxy": "http://open-webui:8080"
                }
            }
        }
    }
}

然后使用 Tailscale 边车设置 Docker Compose 文件:

---
services:
  open-webui:
    image: ghcr.io/open-webui/open-webui:main
    volumes:
      - open-webui:/app/backend/data
    environment:
      - WEBUI_AUTH_TRUSTED_EMAIL_HEADER=Tailscale-User-Login
      - WEBUI_AUTH_TRUSTED_NAME_HEADER=Tailscale-User-Name
    restart: unless-stopped
  tailscale:
    image: tailscale/tailscale:latest
    environment:
      - TS_AUTH_ONCE=true
      - TS_AUTHKEY=${TS_AUTHKEY}
      - TS_EXTRA_ARGS=--advertise-tags=tag:open-webui
      - TS_SERVE_CONFIG=/config/serve.json
      - TS_STATE_DIR=/var/lib/tailscale
      - TS_HOSTNAME=open-webui
    volumes:
      - tailscale:/var/lib/tailscale
      - ./tailscale:/config
      - /dev/net/tun:/dev/net/tun
    cap_add:
      - net_admin
      - sys_module
    restart: unless-stopped

volumes:
  open-webui: {}
  tailscale: {}

您需要在 Tailscale 管理控制台中创建一个具有 device write 权限的 OAuth client,并将该密钥作为 TS_AUTHKEY 传递。

您的实例将可通过 https://open-webui.TAILNET_NAME.ts.net 进行访问。

使用 ACL 限制直接访问

如果您在与 Open WebUI 相同的网络上下文中运行 Tailscale,用户可能会绕过 Serve 代理直接访问 Open WebUI,从而跳过信任标头的身份验证。使用 Tailscale ACLs 将访问限制为仅限端口 443。

有关信任标头身份验证的更多详细信息,请参阅 SSO 文档


Tailscale Funnel(可选的公共访问)

如果您希望公开分享 Open WebUI 而不需要客户端安装 Tailscale,Tailscale Funnel 可以将您的 tailscale serve 终点暴露给互联网:

sudo tailscale funnel https / http://localhost:8080

您的 Open WebUI 现在可以通过有效的 TLS 证书在 https://my-server.tail1234.ts.net 公开访问。Funnel 通过 Tailscale 的基础设施路由流量,类似于 Cloudflare Tunnel。

注意

Funnel 会使您的 Open WebUI 可以被互联网上的任何人访问。在启用它之前,请确保您已在 Open WebUI 中配置了身份验证。


快速参考

内容命令 / 值
连接到 tailnetsudo tailscale up
检查主机名tailscale status
通过 HTTPS 提供服务sudo tailscale serve https / http://localhost:8080
公共访问 (Funnel)sudo tailscale funnel https / http://localhost:8080
手动生成证书sudo tailscale cert my-server.tail1234.ts.net
管理控制台login.tailscale.com/admin
设置 CORS 来源CORS_ALLOW_ORIGIN=https://my-server.tail1234.ts.net
信任的邮箱标头WEBUI_AUTH_TRUSTED_EMAIL_HEADER=Tailscale-User-Login
信任的名称标头WEBUI_AUTH_TRUSTED_NAME_HEADER=Tailscale-User-Name

This content is for informational purposes only and does not constitute a warranty, guarantee, or contractual commitment. Open WebUI is provided "as is." See your license for applicable terms.