mirror of
https://github.com/zhouxiaoka/autoclip.git
synced 2026-09-02 22:15:18 +08:00
🐳 修复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:
19
Dockerfile
19
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"]
|
||||
|
||||
@@ -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"]
|
||||
@@ -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连接成功")
|
||||
|
||||
@@ -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
|
||||
@@ -1,5 +1,3 @@
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
# Redis服务
|
||||
redis:
|
||||
|
||||
59
docker-dev-entrypoint.sh
Executable file
59
docker-dev-entrypoint.sh
Executable 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
49
docker-entrypoint.sh
Executable 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 "$@"
|
||||
@@ -22,3 +22,5 @@ qrcode[pil]
|
||||
yt-dlp>=2024.12.13
|
||||
# bcut-asr 将通过自动安装脚本安装
|
||||
# 如果需要手动安装,请运行: python scripts/install_bcut_asr.py
|
||||
pysrt
|
||||
psutil
|
||||
|
||||
Reference in New Issue
Block a user