背景

我的rpi部署cloudreve后,我目前有两个供应下载站的存储桶。

一个是第三方的cloudreve,一个是我自己的cloudreve。

我就想要做一个健康检查、自动转移的一个“负载均衡”系统,于是用vibe coding技术搓了一个。

正文

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
export default {
  async fetch(request, env, ctx) {
    const url = new URL(request.url);
    const targetHost = 'dl-p.imjcj.eu.org';
    const targetUrl = `https://${targetHost}${url.pathname}${url.search}`;
    const cache = caches.default;
    if (request.method === "GET" || request.method === "HEAD") {
      let response = await cache.match(request);
      if (response) {
        const newHeaders = new Headers(response.headers);
        newHeaders.append("CFW-Cache-Status", "HIT");
        return new Response(response.body, {
          status: response.status,
          statusText: response.statusText,
          headers: newHeaders
        });
      }
    }
    const response = await fetch(targetUrl, {
      method: request.method,
      headers: request.headers,
      body: request.body
    });
    if (response.status >= 500) {
      const backTargetHost = 'dl-b.imjcj.eu.org';
      const backTargetUrl = `https://${backTargetHost}${url.pathname}${url.search}`;
      const backResponse = await fetch(backTargetUrl, {
        method: request.method,
        headers: request.headers,
        body: request.body
      });
      return backResponse;
    }
    if ((request.method === "GET" || request.method === "HEAD") && response.status === 200) {
      const responseToCache = response.clone();
      ctx.waitUntil(cache.put(request, responseToCache));
      const newHeaders = new Headers(response.headers);
      newHeaders.append("CFW-Cache-Status", "MISS");
      return new Response(response.body, {
        status: response.status,
        statusText: response.statusText,
        headers: newHeaders
      });
    }
    return response;
  }
};

全程部署教程:

  1. 将备用站部署到dl-b.imjcj.eu.org(开橙云、缓存1d),主用站部署到dl-p.imjcj.eu.org(开橙云,缓存1d)
  2. Cloudflare Worker部署以上代码
  3. 配置路由dl.imjcj.eu.org/*到worker

提速教程:

  1. 两个cloudreve都在中国,避免数据走Cloudreve→(亚太→北美)→下载站→(北美→亚太)→用户,直接走Cloudreve→(亚太)→下载站→(亚太)→用户
  2. 我的备用站和主用站都部署在vercel,vercel项目仪表盘→SettingsFunctions,将functions的执行数据中心定在ap-east-1(即中国香港地区)
  3. cloudflare worker项目仪表盘→设置→运行时→放置,选择区域→AWS→ap-east-1(中国香港地区)
  4. 提速完成,健康检查及自动转移配置完成