From c1ba893a9d166a42c155a37eee2ca6d50a807093 Mon Sep 17 00:00:00 2001 From: user123456 Date: Wed, 11 Jun 2025 17:52:19 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E9=A1=B9=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/docker-ghcr.yml | 3 +- .github/workflows/release.yml | 133 ++++++++++++ src/Dockerfile => Dockerfile | 42 ++-- README.md | 166 +++++++-------- src/docker-compose.yml => docker-compose.yml | 16 +- hubproxy.service | 39 ++++ install-service.sh | 212 +++++++++++++++++++ src/config.go | 10 +- src/config.toml | 16 +- src/smart_ratelimit.go | 2 +- 10 files changed, 496 insertions(+), 143 deletions(-) create mode 100644 .github/workflows/release.yml rename src/Dockerfile => Dockerfile (70%) rename src/docker-compose.yml => docker-compose.yml (70%) create mode 100644 hubproxy.service create mode 100644 install-service.sh diff --git a/.github/workflows/docker-ghcr.yml b/.github/workflows/docker-ghcr.yml index 6607cb8..e0265f0 100644 --- a/.github/workflows/docker-ghcr.yml +++ b/.github/workflows/docker-ghcr.yml @@ -46,9 +46,8 @@ jobs: - name: Build and push Docker image run: | - cd src docker buildx build --push \ - --platform linux/amd64,linux/arm64 \ + --platform linux/amd64,linux/arm64/v8 \ --tag ghcr.io/${{ env.REPO_LOWER }}:${{ env.VERSION }} \ --tag ghcr.io/${{ env.REPO_LOWER }}:latest \ --build-arg VERSION=${{ env.VERSION }} \ diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..858c04d --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,133 @@ +name: 发布二进制文件 + +on: + workflow_dispatch: # 手动触发 + inputs: + version: + description: '版本号 (例如: v1.0.0)' + required: true + default: 'v1.0.0' + +jobs: + build-and-release: + runs-on: ubuntu-latest + permissions: + contents: write + + steps: + - name: 检出代码 + uses: actions/checkout@v4 + with: + fetch-depth: 0 # 获取完整历史,用于生成变更日志 + + - name: 设置Go环境 + uses: actions/setup-go@v4 + with: + go-version: '1.24' + + - name: 获取版本号 + id: version + run: | + VERSION=${{ github.event.inputs.version }} + echo "version=$VERSION" >> $GITHUB_OUTPUT + echo "版本号: $VERSION" + + - name: 生成变更日志 + id: changelog + run: | + # 获取上一个标签 + PREV_TAG=$(git describe --tags --abbrev=0 HEAD^ 2>/dev/null || echo "") + + if [ -n "$PREV_TAG" ]; then + echo "changelog<> $GITHUB_OUTPUT + echo "## 更新内容" >> $GITHUB_OUTPUT + echo "" >> $GITHUB_OUTPUT + git log --pretty=format:"- %s" $PREV_TAG..HEAD >> $GITHUB_OUTPUT + echo "" >> $GITHUB_OUTPUT + echo "EOF" >> $GITHUB_OUTPUT + else + echo "changelog=## 首次发布" >> $GITHUB_OUTPUT + fi + + - name: 创建构建目录 + run: | + mkdir -p build/hubproxy + + - name: 编译二进制文件 + run: | + cd src + + # Linux AMD64 + GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -o ../build/hubproxy/hubproxy-linux-amd64 . + + # Linux ARM64 + GOOS=linux GOARCH=arm64 go build -ldflags="-s -w" -o ../build/hubproxy/hubproxy-linux-arm64 . + + - name: 复制配置文件 + run: | + # 复制配置文件 + cp src/config.toml build/hubproxy/ + + # 复制systemd服务文件 + cp hubproxy.service build/hubproxy/ + + # 复制安装脚本 + cp install-service.sh build/hubproxy/ + + # 复制Web资源文件(如果存在) + if [ -d "src/public" ]; then + cp -r src/public build/hubproxy/ + fi + + # 创建README文件 + cat > build/hubproxy/README.md << 'EOF' + # HubProxy + + 项目地址:https://github.com/sky22333/hubproxy + EOF + + - name: 创建压缩包 + run: | + cd build + + # Linux AMD64 包 + mkdir -p linux-amd64/hubproxy + cp hubproxy/hubproxy-linux-amd64 linux-amd64/hubproxy/hubproxy + cp hubproxy/config.toml hubproxy/hubproxy.service hubproxy/install-service.sh hubproxy/README.md linux-amd64/hubproxy/ + tar -czf hubproxy-${{ steps.version.outputs.version }}-linux-amd64.tar.gz -C linux-amd64 hubproxy + + # Linux ARM64 包 + mkdir -p linux-arm64/hubproxy + cp hubproxy/hubproxy-linux-arm64 linux-arm64/hubproxy/hubproxy + cp hubproxy/config.toml hubproxy/hubproxy.service hubproxy/install-service.sh hubproxy/README.md linux-arm64/hubproxy/ + tar -czf hubproxy-${{ steps.version.outputs.version }}-linux-arm64.tar.gz -C linux-arm64 hubproxy + + # 列出生成的文件 + ls -la *.tar.gz + + - name: 计算文件校验和 + run: | + cd build + sha256sum *.tar.gz > checksums.txt + cat checksums.txt + + - name: 创建或更新Release + uses: softprops/action-gh-release@v1 + with: + tag_name: ${{ steps.version.outputs.version }} + name: "HubProxy ${{ steps.version.outputs.version }}" + body: | + ${{ steps.changelog.outputs.changelog }} + + + ## 下载文件 + + - **Linux AMD64**: `hubproxy-${{ steps.version.outputs.version }}-linux-amd64.tar.gz` + - **Linux ARM64**: `hubproxy-${{ steps.version.outputs.version }}-linux-arm64.tar.gz` + + files: | + build/*.tar.gz + build/checksums.txt + draft: false + prerelease: false + token: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/src/Dockerfile b/Dockerfile similarity index 70% rename from src/Dockerfile rename to Dockerfile index 025179f..685ee1a 100644 --- a/src/Dockerfile +++ b/Dockerfile @@ -1,21 +1,21 @@ -FROM golang:1.24-alpine AS builder - -WORKDIR /app -COPY go.mod go.sum ./ -RUN go mod download - -COPY . . -RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -trimpath -o hubproxy . - -FROM alpine - -WORKDIR /root/ - -# 安装skopeo -RUN apk add --no-cache skopeo && mkdir -p temp && chmod 700 temp - -COPY --from=builder /app/hubproxy . -COPY --from=builder /app/config.toml . -COPY --from=builder /app/public ./public - -CMD ["./hubproxy"] +FROM golang:1.24-alpine AS builder + +WORKDIR /app +COPY src/go.mod src/go.sum ./ +RUN go mod download + +COPY src/ . +RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -trimpath -o hubproxy . + +FROM alpine + +WORKDIR /root/ + +# 安装skopeo +RUN apk add --no-cache skopeo && mkdir -p temp && chmod 700 temp + +COPY --from=builder /app/hubproxy . +COPY --from=builder /app/src/config.toml . +COPY --from=builder /app/src/public ./public + +CMD ["./hubproxy"] diff --git a/README.md b/README.md index 3a24549..184b641 100644 --- a/README.md +++ b/README.md @@ -1,119 +1,95 @@ -### Docker和Github加速二合一 +# HubProxy -- 使用`docker`一键部署多种仓库的镜像加速 -- `docker`镜像默认缓存3天 -- 支持在线下载`docker`离线镜像包 -- 支持镜像搜索 -- 具有自动清理机制 -- 支持`github`文件加速 -- 支持`api.github.com` -- 支持shell脚本嵌套加速 -- 支持Al模型库Hugging Face -- 支持IP限流,默认每个IP,每小时20次请求。 -- 轻量级,简单方便 -- 自动配置HTTPS,默认使用caddy反代,请确保80和443端口没被占用 +🚀 **Docker 和 GitHub 加速代理服务器** ---- +一个轻量级、高性能的多功能代理服务,提供 Docker 镜像加速、GitHub 文件加速等功能。 -### 使用Docker部署 +## ✨ 特性 -1:域名解析:将`hub`,`ghcr`,`docker`这个几个解析为你的二级域名。 +- 🐳 **Docker 镜像加速** - 支持 Docker Hub、GHCR、Quay 等多个镜像仓库,以及优化拉取速度。支持批量下载离线镜像包。 +- 📁 **GitHub 文件加速** - 加速 GitHub Release、Raw 文件下载,脚本嵌套加速,以及api.github。com +- 🤖 **AI 模型库支持** - 支持 Hugging Face 模型下载加速 +- 🛡️ **智能限流** - IP 限流保护,防止滥用 +- 🔍 **镜像搜索** - 在线搜索 Docker 镜像 +- ⚡ **轻量高效** - 基于 Go 语言,单二进制文件运行,资源占用低 +- 🔧 **配置热重载** - 统一配置管理,部分配置项支持热重载,无需重启服务 -> 嫌麻烦也可以直接泛解析 +## 🚀 快速开始 - -2:拉取本项目 -``` -git clone https://github.com/sky22333/hubproxy.git -``` - - -3:其他无需修改,只需修改`docker-compose.yml`配置里的域名环境变量,修改为你的`根域名` - -> 这里的`根域名`只是为了动态写入配置和前端,不用解析,当然也不会影响你的根域名使用。 - -运行: -``` -docker compose up -d -``` - -4:部署完成后稍等一分钟,等待`caddy`自动配置域名证书后,即可访问`hub.example.com`查看前端 - -> 可以使用命令`docker logs -f caddy`查看日志获取进度 - - - ---- ---- ---- - -#### 单独部署Github文件加速(可选) +### Docker部署(推荐) ``` docker run -d \ - --name ghproxy \ + --name hubproxy \ -p 5000:5000 \ --restart always \ ghcr.io/sky22333/hubproxy ``` ---- ---- -
- CF-CDN获取用户真实IP - +### 一键安装 -- 替换`Caddyfile`配置 - -``` -hub.{$DOMAIN} { - reverse_proxy * ghproxy:5000 { - header_up X-Real-IP {http.request.header.CF-Connecting-IP} - header_up X-Forwarded-For {http.request.header.CF-Connecting-IP} - header_up X-Forwarded-Proto {http.request.scheme} - header_up CF-IPCountry {http.request.header.CF-IPCountry} - } -} - -docker.{$DOMAIN} { - @v2_manifest_blob path_regexp v2_rewrite ^/v2/([^/]+)/(manifests|blobs)/(.*)$ - handle @v2_manifest_blob { - rewrite * /v2/library/{re.v2_rewrite.1}/{re.v2_rewrite.2}/{re.v2_rewrite.3} - } - - reverse_proxy * docker:5000 { - header_up X-Real-IP {http.request.header.CF-Connecting-IP} - header_up X-Forwarded-For {http.request.header.CF-Connecting-IP} - header_up X-Forwarded-Proto {http.request.scheme} - header_up CF-IPCountry {http.request.header.CF-IPCountry} - } -} - -ghcr.{$DOMAIN} { - reverse_proxy * ghcr:5000 { - header_up X-Real-IP {http.request.header.CF-Connecting-IP} - header_up X-Forwarded-For {http.request.header.CF-Connecting-IP} - header_up X-Forwarded-Proto {http.request.scheme} - header_up CF-IPCountry {http.request.header.CF-IPCountry} - } -} +```bash +curl -fsSL https://raw.githubusercontent.com/sky22333/hubproxy/main/install-service.sh | sudo bash ``` -
+这个命令会: +- 🔍 自动检测系统架构(AMD64/ARM64) +- 📥 从 GitHub Releases 下载最新版本 +- ⚙️ 自动配置系统服务 +- 🔄 保留现有配置(升级时) ---- + +## 📖 使用方法 + +### Docker 镜像加速 + +```bash +# 原命令 +docker pull nginx + +# 使用加速(替换 yourdomain.com) +docker pull yourdomain.com/nginx + +# ghcr加速(替换 yourdomain.com) +docker pull yourdomain.com/ghcr.io/user/images +``` + +### GitHub 文件加速 + +```bash +# 原链接 +https://github.com/user/repo/releases/download/v1.0.0/file.tar.gz + +# 加速链接 +https://yourdomain.com/https://github.com/user/repo/releases/download/v1.0.0/file.tar.gz +``` + + + +## ⚙️ 配置 + +主配置文件位于 `/opt/hubproxy/config.toml`: + + + + +## 🙏 致谢 + + +- UI 界面参考了[相关开源项目](https://github.com/WJQSERVER-STUDIO/GHProxy-Frontend) + +## ⚠️ 免责声明 + +- 本程序仅供学习交流使用,请勿用于非法用途 +- 使用本程序需遵守当地法律法规 +- 作者不对使用者的任何行为承担责任 + --- -#### 鸣谢: +
-ghproxy基于go语言的Gin框架,镜像加速基于`registry`镜像实现 +**⭐ 如果这个项目对你有帮助,请给个 Star!⭐** -前端借鉴了[此项目](https://github.com/WJQSERVER-STUDIO/ghproxy)的UI,许可证见`ghproxy/LICENSE` - - -### 免责声明 - -* 本程序完全开源并且仅供学习了解,请勿下载非法文件,使用本项目即默认接受此条款。 -* 使用本程序必循遵守部署免责声明。使用本程序必循遵守部署服务器所在地、所在国家和用户所在国家的法律法规, 程序作者不对使用者任何不当行为负责。 +
diff --git a/src/docker-compose.yml b/docker-compose.yml similarity index 70% rename from src/docker-compose.yml rename to docker-compose.yml index 6f6e8c3..35f7b5f 100644 --- a/src/docker-compose.yml +++ b/docker-compose.yml @@ -1,8 +1,8 @@ -services: - ghproxy: - build: . - restart: always - ports: - - '5000:5000' - volumes: - - ./config.toml:/root/config.toml \ No newline at end of file +services: + ghproxy: + build: . + restart: always + ports: + - '5000:5000' + volumes: + - ./src/config.toml:/root/config.toml \ No newline at end of file diff --git a/hubproxy.service b/hubproxy.service new file mode 100644 index 0000000..64a106f --- /dev/null +++ b/hubproxy.service @@ -0,0 +1,39 @@ +[Unit] +Description=HubProxy - Docker Registry Proxy Service +Documentation=https://github.com/sky22333/hubproxy +After=network-online.target +Wants=network-online.target +AssertPathExists=/opt/hubproxy/hubproxy + +[Service] +Type=simple +User=root +Group=root +WorkingDirectory=/opt/hubproxy +ExecStart=/opt/hubproxy/hubproxy +ExecReload=/bin/kill -HUP $MAINPID +Restart=always +RestartSec=5 +StartLimitInterval=60 +StartLimitBurst=3 +KillMode=mixed +KillSignal=SIGTERM +TimeoutStopSec=30 +TimeoutStartSec=30 + +# 安全设置 - 保持必要的安全限制 +PrivateTmp=true +ProtectHome=true +ReadWritePaths=/opt/hubproxy + +# 资源限制 +LimitNOFILE=65536 +LimitNPROC=4096 + +# 日志设置 +StandardOutput=journal +StandardError=journal +SyslogIdentifier=hubproxy + +[Install] +WantedBy=multi-user.target \ No newline at end of file diff --git a/install-service.sh b/install-service.sh new file mode 100644 index 0000000..279fc0a --- /dev/null +++ b/install-service.sh @@ -0,0 +1,212 @@ +#!/bin/bash + +# HubProxy 一键安装脚本 +# 支持自动下载最新版本或使用本地文件安装 +set -e + +# 颜色定义 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# 配置 +REPO="sky22333/hubproxy" +GITHUB_API="https://api.github.com/repos/${REPO}" +GITHUB_RELEASES="${GITHUB_API}/releases" +SERVICE_NAME="hubproxy" +INSTALL_DIR="/opt/hubproxy" +CONFIG_FILE="config.toml" +BINARY_NAME="hubproxy" +LOG_DIR="/var/log/hubproxy" +TEMP_DIR="/tmp/hubproxy-install" + +echo -e "${BLUE}🚀 HubProxy 一键安装脚本${NC}" +echo "=================================================" + +# 检查是否以root权限运行 +if [[ $EUID -ne 0 ]]; then + echo -e "${RED}❌ 此脚本需要root权限运行${NC}" + echo "请使用: sudo $0" + exit 1 +fi + +# 检测系统架构 +detect_arch() { + local arch=$(uname -m) + case $arch in + x86_64) + echo "amd64" + ;; + aarch64|arm64) + echo "arm64" + ;; + *) + echo -e "${RED}❌ 不支持的架构: $arch${NC}" + exit 1 + ;; + esac +} + +ARCH=$(detect_arch) +echo -e "${BLUE}🖥️ 检测到架构: linux-${ARCH}${NC}" + +# 检查是否为本地安装模式 +if [ -f "${BINARY_NAME}" ]; then + echo -e "${BLUE}📦 发现本地文件,使用本地安装模式${NC}" + LOCAL_INSTALL=true +else + echo -e "${BLUE}📥 本地无文件,使用自动下载模式${NC}" + LOCAL_INSTALL=false + + # 检查依赖 + for cmd in curl jq tar skopeo; do + if ! command -v $cmd &> /dev/null; then + echo -e "${RED}❌ 缺少依赖: $cmd${NC}" + echo "请安装: sudo apt update && sudo apt install -y curl jq skopeo" + exit 1 + fi + done +fi + +# 自动下载功能 +if [ "$LOCAL_INSTALL" = false ]; then + echo -e "${BLUE}🔍 获取最新版本信息...${NC}" + LATEST_RELEASE=$(curl -s "${GITHUB_RELEASES}/latest") + if [ $? -ne 0 ]; then + echo -e "${RED}❌ 无法获取版本信息${NC}" + exit 1 + fi + + VERSION=$(echo "$LATEST_RELEASE" | jq -r '.tag_name') + if [ "$VERSION" = "null" ]; then + echo -e "${RED}❌ 无法解析版本信息${NC}" + exit 1 + fi + + echo -e "${GREEN}✅ 最新版本: ${VERSION}${NC}" + + # 构造下载URL + ASSET_NAME="hubproxy-${VERSION}-linux-${ARCH}.tar.gz" + DOWNLOAD_URL="https://github.com/${REPO}/releases/download/${VERSION}/${ASSET_NAME}" + + echo -e "${BLUE}📥 下载: ${ASSET_NAME}${NC}" + + # 创建临时目录并下载 + rm -rf "${TEMP_DIR}" + mkdir -p "${TEMP_DIR}" + cd "${TEMP_DIR}" + + curl -L -o "${ASSET_NAME}" "${DOWNLOAD_URL}" + if [ $? -ne 0 ]; then + echo -e "${RED}❌ 下载失败${NC}" + exit 1 + fi + + # 解压 + tar -xzf "${ASSET_NAME}" + if [ $? -ne 0 ] || [ ! -d "hubproxy" ]; then + echo -e "${RED}❌ 解压失败${NC}" + exit 1 + fi + + cd hubproxy + echo -e "${GREEN}✅ 下载完成${NC}" +fi + +echo -e "${YELLOW}📋 开始安装 HubProxy...${NC}" + +# 停止现有服务(如果存在) +if systemctl is-active --quiet ${SERVICE_NAME} 2>/dev/null; then + echo -e "${YELLOW}⏸️ 停止现有服务...${NC}" + systemctl stop ${SERVICE_NAME} +fi + +# 备份现有配置(如果存在) +CONFIG_BACKUP_EXISTS=false +if [ -f "${INSTALL_DIR}/${CONFIG_FILE}" ]; then + echo -e "${BLUE}💾 备份现有配置...${NC}" + cp "${INSTALL_DIR}/${CONFIG_FILE}" "${TEMP_DIR}/config.toml.backup" + CONFIG_BACKUP_EXISTS=true +fi + +# 1. 创建目录结构 +echo -e "${BLUE}📁 创建目录结构${NC}" +mkdir -p ${INSTALL_DIR} +mkdir -p ${LOG_DIR} +chmod 755 ${INSTALL_DIR} +chmod 755 ${LOG_DIR} + +# 2. 复制二进制文件 +echo -e "${BLUE}📦 复制二进制文件${NC}" +cp "${BINARY_NAME}" "${INSTALL_DIR}/" +chmod +x "${INSTALL_DIR}/${BINARY_NAME}" + +# 3. 复制配置文件 +echo -e "${BLUE}⚙️ 复制配置文件${NC}" +if [ -f "${CONFIG_FILE}" ]; then + if [ "$CONFIG_BACKUP_EXISTS" = false ]; then + cp "${CONFIG_FILE}" "${INSTALL_DIR}/" + echo -e "${GREEN}✅ 配置文件复制成功${NC}" + else + echo -e "${YELLOW}⚠️ 保留现有配置文件${NC}" + fi +else + echo -e "${YELLOW}⚠️ 配置文件不存在,将使用默认配置${NC}" +fi + +# 4. 复制公共文件(如果存在) +if [ -d "public" ]; then + echo -e "${BLUE}🌐 复制Web资源文件${NC}" + cp -r "public" "${INSTALL_DIR}/" + chmod -R 644 "${INSTALL_DIR}/public" + find "${INSTALL_DIR}/public" -type d -exec chmod 755 {} \; +fi + +# 5. 安装systemd服务文件 +echo -e "${BLUE}🔧 安装systemd服务文件${NC}" +cp "${SERVICE_NAME}.service" "/etc/systemd/system/" +systemctl daemon-reload + +# 6. 恢复配置文件(如果有备份) +if [ "$CONFIG_BACKUP_EXISTS" = true ]; then + echo -e "${BLUE}🔄 恢复配置文件...${NC}" + cp "${TEMP_DIR}/config.toml.backup" "${INSTALL_DIR}/${CONFIG_FILE}" +fi + +# 7. 启用并启动服务 +echo -e "${BLUE}🚀 启用并启动服务${NC}" +systemctl enable ${SERVICE_NAME} +systemctl start ${SERVICE_NAME} + +# 8. 清理临时文件 +if [ "$LOCAL_INSTALL" = false ]; then + echo -e "${BLUE}🧹 清理临时文件...${NC}" + cd / + rm -rf "${TEMP_DIR}" +fi + +# 9. 检查服务状态 +sleep 2 +if systemctl is-active --quiet ${SERVICE_NAME}; then + echo "" + echo -e "${GREEN}🎉 HubProxy 安装成功!${NC}" + if [ "$LOCAL_INSTALL" = false ]; then + echo -e "${BLUE}版本: ${VERSION}${NC}" + echo -e "${BLUE}配置文件: ${INSTALL_DIR}/${CONFIG_FILE}${NC}" + fi + echo "" + echo -e "${BLUE}📊 服务状态:${NC}" + systemctl status ${SERVICE_NAME} --no-pager -l | head -10 + echo "" + echo -e "${BLUE}🔧 服务管理:${NC}" + echo " sudo systemctl start|stop|restart|status ${SERVICE_NAME}" + echo " sudo journalctl -u ${SERVICE_NAME} -f" + echo "" + echo -e "${BLUE}📁 安装目录: ${INSTALL_DIR}${NC}" +else + echo -e "${RED}❌ 服务启动失败${NC}" + echo "查看错误日志: sudo journalctl -u ${SERVICE_NAME} -f" + exit 1 +fi \ No newline at end of file diff --git a/src/config.go b/src/config.go index 18bf324..e8aea65 100644 --- a/src/config.go +++ b/src/config.go @@ -213,17 +213,17 @@ func enableViperHotReload() { // 读取配置文件 if err := viperInstance.ReadInConfig(); err != nil { - fmt.Printf("Viper读取配置失败,继续使用当前配置: %v\n", err) + fmt.Printf("读取配置失败,继续使用当前配置: %v\n", err) return } isViperEnabled = true - fmt.Println("🔄 Viper自动热重载已启用") + fmt.Println("自动热重载已启用") // 🚀 启用文件监听 viperInstance.WatchConfig() viperInstance.OnConfigChange(func(e fsnotify.Event) { - fmt.Printf("📁 检测到配置文件变化: %s\n", e.Name) + fmt.Printf("检测到配置文件变化: %s\n", e.Name) hotReloadWithViper() }) } @@ -231,14 +231,14 @@ func enableViperHotReload() { // 🔥 使用Viper进行热重载 func hotReloadWithViper() { start := time.Now() - fmt.Println("🔄 开始Viper自动热重载...") + fmt.Println("🔄 自动热重载...") // 创建新配置 cfg := DefaultConfig() // 使用Viper解析配置到结构体 if err := viperInstance.Unmarshal(cfg); err != nil { - fmt.Printf("❌ Viper配置解析失败: %v\n", err) + fmt.Printf("❌ 配置解析失败: %v\n", err) return } diff --git a/src/config.toml b/src/config.toml index 53e3e56..93f1fd7 100644 --- a/src/config.toml +++ b/src/config.toml @@ -7,7 +7,7 @@ port = 5000 fileSize = 2147483648 [rateLimit] -# 每个IP每小时允许的请求数 +# 每个IP每小时允许的请求数(Docker镜像每个层为一个请求) requestLimit = 200 # 限流周期(小时) periodHours = 1.0 @@ -35,9 +35,8 @@ whiteList = [] # 禁止访问黑名单中的仓库/镜像 blackList = [ "baduser/malicious-repo", - "thesadboy/x-ui", - "vaxilu/x-ui", - "vaxilu/*" + "*/malicious-repo", + "baduser/*" ] [download] @@ -82,14 +81,9 @@ enabled = true # authType = "basic" # enabled = false -# 缓存配置:Token和Manifest统一管理,显著提升性能 +# 缓存配置:Docker临时Token和Manifest统一管理,显著提升性能 [tokenCache] # 是否启用缓存(同时控制Token和Manifest缓存) enabled = true -# 默认缓存时间(适用于mutable标签,如latest等) +# 默认缓存时间 defaultTTL = "20m" -# 说明: -# - immutable digest缓存24小时 -# - latest/main等热门标签缓存5分钟 -# - 普通tag使用defaultTTL -# - Token自动从响应中提取TTL diff --git a/src/smart_ratelimit.go b/src/smart_ratelimit.go index 436d5f4..916800f 100644 --- a/src/smart_ratelimit.go +++ b/src/smart_ratelimit.go @@ -23,7 +23,7 @@ var smartLimiter = &SmartRateLimit{} // 硬编码的智能限流参数 - 无需配置管理 const ( // manifest请求后的活跃窗口时间 - activeWindowDuration = 5 * time.Minute + activeWindowDuration = 3 * time.Minute // 活跃窗口内最大免费blob请求数(防止滥用) maxFreeBlobRequests = 100 // 会话清理间隔