Skip to content

Commit df3e45b

Browse files
authored
Merge pull request #13 from sky22333/test
🎉 v1.1.0
2 parents db9d11a + 118296e commit df3e45b

21 files changed

+3058
-2825
lines changed

Dockerfile

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,6 @@ FROM alpine
1111

1212
WORKDIR /root/
1313

14-
# 安装依赖
15-
RUN apk add --no-cache skopeo
16-
1714
COPY --from=builder /app/hubproxy .
1815
COPY --from=builder /app/config.toml .
1916

README.md

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@
66

77
## ✨ 特性
88

9-
- 🐳 **Docker 镜像加速** - 单域名实现 Docker Hub、GHCR、Quay 等多个镜像仓库加速,以及优化拉取速度
10-
- 🐳 **离线镜像包** - 支持批量下载离线镜像包
9+
- 🐳 **Docker 镜像加速** - 单域名实现 Docker Hub、GHCR、Quay 等多个镜像仓库加速,流式传输优化拉取速度
10+
- 🐳 **离线镜像包** - 支持下载离线镜像包,流式传输加防抖设计
1111
- 📁 **GitHub 文件加速** - 加速 GitHub Release、Raw 文件下载,支持`api.github.com`,脚本嵌套加速等等
1212
- 🤖 **AI 模型库支持** - 支持 Hugging Face 模型下载加速
1313
- 🛡️ **智能限流** - IP 限流保护,防止滥用
1414
- 🚫 **仓库审计** - 强大的自定义黑名单,白名单,同时审计镜像仓库,和GitHub仓库
1515
- 🔍 **镜像搜索** - 在线搜索 Docker 镜像
16-
-**轻量高效** - 基于 Go 语言,单二进制文件运行,资源占用低
16+
-**轻量高效** - 基于 Go 语言,单二进制文件运行,资源占用低,优雅的内存清理机制。
1717
- 🔧 **配置热重载** - 统一配置管理,部分配置项支持热重载,无需重启服务
1818

1919
## 🚀 快速开始
@@ -87,11 +87,6 @@ example.com {
8787
```
8888

8989

90-
## 🙏 致谢
91-
92-
93-
- UI 界面参考了[相关开源项目](https://github.com/WJQSERVER-STUDIO/GHProxy-Frontend)
94-
9590
## ⚠️ 免责声明
9691

9792
- 本程序仅供学习交流使用,请勿用于非法用途

install-service.sh

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ else
6262

6363
# 检查依赖
6464
missing_deps=()
65-
for cmd in curl jq tar skopeo; do
65+
for cmd in curl jq tar; do
6666
if ! command -v $cmd &> /dev/null; then
6767
missing_deps+=($cmd)
6868
fi
@@ -72,14 +72,14 @@ else
7272
echo -e "${YELLOW}检测到缺少依赖: ${missing_deps[*]}${NC}"
7373
echo -e "${BLUE}正在自动安装依赖...${NC}"
7474

75-
apt update && apt install -y curl jq skopeo
75+
apt update && apt install -y curl jq
7676
if [ $? -ne 0 ]; then
7777
echo -e "${RED}依赖安装失败${NC}"
7878
exit 1
7979
fi
8080

8181
# 重新检查依赖
82-
for cmd in curl jq tar skopeo; do
82+
for cmd in curl jq tar; do
8383
if ! command -v $cmd &> /dev/null; then
8484
echo -e "${RED}依赖安装后仍缺少: $cmd${NC}"
8585
exit 1

src/LICENSE

Lines changed: 0 additions & 107 deletions
This file was deleted.

src/access_control.go

Lines changed: 3 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,10 @@ var GlobalAccessController = &AccessController{}
3131

3232
// ParseDockerImage 解析Docker镜像名称
3333
func (ac *AccessController) ParseDockerImage(image string) DockerImageInfo {
34-
// 移除可能的协议前缀
3534
image = strings.TrimPrefix(image, "docker://")
3635

37-
// 分离标签
3836
var tag string
3937
if idx := strings.LastIndex(image, ":"); idx != -1 {
40-
// 检查是否是端口号而不是标签(包含斜杠)
4138
part := image[idx+1:]
4239
if !strings.Contains(part, "/") {
4340
tag = part
@@ -48,15 +45,11 @@ func (ac *AccessController) ParseDockerImage(image string) DockerImageInfo {
4845
tag = "latest"
4946
}
5047

51-
// 分离命名空间和仓库名
5248
var namespace, repository string
5349
if strings.Contains(image, "/") {
54-
// 处理自定义registry的情况,如 registry.com/user/repo
5550
parts := strings.Split(image, "/")
5651
if len(parts) >= 2 {
57-
// 检查第一部分是否是域名(包含.)
5852
if strings.Contains(parts[0], ".") {
59-
// 跳过registry域名,取用户名和仓库名
6053
if len(parts) >= 3 {
6154
namespace = parts[1]
6255
repository = parts[2]
@@ -65,13 +58,11 @@ func (ac *AccessController) ParseDockerImage(image string) DockerImageInfo {
6558
repository = parts[1]
6659
}
6760
} else {
68-
// 标准格式:user/repo
6961
namespace = parts[0]
7062
repository = parts[1]
7163
}
7264
}
7365
} else {
74-
// 官方镜像,如 nginx
7566
namespace = "library"
7667
repository = image
7768
}
@@ -171,7 +162,6 @@ func (ac *AccessController) matchImageInList(imageInfo DockerImageInfo, list []s
171162
}
172163
}
173164

174-
// 5. 子仓库匹配(防止 user/repo 匹配到 user/repo-fork)
175165
if strings.HasPrefix(fullName, item+"/") {
176166
return true
177167
}
@@ -185,7 +175,6 @@ func (ac *AccessController) checkList(matches, list []string) bool {
185175
return false
186176
}
187177

188-
// 组合用户名和仓库名,处理.git后缀
189178
username := strings.ToLower(strings.TrimSpace(matches[0]))
190179
repoName := strings.ToLower(strings.TrimSpace(strings.TrimSuffix(matches[1], ".git")))
191180
fullRepo := username + "/" + repoName
@@ -196,10 +185,7 @@ func (ac *AccessController) checkList(matches, list []string) bool {
196185
continue
197186
}
198187

199-
// 支持多种匹配模式:
200-
// 1. 精确匹配: "vaxilu/x-ui"
201-
// 2. 用户级匹配: "vaxilu/*" 或 "vaxilu"
202-
// 3. 前缀匹配: "vaxilu/x-ui-*"
188+
// 支持多种匹配模式
203189
if fullRepo == item {
204190
return true
205191
}
@@ -225,15 +211,10 @@ func (ac *AccessController) checkList(matches, list []string) bool {
225211
return false
226212
}
227213

228-
// 🔥 Reload 热重载访问控制规则
214+
// Reload 热重载访问控制规则
229215
func (ac *AccessController) Reload() {
230216
ac.mu.Lock()
231217
defer ac.mu.Unlock()
232218

233-
// 访问控制器本身不缓存配置,每次检查时都会调用GetConfig()
234-
// 所以这里只需要确保锁的原子性,实际的重载在GetConfig()中完成
235-
// 可以在这里添加一些初始化逻辑,比如预编译正则表达式等
236-
237-
// 目前访问控制器设计为无状态的,每次检查都读取最新配置
238-
// 这样设计的好处是配置更新后无需额外处理,自动生效
219+
// 访问控制器本身不缓存配置
239220
}

0 commit comments

Comments
 (0)