侧边栏壁纸
博主头像
QM博主等级

行动起来,活在当下

  • 累计撰写 10 篇文章
  • 累计创建 7 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Cloudflare Workers 反代 Docker

wangqm
2024-11-07 / 0 评论 / 0 点赞 / 32 阅读 / 8276 字

Cloudflare Workers 反代 Docker

简介

Cloudflare Workers 是一个无服务器计算平台,它允许你在 Cloudflare 全球边缘网络中运行 JavaScript 代码。通过 Workers,你可以创建一个反向代理来加速 Docker 镜像的拉取,绕过网络限制,或者解决跨域问题。

所需工具

  1. Cloudflare 账号

  2. 域名并绑定到cloudflare

步骤 1: 创建 Cloudflare Worker

登录 Cloudflare 账号,并在侧边栏中选择 Workers and Pages -> 概述,进入 Worker 控制面板。

步骤 3: 创建应用程序

选择创建应用程序,创建你的第一个反向代理加速器。在接下来的页面中继续点创建。

到了部署 hello World 脚本部分,你可以修改名称后,点击右下角部署进行下一步

到下一步后,你的 worker 就创建好了,下面点击修改代码。

步骤 4: 编写通用转发代码

以下是通用转发接口的代码,适用于所有加速服务,你可以编辑左侧代码使其转发网站内容:

const hub_host = 'registry-1.docker.io'
const auth_url = 'https://auth.docker.io'
const workers_url = 'https://hub.8888.xyz'

export default {
  async fetch(request) {
    const url = new URL(request.url);
    const getReqHeader = (key) => request.headers.get(key);

    if (url.pathname === '/') {
      return index();
    }

    if (url.pathname === '/token') {
      let token_parameter = {
        headers: {
          'Host': 'auth.docker.io',
          'User-Agent': getReqHeader("User-Agent"),
          'Accept': getReqHeader("Accept"),
          'Accept-Language': getReqHeader("Accept-Language"),
          'Accept-Encoding': getReqHeader("Accept-Encoding"),
          'Connection': 'keep-alive',
          'Cache-Control': 'max-age=0'
        },
        cf: {
          cacheTtlByStatus: { "200-299": 120, "404": 10, "500-599": 3 }
        }
      };
      let token_url = auth_url + url.pathname + url.search
      return fetch(new Request(token_url, request), token_parameter)
    }

    url.hostname = hub_host;

    let parameter = {
      headers: {
        'Host': hub_host,
        'User-Agent': getReqHeader("User-Agent"),
        'Accept': getReqHeader("Accept"),
        'Accept-Language': getReqHeader("Accept-Language"),
        'Accept-Encoding': getReqHeader("Accept-Encoding"),
        'Connection': 'keep-alive',
        'Cache-Control': 'max-age=0'
      },
      redirect: 'follow',
      cf: {
        cacheTtlByStatus: { "200-299": 2592000, "404": 10, "500-599": 3 }
      },
    };

    if (request.headers.has("Authorization")) {
      parameter.headers.Authorization = getReqHeader("Authorization");
    }

    let res = await fetch(new Request(url, request), parameter)
    res = new Response(res.body, res)

    if (res.headers.has("Www-Authenticate")) {
      let auth = res.headers.get("Www-Authenticate");
      let re = new RegExp(auth_url, 'g');
      res.headers.set("Www-Authenticate", res.headers.get("Www-Authenticate").replace(re, workers_url));
    }

    return res;
  },
};

async function index() {
  return new Response(
    `<html lang="zh-CN">
    <head>
      <meta charset="UTF-8" />
      <meta name="viewport" content="width=device-width, initial-scale=1.0" />
      <title>Docker Hub Proxy</title>
      <style>
        body {
          background-color: #f9f9f9;
          margin: 0;
          padding: 0;
        }
        .container {
          max-width: 800px;
          margin: 2em auto;
          background-color: #ffffff;
          padding: 20px;
          border-radius: 12px;
          box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
        }
        h1 {
          font-size: 2.5em;
          margin-top: 0;
          margin-bottom: 20px;
          text-align: center;
          color: #333;
          border-bottom: 2px solid #ddd;
          padding-bottom: 0.5em;
        }
        p {
          color: #555;
          line-height: 1.8;
          text-align: center;
        }
        a {
          text-decoration: none;
          color: #007bff;
        }
        @media screen and (max-width: 768px) {
          .container {
            padding: 15px;
            margin: 2em 15px;
          }
          h1 {
            font-size: 1.8em;
          }
        }
      </style>
    </head>
    <body>
      <div class="container">
        <h1>Docker Hub Proxy</h1>
        <p>
          由
          <a target="_blank" href="https://www.8888.xyz">8888</a>
          强力驱动
        </p>
        <p id="cf"></p>
      </div>
      <script>
        async function updateCloudflareInfo() {
          try {
            const response = await fetch("/cdn-cgi/trace");
            if (response.ok) {
              const data = await response.text();
              const lines = data.split("\\n");
              const info = {};
              lines.forEach((line) => {
                const parts = line.split("=");
                if (parts.length === 2) {
                  info[parts[0]] = parts[1];
                }
              });
              const cfElement = document.getElementById("cf");
              const displayText =
                info.loc +
                " " +
                info.ip +
                " | " +
                info.colo +
                " | " +
                info.http +
                " | " +
                info.visit_scheme +
                " | " +
                info.tls +
                " | " +
                info.kex;
              cfElement.textContent = displayText;
            }
          } catch (error) {
            console.error("获取Cloudflare节点信息失败: ", error);
          }
        }
        window.addEventListener("load", updateCloudflareInfo);
      </script>
    </body>
</html>`,
    { headers: { "Content-Type": "text/html" } }
  );
}

步骤 5: 绑定域名

由于自带的 workers.dev 域名无法正常访问,还需要在 Settings -> Domains & Routes 绑定自己的域名

注意事项

  • 使用 Cloudflare 提供的 Workers 进行反代,需要注意,反代可能会违反 Cloudflare 的 ToS 导致账号违规。

  • hub_host:Docker Hub 的主机名。

  • auth_url:Docker 认证服务的 URL。

  • workers_url:您的 Workers 服务的 URL。

通过这种方式,你可以利用 Cloudflare 的全球网络加速 Docker 镜像的下载,同时绕过一些网络限制。这只是一个基本的示例,你可以根据需要调整和优化代码,以满足更具体的需求

0

评论区