Checkpoint before follow-up message

Co-authored-by: jxxghp <jxxghp@live.cn>
This commit is contained in:
Cursor Agent
2025-08-20 16:06:39 +00:00
parent 993bc3775b
commit bb73acdde5
5 changed files with 1 additions and 602 deletions

View File

@@ -1,221 +0,0 @@
# Docker 构建和启动逻辑优化
## 优化概述
本次优化主要解决了以下问题:
1. **统一使用虚拟pip环境**避免pip包在多个地方存在
2. **优化依赖管理**使用pip-tools进行依赖锁定
3. **减少重复安装**:在构建时安装依赖,运行时只更新变化的部分
4. **提升构建速度**:优化.dockerignore文件
5. **简化部署**提供docker-compose配置
## 主要改进
### 1. 虚拟环境管理
- **虚拟环境路径**`/opt/venv`
- **环境变量**`VENV_PATH=/opt/venv`
- **PATH设置**自动将虚拟环境bin目录添加到PATH
### 2. 依赖管理优化
#### 构建阶段
```dockerfile
# 创建虚拟环境
RUN python3 -m venv ${VENV_PATH} \
&& ${VENV_PATH}/bin/pip install --upgrade pip \
&& ${VENV_PATH}/bin/pip install Cython pip-tools
# 安装依赖到虚拟环境
RUN ${VENV_PATH}/bin/pip-compile requirements.in \
&& ${VENV_PATH}/bin/pip install -r requirements.txt
```
#### 运行时更新
- 只在依赖文件发生变化时才重新安装
- 自动备份和恢复机制
- 使用虚拟环境中的pip进行安装
### 3. 文件结构优化
#### .dockerignore 优化
排除不必要的文件,减少构建上下文大小:
- 开发文件(.pyc, __pycache__, .pytest_cache等
- 文档文件
- IDE配置文件
- 临时文件
- 测试文件
#### requirements.txt 优化
- 使用具体版本号锁定依赖
- 包含平台特定依赖
- 自动生成注释说明
### 4. 启动脚本优化
#### entrypoint.sh 改进
- 设置虚拟环境PATH
- 使用虚拟环境中的Python启动应用
- 正确设置虚拟环境权限
#### update.sh 改进
- 使用虚拟环境中的pip
- 智能依赖更新:只在变化时更新
- 备份和恢复机制
## 使用方法
### 1. 简单部署(推荐)
使用SQLite数据库适合个人使用
```bash
# 创建配置目录
mkdir -p config
# 启动服务
docker-compose -f docker-compose.simple.yml up -d
```
### 2. 完整部署
使用PostgreSQL和Redis适合生产环境
```bash
# 创建配置目录
mkdir -p config
# 启动所有服务
docker-compose up -d
```
### 3. 自定义配置
创建 `config/app.env` 文件:
```env
# 代理设置
PIP_PROXY='https://pypi.tuna.tsinghua.edu.cn/simple'
GITHUB_PROXY='https://ghproxy.com/'
# 数据库设置
DB_TYPE='postgresql'
DB_POSTGRESQL_HOST='postgres'
DB_POSTGRESQL_DATABASE='moviepilot'
DB_POSTGRESQL_USERNAME='moviepilot'
DB_POSTGRESQL_PASSWORD='moviepilot'
# SSL设置
ENABLE_SSL='true'
SSL_DOMAIN='your.domain.com'
```
## 环境变量说明
### 基础配置
- `PUID`: 用户ID默认1000
- `PGID`: 组ID默认1000
- `UMASK`: 文件权限掩码默认022
- `CONFIG_DIR`: 配置目录(默认:/config
### 代理设置
- `PIP_PROXY`: pip代理地址
- `GITHUB_PROXY`: GitHub代理地址
- `PROXY_HOST`: 全局代理地址
- `GITHUB_TOKEN`: GitHub访问令牌
### 数据库设置
- `DB_TYPE`: 数据库类型sqlite/postgresql
- `DB_POSTGRESQL_HOST`: PostgreSQL主机
- `DB_POSTGRESQL_PORT`: PostgreSQL端口
- `DB_POSTGRESQL_DATABASE`: 数据库名
- `DB_POSTGRESQL_USERNAME`: 用户名
- `DB_POSTGRESQL_PASSWORD`: 密码
### SSL设置
- `ENABLE_SSL`: 是否启用SSL
- `SSL_DOMAIN`: SSL域名
### 更新设置
- `MOVIEPILOT_AUTO_UPDATE`: 自动更新模式false/release/dev
## 性能优化
### 构建优化
1. **多阶段构建**:减少最终镜像大小
2. **依赖缓存**利用Docker层缓存
3. **最小化上下文**:优化.dockerignore
### 运行时优化
1. **虚拟环境**:隔离依赖,避免冲突
2. **智能更新**:只在必要时更新依赖
3. **健康检查**:确保服务正常运行
## 故障排除
### 常见问题
1. **权限问题**
```bash
# 修改目录权限
sudo chown -R 1000:1000 config/
```
2. **依赖安装失败**
```bash
# 检查网络连接
docker exec moviepilot curl -I https://pypi.org
# 查看日志
docker logs moviepilot
```
3. **虚拟环境问题**
```bash
# 进入容器检查虚拟环境
docker exec -it moviepilot bash
ls -la /opt/venv/bin/
```
### 日志查看
```bash
# 查看应用日志
docker logs moviepilot
# 实时查看日志
docker logs -f moviepilot
# 查看特定时间段的日志
docker logs --since="2024-01-01T00:00:00" moviepilot
```
## 更新和维护
### 更新依赖
```bash
# 重新构建镜像
docker-compose build --no-cache
# 重启服务
docker-compose up -d
```
### 备份配置
```bash
# 备份配置目录
tar -czf moviepilot_config_backup.tar.gz config/
```
### 清理资源
```bash
# 清理未使用的镜像
docker image prune -f
# 清理未使用的卷
docker volume prune -f
# 清理未使用的网络
docker network prune -f
```

175
build.sh
View File

@@ -1,175 +0,0 @@
#!/bin/bash
# MoviePilot Docker 构建脚本
# 使用方法: ./build.sh [选项]
set -e
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# 默认值
IMAGE_NAME="moviepilot"
TAG="latest"
DOCKERFILE="docker/Dockerfile"
BUILD_CONTEXT="."
NO_CACHE=false
PUSH=false
PLATFORM=""
# 帮助信息
show_help() {
echo "MoviePilot Docker 构建脚本"
echo ""
echo "使用方法: $0 [选项]"
echo ""
echo "选项:"
echo " -n, --name NAME 镜像名称 (默认: moviepilot)"
echo " -t, --tag TAG 镜像标签 (默认: latest)"
echo " -f, --file FILE Dockerfile路径 (默认: docker/Dockerfile)"
echo " -c, --context DIR 构建上下文目录 (默认: .)"
echo " --no-cache 不使用缓存构建"
echo " --push 构建后推送到镜像仓库"
echo " --platform PLATFORM 指定目标平台 (例如: linux/amd64,linux/arm64)"
echo " -h, --help 显示此帮助信息"
echo ""
echo "示例:"
echo " $0 # 使用默认设置构建"
echo " $0 -n myapp -t v1.0 # 指定镜像名称和标签"
echo " $0 --no-cache --platform linux/amd64 # 不使用缓存,指定平台"
echo " $0 --push # 构建并推送镜像"
}
# 解析命令行参数
while [[ $# -gt 0 ]]; do
case $1 in
-n|--name)
IMAGE_NAME="$2"
shift 2
;;
-t|--tag)
TAG="$2"
shift 2
;;
-f|--file)
DOCKERFILE="$2"
shift 2
;;
-c|--context)
BUILD_CONTEXT="$2"
shift 2
;;
--no-cache)
NO_CACHE=true
shift
;;
--push)
PUSH=true
shift
;;
--platform)
PLATFORM="$2"
shift 2
;;
-h|--help)
show_help
exit 0
;;
*)
echo -e "${RED}错误: 未知选项 $1${NC}"
show_help
exit 1
;;
esac
done
# 检查Docker是否安装
if ! command -v docker &> /dev/null; then
echo -e "${RED}错误: Docker 未安装${NC}"
exit 1
fi
# 检查Dockerfile是否存在
if [[ ! -f "$DOCKERFILE" ]]; then
echo -e "${RED}错误: Dockerfile 不存在: $DOCKERFILE${NC}"
exit 1
fi
# 检查构建上下文是否存在
if [[ ! -d "$BUILD_CONTEXT" ]]; then
echo -e "${RED}错误: 构建上下文目录不存在: $BUILD_CONTEXT${NC}"
exit 1
fi
# 构建命令
BUILD_CMD="docker build"
# 添加平台参数
if [[ -n "$PLATFORM" ]]; then
BUILD_CMD="$BUILD_CMD --platform $PLATFORM"
fi
# 添加缓存参数
if [[ "$NO_CACHE" == true ]]; then
BUILD_CMD="$BUILD_CMD --no-cache"
fi
# 添加文件参数
BUILD_CMD="$BUILD_CMD -f $DOCKERFILE"
# 添加标签参数
BUILD_CMD="$BUILD_CMD -t $IMAGE_NAME:$TAG"
# 添加构建上下文
BUILD_CMD="$BUILD_CMD $BUILD_CONTEXT"
# 显示构建信息
echo -e "${GREEN}开始构建 MoviePilot Docker 镜像${NC}"
echo "镜像名称: $IMAGE_NAME:$TAG"
echo "Dockerfile: $DOCKERFILE"
echo "构建上下文: $BUILD_CONTEXT"
if [[ -n "$PLATFORM" ]]; then
echo "目标平台: $PLATFORM"
fi
if [[ "$NO_CACHE" == true ]]; then
echo "缓存: 禁用"
else
echo "缓存: 启用"
fi
echo ""
# 执行构建
echo -e "${YELLOW}执行构建命令: $BUILD_CMD${NC}"
echo ""
if eval $BUILD_CMD; then
echo -e "${GREEN}构建成功!${NC}"
# 显示镜像信息
echo ""
echo -e "${GREEN}镜像信息:${NC}"
docker images "$IMAGE_NAME:$TAG"
# 如果指定了推送,则推送镜像
if [[ "$PUSH" == true ]]; then
echo ""
echo -e "${YELLOW}推送镜像到仓库...${NC}"
if docker push "$IMAGE_NAME:$TAG"; then
echo -e "${GREEN}推送成功!${NC}"
else
echo -e "${RED}推送失败!${NC}"
exit 1
fi
fi
echo ""
echo -e "${GREEN}构建完成!${NC}"
echo "运行命令: docker run -d -p 3000:3000 -v ./config:/config $IMAGE_NAME:$TAG"
else
echo -e "${RED}构建失败!${NC}"
exit 1
fi

