> For the complete documentation index, see [llms.txt](https://unsloth.ai/docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://unsloth.ai/docs/zh/ji-chu/ru-he-zai-ren-he-di-fang-ti-gong-ben-di-llm-fu-wu-shi-yong-cloudflare-he-unsloth-jin-xing-an-quan-yu.md).

# 如何在任何地方提供本地 LLM 服务：使用 Cloudflare 和 Unsloth 进行安全远程访问

在任何地方提供和部署本地 AI 模型。你可以通过 Cloudflare 隧道，使用 HTTPS 从另一台设备安全访问你的本地 LLM： [Unsloth](https://github.com/unslothai/unsloth)。无需 Cloudflare 账户、域名设置或端口转发。可在自己的硬件、服务器或云 GPU 上运行私有 AI 模型，并像用手机一样从任何地方连接。

{% columns %}
{% column %}
Unsloth 是一个开源项目，可让你在本地训练和运行 LLM；借助 Cloudflare 隧道，你可以从移动设备访问 Unsloth，与朋友或同事共享访问权限，也可以将 Unsloth 托管在 Google Colab、AWS 之类的服务器上，甚至个人服务器上。

Unsloth 可以 100% 离线运行在你的电脑上。开启远程访问后，你会得到一个类似这样的网页链接： `https://known-plates-desire-turkey.trycloudflare.com`。可在手机、笔记本电脑或任何浏览器中、任何地方打开它。
{% endcolumn %}

{% column %}

<figure><img src="https://3215535692-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2FD2v8S0MkS1xAeEVersl2%2Fmobile_studio1.gif?alt=media&#x26;token=7cd8a534-d82f-4f05-8d5a-9b7277f7eac0" alt="" width="180"><figcaption></figcaption></figure>
{% endcolumn %}
{% endcolumns %}

这是免费的。无需注册或付费，也完全不需要碰你的路由器或防火墙。安装 Unsloth 后，你的电脑会主动连接到 Cloudflare，再由 Cloudflare 将访问者转回给它。该链接使用 HTTPS，因此连接是加密的。

开启它有两种方式：

* **当你启动 Unsloth 时：** 添加 `--secure` 到你的 `unsloth studio` 命令中
* **当 Unsloth 正在运行时：** 进入 设置 → API → **远程访问** 并按 **开始**

每个 Unsloth 进程只存在一个隧道，而且只有其所有者可以停止它。

### ⚡ 快速开始

首先我们需要下载 [Unsloth Desktop](https://unsloth.ai/download) 应用。

1. 安装适用于 [macOS](https://unsloth.ai/download/mac)、Windows 或 [Linux](https://unsloth.ai/download/linux)
2. 启动应用
3. 然后进入 设置 → 远程与局域网 → 远程访问。

<div data-with-frame="true"><figure><img src="https://3215535692-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2F31IAHABHEuWz1juiABBY%2Fimage.png?alt=media&#x26;token=b430b2f7-f91b-49e3-a4b6-c46bd688bbfc" alt=""><figcaption></figcaption></figure></div>

当 Unsloth 已经在运行，而你想在手机或另一台机器上使用它时，请用这个方式。按 **开始**，然后复制 **远程 URL** 或扫描 **QR** 码。 `在线` 表示该链接已经有响应，而不只是被请求过。

有三件事值得知道：

* 任何拿到 URL 和密码的人都可以登录。远程浏览器会以 `unsloth`身份登录，请在 **远程密码**.
* 下进行设置。每次启动时 URL 都是新的，无法固定。
* 一个原始 `0.0.0.0` 端口仍然开放。只有 `--secure` 会关闭它。

如果 **开始** 呈灰色，卡片会说明原因，通常是管理员密码仍需要更改，或者该隧道属于启动命令。

#### 当“开始”不可用时

<table><thead><tr><th width="292">原因</th><th>显示的信息</th></tr></thead><tbody><tr><td><code>server_starting</code></td><td>Unsloth 仍在启动中。</td></tr><tr><td><code>admin_password_change_required</code></td><td>在暴露此服务器之前，请先设置远程密码。 <em>（桌面版）</em> / 在暴露此服务器之前，请先更改管理员密码。在桌面应用中运行 <code>unsloth studio reset-password</code>. <em>（浏览器）</em></td></tr><tr><td><code>explicitly_disabled</code></td><td>此次启动使用了 <code>--no-cloudflare</code>。请不带它重新启动以启用远程访问。</td></tr><tr><td><code>launch_managed</code></td><td>此隧道由启动命令管理。</td></tr><tr><td><code>colab_managed</code></td><td>此隧道由 Colab 运行时管理。</td></tr><tr><td><code>colab</code></td><td>远程访问设置由 Colab 运行时管理。</td></tr></tbody></table>

#### UI 其余部分中的隧道 URL

一旦隧道上线，以下两处会自动切换到它：

* **设置 → API → 使用示例** 会新增一个 **安全 HTTPS** 切换。开启后，每个 curl/Python/JavaScript 片段和编码代理命令都会重写为以 `trycloudflare.com` 为基础，而不是 `localhost`。如果你没有使用 `--secure`启动，信息提示会提醒你： *“0.0.0.0 端口仍可全局访问。为了完全安全，请使用 `--secure` 启动，以仅暴露这个 HTTPS 链接。”*
* 该 **API 监视器** 页面的 **基础 URL** 显示的是隧道源，因此在那里复制的代码片段可在远程设备上工作，并且通过隧道到达的每个请求都会实时列出。

### CLI：仅 HTTPS 方式

手动安装 Unsloth 后，在终端中运行：

```bash
unsloth studio --secure -p 8888
```

Unsloth 会保持绑定到 `127.0.0.1` 并通过 **仅** 通过隧道发布。如果隧道无法建立，Unsloth 会 **直接退出，而不是回退** 到原始端口。横幅会打印：

```
🦥 Unsloth Studio 正在运行（安全）
────────────────────────────────────────────────────
  通过 Cloudflare 的安全链接访问：https://<random>.trycloudflare.com
  仅在本机上：http://127.0.0.1:8888/
────────────────────────────────────────────────────
```

#### CLI：原始 LAN 端口加公开链接

```bash
unsloth studio -H 0.0.0.0 --cloudflare -p 8888
```

原始端口仍可在你的网络中访问 *并且* 会发布一个公开的 Cloudflare URL。横幅会明确提醒你这一点，因为这是最不私密的模式。

#### UI：在已运行的服务器上启动链接

1. 打开 **设置 → API**.
2. 找到 **远程访问** 卡片。
3. 点击 **开始**.
4. 当状态显示 **在线**时，用你的手机复制 **远程 URL** 或扫描 **QR** 码。

### 🖥️ CLI 参考

这两个标志都被 `unsloth studio` 接受（普通服务器路径）以及被 `unsloth studio run`.

<table><thead><tr><th width="283">标志</th><th width="100" align="center">默认值</th><th>效果</th></tr></thead><tbody><tr><td><code>--secure</code> / <code>--no-secure</code></td><td align="center">关</td><td>通过 Cloudflare <strong>仅</strong> 发布。强制回环绑定，隐含 <code>--cloudflare</code>，且如果隧道无法启动则直接失败。</td></tr><tr><td><code>--cloudflare</code> / <code>--no-cloudflare</code></td><td align="center">关</td><td>还会为一个 <strong>非<code>--api-only</code> 通配绑定</strong> (<code>0.0.0.0</code> 或 <code>::</code>）发布公开的 Cloudflare URL。对回环绑定没有影响。 <code>--no-cloudflare</code> 会强制关闭它，但 <strong>不会</strong> 让通配绑定变成私有。</td></tr></tbody></table>

关于标志处理的说明：

* `--secure` 忽略 `-H`。如果你传入其他主机，它会打印一条说明并仍然绑定 `127.0.0.1` 。
* `--secure --no-cloudflare` 是矛盾的，并会以代码 `2`.
* 退出。这些标志属于普通服务器路径。把它们放在子命令（ *之前* 如（`unsloth studio --secure run ...`）会退出 `2` 并显示修正后的命令，因为否则 Typer 会静默丢弃它们。请使用 `unsloth studio run --secure ...`.
* 这个选择会在 Unsloth 内部重新执行时以三态（`启用` / `禁用` / `未设置`）传递，因此，陈旧的 `Docker ENV` 或 `systemd Environment=` 绝不会重新启用你在本次调用中选择退出的隧道。

#### 每种启动实际暴露了什么

<table><thead><tr><th width="391">启动方式</th><th>原始端口</th><th>公开的 Cloudflare URL</th></tr></thead><tbody><tr><td><code>unsloth studio</code></td><td>仅限本机</td><td>否</td></tr><tr><td><code>unsloth studio --cloudflare</code></td><td>仅限本机</td><td>否，该标志在回环模式下无效</td></tr><tr><td><code>unsloth studio -H 0.0.0.0</code></td><td>你的网络</td><td>否</td></tr><tr><td><code>unsloth studio -H 0.0.0.0 --cloudflare</code></td><td>你的网络</td><td><strong>是</strong></td></tr><tr><td><code>unsloth studio --secure</code></td><td>仅限本机</td><td><strong>是</strong>，并且这是唯一的进入方式</td></tr><tr><td><code>unsloth studio --api-only</code> （桌面后端）</td><td>按绑定情况</td><td>否，除非 <code>--secure</code></td></tr><tr><td>Google Colab</td><td>Colab 代理</td><td>仅通过 <code>start(cloudflare=True)</code></td></tr></tbody></table>

后端应用的规则：Colab 从不在启动路径中建立隧道； `--secure` 始终会建立隧道（即使 `--api-only`，用于无头安全 API 服务）；否则隧道只会为非 `--api-only`.

#### `--secure` fails closed

如果隧道没有建立， `--secure` 会拒绝继续运行：

```
不允许安全的 Cloudflare 链接，请使用 --no-secure，它会提供一个 0.0.0.0 链接
```

并退出 `1`。这是有意为之： `--secure` 表示“没有原始公开端口”，因此静默降级为你以为已发布、实际上仅限回环的服务器，比直接停止更糟。

#### 启动横幅行

在通配绑定上，Unsloth 总会说明隧道状态，因此面向网络的启动绝不会无声无息：

* Cloudflare 隧道：开启。这是一个公开的互联网 URL：任何拿到它的人都可以访问此 Unsloth。
* Cloudflare 隧道：开启。这个 Cloudflare URL 是公开的，原始端口也可公开访问。
* Cloudflare 隧道：请求了，但启动失败。
* Cloudflare 隧道：关闭（默认）。/ 关闭（--no-cloudflare）。/ 此模式下关闭。

每个变体都会根据原始端口是否被独立检测到可从互联网访问而调整。该可达性探测会联系 `ifconfig.me` 并且 `check-host.net`；设置 `UNSLOTH_STUDIO_DISABLE_PUBLIC_CHECK=1` 可同时跳过两者。

#### 密码门控

当某次启动即将把 Unsloth 发布到公开 URL，而管理员账户仍使用其自动生成的引导密码时，Unsloth 会停止并要求设置一个新的密码；该密码需要在掩码下确认， **在任何服务器或隧道存在之前**.

* **已连接终端：** 此时会提示你。中止（Ctrl+C）会拒绝这次启动。
* **没有终端：** Unsloth 会改为警告，绝不会把引导凭据注入公共页面，并会启动引导截止时间；如果密码未更改，它会在 `UNSLOTH_STUDIO_BOOTSTRAP_TIMEOUT` （默认 1 小时）后关闭。
* **没有终端，也没有截止时间** (`--api-only`，或者 `UNSLOTH_STUDIO_BOOTSTRAP_TIMEOUT=0`）：启动会被直接拒绝，因为没有任何东西能保护它。
* **`--secure` 与 `cloudflared` 明确不可用：** 会在保留已种子化密码的情况下拒绝，因此失败的隧道不会把你锁在外面。

对于无头设置，请以非交互方式设置初始密码（仅在尚未设置密码时生效）：

```bash
UNSLOTH_STUDIO_PASSWORD='your-strong-password' unsloth studio --secure
```

```bash
printf '%s\n' 'your-strong-password' | unsloth studio --secure --password -
```

一个字面上的 `--password VALUE` 会显示在 `ps` 和 shell 历史记录中，因此更建议使用环境变量或标准输入。之后可用 `unsloth studio reset-password`.

### 📓 Google Colab

`run_server` 会在 Colab 上抑制启动路径隧道，因为 Colab 已经代理了该端口。请显式请求一个可共享的公开链接：

```python
start(cloudflare = True)
```

当管理员账户仍持有引导密码时，Colab 会拒绝打开链接，因为任何能加载页面的人都能看到该凭据。登录、更改密码，然后重新运行。任何失败都会退化为“无链接”，而 Colab 代理会继续工作。

### 🔒 安全

发布 Unsloth 意味着任何持有 URL **并且** 和凭据的人都可以使用它。

* **服务器端工具以你的用户身份运行。** 网页搜索、Python 和终端执行默认开启，所以任何拿到你的 API 密钥并访问服务器的人都可以在那台机器上运行代码。暴露 Unsloth 时请传入 `--disable-tools` ，并保密 API 密钥。每次可被网络访问的启动都会在横幅中说明这一点。
* **上面的管理员密码门控** 在启动管理的隧道中不是可选项。
* **速率限制仍按访问者分别计算。** 隧道终止于 `127.0.0.1`，因此每个通过隧道的调用原本都会共享一个配额。当地面套接字对端是回环地址时，Unsloth 会遵循 Cloudflare 的 `CF-Connecting-IP`，这是边缘侧设置的，通过隧道的客户端无法伪造。若在你自己的反向代理之后，请启用 `X-Forwarded-For` 与 `UNSLOTH_STUDIO_TRUST_FORWARDED=1`.
* **当隧道处于活动状态时，本地 stdio MCP 服务器会被撤销。** stdio MCP 仅作为回环便利功能自动启用；远程连接会打破该信任边界，因此自动默认会自行关闭。显式设置 `UNSLOTH_STUDIO_ALLOW_STDIO_MCP=1` 仍然优先生效。
* **URL 是随机且一次性的。** Quick Tunnel 每次启动都会获得一个新的主机名。请将 URL 本身视为机密，并记住它无法固定。

### ❔ 故障排查

这些就是远程访问卡片中显示的确切状态。其他所有内容都会折叠为通用的 `Cloudflare 隧道失败`.

| 错误                     | 含义                             | 修复方法                                                     |
| ---------------------- | ------------------------------ | -------------------------------------------------------- |
| `cloudflared 不可用`      | 不在 `PATH`中，也未缓存，且下载失败。         | 检查到 `github.com`的出站访问，或者自行安装 `cloudflared` ，使其位于 `PATH`. |
| `cloudflared 没有生成 URL` | 进程在生成之前就退出了。                   | 通常是没有出站网络。请重试；检查代理或出口过滤。                                 |
| `cloudflared 未注册连接`    | URL 已生成，但在 `http2` 重试后仍没有边缘连接。 | 你的网络阻止了 QUIC *并且* 到 Cloudflare 边缘的 HTTP/2。               |
| `Cloudflare URL 不可达`   | 已注册，但健康探测从未通过公开 URL 响应。        | 临时性的边缘/DNS 传播；请再次按“开始”。                                  |
| `cloudflared 已退出`      | 连接器在在线时死亡。                     | 再次开始；检查是否有 OOM killer 或进程监督器在回收子进程。                      |
| `无法停止 cloudflared`     | 从未确认终止，因此该槽位仍被占用。              | 再次按“停止”；如果持续存在，请重启 Unsloth。                              |

其他症状：

* **`--secure` 立即退出。** 隧道失败；消息中提到 `--no-secure` 作为替代。请先修复连接，因为 `--no-secure` 会发布原始端口。
* **UI 中“开始”是灰色的。** 阅读卡片下方的消息，它会指出上表中的阻止原因。

### 🌱 环境变量

| 变量                                    | 用途                                                   |
| ------------------------------------- | ---------------------------------------------------- |
| `UNSLOTH_STUDIO_HOME`                 | 安装根目录；该 `cloudflared` 缓存位于 `<root>/bin`.             |
| `UNSLOTH_STUDIO_BOOTSTRAP_TIMEOUT`    | 未受保护的公开启动在自动关闭前的秒数。默认值 `3600`; `0` 将禁用（并使无头公开启动被拒绝）。 |
| `UNSLOTH_STUDIO_PASSWORD`             | 无头启动的初始管理员密码。                                        |
| `UNSLOTH_STUDIO_DISABLE_PUBLIC_CHECK` | `1` 在通配绑定时跳过第三方原始端口可达性探测。                            |
| `UNSLOTH_STUDIO_TRUST_FORWARDED`      | `1` 遵循 `X-Forwarded-For` 在你自己的反向代理之后。                |
| `UNSLOTH_STUDIO_ALLOW_STDIO_MCP`      | `1` 即使隧道已建立，也保持 stdio MCP 服务器启用； `0` 强制禁用。           |

### 🌐 HTTP API

这四个都需要一个 **UI 会话，** API 密钥会被拒绝，并返回 `403 远程访问需要 UI 会话。` 被拒绝的操作会返回 `409` 并将阻止原因作为详情。

<table><thead><tr><th width="100">方法</th><th>路径</th><th>用途</th></tr></thead><tbody><tr><td><code>GET</code></td><td><code>/api/settings/remote-access</code></td><td>当前状态、URL、所有者， <code>can_start</code> / <code>can_stop</code>, <code>block_reason</code>.</td></tr><tr><td><code>POST</code></td><td><code>/api/settings/remote-access/start</code></td><td>安排一次由设置拥有的启动。幂等。</td></tr><tr><td><code>POST</code></td><td><code>/api/settings/remote-access/stop</code></td><td>安排一次由设置拥有的停止。不会更改自动启动偏好。</td></tr><tr><td><code>PUT</code></td><td><code>/api/settings/remote-access/auto-start</code></td><td><code>{"enabled": true|false}</code>。在 Colab 上会被拒绝。</td></tr></tbody></table>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://unsloth.ai/docs/zh/ji-chu/ru-he-zai-ren-he-di-fang-ti-gong-ben-di-llm-fu-wu-shi-yong-cloudflare-he-unsloth-jin-xing-an-quan-yu.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
