From 1efc5eb2329c872183cb57472dd7903e8dc85ee9 Mon Sep 17 00:00:00 2001 From: Kris Ka Date: Thu, 25 Sep 2025 01:54:48 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=B3=20=E4=BF=AE=E5=A4=8DDocker?= =?UTF-8?q?=E9=83=A8=E7=BD=B2=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修复Redis连接地址硬编码问题,使用环境变量REDIS_URL - 添加缺失的Python依赖:pysrt和psutil - 修复Docker构建中的Rollup兼容性问题,使用node:18-slim - 修复容器启动脚本的node环境检查问题 - 修复data目录权限问题 - 修复docker-compose.yml版本警告 - 创建专门的Docker启动脚本和开发环境配置 - 优化Dockerfile构建流程和错误处理 解决的主要问题: 1. 构建阶段失败 - Rollup模块兼容性 2. 依赖缺失 - pysrt和psutil 3. 运行时失败 - Redis硬编码和权限问题 4. 开发环境vite命令找不到问题 现在Docker部署应该可以正常工作。 --- Dockerfile | 19 ++++++++-- Dockerfile.dev | 8 +++- backend/services/simple_progress.py | 4 +- docker-compose.dev.yml | 8 ++-- docker-compose.yml | 2 - docker-dev-entrypoint.sh | 59 +++++++++++++++++++++++++++++ docker-entrypoint.sh | 49 ++++++++++++++++++++++++ requirements.txt | 2 + 8 files changed, 138 insertions(+), 13 deletions(-) create mode 100755 docker-dev-entrypoint.sh create mode 100755 docker-entrypoint.sh diff --git a/Dockerfile b/Dockerfile index 2057907c..5f22590f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,15 +2,22 @@ # 多阶段构建,优化镜像大小 # 第一阶段:构建前端 -FROM node:18-alpine AS frontend-builder +FROM node:18-slim AS frontend-builder WORKDIR /app/frontend +# 安装必要的系统依赖 +RUN apt-get update && apt-get install -y \ + python3 \ + make \ + g++ \ + && rm -rf /var/lib/apt/lists/* + # 复制前端依赖文件 COPY frontend/package*.json ./ -# 安装前端依赖 -RUN npm ci --only=production +# 安装前端依赖(使用完整安装,包括devDependencies) +RUN npm ci # 复制前端源代码 COPY frontend/ ./ @@ -73,6 +80,7 @@ COPY backend/ ./backend/ COPY scripts/ ./scripts/ COPY *.sh ./ COPY env.example .env +COPY docker-entrypoint.sh ./ # 创建必要的目录 RUN mkdir -p data/projects data/uploads data/temp data/output logs @@ -80,6 +88,8 @@ RUN mkdir -p data/projects data/uploads data/temp data/output logs # 设置权限 RUN chown -R autoclip:autoclip /app RUN chmod +x *.sh +RUN chmod +x docker-entrypoint.sh +RUN chmod -R 755 data logs # 切换到非root用户 USER autoclip @@ -92,4 +102,5 @@ HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \ CMD curl -f http://localhost:8000/api/v1/health/ || exit 1 # 启动命令 -CMD ["./start_autoclip.sh"] +ENTRYPOINT ["./docker-entrypoint.sh"] +CMD ["python", "-m", "uvicorn", "backend.main:app", "--host", "0.0.0.0", "--port", "8000"] diff --git a/Dockerfile.dev b/Dockerfile.dev index 46d38f28..b1b5fda6 100644 --- a/Dockerfile.dev +++ b/Dockerfile.dev @@ -32,19 +32,23 @@ RUN . venv/bin/activate && pip install -r requirements.txt COPY frontend/package*.json ./frontend/ # 安装前端依赖 -RUN cd frontend && npm install +RUN cd frontend && npm install && npm run build # 复制项目文件 COPY . . +# 复制开发环境启动脚本 +COPY docker-dev-entrypoint.sh ./ + # 创建必要的目录 RUN mkdir -p data/projects data/uploads data/temp data/output logs # 设置权限 RUN chmod +x *.sh +RUN chmod +x docker-dev-entrypoint.sh # 暴露端口 EXPOSE 8000 3000 # 启动命令 -CMD ["sh", "-c", "source venv/bin/activate && ./start_autoclip.sh"] +CMD ["./docker-dev-entrypoint.sh"] \ No newline at end of file diff --git a/backend/services/simple_progress.py b/backend/services/simple_progress.py index 03e34f8e..a2c4c803 100644 --- a/backend/services/simple_progress.py +++ b/backend/services/simple_progress.py @@ -28,7 +28,9 @@ ORDER = [name for name, _ in STAGES] # Redis连接 - 使用项目现有的Redis配置 try: - r = redis.Redis.from_url("redis://127.0.0.1:6379/0", decode_responses=True) + # 从环境变量获取Redis URL,默认为本地地址 + redis_url = os.getenv("REDIS_URL", "redis://127.0.0.1:6379/0") + r = redis.Redis.from_url(redis_url, decode_responses=True) # 测试连接 r.ping() logger.info("Redis连接成功") diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index 4e2035d4..bbd03cf0 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -1,5 +1,3 @@ -version: '3.8' - services: # Redis服务 redis: @@ -41,7 +39,9 @@ services: sh -c " source venv/bin/activate && python -m uvicorn backend.main:app --host 0.0.0.0 --port 8000 --reload & - cd frontend && npm run dev -- --host 0.0.0.0 --port 3000 & + cd frontend && + if [ ! -d node_modules ]; then npm install; fi && + npx vite --host 0.0.0.0 --port 3000 & wait " @@ -79,4 +79,4 @@ volumes: networks: default: - name: autoclip-dev-network + name: autoclip-dev-network \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index e10a0f13..395ba791 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,5 +1,3 @@ -version: '3.8' - services: # Redis服务 redis: diff --git a/docker-dev-entrypoint.sh b/docker-dev-entrypoint.sh new file mode 100755 index 00000000..c65d49bf --- /dev/null +++ b/docker-dev-entrypoint.sh @@ -0,0 +1,59 @@ +#!/bin/bash + +# Docker开发环境启动脚本 +# 专门为开发环境设计,解决前端vite问题 + +set -euo pipefail + +echo "🚀 启动AutoClip开发环境..." + +# 设置环境变量 +export PYTHONPATH=/app +export PYTHONUNBUFFERED=1 + +# 确保数据目录存在 +mkdir -p /app/data/projects /app/data/uploads /app/data/temp /app/data/output /app/logs + +# 激活虚拟环境 +source /app/venv/bin/activate + +# 检查并安装前端依赖 +echo "📦 检查前端依赖..." +cd /app/frontend +if [ ! -d node_modules ] || [ ! -f node_modules/.bin/vite ]; then + echo "安装前端依赖..." + npm install +fi + +# 检查vite是否正确安装 +if [ ! -f node_modules/.bin/vite ]; then + echo "❌ vite未正确安装,重新安装..." + npm install vite +fi + +# 返回根目录 +cd /app + +# 启动后端服务 +echo "🔧 启动后端服务..." +python -m uvicorn backend.main:app --host 0.0.0.0 --port 8000 --reload & +BACKEND_PID=$! + +# 等待后端启动 +sleep 3 + +# 启动前端服务 +echo "🌐 启动前端服务..." +cd /app/frontend +npx vite --host 0.0.0.0 --port 3000 & +FRONTEND_PID=$! + +# 返回根目录 +cd /app + +echo "✅ 服务启动完成" +echo " 后端API: http://localhost:8000" +echo " 前端界面: http://localhost:3000" + +# 等待所有进程 +wait \ No newline at end of file diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh new file mode 100755 index 00000000..f4109139 --- /dev/null +++ b/docker-entrypoint.sh @@ -0,0 +1,49 @@ +#!/bin/bash + +# Docker容器启动脚本 +# 专门为Docker环境设计,解决权限和配置问题 + +set -euo pipefail + +# 设置环境变量 +export PYTHONPATH=/app +export PYTHONUNBUFFERED=1 + +# 确保数据目录存在且有正确权限 +mkdir -p /app/data/projects /app/data/uploads /app/data/temp /app/data/output /app/logs + +# 如果数据目录为空,创建必要的文件 +if [[ ! -f /app/data/autoclip.db ]]; then + echo "初始化数据库..." + python -c " +import sys +sys.path.insert(0, '/app') +from backend.core.database import engine, Base +from backend.models import project, task, clip, collection, bilibili +try: + Base.metadata.create_all(bind=engine) + print('数据库初始化成功') +except Exception as e: + print(f'数据库初始化失败: {e}') + sys.exit(1) +" +fi + +# 检查Redis连接 +echo "检查Redis连接..." +python -c " +import os +import redis +try: + redis_url = os.getenv('REDIS_URL', 'redis://redis:6379/0') + r = redis.Redis.from_url(redis_url, decode_responses=True) + r.ping() + print(f'Redis连接成功: {redis_url}') +except Exception as e: + print(f'Redis连接失败: {e}') + print('将使用SQLite作为备选存储') +" + +# 启动应用 +echo "启动AutoClip应用..." +exec "$@" \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index a737d7a9..ac6a0b78 100644 --- a/requirements.txt +++ b/requirements.txt @@ -22,3 +22,5 @@ qrcode[pil] yt-dlp>=2024.12.13 # bcut-asr 将通过自动安装脚本安装 # 如果需要手动安装,请运行: python scripts/install_bcut_asr.py +pysrt +psutil