Docker
服务搭建
Docker-笔记类
Docker-Wiki.js
Docker-Trilium(个人云笔记)
Docker-MrDoc(觅思文档)
Docker-MinDoc(文档管理系统)
Docker-Wiz(为知笔记)
Docker-Wizard(开源文档管理系统)
Docker-siyuan(思源笔记)
Docker-Athensresearch(雅典)
Docker-Logseq(日志序列)
Docker-Joplin Server(需搭配APP)
MarkDown-进阶
Docker-AFFiNE(白板文档)
Docker-Obsidian(黑曜石)
Html-文章保护
Docker-Memos(备忘录)
Docker-Etherpad(实时协作在线编辑器)
Docker-AppFlowy
Docker-DokuWiki(维基)
Docker-小书匠
Docker-MD(微信 Markdown编辑器)
Docker-Halo(个人博客)
闲置宽带利用
甜糖
网心云
点心云
Docker-JS TOOL(京豆)
Docker-Gitea(代码托管平台)
Git使用小技巧
Git-命令推送
Git-常用命令
Docker-CentOS
Docker-iperf3(网络测速)
Docker-QingLong(青龙面板)
🚫青龙-NolanJDCloud
青龙-Ninja
青龙-京豆
青龙-互助码
青龙-WxPusher(通知)
青龙-其他脚本
青龙-bilibili
青龙-短视频金币
青龙-常见问题
青龙-迁移
青龙-快速部署
Docker-EMQX(MQTT服务器)
EMQX-高级操作
Docker-Home Assistant
Docker-RustDesk(远程桌面)
Docker-邮箱系统
Docker-SRS(直播服务器)
Docker-Bitwarden(密码服务器)
Bitwarden-TOTP(双因素认证2FA)
Docker-书签/导航
Docker-OneNav
Docker-Flare
Docker-WebStack
Docker-GEEKAPE
Docker-nav(发现导航)
Docker-Linkding(网络书签)
Docker-Wallabag(网络书签)
Docker-Benotes(书签)
Docker-LyLme Spage(六零导航页)
Docker-Homarr(浏览器仪表板)
Docker-Sun-Panel
Docker-Nginx
Docker-nginxWebUI(反向代理)
Docker-Nginx Proxy Manager
Docker-Nginx Config(配置生成器)
Docker-Nginx UI
Nginx-配置详细说明
PHP扩展
Nginx-安全
Nginx-Shell管理脚本
Docker-Redis
Docker-Jupyter(Python在线环境)
JupyterHub(支持课程管理)
Jupyter(单用户)
Jupyter-OpenCV
JupyterHub-自构建
Docker-LiveTorrent(磁力链在线解析)
Docker-OpenVPN
OpenVPN-配置注释
OpenVPN-基础部署
OpenVPN-一键脚本部署
OpenVPN-访问内部设备
OpenVPN-ovpn-admin(WebUI)
Docker-Switch联机
Docker-网站统计
Docker-Umami
Docker-Matomo
Docker-IPsecVPN
Docker-Zerotier(虚拟组网)
ZeroTier-Planet(星球)
Zerotier-Moons(月亮)
Zerotier-伪根服务器(修改UI)
ZeroTier-局域组网
Docker-Linux
Docker-Screeps 服务器
Docker-Harbor(Docker 镜像服务器)
Harbor-镜像迁移
docker-mirror(镜像转存工具)
Docker-Reader(网文阅读器)
Docker-聊天类
Docker-Rocket.chat(IM聊天系统)
Docker-Fiora(二次元聊天室)
Docker-Mattermost(开发者聊天室)
Docker-唐僧叨叨
Docker-Mastodon
Docker-VoceChat
Docker-blogChat(在线聊天室)
Docker-NASTools(影音库工具)
Docker-Lottery(抽奖程序)
Docker-VSCode Web版
Docker-临时分享类
Docker-PasteMe(自销毁小纸条)
Docker-PasteBin(临时分享)
Docker-Pingvin Share(文件分享)
Docker-Snapdrop(局域网传输)
Docker-FileCodeBox(文件快递柜)
Docker-microbin(临时分享)
Docker-PairDrop(局域网传输)
Docker-FastSend(文件快传)
Docker-internal-chat(局域网文字/文件)
Docker-Enclosed(私密安全笔记)
Docker-任务管理类
Docker-TAIGA(看板)
Docker-Focalboard(看板)
Docker-DooTask(轻量级任务管理工具)
Docker-Vikunja(待办事项)
Docker-Tasks.md(任务管理板)
Docker-Send(私密文件分享)
Docker-ScreeGo(在线多人屏幕分享)
Docker-ChatGPT
ChatGPT(伪)-部署
ChatGPT-未测试项目
ChatGPT-ChatGPT Web
🚫ChatGPT-ChatGPT Vercel
🚫ChatGPT-PandoraNext(潘多拉)
🚫ChatGPT-PandoraNext-Helper(Token管理)
Docker-kkFileView(文件在线预览)
Docker-问卷考试类
Docker-学之思(开源考试系统)
Docker-文字识别类(OCR)
Docker-OCR(Python)
Docker-Paperless-ngx(无纸化)
Docker-短链类
Docker-Yourls(短链)
Worker短链(CloudFlare)
Docker-GreaterWMS(仓管系统)
Docker-内网穿透
Docker-Frp
Docker-NPS
Frp-客户端配置工具
Docker-Frp-Panel
Docker-OpenP2P
Docker-网盘
Docker-AList(云盘直链)
🚫Docker-FileRun(个人网盘)
Docker-腾飞WebOS
Docker-Cloudreve(支持WebDAV子账户)
Docker-Seafile
Docker-ZFile
Docker-Dufs(轻量文件服务器)
Docker-FileGator
Docker-SSH/远程桌面
Docker-Guacamole(远程桌面)
Docker-Nexterm(服务器管理软件)
Docker-Sshwifty(SSH&Telnet客户端)
Docker-Next Terminal(Web终端)
Docker-CF_Tunnels(隧道)
Docker-RouYi_WMS
Docker-图形化管理工具
Docker-Portainer(图形化管理工具)
Docker-SimpleDocker(Docker控制面板)
Docker-Easypanel(易面板)
Docker-DockerUI(国内图形化)
Docker-1Panel
Docker-宝塔
Docker-lazydocker(Shell UI)
Docker-⭐DPanel(可视化管理面板)
Docker-⭐Dockge(docker-compose管理器)
Docker-Dokploy(PaaS)
Docker-UpSnap(局域网唤醒)
Docker-Watchtower(自动更新)
Docker-RunnerGo(全栈测试)
Docker-Web工具箱
Docker-Stirling-PDF(PDF工具)
Docker-IT Tools(IT工具箱)
Docker-Reference(速查神器)
Docker-Photopea(在线PS)
Docker-miniPaint(在线PS)
Docker-Morphos(文件转换)
Docker-证件照片排版
Docker-网易云解锁
Docker-nondanee_UnblockNeteaseMusic
Docker-UnblockNeteaseMusic
Docker-LX Music_Sync(数据同步)
Docker-在线白板类
Docker-Wbo(协作白板)
Docker-Excalidraw+(在线白板)
Docker-tldraw
Docker-Cook(今天吃什么)
Docker-Android
Docker-QD(自动签到)
QD-使用说明
Docker-消息推送(通知)
Docker-Wecom酱
Docker-Gotify(消息通知)
Docker-WeChatBot(微信机器人)
Docker-lumen项目部署
Docker-简历构建器
Docker-Open Resume
Docker-Reactive Resume
Docker-照片备份
Docker-Immich
Docker-vlmcsd(KMS)
Docker-Papermerge(数字档案文件管理系统)
Docker-SearXNG(搜索引擎)
Docker-Snipe-IT(资产管理)
Docker-Moments(极简朋友圈)
Docker-neko(浏览器)
Docker-AsPoem(诗词网站)
Docker-CMS(内容管理系统)
Docker-Ikaros(个人内容管家)
Docker-JPress
Docker-OneKVM(类向日葵控控)
Docker-OS(系统)
Docker-DSM(群晖)
Docker-OSX(MacOS)
Docker-Puter(云端系统)
Docker-GodoOS(内网办公操作系统)
Docker-Nextcloud
Docker-KodCloud(可道云)
Docker-MacOS
Docker-Windows
Docker-Ferry(工单系统)
Docker-HivisionIDPhotos(AI证件照)
Docker-IPTVnator(IPTV播放器)
Docker-SQL工具
Docker-SQLynx
Docker-STUN/TURN(Coturn)
Docker-gocron(定时任务管理系统)
Docker-paopao-ce(微社区)
Docker-JSON Hero(JSON浏览器)
Docker-n8n(工作流自动化)
Docker-Aria2
Docker-NTP(时间服务器)
Docker-EasyTier(异地组网)
Linux-EasyTier
EasyTier-配置文件
Docker-Domain Admin(域管理员)
Docker-WPS
卷的使用
备份与还原
各种开源项目(未测试)
限制资源
开放端口调整
更换 Docker 源
镜像转存DockerHub
DockerHub 代理加速(Cloudflare Worker)
Docker 代理加速(Cloudflare Worker)
代理加速
⭐CF-Workers-docker(DockerHub 加速)
docker run 转 docker-compose
Docker 解释
Dockerfile(自建镜像)
使用第三方构建
多阶段构建(缩小体积)
Docker的备份服务器
Kasm(Web服务)
Docker-备份与还原
Docker-volume(卷)
Docker-network(网络)
Linux 安装 Docker
Windows 安装 Docker
Win7 安装 Docker
游戏服务器搭建
Docker-Valheim(英灵神殿)
Docker-jsnes(在线NES)
Docker-7DaysToDie(七日杀)
7DaysToDie-配置文件
Docker-Conan Exiles(流放者柯南)
Docker-noname(无名杀)
Docker-Epic游戏商城每周免费游戏
Docker-Terraria(泰拉瑞亚)
泰拉瑞亚-服务器
Terrari-存档同步
Docker-Mindustry(像素工厂)
Docker-Habitica(习惯养成RPG)
Docker-RetroArch(在线模拟器)
Docker-vue-idle-game(轮回勇士传说)
Docker-Phira(Phigros 二创版)
Docker-Pterodactyl(翼龙面板⭐)
Pterodactyl-自建预设(游戏部署脚本)
Docker-GamePanelX-V3(游戏面板)
Docker-MCSManager(游戏面板⭐)
Docker-Easy-WI(游戏面板)
Docker-常见问题处理
Podman(Docker替代品)
Docker-Linux Command(Linux命令搜索引擎)
Docker-修改存储位置
Dockerc(编译为独立二进制文件)
slim(镜像瘦身)
Docker-API(远程连接)
Docker-cloudbak(云朵备份)
本文档使用 MrDoc 发布
-
+
首页
Docker 代理加速(Cloudflare Worker)
使用 `Cloudflare Worker` 部署代理 **相关链接:** - Cloudflare:https://dash.cloudflare.com/ - cloudflare-docker-proxy:https://github.com/ciiiii/cloudflare-docker-proxy - 我的转存:https://github.com/ai773203918/cloudflare-docker-proxy (增加 Web使用提示) - Cloudflare Docs:https://developers.cloudflare.com/ - Wrangler:https://developers.cloudflare.com/workers/get-started/guide/ - wrangler.toml:https://developers.cloudflare.com/workers/wrangler/configuration/ ## Wrangler 部署至 Cloudflare Workers ```bash # 安装 npm # npm create cloudflare@latest # 创建新的 Worker 项目 npm create cloudflare@latest -- --template https://github.com/ai773203918/cloudflare-docker-proxy # 从外部源创建项目 # 修改 项目文件(参考下方的 项目文件修改说明) npx wrangler dev # 开发测试 npx wrangler deploy # 部署项目 ``` ## GitHub 部署至 Cloudflare Workers fork [cloudflare-docker-proxy](https://github.com/ciiiii/cloudflare-docker-proxy) 仓库到自己账号下 根据 [项目文件修改说明](#项目文件修改说明) 进行修改 ### 修改 `README.md` 修改 Deploy with Workers 自动部署地址为自己转存地址 ```md # 修改 Deploy with Workers 图标对应链接(两个都修改) # 原链接 https://deploy.workers.cloudflare.com/?url=https://github.com/ciiiii/cloudflare-docker-proxy # 修改后链接 https://deploy.workers.cloudflare.com/?url=https://github.com/ai773203918/cloudflare-docker-proxy ``` ### 部署 1. 点击 [](https://deploy.workers.cloudflare.com/?url=https://github.com/ai773203918/cloudflare-docker-proxy) 图标进行部署 2. 根据提示操作 Cloudflare 的 [Account ID](https://dash.cloudflare.com/?to=/:account/workers)(是 账户ID 而非账户),[API Token](https://dash.cloudflare.com/profile/api-tokens)(使用具有 `编辑 Cloudflare Workers` 权限的API令牌) 3. [Github](https://github.com/ai773203918/cloudflare-docker-proxy) 查看 [Action](https://github.com/ai773203918/cloudflare-docker-proxy/actions) 执行进度 4. [Cloudflare Dashboard](https://dash.cloudflare.coms/) 查看创建的 Worker 5. 等待 `Workers 和 Pages——{刚创建项目}——设置——触发器` 自定义域 中证书签发后即可使用 ## 项目文件修改说明 已下为需修改点 ### 修改 `src/index.js`,修改你的域名对应至仓库 ```js // 修改绑定域名 const routes = { "docker.918178.xyz": "https://registry-1.docker.io", "quay.918178.xyz": "https://quay.io", "gcr.918178.xyz": "https://gcr.io", "k8s-gcr.918178.xyz": "https://k8s.gcr.io", "k8s.918178.xyz": "https://registry.k8s.io", "ghcr.918178.xyz": "https://ghcr.io", "cloudsmith.918178.xyz": "https://docker.cloudsmith.io", }; // 加载 help.html 文件(帮助页面) import DOCS from './help.html' // 添加到头部即可 // 添加帮助页面的根路由(/) const isDockerHub = upstream == dockerHub; // 参考位置 const authorization = request.headers.get("Authorization"); // 参考位置 // 添加到该位置👇 if (url.pathname === "/") { return new Response(DOCS, { status: 200, headers: { "content-type": "text/html" } }); } ``` ### 修改 `wrangler.toml`,修改你的域名(会自动添加 Cloudflare Workers 自定义域) ```bash # 修改绑定域名 [env.production] name = "cloudflare-docker-proxy" routes = [ { pattern = "docker.918178.xyz", custom_domain = true }, { pattern = "quay.918178.xyz", custom_domain = true }, { pattern = "gcr.918178.xyz", custom_domain = true }, { pattern = "k8s-gcr.918178.xyz", custom_domain = true }, { pattern = "k8s.918178.xyz", custom_domain = true }, { pattern = "ghcr.918178.xyz", custom_domain = true }, { pattern = "cloudsmith.918178.xyz", custom_domain = true }, ] [env.production.vars] MODE = "production" TARGET_UPSTREAM = "" [env.staging] name = "cloudflare-docker-proxy-staging" route = { pattern = "docker-staging.918178.xyz", custom_domain = true } ``` ### 添加 `src/help.html`,帮助页面 ```html <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>镜像使用说明_造物者W</title> <style> body { font-family: 'Roboto', sans-serif; margin: 0; padding: 0; background-color: #f4f4f4; } .header { background: linear-gradient(135deg, #667eea, #764ba2); color: #fff; padding: 20px 0; text-align: center; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); position: relative; } .github-link { position: absolute; top: 10px; right: 20px; color: #fff; text-decoration: none; } .github-icon { width: 24px; height: 24px; vertical-align: middle; } .container { max-width: 800px; margin: 40px auto; padding: 20px; background-color: #fff; box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); border-radius: 10px; } .content { margin-bottom: 20px; } .footer { text-align: center; padding: 20px 0; background-color: #333; color: #fff; } pre { background-color: #272822; color: #f8f8f2; padding: 15px; border-radius: 5px; overflow-x: auto; } code { font-family: 'Source Code Pro', monospace; } a { color: #4CAF50; text-decoration: none; } a:hover { text-decoration: underline; } @media (max-width: 600px) { .container { margin: 20px; padding: 15px; } .header { padding: 15px 0; } } </style> <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;700&family=Source+Code+Pro:wght@400;700&display=swap" rel="stylesheet"> </head> <body> <div class="header"> <h1>镜像使用说明</h1> <a href="https://github.com/ai773203918/cloudflare-docker-proxy" target="_blank" class="github-link"> <img src="https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png" alt="GitHub" class="github-icon"> </a> </div> <div class="container"> <div class="content"> <p>为了加速 Docker 镜像拉取,你可以使用以下命令设置 registry mirror:</p> <pre><code id="registry-config">sudo tee /etc/docker/daemon.json <<EOF { "registry-mirrors": ["https://{{host}}"] } EOF # 配置完后需要重启 Docker 服务 sudo systemctl restart docker </code></pre> <p>使用该代理从不同的镜像仓库拉取镜像,请参考以下命令:</p> <pre><code id="commands"> # docker pull nginx:latest docker pull docker.{{host}}/library/nginx:latest # 拉取 Docker 官方镜像(library 不可省略) # docker pull quay.io/coreos/etcd:latest docker pull quay.{{host}}/coreos/etcd:latest # 拉取 Quay 镜像 # docker pull gcr.io/google-containers/busybox:latest docker pull gcr.{{host}}/google-containers/busybox:latest # 拉取 GCR 镜像 # docker pull k8s.gcr.io/pause:latest docker pull k8s-gcr.{{host}}/pause:latest # 拉取 k8s.gcr.io 镜像 # docker pull registry.k8s.io/pause:latest docker pull k8s.{{host}}/pause:latest # 拉取 registry.k8s.io 镜像 # docker pull ghcr.io/github/super-linter:latest docker pull ghcr.{{host}}/github/super-linter:latest # 拉取 GitHub 容器镜像 # docker pull docker.cloudsmith.io/public/repo/image:latest docker pull cloudsmith.{{host}}/public/repo/image:latest # 拉取 Cloudsmith 镜像 </code></pre> <p>为了避免 Worker 用量耗尽,你可以手动 pull 镜像然后 re-tag 之后 push 至本地镜像仓库。</p> </div> </div> <div class="footer"> <p>由 Cloudflare Workers 提供支持</p> <p><a href="https://doc.918178.xyz" target="_blank">造物者W</a></p> </div> <script> document.addEventListener('DOMContentLoaded', function() { const host = window.location.hostname; const mainDomain = host.split('.').slice(-2).join('.'); const registryConfigElement = document.getElementById('registry-config'); const commandsElement = document.getElementById('commands'); registryConfigElement.innerHTML = registryConfigElement.innerHTML.replace(/{{host}}/g, host); commandsElement.innerHTML = commandsElement.innerHTML.replace(/{{host}}/g, mainDomain); }); </script> </body> </html> ``` ## 手动部署 `worker.js` Web页面整合一起的 ```js addEventListener("fetch", (event) => { event.passThroughOnException(); event.respondWith(handleRequest(event.request)); }); const dockerHub = "https://registry-1.docker.io"; // 修改为你的域名(多域名),然后添加对应的自定义域 const routes = { // production "docker.918178.xyz": dockerHub, "quay.918178.xyz": "https://quay.io", "gcr.918178.xyz": "https://gcr.io", "k8s-gcr.918178.xyz": "https://k8s.gcr.io", "k8s.918178.xyz": "https://registry.k8s.io", "ghcr.918178.xyz": "https://ghcr.io", "cloudsmith.918178.xyz": "https://docker.cloudsmith.io", // staging "docker-staging.918178.xyz": dockerHub, }; // Web页面 const htmlContent = ` <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>镜像使用说明_造物者W</title> <style> body { font-family: 'Roboto', sans-serif; margin: 0; padding: 0; background-color: #f4f4f4; } .header { background: linear-gradient(135deg, #667eea, #764ba2); color: #fff; padding: 20px 0; text-align: center; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); position: relative; } .github-link { position: absolute; top: 10px; right: 20px; color: #fff; text-decoration: none; } .github-icon { width: 24px; height: 24px; vertical-align: middle; } .container { max-width: 800px; margin: 40px auto; padding: 20px; background-color: #fff; box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); border-radius: 10px; } .content { margin-bottom: 20px; } .footer { text-align: center; padding: 20px 0; background-color: #333; color: #fff; } pre { background-color: #272822; color: #f8f8f2; padding: 15px; border-radius: 5px; overflow-x: auto; } code { font-family: 'Source Code Pro', monospace; } a { color: #4CAF50; text-decoration: none; } a:hover { text-decoration: underline; } @media (max-width: 600px) { .container { margin: 20px; padding: 15px; } .header { padding: 15px 0; } } </style> <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;700&family=Source+Code+Pro:wght@400;700&display=swap" rel="stylesheet"> </head> <body> <div class="header"> <h1>镜像使用说明</h1> <a href="https://github.com/ai773203918/cloudflare-docker-proxy" target="_blank" class="github-link"> <img src="https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png" alt="GitHub" class="github-icon"> </a> </div> <div class="container"> <div class="content"> <p>为了加速 Docker 镜像拉取,你可以使用以下命令设置 registry mirror:</p> <pre><code id="registry-config">sudo tee /etc/docker/daemon.json <<EOF { "registry-mirrors": ["https://{{host}}"] } EOF # 配置完后需要重启 Docker 服务 sudo systemctl restart docker </code></pre> <p>使用该代理从不同的镜像仓库拉取镜像,请参考以下命令:</p> <pre><code id="commands"> # docker pull nginx:latest docker pull docker.{{host}}/library/nginx:latest # 拉取 Docker 官方镜像(library 不可省略) # docker pull quay.io/coreos/etcd:latest docker pull quay.{{host}}/coreos/etcd:latest # 拉取 Quay 镜像 # docker pull gcr.io/google-containers/busybox:latest docker pull gcr.{{host}}/google-containers/busybox:latest # 拉取 GCR 镜像 # docker pull k8s.gcr.io/pause:latest docker pull k8s-gcr.{{host}}/pause:latest # 拉取 k8s.gcr.io 镜像 # docker pull registry.k8s.io/pause:latest docker pull k8s.{{host}}/pause:latest # 拉取 registry.k8s.io 镜像 # docker pull ghcr.io/github/super-linter:latest docker pull ghcr.{{host}}/github/super-linter:latest # 拉取 GitHub 容器镜像 # docker pull docker.cloudsmith.io/public/repo/image:latest docker pull cloudsmith.{{host}}/public/repo/image:latest # 拉取 Cloudsmith 镜像 </code></pre> <p>为了避免 Worker 用量耗尽,你可以手动 pull 镜像然后 re-tag 之后 push 至本地镜像仓库。</p> </div> </div> <div class="footer"> <p>由 Cloudflare Workers 提供支持</p> <p><a href="https://doc.918178.xyz" target="_blank">造物者W</a></p> </div> <script> document.addEventListener('DOMContentLoaded', function() { const host = window.location.hostname; const mainDomain = host.split('.').slice(-2).join('.'); const registryConfigElement = document.getElementById('registry-config'); const commandsElement = document.getElementById('commands'); registryConfigElement.innerHTML = registryConfigElement.innerHTML.replace(/{{host}}/g, host); commandsElement.innerHTML = commandsElement.innerHTML.replace(/{{host}}/g, mainDomain); }); </script> </body> </html> ` function routeByHosts(host) { if (host in routes) { return routes[host]; } if (MODE == "debug") { return TARGET_UPSTREAM; } return ""; } async function handleRequest(request) { const url = new URL(request.url); const upstream = routeByHosts(url.hostname); if (upstream === "") { return new Response( JSON.stringify({ routes: routes, }), { status: 404, } ); } const isDockerHub = upstream == dockerHub; const authorization = request.headers.get("Authorization"); // return docs if (url.pathname === "/") { return new Response(htmlContent, { status: 200, headers: { "content-type": "text/html" } }); } if (url.pathname == "/v2/") { const newUrl = new URL(upstream + "/v2/"); const headers = new Headers(); if (authorization) { headers.set("Authorization", authorization); } // check if need to authenticate const resp = await fetch(newUrl.toString(), { method: "GET", headers: headers, redirect: "follow", }); if (resp.status === 401) { 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; } } // get token if (url.pathname == "/v2/auth") { const newUrl = new URL(upstream + "/v2/"); const resp = await fetch(newUrl.toString(), { method: "GET", redirect: "follow", }); if (resp.status !== 401) { return resp; } const authenticateStr = resp.headers.get("WWW-Authenticate"); if (authenticateStr === null) { return resp; } const wwwAuthenticate = parseAuthenticate(authenticateStr); let scope = url.searchParams.get("scope"); // autocomplete repo part into scope for DockerHub library images // Example: repository:busybox:pull => repository:library/busybox:pull if (scope && isDockerHub) { let scopeParts = scope.split(":"); if (scopeParts.length == 3 && !scopeParts[1].includes("/")) { scopeParts[1] = "library/" + scopeParts[1]; scope = scopeParts.join(":"); } } return await fetchToken(wwwAuthenticate, scope, authorization); } // redirect for DockerHub library images // Example: /v2/busybox/manifests/latest => /v2/library/busybox/manifests/latest if (isDockerHub) { const pathParts = url.pathname.split("/"); if (pathParts.length == 5) { pathParts.splice(2, 0, "library"); const redirectUrl = new URL(url); redirectUrl.pathname = pathParts.join("/"); return Response.redirect(redirectUrl, 301); } } // foward requests const newUrl = new URL(upstream + url.pathname); const newReq = new Request(newUrl, { method: request.method, headers: request.headers, redirect: "follow", }); return await fetch(newReq); } function parseAuthenticate(authenticateStr) { // sample: Bearer realm="https://auth.ipv6.docker.com/token",service="registry.docker.io" // match strings after =" and before " const re = /(?<=\=")(?:\\.|[^"\\])*(?=")/g; const matches = authenticateStr.match(re); if (matches == null || matches.length < 2) { throw new Error(`invalid Www-Authenticate Header: ${authenticateStr}`); } return { realm: matches[0], service: matches[1], }; } async function fetchToken(wwwAuthenticate, scope, authorization) { const url = new URL(wwwAuthenticate.realm); if (wwwAuthenticate.service.length) { url.searchParams.set("service", wwwAuthenticate.service); } if (scope) { url.searchParams.set("scope", scope); } headers = new Headers(); if (authorization) { headers.set("Authorization", authorization); } return await fetch(url, { method: "GET", headers: headers }); } ``` 部署后在 `Cloudflare Worker——设置——触发器` 添加对应的`自定义域` ## 使用 直接访问 [https://docker.918178.xyz/](https://docker.918178.xyz/) 即可查看使用提示 需注意的是 DockerHub 的官方库无法识别需要带 `library` 使用 如:`docker pull nginx → docker pull docker.918178.xyz/library/nginx` **相关教程:** [基于 Cloudflare Workers 和 cloudflare-docker-proxy 搭建镜像加速服务](https://www.lixueduan.com/posts/docker/12-docker-mirror/)
造物者W
2024年6月30日 21:58
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码