Leidun 发表于 2026-2-1 13:17:12

白嫖HFSpace的AWS基础设施用作DockerHub镜像源

本帖最后由 Leidun 于 2026-2-1 15:38 编辑

# HF-Space-DockerHub-Proxy

(https://github.com/hohouman/hf-space-dockerhub-proxy)

!(https://img.shields.io/github/license/hohouman/hf-space-dockerhub-proxy)
!(https://img.shields.io/badge/Docker-Registry-blue?logo=docker)
!(https://img.shields.io/badge/Deployed%20on-Hugging%20Face-yellow?logo=huggingface)
!(https://img.shields.io/badge/Deployed%20on-Cloudflare-orange?logo=cloudflare)

**基于 Hugging Face Space + Cloudflare Pages 的高可用、抗污染 Docker Hub 镜像加速方案。**

## 📖 背景与痛点

随着 Docker Hub 对匿名拉取限制的收紧(100次/6小时),以及对 Cloudflare 泛播 IP 的严格风控,传统的 "CF Worker 反代" 方案已难以稳定使用。

本方案通过 **Hugging Face Space** 作为中间层,利用其 AWS 基础设施“洗白”IP,并支持服务端强制注入账号认证,从而实现:
1.**解除限流**:将匿名请求转换为认证请求(Pro 账号无限拉取)。
2.**避开风控**:不再使用被 Docker Hub 标记的 Cloudflare IP 回源。
3.**抗污能力**:前端 Cloudflare 自定义域名解决 SNI 阻断。

---

## 🚀 部署指南

### 第一步:后端部署 (Hugging Face)

1.**创建 Space**:
    * 登录 (https://huggingface.co/new-space)。
    * **SDK**: 选择 `Docker`。
    * **Template**: 选择 `Blank`。
    * **Visibility**: 建议 `Public`(私有 Space 需额外处理 Token 鉴权)。

2.**配置 Dockerfile**:
    在 Space 文件列表中新建 `Dockerfile`:

    ```dockerfile
    FROM registry:2

    USER root

    # 端口配置 (HF Space 默认端口)
    ENV REGISTRY_HTTP_ADDR=:7860
    EXPOSE 7860

    # 开启 Proxy 模式 (指向官方源)
    ENV REGISTRY_PROXY_REMOTEURL=https://registry-1.docker.io

    # 注入认证信息 (核心步骤:解决 Rate Limit)
    # 变量值将在 Space 设置中读取,切勿直接写在 Dockerfile 里
    ENV REGISTRY_PROXY_USERNAME=${DOCKER_USER}
    ENV REGISTRY_PROXY_PASSWORD=${DOCKER_PASSWORD}

    # 允许删除 (可选)
    ENV REGISTRY_STORAGE_DELETE_ENABLED=true

    # 权限修正
    RUN mkdir -p /var/lib/registry && \
      chmod -R 777 /var/lib/registry

    CMD ["/etc/docker/registry/config.yml"]
    ```

3.**设置环境变量 (Secrets)**:
    进入 Space 的 **Settings** -> **Variables and secrets**,添加以下 Secrets:
    * `DOCKER_USER`: 你的 Docker Hub 用户名
    * `DOCKER_PASSWORD`: 你的 Docker Hub Access Token (推荐) 或密码

### 第二步:边缘部署 (Cloudflare Pages)

1.**准备 Worker 脚本**:
    在本地创建一个目录(例如 `proxy`),并在其中新建 `_worker.js` 文件:

    ```javascript
    // 请修改为你的 Hugging Face Space 域名
    const UPSTREAM_DOMAIN = "your-space-name.hf.space";

    export default {
      async fetch(request, env) {
      const url = new URL(request.url);
   
      // 仅放行 Docker V2 API
      if (!url.pathname.startsWith('/v2/')) {
            return new Response('Registry is active.', { status: 200 });
      }

       // 修改回源 Host
      url.hostname = UPSTREAM_DOMAIN;
      url.protocol = 'https:';

      // 构建新请求
      const newRequest = new Request(url, {
          method: request.method,
          headers: request.headers,
          body: request.body,
          redirect: 'follow'
      });

      return fetch(newRequest);
      }
    };
    ```

2.**部署到 Pages**:
    * 登录 Cloudflare Dashboard -> **Compute (Workers & Pages)** -> **Create Application** -> **Pages** -> **Upload assets**。
    * 上传包含 `_worker.js` 的目录。
    * 部署完成后,进入项目设置,绑定**自定义域名**(例如 `docker.yourdomain.com`)。
    * *注意:必须使用自定义域名,以防止CF 分配的 `*.pages.dev` 域名在某些地区被DNS污染。*

---

## 💻 客户端配置

修改服务器上的 `/etc/docker/daemon.json`:

```json
{
"registry-mirrors": [
    "https://docker.yourdomain.com"
]
}
```

重载配置并重启 Docker:

```bash
sudo systemctl daemon-reload && sudo systemctl restart docker
```

---

## ✅ 验证与常见问题

### 1. 测试拉取
```bash
docker pull busybox
```
如果能正常拉取,说明链路已打通。

### 2. 关于 "Cold Start" (冷启动)
免费版 Hugging Face Space 在闲置 48 小时后会进入休眠状态。
* **现象**:第一次 `docker pull` 可能会卡住或超时。
* **解决**:这是正常现象,HF 正在后台唤醒容器(Building/Starting)。等待约 1 分钟后再次重试即可。

### 3. 为什么需要 Docker Hub 账号?
如果不配置 `DOCKER_USER` 和 `PASSWORD`,请求实际上还是匿名的。虽然 HF 的 IP 质量比 CF 好,但依然受到 Docker Hub 对 IP 的匿名限流(单 IP 限制)。配置账号后,限制将变为针对账号(免费号 200次/6小时),且多个 HF Space 实例可复用同一账号额度。

Leidun 发表于 2026-2-4 00:22:36

{tieba33}这样用HF Space好容易封号,用Northflank好了

nannango58 发表于 2026-2-4 00:57:56

Leidun 发表于 2026-2-4 00:22
这样用HF Space好容易封号,用Northflank好了

毕竟本质还是HF做了代理, 而HF严打这玩意
(另外代理可以不发内板吗?)
页: [1]
查看完整版本: 白嫖HFSpace的AWS基础设施用作DockerHub镜像源