Zxilly
Calm down
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

文章作者

发表回复

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,手动配证书麻烦。

      2 年前 回复

Zxilly's Blog

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