完善项目
This commit is contained in:
3
.github/workflows/docker-ghcr.yml
vendored
3
.github/workflows/docker-ghcr.yml
vendored
@@ -46,9 +46,8 @@ jobs:
|
|||||||
|
|
||||||
- name: Build and push Docker image
|
- name: Build and push Docker image
|
||||||
run: |
|
run: |
|
||||||
cd src
|
|
||||||
docker buildx build --push \
|
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 }}:${{ env.VERSION }} \
|
||||||
--tag ghcr.io/${{ env.REPO_LOWER }}:latest \
|
--tag ghcr.io/${{ env.REPO_LOWER }}:latest \
|
||||||
--build-arg VERSION=${{ env.VERSION }} \
|
--build-arg VERSION=${{ env.VERSION }} \
|
||||||
|
|||||||
133
.github/workflows/release.yml
vendored
Normal file
133
.github/workflows/release.yml
vendored
Normal file
@@ -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<<EOF" >> $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 }}
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
FROM golang:1.24-alpine AS builder
|
FROM golang:1.24-alpine AS builder
|
||||||
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
COPY go.mod go.sum ./
|
COPY src/go.mod src/go.sum ./
|
||||||
RUN go mod download
|
RUN go mod download
|
||||||
|
|
||||||
COPY . .
|
COPY src/ .
|
||||||
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -trimpath -o hubproxy .
|
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -trimpath -o hubproxy .
|
||||||
|
|
||||||
FROM alpine
|
FROM alpine
|
||||||
@@ -15,7 +15,7 @@ WORKDIR /root/
|
|||||||
RUN apk add --no-cache skopeo && mkdir -p temp && chmod 700 temp
|
RUN apk add --no-cache skopeo && mkdir -p temp && chmod 700 temp
|
||||||
|
|
||||||
COPY --from=builder /app/hubproxy .
|
COPY --from=builder /app/hubproxy .
|
||||||
COPY --from=builder /app/config.toml .
|
COPY --from=builder /app/src/config.toml .
|
||||||
COPY --from=builder /app/public ./public
|
COPY --from=builder /app/src/public ./public
|
||||||
|
|
||||||
CMD ["./hubproxy"]
|
CMD ["./hubproxy"]
|
||||||
166
README.md
166
README.md
@@ -1,119 +1,95 @@
|
|||||||
### Docker和Github加速二合一
|
# HubProxy
|
||||||
|
|
||||||
- 使用`docker`一键部署多种仓库的镜像加速
|
🚀 **Docker 和 GitHub 加速代理服务器**
|
||||||
- `docker`镜像默认缓存3天
|
|
||||||
- 支持在线下载`docker`离线镜像包
|
|
||||||
- 支持镜像搜索
|
|
||||||
- 具有自动清理机制
|
|
||||||
- 支持`github`文件加速
|
|
||||||
- 支持`api.github.com`
|
|
||||||
- 支持shell脚本嵌套加速
|
|
||||||
- 支持Al模型库Hugging Face
|
|
||||||
- 支持IP限流,默认每个IP,每小时20次请求。
|
|
||||||
- 轻量级,简单方便
|
|
||||||
- 自动配置HTTPS,默认使用caddy反代,请确保80和443端口没被占用
|
|
||||||
|
|
||||||
---
|
一个轻量级、高性能的多功能代理服务,提供 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 语言,单二进制文件运行,资源占用低
|
||||||
|
- 🔧 **配置热重载** - 统一配置管理,部分配置项支持热重载,无需重启服务
|
||||||
|
|
||||||
> 嫌麻烦也可以直接泛解析
|
## 🚀 快速开始
|
||||||
|
|
||||||
|
### Docker部署(推荐)
|
||||||
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 run -d \
|
docker run -d \
|
||||||
--name ghproxy \
|
--name hubproxy \
|
||||||
-p 5000:5000 \
|
-p 5000:5000 \
|
||||||
--restart always \
|
--restart always \
|
||||||
ghcr.io/sky22333/hubproxy
|
ghcr.io/sky22333/hubproxy
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
|
||||||
---
|
|
||||||
|
|
||||||
|
|
||||||
<details>
|
### 一键安装
|
||||||
<summary>CF-CDN获取用户真实IP</summary>
|
|
||||||
|
|
||||||
|
```bash
|
||||||
- 替换`Caddyfile`配置
|
curl -fsSL https://raw.githubusercontent.com/sky22333/hubproxy/main/install-service.sh | sudo bash
|
||||||
|
|
||||||
```
|
|
||||||
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}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
```
|
||||||
|
|
||||||
</details>
|
这个命令会:
|
||||||
|
- 🔍 自动检测系统架构(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)
|
||||||
|
|
||||||
|
## ⚠️ 免责声明
|
||||||
|
|
||||||
|
- 本程序仅供学习交流使用,请勿用于非法用途
|
||||||
|
- 使用本程序需遵守当地法律法规
|
||||||
|
- 作者不对使用者的任何行为承担责任
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
#### 鸣谢:
|
<div align="center">
|
||||||
|
|
||||||
ghproxy基于go语言的Gin框架,镜像加速基于`registry`镜像实现
|
**⭐ 如果这个项目对你有帮助,请给个 Star!⭐**
|
||||||
|
|
||||||
前端借鉴了[此项目](https://github.com/WJQSERVER-STUDIO/ghproxy)的UI,许可证见`ghproxy/LICENSE`
|
</div>
|
||||||
|
|
||||||
|
|
||||||
### 免责声明
|
|
||||||
|
|
||||||
* 本程序完全开源并且仅供学习了解,请勿下载非法文件,使用本项目即默认接受此条款。
|
|
||||||
* 使用本程序必循遵守部署免责声明。使用本程序必循遵守部署服务器所在地、所在国家和用户所在国家的法律法规, 程序作者不对使用者任何不当行为负责。
|
|
||||||
|
|||||||
@@ -5,4 +5,4 @@ services:
|
|||||||
ports:
|
ports:
|
||||||
- '5000:5000'
|
- '5000:5000'
|
||||||
volumes:
|
volumes:
|
||||||
- ./config.toml:/root/config.toml
|
- ./src/config.toml:/root/config.toml
|
||||||
39
hubproxy.service
Normal file
39
hubproxy.service
Normal file
@@ -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
|
||||||
212
install-service.sh
Normal file
212
install-service.sh
Normal file
@@ -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
|
||||||
@@ -213,17 +213,17 @@ func enableViperHotReload() {
|
|||||||
|
|
||||||
// 读取配置文件
|
// 读取配置文件
|
||||||
if err := viperInstance.ReadInConfig(); err != nil {
|
if err := viperInstance.ReadInConfig(); err != nil {
|
||||||
fmt.Printf("Viper读取配置失败,继续使用当前配置: %v\n", err)
|
fmt.Printf("读取配置失败,继续使用当前配置: %v\n", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
isViperEnabled = true
|
isViperEnabled = true
|
||||||
fmt.Println("🔄 Viper自动热重载已启用")
|
fmt.Println("自动热重载已启用")
|
||||||
|
|
||||||
// 🚀 启用文件监听
|
// 🚀 启用文件监听
|
||||||
viperInstance.WatchConfig()
|
viperInstance.WatchConfig()
|
||||||
viperInstance.OnConfigChange(func(e fsnotify.Event) {
|
viperInstance.OnConfigChange(func(e fsnotify.Event) {
|
||||||
fmt.Printf("📁 检测到配置文件变化: %s\n", e.Name)
|
fmt.Printf("检测到配置文件变化: %s\n", e.Name)
|
||||||
hotReloadWithViper()
|
hotReloadWithViper()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -231,14 +231,14 @@ func enableViperHotReload() {
|
|||||||
// 🔥 使用Viper进行热重载
|
// 🔥 使用Viper进行热重载
|
||||||
func hotReloadWithViper() {
|
func hotReloadWithViper() {
|
||||||
start := time.Now()
|
start := time.Now()
|
||||||
fmt.Println("🔄 开始Viper自动热重载...")
|
fmt.Println("🔄 自动热重载...")
|
||||||
|
|
||||||
// 创建新配置
|
// 创建新配置
|
||||||
cfg := DefaultConfig()
|
cfg := DefaultConfig()
|
||||||
|
|
||||||
// 使用Viper解析配置到结构体
|
// 使用Viper解析配置到结构体
|
||||||
if err := viperInstance.Unmarshal(cfg); err != nil {
|
if err := viperInstance.Unmarshal(cfg); err != nil {
|
||||||
fmt.Printf("❌ Viper配置解析失败: %v\n", err)
|
fmt.Printf("❌ 配置解析失败: %v\n", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ port = 5000
|
|||||||
fileSize = 2147483648
|
fileSize = 2147483648
|
||||||
|
|
||||||
[rateLimit]
|
[rateLimit]
|
||||||
# 每个IP每小时允许的请求数
|
# 每个IP每小时允许的请求数(Docker镜像每个层为一个请求)
|
||||||
requestLimit = 200
|
requestLimit = 200
|
||||||
# 限流周期(小时)
|
# 限流周期(小时)
|
||||||
periodHours = 1.0
|
periodHours = 1.0
|
||||||
@@ -35,9 +35,8 @@ whiteList = []
|
|||||||
# 禁止访问黑名单中的仓库/镜像
|
# 禁止访问黑名单中的仓库/镜像
|
||||||
blackList = [
|
blackList = [
|
||||||
"baduser/malicious-repo",
|
"baduser/malicious-repo",
|
||||||
"thesadboy/x-ui",
|
"*/malicious-repo",
|
||||||
"vaxilu/x-ui",
|
"baduser/*"
|
||||||
"vaxilu/*"
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[download]
|
[download]
|
||||||
@@ -82,14 +81,9 @@ enabled = true
|
|||||||
# authType = "basic"
|
# authType = "basic"
|
||||||
# enabled = false
|
# enabled = false
|
||||||
|
|
||||||
# 缓存配置:Token和Manifest统一管理,显著提升性能
|
# 缓存配置:Docker临时Token和Manifest统一管理,显著提升性能
|
||||||
[tokenCache]
|
[tokenCache]
|
||||||
# 是否启用缓存(同时控制Token和Manifest缓存)
|
# 是否启用缓存(同时控制Token和Manifest缓存)
|
||||||
enabled = true
|
enabled = true
|
||||||
# 默认缓存时间(适用于mutable标签,如latest等)
|
# 默认缓存时间
|
||||||
defaultTTL = "20m"
|
defaultTTL = "20m"
|
||||||
# 说明:
|
|
||||||
# - immutable digest缓存24小时
|
|
||||||
# - latest/main等热门标签缓存5分钟
|
|
||||||
# - 普通tag使用defaultTTL
|
|
||||||
# - Token自动从响应中提取TTL
|
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ var smartLimiter = &SmartRateLimit{}
|
|||||||
// 硬编码的智能限流参数 - 无需配置管理
|
// 硬编码的智能限流参数 - 无需配置管理
|
||||||
const (
|
const (
|
||||||
// manifest请求后的活跃窗口时间
|
// manifest请求后的活跃窗口时间
|
||||||
activeWindowDuration = 5 * time.Minute
|
activeWindowDuration = 3 * time.Minute
|
||||||
// 活跃窗口内最大免费blob请求数(防止滥用)
|
// 活跃窗口内最大免费blob请求数(防止滥用)
|
||||||
maxFreeBlobRequests = 100
|
maxFreeBlobRequests = 100
|
||||||
// 会话清理间隔
|
// 会话清理间隔
|
||||||
|
|||||||
Reference in New Issue
Block a user