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