> 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-zhi-shi/ru-he-zai-ren-he-di-fang-ti-gong-ben-di-llm-fu-wu-shi-yong-cloudflare-he-unsloth-shi-xian-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. 然后前往 设置 → Remote & LAN → 远程访问。

<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` 会将其关闭。

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

#### 当 Start 不可用时

<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>显式禁用</code></td><td>此次启动使用了 <code>--no-cloudflare</code>。重新启动时去掉它以启用远程访问。</td></tr><tr><td><code>受启动命令管理</code></td><td>此隧道由启动命令管理。</td></tr><tr><td><code>由 Colab 运行时管理</code></td><td>此隧道由 Colab 运行时管理。</td></tr><tr><td><code>colab</code></td><td>远程访问设置由 Colab 运行时管理。</td></tr></tbody></table>

#### 界面其余部分中的隧道 URL

一旦隧道上线，两个地方会自动切换过去：

* **设置 → API → 使用示例** 会增加一个 **安全 HTTPS** 切换开关。开启后，所有 curl/Python/JavaScript 代码片段和编程代理命令都会改写为使用 `trycloudflare.com` 基址，而不是 `localhost`。如果你没有使用 `--secure`启动，信息提示会提醒你： *“0.0.0.0 端口仍可从全局访问。要获得完整安全性，请使用 `--secure` 启动 Unsloth，只暴露这个 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>发布 <strong>仅</strong> 通过 Cloudflare。强制回环绑定，并隐含 <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>）。对回环绑定无效。 <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` 安全失败

如果隧道无法建立， `--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` 可跳过这两者。

#### 密码门控

当某次启动即将通过公共 URL 发布 Unsloth，而管理员账户仍持有其自动生成的引导密码时，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 历史记录中，因此更推荐使用环境变量或 stdin。之后可通过 `unsloth studio reset-password`.

### 📓 Google Colab

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

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

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

### 🔒 安全

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

* **服务器端工具以你的用户身份运行。** Web 搜索、Python 和终端执行默认开启，因此任何持有你的 API 密钥并访问服务器的人都可以在那台机器上运行代码。公开 Unsloth 时请传入 `--disable-tools` ，并保密 API 密钥。每次可被网络访问的启动都会在横幅中说明这一点。
* **上面的管理员密码门控** 在启动命令管理的隧道中不是可选项。
* **限流仍按访问者分别计算。** 隧道终止于 `127.0.0.1`，因此所有经由隧道的调用否则都会共享一个桶。当地 socket 对端是回环时，Unsloth 会遵守 Cloudflare 的 `CF-Connecting-IP`，这是边缘节点设置的，而经隧道的客户端无法伪造。若在你自己的反向代理之后，请启用 `X-Forwarded-For` 替换为 `UNSLOTH_STUDIO_TRUST_FORWARDED=1`.
* **在隧道运行期间，本地 stdio MCP 服务器会被撤销。** stdio MCP 仅作为回环便利而自动启用；远程连接器会打破该信任边界，因此自动默认会自行关闭。显式的 `UNSLOTH_STUDIO_ALLOW_STDIO_MCP=1` 仍然优先。
* **URL 是随机且一次性的。** 快速隧道每次启动都会获得一个新的主机名。请将 URL 本身视为机密，并记住它无法固定。

### ❔ 故障排除

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

| 错误                    | 含义                            | 修复                                                        |
| --------------------- | ----------------------------- | --------------------------------------------------------- |
| `cloudflared 不可用`     | 未安装 `PATH`、未缓存，并且下载失败。        | 检查到 `github.com`的出站访问，或者自行安装 `cloudflared` ，以便它可用 `PATH`. |
| `cloudflared 未生成 URL` | 进程在生成 URL 之前就退出了。             | 通常是没有出站网络。重试；检查代理或出口过滤器。                                  |
| `cloudflared 未注册连接`   | URL 已生成，但在 `http2` 重试后没有边缘连接。 | 你的网络阻止了 QUIC *和* 到 Cloudflare 边缘的 HTTP/2。                 |
| `Cloudflare URL 无法访问` | 已注册，但健康检查通过公共 URL 从未得到响应。     | 边缘/DNS 传播的暂时性问题；请再次按 Start。                               |
| `cloudflared 已退出`     | 连接器在在线时崩溃了。                   | 再次启动；检查是否有 OOM killer 或进程监督器回收子进程。                        |
| `cloudflared 无法停止`    | 从未确认终止，因此该槽位仍被占用。             | 再次按 Stop；如果仍然存在，请重启 Unsloth。                              |

其他症状：

* **`--secure` 会立即退出。** 隧道失败了；消息将 `--no-secure` 作为替代项命名。先修复连接，因为 `--no-secure` 会发布原始端口。
* **UI 中的 Start 呈灰色不可用。** 阅读卡片下方的信息，它会从上表中指出阻塞原因。

### 🌱 环境变量

| 变量                                    | 用途                                                |
| ------------------------------------- | ------------------------------------------------- |
| `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>可启动</code> / <code>可停止</code>, <code>阻塞原因</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 by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

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

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

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.
