# 维护页面的变通方法——这能做到吗？

**URL:** <https://meta.discourse.org/t/maintenance-page-workaround-can-this-be-done/408967>\
**Category:** Self-hosting\
**Tags:** cloudflare\
**Created:** [2026年七月31日 08:22 UTC](https://meta.discourse.org/t/maintenance-page-workaround-can-this-be-done/408967 "2026-07-31T08:22:23Z")\
**Posts on this page:** 1\
**Showing post:** 23

<div class="post-metadata">

**Author:** ![Lilly](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/lilly/32/575047_2.png) [@Lilly](https://meta.discourse.org/u/Lilly)\
**Post date:** [2026年八月2日 01:19 UTC](https://meta.discourse.org/t/maintenance-page-workaround-can-this-be-done/408967/23 "2026-08-02T01:19:03Z")

</div>

> [@alltiagocom](#):
>
> 如果不保留也没问题，为什么还要添加和删除 Workers 路由页面呢？所以，如果我添加了维护页面，我真的只需要设置一次，然后从那一刻起，我就一直通过终端 SSH 连接到我的服务器，像操作单个容器一样在那里完成所有操作，而无需再访问 Cloudflare 吗？

哈哈，很高兴你问了这个问题，因为我之前没花时间解释这部分（我应该解释的——这里有很多内容需要说明，而且 Cloudflare 很复杂！）

当设置了 Workers 路由页面时，论坛上的每一个图片加载和页面浏览都会通过该 Worker 进行路由。

Cloudflare 免费 CDN 计划包含 [Worker 路由每天 100,000 次请求的限制](https://developers.cloudflare.com/workers/platform/pricing/#workers)。

因此，如果你的论坛流量相对较大，为了防止在一天内达到免费版的上限，最好不要一直开启它。这里指的是 Worker 路由，而不是维护页面——你可以一直保留维护页面，除非你开启了 Worker 路由，否则它不会被触发。这仅仅是指 [上面步骤 2 中你分配路由的部分](https://meta.discourse.org/t/maintenance-page-workaround-can-this-be-done/408967/6#p-2017547-step-2-add-the-route-2)（设置和删除都很简单）。除非你使用的是 Cloudflare 付费计划，否则良好的做法是仅在进行自己的维护时才开启它。

1. 前往你域名的 Cloudflare Workers 路由页面，点击路由右侧的按钮。

 ![Screenshot 2026-08-01 at 5.06.14 PM](https://global.discourse-cdn.com/meta/original/4X/a/c/3/ac31a19c4a09656bd9250147a86a3389a40d499d.png)

1. 在编辑屏幕底部，点击 `remove`（移除）按钮，将 Worker 页面从路由中分离。

 ![Screenshot 2026-08-01 at 5.09.01 PM](https://global.discourse-cdn.com/meta/original/4X/e/9/6/e96be50fae2b89573431e5fa7d8583edf406c5a3.png)

1. 别担心，Worker 代码本身不会被删除，只是路由规则被移除。下次你进行重建/更新时，可以像 [上面的步骤 2](https://meta.discourse.org/t/maintenance-page-workaround-can-this-be-done/408967/6#p-2017547-step-2-add-the-route-2) 那样再次添加它。

如果你使用的是 Cloudflare 付费计划，那就不用担心了。不过，那样的话你可以直接使用 Cloudflare 的错误页面，而不是使用 Workers 页面……（我是不是说过 Cloudflare 挺复杂的？LOL）

#### ⚠ 下方为高级管理员配置

如果想在免费版上完全自动化更新，则应使用 Cloudflare API 令牌、你的区域 ID (zone-id) 以及 `curl` 命令来获取 Worker 的 `route id`（路由 ID）。然后编辑 `/root/update-web.sh` 脚本，添加一些有趣的内容，以自动开启和关闭 Worker 路由：

```plaintext
#!/bin/bash
cd /var/discourse

CF_TOKEN="your_actual_token_here" #<---Cloudflare API 令牌
ZONE_ID="xxxx" #<---来自你的 Cloudflare 个人资料页面
ROUTE_ID="xxxx"
WORKER_NAME="my-site-maintenance-page"

echo "➡️ 正在拉取最新的 Discourse Docker 脚本..."
git pull

echo "➡️ 在后台引导新的 Web 容器..."
./launcher bootstrap web_only

if [$? -eq 0]; then
    echo "✅ 引导成功！"
    
    # 开启 Cloudflare 维护 Worker
    echo "🚧 正在启用维护页面..."
    curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/workers/routes/$ROUTE_ID" \
         -H "Authorization: Bearer $CF_TOKEN" \
         -H "Content-Type: application/json" \
         --data '{"pattern":"*your-site.com/*","script":"'$WORKER_NAME'"}' > /dev/null

    # 交换容器（30秒的停机窗口）
    echo "🔄 正在交换容器..."
    ./launcher destroy web_only && ./launcher start web_only
    
    # 关闭 Cloudflare 维护 Worker
    echo "🌍 正在禁用维护页面..."
    curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/workers/routes/$ROUTE_ID" \
         -H "Authorization: Bearer $CF_TOKEN" \
         -H "Content-Type: application/json" \
         --data '{"pattern":"*your-site.com/*","script":null}' > /dev/null

    echo "🚀 完成！网站已更新，且无可见停机时间。"
else
    echo "❌ 引导失败！中止交换以保持当前网站在线。"
fi 

```

我使用的是旧版本的脚本，因为我不想自动化所有事情，而且我喜欢亲自参与更新/重建过程。我只需要在更新前添加 Workers 路由，然后在更新后移除它。这只需要几秒钟。

我的一般步骤如下：

1. 在 Cloudflare 上添加 Workers 路由
2. SSH 连接到 Hetzner
3. 执行任何系统更新（例如：`sudo apt update && sudo apt upgrade -y`，如有必要则重启服务器）
4. 如果需要重启，则再次 SSH 连接
5. 运行 `./update-web.sh`
6. 在 Cloudflare 上移除 Workers 路由

---

_[View the full topic](https://meta.discourse.org/t/maintenance-page-workaround-can-this-be-done/408967)._