View File

@@ -1,34 +0,0 @@
version: '3.8'
services:
moviepilot:
build:
context: .
dockerfile: docker/Dockerfile
container_name: moviepilot
restart: unless-stopped
ports:
- "3000:3000"
volumes:
- ./config:/config
- /var/run/docker.sock:/var/run/docker.sock:ro
environment:
- PUID=1000
- PGID=1000
- UMASK=022
- CONFIG_DIR=/config
- MOVIEPILOT_AUTO_UPDATE=release
# 可选:代理设置
# - PIP_PROXY=https://pypi.tuna.tsinghua.edu.cn/simple
# - GITHUB_PROXY=https://ghproxy.com/
# - PROXY_HOST=http://proxy:7890
# - GITHUB_TOKEN=your_github_token
# 可选SSL设置
# - ENABLE_SSL=true
# - SSL_DOMAIN=your.domain.com
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/api/v1/system/version"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s

View File

@@ -1,86 +0,0 @@
version: '3.8'
services:
moviepilot:
build:
context: .
dockerfile: docker/Dockerfile
container_name: moviepilot
restart: unless-stopped
ports:
- "3000:3000"
volumes:
- ./config:/config
- /var/run/docker.sock:/var/run/docker.sock:ro
environment:
- PUID=1000
- PGID=1000
- UMASK=022
- CONFIG_DIR=/config
- MOVIEPILOT_AUTO_UPDATE=release
# 可选:代理设置
# - PIP_PROXY=https://pypi.tuna.tsinghua.edu.cn/simple
# - GITHUB_PROXY=https://ghproxy.com/
# - PROXY_HOST=http://proxy:7890
# - GITHUB_TOKEN=your_github_token
# 可选:数据库设置
# - DB_TYPE=postgresql
# - DB_POSTGRESQL_HOST=postgres
# - DB_POSTGRESQL_PORT=5432
# - DB_POSTGRESQL_DATABASE=moviepilot
# - DB_POSTGRESQL_USERNAME=moviepilot
# - DB_POSTGRESQL_PASSWORD=moviepilot
# 可选SSL设置
# - ENABLE_SSL=true
# - SSL_DOMAIN=your.domain.com
networks:
- moviepilot_network
depends_on:
- postgres
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/api/v1/system/version"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
postgres:
image: postgres:15-alpine
container_name: moviepilot_postgres
restart: unless-stopped
environment:
- POSTGRES_DB=moviepilot
- POSTGRES_USER=moviepilot
- POSTGRES_PASSWORD=moviepilot
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
- moviepilot_network
healthcheck:
test: ["CMD-SHELL", "pg_isready -U moviepilot -d moviepilot"]
interval: 30s
timeout: 10s
retries: 3
redis:
image: redis:7-alpine
container_name: moviepilot_redis
restart: unless-stopped
command: redis-server --appendonly yes
volumes:
- redis_data:/data
networks:
- moviepilot_network
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 30s
timeout: 10s
retries: 3
volumes:
postgres_data:
redis_data:
networks:
moviepilot_network:
driver: bridge

