1 Commits

Author SHA1 Message Date
ciiiii
c737c70c48 Fix DockerHub library images default pulling case 2024-06-14 01:44:53 +08:00
7 changed files with 553 additions and 3627 deletions

View File

@@ -13,15 +13,15 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
name: Build & Deploy name: Build & Deploy
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v2
- name: Use Node.js
uses: actions/setup-node@v1
with:
node-version: "12.x"
- run: npm install
- name: Publish - name: Publish
uses: cloudflare/wrangler-action@v3 uses: cloudflare/wrangler-action@2.0.0
env:
CUSTOM_DOMAIN: ${{ secrets.CUSTOM_DOMAIN || 'libcuda.so' }}
with: with:
apiToken: ${{ secrets.CF_API_TOKEN }} apiToken: ${{ secrets.CF_API_TOKEN }}
accountId: ${{secrets.CF_ACCOUNT_ID}} env:
vars: CF_ACCOUNT_ID: ${{secrets.CF_ACCOUNT_ID}}
CUSTOM_DOMAIN
command: deploy --env production --minify src/index.js
environment: production

View File

@@ -2,19 +2,19 @@
![deploy](https://github.com/ciiiii/cloudflare-docker-proxy/actions/workflows/deploy.yaml/badge.svg) ![deploy](https://github.com/ciiiii/cloudflare-docker-proxy/actions/workflows/deploy.yaml/badge.svg)
[![Deploy to Cloudflare Workers](https://deploy.workers.cloudflare.com/button)](https://deploy.workers.cloudflare.com/?url=https://git.yinr.cc/Yinr/cloudflare-docker-proxy.git) [![Deploy to Cloudflare Workers](https://deploy.workers.cloudflare.com/button)](https://deploy.workers.cloudflare.com/?url=https://github.com/ciiiii/cloudflare-docker-proxy)
> If you're looking for proxy for helm, maybe you can try [cloudflare-helm-proxy](https://github.com/ciiiii/cloudflare-helm-proxy). > If you're looking for proxy for helm, maybe you can try [cloudflare-helm-proxy](https://github.com/ciiiii/cloudflare-helm-proxy).
## Deploy ## Deploy
1. click the "Deploy With Workers" button 1. fork this project
2. follow the instructions to fork and deploy 2. modify the link of the above button to your fork url
3. update routes as you requirement 3. click the button, you will be redirected to the deploy page
[![Deploy to Cloudflare Workers](https://deploy.workers.cloudflare.com/button)](https://deploy.workers.cloudflare.com/?url=https://git.yinr.cc/Yinr/cloudflare-docker-proxy.git) [![Deploy to Cloudflare Workers](https://deploy.workers.cloudflare.com/button)](https://deploy.workers.cloudflare.com/?url=https://github.com/ciiiii/cloudflare-docker-proxy)
## Routes configuration tutorial ## Config tutorial
1. use cloudflare worker host: only support proxy one registry 1. use cloudflare worker host: only support proxy one registry
```javascript ```javascript

3023
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -14,7 +14,7 @@
"scripts": { "scripts": {
"format": "prettier --write '**/*.{js,css,json,md}'", "format": "prettier --write '**/*.{js,css,json,md}'",
"build": "webpack", "build": "webpack",
"dev": "npx wrangler dev src/index.js --env dev" "dev": "wrangler dev src/index.js --env dev"
}, },
"license": "MIT", "license": "MIT",
"main": "src/index.js" "main": "src/index.js"

View File

@@ -6,18 +6,13 @@ addEventListener("fetch", (event) => {
const dockerHub = "https://registry-1.docker.io"; const dockerHub = "https://registry-1.docker.io";
const routes = { const routes = {
// production "docker.libcuda.so": dockerHub,
["docker." + CUSTOM_DOMAIN]: dockerHub, "quay.libcuda.so": "https://quay.io",
["quay." + CUSTOM_DOMAIN]: "https://quay.io", "gcr.libcuda.so": "https://gcr.io",
["gcr." + CUSTOM_DOMAIN]: "https://gcr.io", "k8s-gcr.libcuda.so": "https://k8s.gcr.io",
["k8s-gcr." + CUSTOM_DOMAIN]: "https://k8s.gcr.io", "k8s.libcuda.so": "https://registry.k8s.io",
["k8s." + CUSTOM_DOMAIN]: "https://registry.k8s.io", "ghcr.libcuda.so": "https://ghcr.io",
["ghcr." + CUSTOM_DOMAIN]: "https://ghcr.io", "cloudsmith.libcuda.so": "https://docker.cloudsmith.io",
["cloudsmith." + CUSTOM_DOMAIN]: "https://docker.cloudsmith.io",
["ecr." + CUSTOM_DOMAIN]: "https://public.ecr.aws",
// staging
["docker-staging." + CUSTOM_DOMAIN]: dockerHub,
}; };
function routeByHosts(host) { function routeByHosts(host) {
@@ -32,9 +27,6 @@ function routeByHosts(host) {
async function handleRequest(request) { async function handleRequest(request) {
const url = new URL(request.url); const url = new URL(request.url);
if (url.pathname == "/") {
return Response.redirect(url.protocol + "//" + url.host + "/v2/", 301);
}
const upstream = routeByHosts(url.hostname); const upstream = routeByHosts(url.hostname);
if (upstream === "") { if (upstream === "") {
return new Response( return new Response(
@@ -61,10 +53,25 @@ async function handleRequest(request) {
redirect: "follow", redirect: "follow",
}); });
if (resp.status === 401) { if (resp.status === 401) {
return responseUnauthorized(url); if (MODE == "debug") {
headers.set(
"Www-Authenticate",
`Bearer realm="http://${url.host}/v2/auth",service="cloudflare-docker-proxy"`
);
} else {
headers.set(
"Www-Authenticate",
`Bearer realm="https://${url.hostname}/v2/auth",service="cloudflare-docker-proxy"`
);
} }
return new Response(JSON.stringify({ message: "UNAUTHORIZED" }), {
status: 401,
headers: headers,
});
} else {
return resp; return resp;
} }
}
// get token // get token
if (url.pathname == "/v2/auth") { if (url.pathname == "/v2/auth") {
const newUrl = new URL(upstream + "/v2/"); const newUrl = new URL(upstream + "/v2/");
@@ -108,23 +115,9 @@ async function handleRequest(request) {
const newReq = new Request(newUrl, { const newReq = new Request(newUrl, {
method: request.method, method: request.method,
headers: request.headers, headers: request.headers,
// don't follow redirect to dockerhub blob upstream
redirect: isDockerHub ? "manual" : "follow",
});
const resp = await fetch(newReq);
if (resp.status == 401) {
return responseUnauthorized(url);
}
// handle dockerhub blob redirect manually
if (isDockerHub && resp.status == 307) {
const location = new URL(resp.headers.get("Location"));
const redirectResp = await fetch(location.toString(), {
method: "GET",
redirect: "follow", redirect: "follow",
}); });
return redirectResp; return await fetch(newReq);
}
return resp;
} }
function parseAuthenticate(authenticateStr) { function parseAuthenticate(authenticateStr) {
@@ -149,28 +142,9 @@ async function fetchToken(wwwAuthenticate, scope, authorization) {
if (scope) { if (scope) {
url.searchParams.set("scope", scope); url.searchParams.set("scope", scope);
} }
const headers = new Headers(); headers = new Headers();
if (authorization) { if (authorization) {
headers.set("Authorization", authorization); headers.set("Authorization", authorization);
} }
return await fetch(url, { method: "GET", headers: headers }); return await fetch(url, { method: "GET", headers: headers });
} }
function responseUnauthorized(url) {
const headers = new Headers();
if (MODE == "debug") {
headers.set(
"Www-Authenticate",
`Bearer realm="http://${url.host}/v2/auth",service="cloudflare-docker-proxy"`
);
} else {
headers.set(
"Www-Authenticate",
`Bearer realm="https://${url.hostname}/v2/auth",service="cloudflare-docker-proxy"`
);
}
return new Response(JSON.stringify({ message: "UNAUTHORIZED" }), {
status: 401,
headers: headers,
});
}

View File

@@ -1,30 +1,18 @@
name = "cloudflare-docker-proxy" name = "cloudflare-docker-proxy"
compatibility_date = "2023-12-01" workers_dev = true
main = "src/index.js"
compatibility_date = "2021-12-07"
[dev] [dev]
ip = "0.0.0.0" ip = "0.0.0.0"
port = 8787 port = 8787
local_protocol = "http" local_protocol="http"
upstream_protocol="https"
[env.vars] [vars]
CUSTOM_DOMAIN = "lolicon.in" MODE="production"
TARGET_UPSTREAM=""
[env.dev.vars] [env.dev.vars]
MODE = "debug" MODE="debug"
TARGET_UPSTREAM = "https://registry-1.docker.io" TARGET_UPSTREAM="https://registry-1.docker.io"
CUSTOM_DOMAIN = "exmaple.com"
[env.production]
name = "cloudflare-docker-proxy"
[env.production.vars]
MODE = "production"
TARGET_UPSTREAM = ""
[env.staging]
name = "cloudflare-docker-proxy-staging"
# route = { pattern = "docker-staging.libcuda.so", custom_domain = true }
[env.staging.vars]
MODE = "staging"
TARGET_UPSTREAM = ""

1013
yarn.lock

File diff suppressed because it is too large Load Diff