🐳 修复Docker部署问题

- 修复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部署应该可以正常工作。
This commit is contained in:
Kris Ka
2025-09-25 01:54:48 +08:00
parent a44207142c
commit 1efc5eb232
8 changed files with 138 additions and 13 deletions

View File

@@ -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"]

View File

@@ -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"]

View File

@@ -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连接成功")

View File

@@ -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

View File

@@ -1,5 +1,3 @@
version: '3.8'
services:
# Redis服务
redis:

59
docker-dev-entrypoint.sh Executable file
View File

@@ -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

49
docker-entrypoint.sh Executable file
View File

@@ -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 "$@"

View File

@@ -22,3 +22,5 @@ qrcode[pil]
yt-dlp>=2024.12.13
# bcut-asr 将通过自动安装脚本安装
# 如果需要手动安装,请运行: python scripts/install_bcut_asr.py
pysrt
psutil