View File

@@ -1,86 +1 @@
# This file is auto-generated from requirements.in
# To update, run: pip-compile requirements.in
Cython==3.1.2
pydantic==1.10.22
SQLAlchemy==2.0.41
uvicorn==0.34.3
fastapi==0.115.14
passlib==1.7.4
PyJWT==2.10.1
python-multipart==0.0.9
aiofiles==24.1.0
aioshutil==1.5
alembic==1.16.2
bcrypt==4.0.1
regex==2024.11.6
cn2an==0.5.19
dateparser==1.2.2
python-dateutil==2.8.2
zhconv==1.4.3
anitopy==2.1.1
requests[socks]==2.32.4
urllib3==2.5.0
lxml==6.0.0
pyquery==2.0.1
ruamel.yaml==0.18.14
APScheduler==3.11.0
cryptography==45.0.4
pytz==2025.2
pycryptodome==3.23.0
qbittorrent-api==2025.5.0
plexapi==4.17.0
transmission-rpc==4.3.0
Jinja2==3.1.6
pyparsing==3.2.3
func_timeout==4.3.5
bs4==0.0.2
beautifulsoup4==4.13.4
pillow==11.2.1
pillow-avif-plugin==1.5.2
pyTelegramBotAPI==4.27.0
playwright==1.53.0
cf_clearance==0.31.0
torrentool==1.2.0
slack-bolt==1.23.0
slack-sdk==3.35.0
chardet==5.2.0
starlette==0.46.2
PyVirtualDisplay==3.0
psutil==7.0.0
python-dotenv==1.1.1
python-hosts==1.1.2
watchdog==6.0.0
cacheout==0.16.0
click==8.2.1
requests-cache==1.2.1
parse==1.20.2
docker==7.1.0
cachetools==6.1.0
fast-bencode==1.1.7
pystray==0.19.5
pyotp==2.9.0
Pinyin2Hanzi==0.1.1
pywebpush==2.0.3
aiopathlib==0.6.0
asynctempfile==0.5.0
aiosqlite==0.21.0
psycopg2-binary==2.9.10
asyncpg==0.30.0
jieba==0.42.1
rsa==4.9
redis==6.2.0
packaging==25.0
oss2==2.19.1
tqdm==4.67.1
setuptools==78.1.0
pympler==1.1
smbprotocol==1.15.0
setproctitle==1.3.6
httpx[socks]==0.28.1
prometheus-client==0.22.1
prometheus-fastapi-instrumentator==7.1.0
# Platform-specific dependencies
pywin32==310; platform_system == "Windows"
async_timeout==5.0.1; python_full_version < "3.11.3"
-r requirements.in