parent
52f0fba78d
commit
58b5d92aae
@ -0,0 +1,55 @@ |
|||||||
|
# Git |
||||||
|
.git |
||||||
|
.gitignore |
||||||
|
|
||||||
|
# Build artifacts |
||||||
|
bin/ |
||||||
|
dist/ |
||||||
|
*.exe |
||||||
|
*.dll |
||||||
|
*.so |
||||||
|
*.dylib |
||||||
|
|
||||||
|
# Test files |
||||||
|
*_test.go |
||||||
|
test/ |
||||||
|
tests/ |
||||||
|
|
||||||
|
# Documentation |
||||||
|
*.md |
||||||
|
docs/ |
||||||
|
|
||||||
|
# IDE files |
||||||
|
.vscode/ |
||||||
|
.idea/ |
||||||
|
*.swp |
||||||
|
*.swo |
||||||
|
*~ |
||||||
|
|
||||||
|
# OS files |
||||||
|
.DS_Store |
||||||
|
Thumbs.db |
||||||
|
|
||||||
|
# Logs |
||||||
|
*.log |
||||||
|
|
||||||
|
# Temporary files |
||||||
|
tmp/ |
||||||
|
temp/ |
||||||
|
|
||||||
|
# Docker files |
||||||
|
Dockerfile* |
||||||
|
.dockerignore |
||||||
|
|
||||||
|
# CI/CD |
||||||
|
.github/ |
||||||
|
.gitlab-ci.yml |
||||||
|
.travis.yml |
||||||
|
|
||||||
|
# Scripts (not needed in container) |
||||||
|
scripts/ |
||||||
|
|
||||||
|
# Development files |
||||||
|
.env |
||||||
|
.env.local |
||||||
|
.env.development |
@ -0,0 +1,268 @@ |
|||||||
|
name: Build and Release |
||||||
|
|
||||||
|
on: |
||||||
|
push: |
||||||
|
branches: [ main, develop ] |
||||||
|
tags: [ 'v*' ] |
||||||
|
pull_request: |
||||||
|
branches: [ main ] |
||||||
|
|
||||||
|
jobs: |
||||||
|
test: |
||||||
|
name: Test |
||||||
|
runs-on: ubuntu-latest |
||||||
|
|
||||||
|
steps: |
||||||
|
- name: Checkout code |
||||||
|
uses: actions/checkout@v4 |
||||||
|
|
||||||
|
- name: Set up Go |
||||||
|
uses: actions/setup-go@v4 |
||||||
|
with: |
||||||
|
go-version: '1.21' |
||||||
|
|
||||||
|
- name: Download dependencies |
||||||
|
run: go mod download |
||||||
|
|
||||||
|
- name: Run tests |
||||||
|
run: go test -v ./... |
||||||
|
|
||||||
|
- name: Run race detection tests |
||||||
|
run: go test -race -v ./... |
||||||
|
|
||||||
|
- name: Run benchmarks |
||||||
|
run: go test -bench=. -benchmem ./... |
||||||
|
|
||||||
|
build: |
||||||
|
name: Build Multi-Platform |
||||||
|
runs-on: ubuntu-latest |
||||||
|
needs: test |
||||||
|
|
||||||
|
strategy: |
||||||
|
matrix: |
||||||
|
include: |
||||||
|
- goos: linux |
||||||
|
goarch: amd64 |
||||||
|
name: linux-amd64 |
||||||
|
- goos: linux |
||||||
|
goarch: arm64 |
||||||
|
name: linux-arm64 |
||||||
|
- goos: linux |
||||||
|
goarch: 386 |
||||||
|
name: linux-386 |
||||||
|
- goos: linux |
||||||
|
goarch: arm |
||||||
|
name: linux-arm |
||||||
|
- goos: darwin |
||||||
|
goarch: amd64 |
||||||
|
name: darwin-amd64 |
||||||
|
- goos: darwin |
||||||
|
goarch: arm64 |
||||||
|
name: darwin-arm64 |
||||||
|
- goos: windows |
||||||
|
goarch: amd64 |
||||||
|
name: windows-amd64 |
||||||
|
ext: .exe |
||||||
|
- goos: windows |
||||||
|
goarch: 386 |
||||||
|
name: windows-386 |
||||||
|
ext: .exe |
||||||
|
- goos: windows |
||||||
|
goarch: arm64 |
||||||
|
name: windows-arm64 |
||||||
|
ext: .exe |
||||||
|
- goos: freebsd |
||||||
|
goarch: amd64 |
||||||
|
name: freebsd-amd64 |
||||||
|
- goos: freebsd |
||||||
|
goarch: arm64 |
||||||
|
name: freebsd-arm64 |
||||||
|
|
||||||
|
steps: |
||||||
|
- name: Checkout code |
||||||
|
uses: actions/checkout@v4 |
||||||
|
with: |
||||||
|
fetch-depth: 0 |
||||||
|
|
||||||
|
- name: Set up Go |
||||||
|
uses: actions/setup-go@v4 |
||||||
|
with: |
||||||
|
go-version: '1.21' |
||||||
|
|
||||||
|
- name: Get version |
||||||
|
id: version |
||||||
|
run: | |
||||||
|
if [[ $GITHUB_REF == refs/tags/* ]]; then |
||||||
|
VERSION=${GITHUB_REF#refs/tags/} |
||||||
|
else |
||||||
|
VERSION=v1.1.0-$(git rev-parse --short HEAD) |
||||||
|
fi |
||||||
|
echo "VERSION=$VERSION" >> $GITHUB_OUTPUT |
||||||
|
echo "Building version: $VERSION" |
||||||
|
|
||||||
|
- name: Build binary |
||||||
|
env: |
||||||
|
GOOS: ${{ matrix.goos }} |
||||||
|
GOARCH: ${{ matrix.goarch }} |
||||||
|
VERSION: ${{ steps.version.outputs.VERSION }} |
||||||
|
run: | |
||||||
|
BUILD_TIME=$(date -u '+%Y-%m-%d_%H:%M:%S') |
||||||
|
GIT_COMMIT=$(git rev-parse --short HEAD) |
||||||
|
LDFLAGS="-ldflags \"-X main.version=${VERSION} -X main.buildTime=${BUILD_TIME} -X main.gitCommit=${GIT_COMMIT} -s -w\"" |
||||||
|
|
||||||
|
mkdir -p dist |
||||||
|
BINARY_NAME="wormhole-server-${VERSION}-${{ matrix.name }}${{ matrix.ext }}" |
||||||
|
|
||||||
|
echo "Building ${BINARY_NAME}..." |
||||||
|
go build ${LDFLAGS} -o "dist/${BINARY_NAME}" cmd/wormhole-server/main.go |
||||||
|
|
||||||
|
- name: Upload artifact |
||||||
|
uses: actions/upload-artifact@v3 |
||||||
|
with: |
||||||
|
name: wormhole-server-${{ matrix.name }} |
||||||
|
path: dist/wormhole-server-*-${{ matrix.name }}* |
||||||
|
retention-days: 30 |
||||||
|
|
||||||
|
release: |
||||||
|
name: Create Release |
||||||
|
runs-on: ubuntu-latest |
||||||
|
needs: build |
||||||
|
if: startsWith(github.ref, 'refs/tags/') |
||||||
|
|
||||||
|
steps: |
||||||
|
- name: Checkout code |
||||||
|
uses: actions/checkout@v4 |
||||||
|
|
||||||
|
- name: Download all artifacts |
||||||
|
uses: actions/download-artifact@v3 |
||||||
|
with: |
||||||
|
path: artifacts |
||||||
|
|
||||||
|
- name: Get version |
||||||
|
id: version |
||||||
|
run: echo "VERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT |
||||||
|
|
||||||
|
- name: Create release packages |
||||||
|
run: | |
||||||
|
mkdir -p release |
||||||
|
VERSION=${{ steps.version.outputs.VERSION }} |
||||||
|
|
||||||
|
# 移动所有二进制文件到一个目录 |
||||||
|
find artifacts -name "wormhole-server-*" -type f -exec mv {} release/ \; |
||||||
|
|
||||||
|
cd release |
||||||
|
|
||||||
|
# 为每个平台创建发布包 |
||||||
|
for binary in wormhole-server-${VERSION}-*; do |
||||||
|
if [[ "$binary" == *.exe ]]; then |
||||||
|
# Windows平台使用zip |
||||||
|
platform=$(echo "$binary" | sed "s/wormhole-server-${VERSION}-//; s/.exe$//") |
||||||
|
zip -j "wormhole-server-${VERSION}-${platform}.zip" "$binary" ../configs/server.yaml ../README.md |
||||||
|
else |
||||||
|
# 其他平台使用tar.gz |
||||||
|
platform=$(echo "$binary" | sed "s/wormhole-server-${VERSION}-//") |
||||||
|
tar -czf "wormhole-server-${VERSION}-${platform}.tar.gz" "$binary" -C .. configs/server.yaml README.md |
||||||
|
fi |
||||||
|
done |
||||||
|
|
||||||
|
# 创建校验和文件 |
||||||
|
sha256sum wormhole-server-${VERSION}-*.{tar.gz,zip} > wormhole-server-${VERSION}-checksums.txt |
||||||
|
|
||||||
|
- name: Create Release |
||||||
|
uses: ncipollo/release-action@v1 |
||||||
|
with: |
||||||
|
tag: ${{ steps.version.outputs.VERSION }} |
||||||
|
name: Wormhole Server ${{ steps.version.outputs.VERSION }} |
||||||
|
draft: false |
||||||
|
prerelease: false |
||||||
|
artifacts: "release/wormhole-server-*" |
||||||
|
body: | |
||||||
|
## Wormhole Server ${{ steps.version.outputs.VERSION }} |
||||||
|
|
||||||
|
### 🚀 新功能 |
||||||
|
- 高性能 SOCKS5 代理服务器 |
||||||
|
- 速率限制和连接池优化 |
||||||
|
- 内存优化和DNS缓存 |
||||||
|
- 多平台支持 |
||||||
|
|
||||||
|
### 📦 下载 |
||||||
|
|
||||||
|
选择适合您系统的版本: |
||||||
|
|
||||||
|
**Linux:** |
||||||
|
- `wormhole-server-${{ steps.version.outputs.VERSION }}-linux-amd64.tar.gz` - Linux x86_64 |
||||||
|
- `wormhole-server-${{ steps.version.outputs.VERSION }}-linux-arm64.tar.gz` - Linux ARM64 |
||||||
|
- `wormhole-server-${{ steps.version.outputs.VERSION }}-linux-arm.tar.gz` - Linux ARM |
||||||
|
- `wormhole-server-${{ steps.version.outputs.VERSION }}-linux-386.tar.gz` - Linux x86 |
||||||
|
|
||||||
|
**macOS:** |
||||||
|
- `wormhole-server-${{ steps.version.outputs.VERSION }}-darwin-amd64.tar.gz` - macOS Intel |
||||||
|
- `wormhole-server-${{ steps.version.outputs.VERSION }}-darwin-arm64.tar.gz` - macOS Apple Silicon |
||||||
|
|
||||||
|
**Windows:** |
||||||
|
- `wormhole-server-${{ steps.version.outputs.VERSION }}-windows-amd64.zip` - Windows x64 |
||||||
|
- `wormhole-server-${{ steps.version.outputs.VERSION }}-windows-386.zip` - Windows x86 |
||||||
|
- `wormhole-server-${{ steps.version.outputs.VERSION }}-windows-arm64.zip` - Windows ARM64 |
||||||
|
|
||||||
|
**FreeBSD:** |
||||||
|
- `wormhole-server-${{ steps.version.outputs.VERSION }}-freebsd-amd64.tar.gz` - FreeBSD x86_64 |
||||||
|
- `wormhole-server-${{ steps.version.outputs.VERSION }}-freebsd-arm64.tar.gz` - FreeBSD ARM64 |
||||||
|
|
||||||
|
### 🔐 校验和 |
||||||
|
下载 `wormhole-server-${{ steps.version.outputs.VERSION }}-checksums.txt` 来验证文件完整性。 |
||||||
|
|
||||||
|
### 📖 使用方法 |
||||||
|
|
||||||
|
1. 下载适合您系统的版本 |
||||||
|
2. 解压文件 |
||||||
|
3. 编辑 `server.yaml` 配置文件 |
||||||
|
4. 运行 `./wormhole-server -config server.yaml` |
||||||
|
|
||||||
|
更多信息请查看 [README.md](https://github.com/azoic/wormhole-server/blob/main/README.md) |
||||||
|
|
||||||
|
docker: |
||||||
|
name: Build Docker Images |
||||||
|
runs-on: ubuntu-latest |
||||||
|
needs: test |
||||||
|
if: github.event_name == 'push' && (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/')) |
||||||
|
|
||||||
|
steps: |
||||||
|
- name: Checkout code |
||||||
|
uses: actions/checkout@v4 |
||||||
|
|
||||||
|
- name: Set up Docker Buildx |
||||||
|
uses: docker/setup-buildx-action@v3 |
||||||
|
|
||||||
|
- name: Login to Docker Hub |
||||||
|
uses: docker/login-action@v3 |
||||||
|
with: |
||||||
|
username: ${{ secrets.DOCKER_USERNAME }} |
||||||
|
password: ${{ secrets.DOCKER_PASSWORD }} |
||||||
|
if: secrets.DOCKER_USERNAME && secrets.DOCKER_PASSWORD |
||||||
|
|
||||||
|
- name: Get version |
||||||
|
id: version |
||||||
|
run: | |
||||||
|
if [[ $GITHUB_REF == refs/tags/* ]]; then |
||||||
|
VERSION=${GITHUB_REF#refs/tags/} |
||||||
|
echo "VERSION=$VERSION" >> $GITHUB_OUTPUT |
||||||
|
echo "LATEST=true" >> $GITHUB_OUTPUT |
||||||
|
else |
||||||
|
VERSION=v1.1.0-$(git rev-parse --short HEAD) |
||||||
|
echo "VERSION=$VERSION" >> $GITHUB_OUTPUT |
||||||
|
echo "LATEST=false" >> $GITHUB_OUTPUT |
||||||
|
fi |
||||||
|
|
||||||
|
- name: Build and push Docker image |
||||||
|
uses: docker/build-push-action@v5 |
||||||
|
with: |
||||||
|
context: . |
||||||
|
platforms: linux/amd64,linux/arm64 |
||||||
|
push: ${{ secrets.DOCKER_USERNAME && secrets.DOCKER_PASSWORD }} |
||||||
|
tags: | |
||||||
|
${{ secrets.DOCKER_USERNAME }}/wormhole-server:${{ steps.version.outputs.VERSION }} |
||||||
|
${{ secrets.DOCKER_USERNAME }}/wormhole-server:latest |
||||||
|
build-args: | |
||||||
|
VERSION=${{ steps.version.outputs.VERSION }} |
||||||
|
cache-from: type=gha |
||||||
|
cache-to: type=gha,mode=max |
@ -0,0 +1,63 @@ |
|||||||
|
# 多阶段构建 Dockerfile |
||||||
|
# 支持多架构: linux/amd64, linux/arm64 |
||||||
|
|
||||||
|
# 构建阶段 |
||||||
|
FROM --platform=$BUILDPLATFORM golang:1.21-alpine AS builder |
||||||
|
|
||||||
|
# 安装构建依赖 |
||||||
|
RUN apk add --no-cache git ca-certificates tzdata |
||||||
|
|
||||||
|
# 设置工作目录 |
||||||
|
WORKDIR /app |
||||||
|
|
||||||
|
# 复制 go mod 文件 |
||||||
|
COPY go.mod go.sum ./ |
||||||
|
|
||||||
|
# 下载依赖 |
||||||
|
RUN go mod download |
||||||
|
|
||||||
|
# 复制源代码 |
||||||
|
COPY . . |
||||||
|
|
||||||
|
# 构建参数 |
||||||
|
ARG TARGETOS |
||||||
|
ARG TARGETARCH |
||||||
|
ARG VERSION=v1.1.0 |
||||||
|
|
||||||
|
# 构建二进制文件 |
||||||
|
RUN CGO_ENABLED=0 GOOS=$TARGETOS GOARCH=$TARGETARCH go build \ |
||||||
|
-ldflags "-X main.version=${VERSION} -X main.buildTime=$(date -u '+%Y-%m-%d_%H:%M:%S') -X main.gitCommit=$(git rev-parse --short HEAD 2>/dev/null || echo 'unknown') -s -w" \ |
||||||
|
-o wormhole-server \ |
||||||
|
cmd/wormhole-server/main.go |
||||||
|
|
||||||
|
# 运行阶段 |
||||||
|
FROM --platform=$TARGETPLATFORM alpine:latest |
||||||
|
|
||||||
|
# 安装运行时依赖 |
||||||
|
RUN apk --no-cache add ca-certificates tzdata && \ |
||||||
|
addgroup -g 1000 wormhole && \ |
||||||
|
adduser -D -s /bin/sh -u 1000 -G wormhole wormhole |
||||||
|
|
||||||
|
# 设置工作目录 |
||||||
|
WORKDIR /app |
||||||
|
|
||||||
|
# 从构建阶段复制二进制文件 |
||||||
|
COPY --from=builder /app/wormhole-server . |
||||||
|
COPY --from=builder /app/configs ./configs |
||||||
|
|
||||||
|
# 设置权限 |
||||||
|
RUN chown -R wormhole:wormhole /app |
||||||
|
|
||||||
|
# 切换到非root用户 |
||||||
|
USER wormhole |
||||||
|
|
||||||
|
# 暴露端口 |
||||||
|
EXPOSE 1080 8090 |
||||||
|
|
||||||
|
# 健康检查 |
||||||
|
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ |
||||||
|
CMD wget --no-verbose --tries=1 --spider http://localhost:8090/health || exit 1 |
||||||
|
|
||||||
|
# 启动命令 |
||||||
|
ENTRYPOINT ["./wormhole-server"] |
||||||
|
CMD ["-config", "configs/server.yaml"] |
@ -0,0 +1,298 @@ |
|||||||
|
#!/bin/bash |
||||||
|
|
||||||
|
# 多平台构建脚本 |
||||||
|
# 用法: ./scripts/build.sh [版本号] [平台] |
||||||
|
|
||||||
|
set -e |
||||||
|
|
||||||
|
# 默认值 |
||||||
|
VERSION=${1:-"v1.1.0"} |
||||||
|
PLATFORM=${2:-"all"} |
||||||
|
|
||||||
|
# 配置 |
||||||
|
APP_NAME="wormhole-server" |
||||||
|
BUILD_TIME=$(date -u '+%Y-%m-%d_%H:%M:%S') |
||||||
|
GIT_COMMIT=$(git rev-parse --short HEAD 2>/dev/null || echo "unknown") |
||||||
|
|
||||||
|
# 颜色输出 |
||||||
|
RED='\033[0;31m' |
||||||
|
GREEN='\033[0;32m' |
||||||
|
YELLOW='\033[1;33m' |
||||||
|
BLUE='\033[0;34m' |
||||||
|
NC='\033[0m' # No Color |
||||||
|
|
||||||
|
# 支持的平台列表 |
||||||
|
SUPPORTED_PLATFORMS=( |
||||||
|
"linux-amd64:linux:amd64:" |
||||||
|
"linux-arm64:linux:arm64:" |
||||||
|
"linux-386:linux:386:" |
||||||
|
"linux-arm:linux:arm:" |
||||||
|
"darwin-amd64:darwin:amd64:" |
||||||
|
"darwin-arm64:darwin:arm64:" |
||||||
|
"windows-amd64:windows:amd64:.exe" |
||||||
|
"windows-386:windows:386:.exe" |
||||||
|
"windows-arm64:windows:arm64:.exe" |
||||||
|
"freebsd-amd64:freebsd:amd64:" |
||||||
|
"freebsd-arm64:freebsd:arm64:" |
||||||
|
) |
||||||
|
|
||||||
|
# 日志函数 |
||||||
|
log_info() { |
||||||
|
echo -e "${BLUE}[INFO]${NC} $1" |
||||||
|
} |
||||||
|
|
||||||
|
log_success() { |
||||||
|
echo -e "${GREEN}[SUCCESS]${NC} $1" |
||||||
|
} |
||||||
|
|
||||||
|
log_warn() { |
||||||
|
echo -e "${YELLOW}[WARN]${NC} $1" |
||||||
|
} |
||||||
|
|
||||||
|
log_error() { |
||||||
|
echo -e "${RED}[ERROR]${NC} $1" |
||||||
|
} |
||||||
|
|
||||||
|
# 获取平台信息 |
||||||
|
get_platform_info() { |
||||||
|
local platform=$1 |
||||||
|
for entry in "${SUPPORTED_PLATFORMS[@]}"; do |
||||||
|
IFS=':' read -ra parts <<< "$entry" |
||||||
|
if [[ "${parts[0]}" == "$platform" ]]; then |
||||||
|
echo "${parts[1]} ${parts[2]} ${parts[3]}" |
||||||
|
return 0 |
||||||
|
fi |
||||||
|
done |
||||||
|
return 1 |
||||||
|
} |
||||||
|
|
||||||
|
# 显示帮助信息 |
||||||
|
show_help() { |
||||||
|
echo "多平台构建脚本 - Wormhole Server" |
||||||
|
echo "" |
||||||
|
echo "用法:" |
||||||
|
echo " $0 [版本号] [平台]" |
||||||
|
echo "" |
||||||
|
echo "参数:" |
||||||
|
echo " 版本号 构建版本 (默认: v1.1.0)" |
||||||
|
echo " 平台 目标平台 (默认: all)" |
||||||
|
echo "" |
||||||
|
echo "支持的平台:" |
||||||
|
for entry in "${SUPPORTED_PLATFORMS[@]}"; do |
||||||
|
IFS=':' read -ra parts <<< "$entry" |
||||||
|
echo " ${parts[0]} - ${parts[1]} ${parts[2]}" |
||||||
|
done |
||||||
|
echo " all - 构建所有平台" |
||||||
|
echo "" |
||||||
|
echo "示例:" |
||||||
|
echo " $0 # 构建所有平台,版本 v1.1.0" |
||||||
|
echo " $0 v1.2.0 # 构建所有平台,版本 v1.2.0" |
||||||
|
echo " $0 v1.2.0 linux-amd64 # 构建 Linux AMD64 版本" |
||||||
|
echo " $0 v1.2.0 darwin-arm64 # 构建 macOS ARM64 版本" |
||||||
|
} |
||||||
|
|
||||||
|
# 检查依赖 |
||||||
|
check_dependencies() { |
||||||
|
log_info "检查构建依赖..." |
||||||
|
|
||||||
|
if ! command -v go &> /dev/null; then |
||||||
|
log_error "Go 未安装或不在 PATH 中" |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
|
||||||
|
GO_VERSION=$(go version | cut -d' ' -f3) |
||||||
|
log_info "Go 版本: $GO_VERSION" |
||||||
|
|
||||||
|
if ! command -v git &> /dev/null; then |
||||||
|
log_warn "Git 未安装,将使用默认提交哈希" |
||||||
|
fi |
||||||
|
} |
||||||
|
|
||||||
|
# 构建单个平台 |
||||||
|
build_platform() { |
||||||
|
local platform=$1 |
||||||
|
|
||||||
|
local platform_info=$(get_platform_info "$platform") |
||||||
|
if [[ $? -ne 0 ]]; then |
||||||
|
log_error "不支持的平台: $platform" |
||||||
|
return 1 |
||||||
|
fi |
||||||
|
|
||||||
|
IFS=' ' read -ra parts <<< "$platform_info" |
||||||
|
local goos=${parts[0]} |
||||||
|
local goarch=${parts[1]} |
||||||
|
local ext=${parts[2]:-""} |
||||||
|
|
||||||
|
local binary_name="${APP_NAME}-${VERSION}-${platform}${ext}" |
||||||
|
local output_path="dist/${binary_name}" |
||||||
|
|
||||||
|
log_info "构建 ${platform} (${goos}/${goarch})..." |
||||||
|
|
||||||
|
# 创建输出目录 |
||||||
|
mkdir -p dist |
||||||
|
|
||||||
|
# 设置环境变量并构建 |
||||||
|
GOOS=$goos GOARCH=$goarch go build \ |
||||||
|
-ldflags "-X main.version=${VERSION} -X main.buildTime=${BUILD_TIME} -X main.gitCommit=${GIT_COMMIT} -s -w" \ |
||||||
|
-o "$output_path" \ |
||||||
|
cmd/wormhole-server/main.go |
||||||
|
|
||||||
|
if [[ $? -eq 0 ]]; then |
||||||
|
local size=$(du -h "$output_path" | cut -f1) |
||||||
|
log_success "构建完成: $output_path ($size)" |
||||||
|
return 0 |
||||||
|
else |
||||||
|
log_error "构建失败: $platform" |
||||||
|
return 1 |
||||||
|
fi |
||||||
|
} |
||||||
|
|
||||||
|
# 构建所有平台 |
||||||
|
build_all() { |
||||||
|
log_info "开始构建所有平台..." |
||||||
|
|
||||||
|
local success_count=0 |
||||||
|
local total_count=${#SUPPORTED_PLATFORMS[@]} |
||||||
|
|
||||||
|
for entry in "${SUPPORTED_PLATFORMS[@]}"; do |
||||||
|
IFS=':' read -ra parts <<< "$entry" |
||||||
|
local platform=${parts[0]} |
||||||
|
if build_platform "$platform"; then |
||||||
|
((success_count++)) |
||||||
|
fi |
||||||
|
echo "" |
||||||
|
done |
||||||
|
|
||||||
|
log_info "构建统计: $success_count/$total_count 成功" |
||||||
|
|
||||||
|
if [[ $success_count -eq $total_count ]]; then |
||||||
|
log_success "所有平台构建成功!" |
||||||
|
return 0 |
||||||
|
else |
||||||
|
log_warn "部分平台构建失败" |
||||||
|
return 1 |
||||||
|
fi |
||||||
|
} |
||||||
|
|
||||||
|
# 创建发布包 |
||||||
|
create_release_packages() { |
||||||
|
log_info "创建发布包..." |
||||||
|
|
||||||
|
cd dist |
||||||
|
|
||||||
|
for file in ${APP_NAME}-${VERSION}-*; do |
||||||
|
if [[ -f "$file" ]]; then |
||||||
|
if [[ "$file" == *.exe ]]; then |
||||||
|
# Windows 平台使用 zip |
||||||
|
platform=$(echo "$file" | sed "s/${APP_NAME}-${VERSION}-//; s/.exe$//") |
||||||
|
if command -v zip &> /dev/null; then |
||||||
|
zip -q "${APP_NAME}-${VERSION}-${platform}.zip" "$file" ../configs/server.yaml ../README.md |
||||||
|
log_success "创建包: ${APP_NAME}-${VERSION}-${platform}.zip" |
||||||
|
else |
||||||
|
log_warn "zip 命令未找到,跳过 Windows 包创建" |
||||||
|
fi |
||||||
|
else |
||||||
|
# 其他平台使用 tar.gz |
||||||
|
platform=$(echo "$file" | sed "s/${APP_NAME}-${VERSION}-//") |
||||||
|
tar -czf "${APP_NAME}-${VERSION}-${platform}.tar.gz" "$file" -C .. configs/server.yaml README.md |
||||||
|
log_success "创建包: ${APP_NAME}-${VERSION}-${platform}.tar.gz" |
||||||
|
fi |
||||||
|
fi |
||||||
|
done |
||||||
|
|
||||||
|
# 创建校验和文件 |
||||||
|
if ls ${APP_NAME}-${VERSION}-*.{tar.gz,zip} 1> /dev/null 2>&1; then |
||||||
|
sha256sum ${APP_NAME}-${VERSION}-*.{tar.gz,zip} 2>/dev/null > ${APP_NAME}-${VERSION}-checksums.txt || \ |
||||||
|
shasum -a 256 ${APP_NAME}-${VERSION}-*.{tar.gz,zip} > ${APP_NAME}-${VERSION}-checksums.txt |
||||||
|
log_success "创建校验和文件: ${APP_NAME}-${VERSION}-checksums.txt" |
||||||
|
fi |
||||||
|
|
||||||
|
cd .. |
||||||
|
} |
||||||
|
|
||||||
|
# 显示构建结果 |
||||||
|
show_results() { |
||||||
|
log_info "构建结果:" |
||||||
|
|
||||||
|
if [[ -d "dist" ]]; then |
||||||
|
echo "" |
||||||
|
ls -lh dist/ | grep -E "(${APP_NAME}|总计|total)" |
||||||
|
echo "" |
||||||
|
|
||||||
|
log_info "要运行本地版本,使用:" |
||||||
|
if [[ "$OSTYPE" == "msys" || "$OSTYPE" == "cygwin" ]]; then |
||||||
|
echo " .\\dist\\${APP_NAME}-${VERSION}-windows-amd64.exe -config configs\\server.yaml" |
||||||
|
elif [[ "$OSTYPE" == "darwin"* ]]; then |
||||||
|
if [[ $(uname -m) == "arm64" ]]; then |
||||||
|
echo " ./dist/${APP_NAME}-${VERSION}-darwin-arm64 -config configs/server.yaml" |
||||||
|
else |
||||||
|
echo " ./dist/${APP_NAME}-${VERSION}-darwin-amd64 -config configs/server.yaml" |
||||||
|
fi |
||||||
|
else |
||||||
|
echo " ./dist/${APP_NAME}-${VERSION}-linux-amd64 -config configs/server.yaml" |
||||||
|
fi |
||||||
|
fi |
||||||
|
} |
||||||
|
|
||||||
|
# 主函数 |
||||||
|
main() { |
||||||
|
echo "==============================================" |
||||||
|
echo " Wormhole Server 多平台构建脚本" |
||||||
|
echo "==============================================" |
||||||
|
echo "" |
||||||
|
|
||||||
|
# 处理帮助参数 |
||||||
|
if [[ "$1" == "-h" || "$1" == "--help" ]]; then |
||||||
|
show_help |
||||||
|
exit 0 |
||||||
|
fi |
||||||
|
|
||||||
|
log_info "构建版本: $VERSION" |
||||||
|
log_info "目标平台: $PLATFORM" |
||||||
|
log_info "构建时间: $BUILD_TIME" |
||||||
|
log_info "Git 提交: $GIT_COMMIT" |
||||||
|
echo "" |
||||||
|
|
||||||
|
# 检查依赖 |
||||||
|
check_dependencies |
||||||
|
echo "" |
||||||
|
|
||||||
|
# 下载依赖 |
||||||
|
log_info "下载 Go 模块依赖..." |
||||||
|
go mod download |
||||||
|
go mod tidy |
||||||
|
echo "" |
||||||
|
|
||||||
|
# 执行构建 |
||||||
|
local build_success=false |
||||||
|
|
||||||
|
if [[ "$PLATFORM" == "all" ]]; then |
||||||
|
if build_all; then |
||||||
|
build_success=true |
||||||
|
fi |
||||||
|
else |
||||||
|
if build_platform "$PLATFORM"; then |
||||||
|
build_success=true |
||||||
|
fi |
||||||
|
fi |
||||||
|
|
||||||
|
# 创建发布包 (仅在构建成功时) |
||||||
|
if [[ "$build_success" == true && "$PLATFORM" == "all" ]]; then |
||||||
|
echo "" |
||||||
|
create_release_packages |
||||||
|
fi |
||||||
|
|
||||||
|
echo "" |
||||||
|
show_results |
||||||
|
|
||||||
|
if [[ "$build_success" == true ]]; then |
||||||
|
log_success "构建完成!" |
||||||
|
exit 0 |
||||||
|
else |
||||||
|
log_error "构建失败!" |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
} |
||||||
|
|
||||||
|
# 运行主函数 |
||||||
|
main "$@" |
@ -0,0 +1,248 @@ |
|||||||
|
#!/bin/bash |
||||||
|
|
||||||
|
# Docker SOCKS5 代理配置脚本 |
||||||
|
# 用法: ./scripts/setup-docker-proxy.sh [SOCKS5地址] [用户名] [密码] |
||||||
|
|
||||||
|
set -e |
||||||
|
|
||||||
|
# 默认配置 |
||||||
|
SOCKS5_HOST=${1:-"127.0.0.1"} |
||||||
|
SOCKS5_PORT=${2:-"1080"} |
||||||
|
USERNAME=${3:-"admin"} |
||||||
|
PASSWORD=${4:-"secure123"} |
||||||
|
|
||||||
|
# 颜色输出 |
||||||
|
RED='\033[0;31m' |
||||||
|
GREEN='\033[0;32m' |
||||||
|
YELLOW='\033[1;33m' |
||||||
|
BLUE='\033[0;34m' |
||||||
|
NC='\033[0m' |
||||||
|
|
||||||
|
log_info() { |
||||||
|
echo -e "${BLUE}[INFO]${NC} $1" |
||||||
|
} |
||||||
|
|
||||||
|
log_success() { |
||||||
|
echo -e "${GREEN}[SUCCESS]${NC} $1" |
||||||
|
} |
||||||
|
|
||||||
|
log_warn() { |
||||||
|
echo -e "${YELLOW}[WARN]${NC} $1" |
||||||
|
} |
||||||
|
|
||||||
|
log_error() { |
||||||
|
echo -e "${RED}[ERROR]${NC} $1" |
||||||
|
} |
||||||
|
|
||||||
|
# 检查操作系统 |
||||||
|
detect_os() { |
||||||
|
if [[ "$OSTYPE" == "darwin"* ]]; then |
||||||
|
echo "macos" |
||||||
|
elif [[ "$OSTYPE" == "linux-gnu"* ]]; then |
||||||
|
echo "linux" |
||||||
|
else |
||||||
|
echo "unknown" |
||||||
|
fi |
||||||
|
} |
||||||
|
|
||||||
|
# 配置Docker Desktop (macOS/Windows) |
||||||
|
configure_docker_desktop() { |
||||||
|
log_info "配置Docker Desktop代理设置..." |
||||||
|
|
||||||
|
# Docker Desktop配置文件路径 |
||||||
|
if [[ "$(detect_os)" == "macos" ]]; then |
||||||
|
DOCKER_CONFIG_DIR="$HOME/.docker" |
||||||
|
else |
||||||
|
DOCKER_CONFIG_DIR="$HOME/.docker" |
||||||
|
fi |
||||||
|
|
||||||
|
mkdir -p "$DOCKER_CONFIG_DIR" |
||||||
|
|
||||||
|
# 创建daemon.json配置 |
||||||
|
cat > "$DOCKER_CONFIG_DIR/daemon.json" << EOF |
||||||
|
{ |
||||||
|
"proxies": { |
||||||
|
"default": { |
||||||
|
"httpProxy": "socks5://${USERNAME}:${PASSWORD}@${SOCKS5_HOST}:${SOCKS5_PORT}", |
||||||
|
"httpsProxy": "socks5://${USERNAME}:${PASSWORD}@${SOCKS5_HOST}:${SOCKS5_PORT}", |
||||||
|
"noProxy": "localhost,127.0.0.1,*.local" |
||||||
|
} |
||||||
|
}, |
||||||
|
"registry-mirrors": [ |
||||||
|
"https://docker.mirrors.ustc.edu.cn", |
||||||
|
"https://hub-mirror.c.163.com" |
||||||
|
] |
||||||
|
} |
||||||
|
EOF |
||||||
|
|
||||||
|
log_success "Docker daemon.json 配置已创建: $DOCKER_CONFIG_DIR/daemon.json" |
||||||
|
} |
||||||
|
|
||||||
|
# 配置Docker客户端 |
||||||
|
configure_docker_client() { |
||||||
|
log_info "配置Docker客户端代理设置..." |
||||||
|
|
||||||
|
DOCKER_CONFIG_DIR="$HOME/.docker" |
||||||
|
mkdir -p "$DOCKER_CONFIG_DIR" |
||||||
|
|
||||||
|
# 创建config.json配置 |
||||||
|
cat > "$DOCKER_CONFIG_DIR/config.json" << EOF |
||||||
|
{ |
||||||
|
"proxies": { |
||||||
|
"default": { |
||||||
|
"httpProxy": "socks5://${USERNAME}:${PASSWORD}@${SOCKS5_HOST}:${SOCKS5_PORT}", |
||||||
|
"httpsProxy": "socks5://${USERNAME}:${PASSWORD}@${SOCKS5_HOST}:${SOCKS5_PORT}", |
||||||
|
"noProxy": "localhost,127.0.0.1,*.local" |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
EOF |
||||||
|
|
||||||
|
log_success "Docker 客户端配置已创建: $DOCKER_CONFIG_DIR/config.json" |
||||||
|
} |
||||||
|
|
||||||
|
# 配置systemd服务 (Linux) |
||||||
|
configure_docker_systemd() { |
||||||
|
log_info "配置Docker systemd服务代理..." |
||||||
|
|
||||||
|
DOCKER_SERVICE_DIR="/etc/systemd/system/docker.service.d" |
||||||
|
|
||||||
|
if [[ ! -d "$DOCKER_SERVICE_DIR" ]]; then |
||||||
|
log_info "创建Docker服务目录: $DOCKER_SERVICE_DIR" |
||||||
|
sudo mkdir -p "$DOCKER_SERVICE_DIR" |
||||||
|
fi |
||||||
|
|
||||||
|
# 创建代理配置文件 |
||||||
|
sudo tee "$DOCKER_SERVICE_DIR/proxy.conf" > /dev/null << EOF |
||||||
|
[Service] |
||||||
|
Environment="HTTP_PROXY=socks5://${USERNAME}:${PASSWORD}@${SOCKS5_HOST}:${SOCKS5_PORT}" |
||||||
|
Environment="HTTPS_PROXY=socks5://${USERNAME}:${PASSWORD}@${SOCKS5_HOST}:${SOCKS5_PORT}" |
||||||
|
Environment="NO_PROXY=localhost,127.0.0.1,*.local" |
||||||
|
EOF |
||||||
|
|
||||||
|
log_success "Docker systemd 代理配置已创建" |
||||||
|
|
||||||
|
# 重新加载配置 |
||||||
|
log_info "重新加载systemd配置..." |
||||||
|
sudo systemctl daemon-reload |
||||||
|
sudo systemctl restart docker |
||||||
|
|
||||||
|
log_success "Docker服务已重启" |
||||||
|
} |
||||||
|
|
||||||
|
# 设置环境变量 |
||||||
|
setup_env_vars() { |
||||||
|
log_info "设置环境变量..." |
||||||
|
|
||||||
|
cat << EOF |
||||||
|
|
||||||
|
# 添加以下环境变量到您的 ~/.bashrc 或 ~/.zshrc: |
||||||
|
export HTTP_PROXY=socks5://${USERNAME}:${PASSWORD}@${SOCKS5_HOST}:${SOCKS5_PORT} |
||||||
|
export HTTPS_PROXY=socks5://${USERNAME}:${PASSWORD}@${SOCKS5_HOST}:${SOCKS5_PORT} |
||||||
|
export NO_PROXY=localhost,127.0.0.1,*.local |
||||||
|
|
||||||
|
# 或者临时设置 (当前shell有效): |
||||||
|
EOF |
||||||
|
|
||||||
|
echo "export HTTP_PROXY=socks5://${USERNAME}:${PASSWORD}@${SOCKS5_HOST}:${SOCKS5_PORT}" |
||||||
|
echo "export HTTPS_PROXY=socks5://${USERNAME}:${PASSWORD}@${SOCKS5_HOST}:${SOCKS5_PORT}" |
||||||
|
echo "export NO_PROXY=localhost,127.0.0.1,*.local" |
||||||
|
} |
||||||
|
|
||||||
|
# 测试连接 |
||||||
|
test_connection() { |
||||||
|
log_info "测试SOCKS5连接..." |
||||||
|
|
||||||
|
# 测试SOCKS5代理是否可用 |
||||||
|
if command -v curl &> /dev/null; then |
||||||
|
if curl --socks5 "${USERNAME}:${PASSWORD}@${SOCKS5_HOST}:${SOCKS5_PORT}" \ |
||||||
|
--connect-timeout 10 \ |
||||||
|
-s https://registry-1.docker.io/v2/ > /dev/null; then |
||||||
|
log_success "SOCKS5代理连接测试成功" |
||||||
|
else |
||||||
|
log_error "SOCKS5代理连接测试失败" |
||||||
|
return 1 |
||||||
|
fi |
||||||
|
else |
||||||
|
log_warn "curl未安装,跳过连接测试" |
||||||
|
fi |
||||||
|
} |
||||||
|
|
||||||
|
# 显示帮助信息 |
||||||
|
show_help() { |
||||||
|
echo "Docker SOCKS5 代理配置脚本" |
||||||
|
echo "" |
||||||
|
echo "用法:" |
||||||
|
echo " $0 [SOCKS5地址] [端口] [用户名] [密码]" |
||||||
|
echo "" |
||||||
|
echo "参数:" |
||||||
|
echo " SOCKS5地址 SOCKS5服务器地址 (默认: 127.0.0.1)" |
||||||
|
echo " 端口 SOCKS5服务器端口 (默认: 1080)" |
||||||
|
echo " 用户名 认证用户名 (默认: admin)" |
||||||
|
echo " 密码 认证密码 (默认: secure123)" |
||||||
|
echo "" |
||||||
|
echo "示例:" |
||||||
|
echo " $0 # 使用默认配置" |
||||||
|
echo " $0 192.168.1.100 1080 user pass # 自定义配置" |
||||||
|
} |
||||||
|
|
||||||
|
# 主函数 |
||||||
|
main() { |
||||||
|
echo "==============================================" |
||||||
|
echo " Docker SOCKS5 代理配置脚本" |
||||||
|
echo "==============================================" |
||||||
|
echo "" |
||||||
|
|
||||||
|
if [[ "$1" == "-h" || "$1" == "--help" ]]; then |
||||||
|
show_help |
||||||
|
exit 0 |
||||||
|
fi |
||||||
|
|
||||||
|
log_info "SOCKS5服务器: ${SOCKS5_HOST}:${SOCKS5_PORT}" |
||||||
|
log_info "认证信息: ${USERNAME}:${PASSWORD}" |
||||||
|
echo "" |
||||||
|
|
||||||
|
# 测试连接 |
||||||
|
if ! test_connection; then |
||||||
|
log_error "请确保SOCKS5服务器正在运行并且配置正确" |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
|
||||||
|
# 检测操作系统并配置 |
||||||
|
OS=$(detect_os) |
||||||
|
case $OS in |
||||||
|
"macos") |
||||||
|
log_info "检测到macOS系统" |
||||||
|
configure_docker_desktop |
||||||
|
configure_docker_client |
||||||
|
;; |
||||||
|
"linux") |
||||||
|
log_info "检测到Linux系统" |
||||||
|
configure_docker_client |
||||||
|
if systemctl is-active --quiet docker; then |
||||||
|
configure_docker_systemd |
||||||
|
else |
||||||
|
log_warn "Docker服务未运行,跳过systemd配置" |
||||||
|
fi |
||||||
|
;; |
||||||
|
*) |
||||||
|
log_warn "未知操作系统,仅配置客户端" |
||||||
|
configure_docker_client |
||||||
|
;; |
||||||
|
esac |
||||||
|
|
||||||
|
echo "" |
||||||
|
setup_env_vars |
||||||
|
echo "" |
||||||
|
|
||||||
|
log_success "Docker代理配置完成!" |
||||||
|
log_info "请重启Docker Desktop或执行 'sudo systemctl restart docker' 使配置生效" |
||||||
|
|
||||||
|
echo "" |
||||||
|
echo "测试命令:" |
||||||
|
echo " docker pull hello-world" |
||||||
|
echo " docker run hello-world" |
||||||
|
} |
||||||
|
|
||||||
|
# 运行主函数 |
||||||
|
main "$@" |
Loading…
Reference in new issue