diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..9de2958 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,91 @@ +# ============================================== +# Docker 忽略文件 +# 优化构建上下文,减少构建时间 +# ============================================== + +# Git 相关 +.git +.gitignore +.gitattributes + +# 文档 +README.md +*.md +docs/ + +# 开发配置 +.env +.env.local +.env.development +.env.test +.env.production +.envrc + +# IDE 和编辑器 +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# Node.js +node_modules/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.npm +.yarn-integrity + +# Next.js +chuan-next/.next/ +chuan-next/out/ +chuan-next/.env* +chuan-next/build.log + +# Go 相关 +# *.sum # 注释掉这行,因为需要 go.sum 文件 +vendor/ + +# 构建输出 +dist/ +build/ +*.exe +*.exe~ + +# 日志文件 +*.log +logs/ + +# 临时文件 +tmp/ +temp/ +.tmp + +# OS 生成文件 +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +ehthumbs.db +Thumbs.db + +# Docker 相关 +Dockerfile* +docker-compose* +.dockerignore + +# CI/CD +.github/ +.gitlab-ci.yml +.travis.yml +.circleci/ + +# 测试 +coverage/ +.nyc_output/ +.coverage + +# 其他构建工具 +.sass-cache/ +.cache/ diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml new file mode 100644 index 0000000..e408f13 --- /dev/null +++ b/.github/workflows/docker-publish.yml @@ -0,0 +1,129 @@ +name: 🐳 Build and Push Docker Image + +on: + # 手动触发 + workflow_dispatch: + inputs: + version: + description: '版本号 (例如: v1.0.5)' + required: true + default: 'v1.0.5' + type: string + push_to_hub: + description: '推送到 Docker Hub' + required: true + default: true + type: boolean + build_multiarch: + description: '构建多架构镜像 (amd64 + arm64)' + required: true + default: true + type: boolean + + # 推送标签时触发 + push: + tags: + - 'v*.*.*' + + # PR 时构建测试(不推送) + pull_request: + branches: [ main ] + +env: + REGISTRY: docker.io + IMAGE_NAME: matrixseven/file-transfer-go + +jobs: + build: + name: 🏗️ Build & Push Docker Image + runs-on: ubuntu-latest + + permissions: + contents: read + packages: write + + steps: + - name: 📥 Checkout code + uses: actions/checkout@v4 + + - name: 🏷️ Extract metadata + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + tags: | + type=ref,event=branch + type=ref,event=pr + type=semver,pattern={{version}} + type=semver,pattern={{major}}.{{minor}} + type=semver,pattern={{major}} + type=raw,value=latest,enable={{is_default_branch}} + type=raw,value=${{ inputs.version }},enable=${{ github.event_name == 'workflow_dispatch' }} + + - name: 🔧 Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + with: + platforms: linux/amd64,linux/arm64 + + - name: 🔑 Login to Docker Hub + if: github.event_name != 'pull_request' + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ secrets.DOCKER_HUB_USERNAME }} + password: ${{ secrets.DOCKER_HUB_TOKEN }} + + - name: 🐳 Build and push Docker image + uses: docker/build-push-action@v5 + with: + context: . + file: ./Dockerfile + platforms: ${{ (github.event_name == 'workflow_dispatch' && inputs.build_multiarch == true) || github.event_name == 'push' && 'linux/amd64,linux/arm64' || 'linux/amd64' }} + push: ${{ github.event_name != 'pull_request' && (inputs.push_to_hub != false) }} + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: type=gha + cache-to: type=gha,mode=max + + - name: 📊 Image digest + if: github.event_name != 'pull_request' + run: echo ${{ steps.build.outputs.digest }} + + - name: 🎉 Build Summary + if: always() + run: | + echo "## 🐳 Docker Build Summary" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 📦 Image Details" >> $GITHUB_STEP_SUMMARY + echo "- **Registry**: ${{ env.REGISTRY }}" >> $GITHUB_STEP_SUMMARY + echo "- **Image**: ${{ env.IMAGE_NAME }}" >> $GITHUB_STEP_SUMMARY + echo "- **Tags**: ${{ steps.meta.outputs.tags }}" >> $GITHUB_STEP_SUMMARY + echo "- **Platforms**: ${{ (github.event_name == 'workflow_dispatch' && inputs.build_multiarch == true) || github.event_name == 'push' && 'linux/amd64,linux/arm64' || 'linux/amd64' }}" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### 🚀 Usage" >> $GITHUB_STEP_SUMMARY + echo '```bash' >> $GITHUB_STEP_SUMMARY + echo "docker run -d -p 8080:8080 ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ inputs.version || 'latest' }}" >> $GITHUB_STEP_SUMMARY + echo '```' >> $GITHUB_STEP_SUMMARY + + security-scan: + name: 🔍 Security Scan + runs-on: ubuntu-latest + needs: build + if: github.event_name != 'pull_request' + + steps: + - name: 📥 Checkout code + uses: actions/checkout@v4 + + - name: 🔍 Run Trivy vulnerability scanner + uses: aquasecurity/trivy-action@master + with: + image-ref: '${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest' + format: 'sarif' + output: 'trivy-results.sarif' + + - name: 📤 Upload Trivy scan results + uses: github/codeql-action/upload-sarif@v3 + if: always() + with: + sarif_file: 'trivy-results.sarif' diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..1efda63 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,65 @@ +# ============================================== +# 最简 Dockerfile - 专为 Docker 环境优化 +# ============================================== + +FROM node:20-alpine AS builder + +# 国内镜像源优化 +RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && \ + npm config set registry https://registry.npmmirror.com + +# 安装必要工具 +RUN apk add --no-cache bash git curl wget make ca-certificates tzdata + +# 安装 Go +ENV GO_VERSION=1.21.5 +RUN wget https://mirrors.aliyun.com/golang/go${GO_VERSION}.linux-amd64.tar.gz && \ + tar -C /usr/local -xzf go${GO_VERSION}.linux-amd64.tar.gz && \ + rm go${GO_VERSION}.linux-amd64.tar.gz + +# Go 环境 +ENV PATH=/usr/local/go/bin:$PATH +ENV GOPROXY=https://goproxy.cn,direct + +WORKDIR /app + +# Go 依赖 +COPY go.mod go.sum ./ +RUN go mod download + +# 前端依赖和构建 +COPY chuan-next/package.json ./chuan-next/ +RUN cd chuan-next && npm install + +COPY chuan-next/ ./chuan-next/ +# 临时移除 API 目录进行 SSG 构建(模仿 build-fullstack.sh) +RUN cd chuan-next && \ + if [ -d "src/app/api" ]; then mv src/app/api /tmp/api-backup; fi && \ + NEXT_EXPORT=true npm run build && \ + if [ -d "/tmp/api-backup" ]; then mv /tmp/api-backup src/app/api; fi + +# Go 源码和构建 +COPY cmd/ ./cmd/ +COPY internal/ ./internal/ + +# 嵌入前端文件 +RUN mkdir -p internal/web/frontend && \ + cp -r chuan-next/out/* internal/web/frontend/ + +# 构建 Go 应用 +RUN CGO_ENABLED=0 go build -ldflags='-w -s' -o server ./cmd + +# ============================================== + +FROM alpine:3.18 + +RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && \ + apk add --no-cache ca-certificates tzdata && \ + adduser -D -s /bin/sh appuser + +WORKDIR /app +COPY --from=builder --chown=appuser:appuser /app/server ./ +USER appuser + +EXPOSE 8080 +CMD ["./server"] diff --git a/README.md b/README.md index b1c8f77..23d6bb2 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ **安全、快速、简单的点对点文件传输解决方案 - 无需注册,即传即用** -[在线体验](https://transfer.52python.cn) • [GitHub](https://github.com/MatrixSeven/file-transfer-go) +## [在线体验](https://transfer.52python.cn) • [GitHub](https://github.com/MatrixSeven/file-transfer-go) ![项目演示](img.png) @@ -31,6 +31,12 @@ ## 🔄 最近更新日志 +### 2025-08-28 +- ✅ **完善Docker部署支持** - 优化Docker配置,支持一键部署和多环境配置 +- ✅ **优化README文档** - 更新项目说明,完善部署指南和技术栈信息 +- ✅ **改进UI用户体验** - 优化界面细节,完善错误提示和加载状态 +- ✅ **重构Hooks架构** - 拆分复杂hooks,提高代码复用性和可维护性 + ### 2025-08-24 - ✅ **文件传输 ACK 确认支持** - 实现了可靠的数据传输机制,每个数据块都需要接收方确认 - ✅ **修复组件渲染后重复注册/解绑 bug** - 解决了 React 组件重复渲染导致的处理器反复注册问题 @@ -44,14 +50,50 @@ ## 🚀 技术栈 +### 前端技术栈 +- **Next.js 15** - React全栈框架,支持SSR/SSG +- **React 18** - 现代化UI组件库 +- **TypeScript 5** - 类型安全的JavaScript超集 +- **Tailwind CSS 3.4** - 实用优先的CSS框架 +- **Radix UI** - 无障碍访问的组件库 +- **Zustand** - 轻量级状态管理 +- **Lucide React** - 现代化图标库 + +### 后端技术栈 +- **Go 1.22** - 高性能编程语言 +- **WebSocket** - 实时双向通信 +- **内存存储** - 轻量级数据存储 +- **标准库** - 原生HTTP服务器 + +### 传输协议 +- **WebRTC DataChannel** - 端到端数据传输 +- **P2P直连** - 点对点连接,无需中转 +- **ICE框架** - 网络连接协商 +- **STUN/TURN** - NAT穿透支持 -**前端** - Next.js 15 + React 18 + TypeScript + Tailwind CSS -**后端** - Go + WebSocket + 内存存储 -**传输** - WebRTC DataChannel + P2P直连 +### 架构特点 +- **微服务架构** - 前后端分离 +- **实时通信** - WebSocket + WebRTC +- **响应式设计** - 移动端适配 +- **容器化** - Docker部署支持 ## 📦 快速部署 +### 方式一:Docker 一键部署(推荐) + +```bash +# 使用 Docker Compose(最简单) +git clone https://github.com/MatrixSeven/file-transfer-go.git +cd file-transfer-go +docker-compose up -d + +# 或者直接使用 Docker 镜像 +docker run -d -p 8080:8080 --name file-transfer-go matrixseven/file-transfer:latest +``` + +### 方式二:本地构建部署 + ```bash git clone https://github.com/MatrixSeven/file-transfer-go.git cd file-transfer-go @@ -61,6 +103,44 @@ cd file-transfer-go 访问 http://localhost:8080 开始使用 +### 方式三:开发环境部署 + +```bash +# 后端服务 +make dev + +# 前端服务(新终端) +cd chuan-next && yarn && yarn dev +``` + +### 部署配置说明 + +#### 环境变量配置 +- `NODE_ENV`: 运行环境(development/production) +- `PORT`: 服务端口(默认8080) +- `GO_BACKEND_URL`: 后端服务地址 + +#### Docker 配置选项 +```yaml +# docker-compose.yml 可配置项 +environment: + - NODE_ENV=production + - PORT=8080 +ports: + - "8080:8080" +restart: unless-stopped +``` + +#### 多架构支持 +项目支持多架构Docker镜像: +- `linux/amd64` - x86_64 架构 +- `linux/arm64` - ARM 64位架构 + +#### 镜像版本 +- `latest` - 最新稳定版本 +- `v1.0.x` - 特定版本号 +- `dev` - 开发版本 + ## 🎯 使用方法 ### 发送文件 diff --git a/bug-repo.png b/bug-repo.png deleted file mode 100644 index be49af5..0000000 Binary files a/bug-repo.png and /dev/null differ diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..e2248fe --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,23 @@ +version: '3.8' + +services: + file-transfer-go: + build: . + ports: + - "8080:8080" + environment: + - NODE_ENV=production + restart: unless-stopped + healthcheck: + test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:8080"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 40s + + # 可选:使用已发布的镜像 + # file-transfer-go: + # image: matrixseven/file-transfer:latest + # ports: + # - "8080:8080" + # restart: unless-stopped diff --git a/docker-release.sh b/docker-release.sh new file mode 100755 index 0000000..6ed2ade --- /dev/null +++ b/docker-release.sh @@ -0,0 +1,163 @@ +#!/bin/bash + +# ============================================== +# Docker 发布脚本 +# 支持单架构和多架构构建 +# ============================================== + +set -e + +# 颜色定义 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +PURPLE='\033[0;35m' +NC='\033[0m' + +# 配置 +DOCKER_HUB_USER=${DOCKER_HUB_USER:-"matrixseven"} # 替换为你的 Docker Hub 用户名 +REPO_NAME="file-transfer-go" +IMAGE_NAME="${DOCKER_HUB_USER}/${REPO_NAME}" +VERSION="v1.0.5" + +print_header() { + echo -e "${PURPLE}========================================${NC}" + echo -e "${PURPLE}🐳 $1${NC}" + echo -e "${PURPLE}========================================${NC}" +} + +print_success() { + echo -e "${GREEN}✅ $1${NC}" +} + +print_info() { + echo -e "${BLUE}ℹ️ $1${NC}" +} + +# 检查 Docker 是否支持多架构构建 +check_multiarch_support() { + if command -v docker buildx >/dev/null 2>&1; then + echo "true" + else + echo "false" + fi +} + +# 登录 Docker Hub +docker_login() { + print_info "登录 Docker Hub..." + if ! docker info | grep -q "Username: ${DOCKER_HUB_USER}"; then + echo -e "${YELLOW}请输入 Docker Hub 登录信息:${NC}" + docker login + else + print_success "已登录 Docker Hub" + fi +} + +# 推送镜像到 Docker Hub +push_to_dockerhub() { + print_info "推送镜像到 Docker Hub..." + docker push "${IMAGE_NAME}:${VERSION}" + docker push "${IMAGE_NAME}:latest" + print_success "镜像推送完成" +} + +# 单架构构建(当前方法) +build_single_arch() { + print_header "单架构 Docker 镜像构建" + + print_info "构建镜像: ${IMAGE_NAME}:${VERSION}" + docker build -t "${IMAGE_NAME}:${VERSION}" -t "${IMAGE_NAME}:latest" . + + print_success "单架构镜像构建完成" + docker images "${IMAGE_NAME}" +} + +# 多架构构建(需要 buildx) +build_multiarch() { + print_header "多架构 Docker 镜像构建" + + print_info "创建 buildx builder" + docker buildx create --name multiarch --use 2>/dev/null || true + docker buildx inspect --bootstrap + + print_info "构建多架构镜像: linux/amd64,linux/arm64" + docker buildx build \ + --platform linux/amd64,linux/arm64 \ + -t "${IMAGE_NAME}:${VERSION}" \ + -t "${IMAGE_NAME}:latest" \ + --push \ + . + + print_success "多架构镜像构建并推送完成" +} + +# 显示使用说明 +show_usage() { + print_header "Docker 镜像使用说明" + + echo -e "${GREEN}🚀 运行镜像:${NC}" + echo " docker run -d -p 8080:8080 ${IMAGE_NAME}:${VERSION}" + echo "" + + echo -e "${GREEN}📦 镜像信息:${NC}" + echo " - Docker Hub: https://hub.docker.com/r/${DOCKER_HUB_USER}/${REPO_NAME}" + echo " - 版本: ${VERSION}" + echo " - 大小: ~16MB" + echo " - 架构: $(check_multiarch_support && echo "amd64, arm64" || echo "amd64")" + echo " - 基础镜像: alpine:3.18" + echo "" + + echo -e "${GREEN}🌟 特性:${NC}" + echo " ✅ 静态编译,无外部依赖" + echo " ✅ 前端文件完全嵌入" + echo " ✅ 多平台文件传输支持" + echo " ✅ WebRTC P2P 连接" + echo " ✅ 桌面共享功能" + echo "" +} + +# 主函数 +main() { + # 登录 Docker Hub + docker_login + + case "${1:-single}" in + "multi") + if [ "$(check_multiarch_support)" = "true" ]; then + build_multiarch # 多架构构建会自动推送 + else + echo -e "${RED}❌ Docker buildx 不可用,回退到单架构构建${NC}" + build_single_arch + push_to_dockerhub + fi + ;; + "single"|*) + build_single_arch + push_to_dockerhub + ;; + esac + + show_usage +} + +# 检查参数 +if [ "$1" = "--help" ] || [ "$1" = "-h" ]; then + echo "用法: $0 [single|multi]" + echo "" + echo " single 构建单架构镜像并推送到 Docker Hub (默认,amd64)" + echo " multi 构建多架构镜像并推送到 Docker Hub (amd64, arm64)" + echo "" + echo "环境变量:" + echo " DOCKER_HUB_USER Docker Hub 用户名 (默认: matrixseven)" + echo "" + echo "示例:" + echo " $0 single # 单架构构建" + echo " $0 multi # 多架构构建" + echo " DOCKER_HUB_USER=yourname $0 single # 指定用户名" + echo "" + exit 0 +fi + +main "$@"