Zxilly
Try to be 1%
Zxilly's Blog

使用 Caddy 反代 ghcr.io

背景

我们今天遇到的问题是在中国大陆服务器上, Docker 拉取托管于 ghcr.ioImage 极端缓慢。

原理及方案

Docker 的通信协议基于标准 http,可以通过反代并替换对应的字符串来完成劫持对应的 manifest 文件。

配置文件

因为是在新服务器上配置,所以选择了易于配置的 Caddy

ghcr.io 选择将 APIImage 二进制文件 在不同的服务器上提供,通过 HTTP 307 从 API 跳转到文件服务器,因此我们也对应需要配置两个 vhost,可以被部署在不同的服务器上。

警告
这个配置文件依赖 ueffel/caddy-brotlicaddyserver/replace-response,请使用 caddy 自行编译。

Caddyfile (API-server)

ghcr.example.com {
    encode br gzip
    log {
        output stdout
    }
    reverse_proxy {
        to https://ghcr.io
        header_up Host ghcr.io
        header_down Location pkg-containers.githubusercontent.com pkg.example.com
    }
    replace {
        ghcr.io ghcr.example.com
    }
}

Caddyfile (Binary Server)

pkg.example.com {
    reverse_proxy {
        to https://pkg-containers.githubusercontent.com
        header_up Host pkg-containers.githubusercontent.com
    }
}

使用

ghcr.io 的镜像对应替换为 ghcr.example.com,即可正常 pull

样例

docker pull ghcr.io/zxilly/yearmaps:latest
# to
docker pull ghcr.example.com/zxilly/yearmaps:latest

Zxilly

文章作者

回复 kovacs 取消回复

textsms
account_circle
email

  • 解决了我的问题,赞一个

    2年前 回复
  • kovacs

    哈哈哈 居然有人在跟我干同样的事… 我也是折腾了半天; 折腾完了突然想起来看看有没有其他人有更好的方案…

    测试如果通过头部处理方案还需要替换一下 `Www-Authenticate`, 否则拿 Token 还会发到 ghcr.io;
    我一直在想能不能通过 `handle_response` 做到, 但是尴尬的是 再套 `reverse_proxy` 取 `{rp.header.Location}` 带查询参数… 不支持

    2年前 回复
    • Zxilly博主

      @kovacs: caddy 不能这么搞,nginx 可以,关键字 follow redirect。
      主要是这台服务器上没有 nginx,手动配证书麻烦。

      1年前 回复

Zxilly's Blog

使用 Caddy 反代 ghcr.io
背景 我们今天遇到的问题是在中国大陆服务器上, Docker 拉取托管于 ghcr.io 的 Image 极端缓慢。 原理及方案 Docker 的通信协议基于标准 http,可以通过反代并替换对应的字符串来完成劫…
扫描二维码继续阅读
2022-04-27