mirror of
https://github.com/linyqh/NarratoAI.git
synced 2025-12-10 18:02:51 +00:00
refactor(docker): 优化docker配置和部署脚本
重构Docker相关配置,包括: - 更新.dockerignore文件,增加更多忽略规则 - 优化requirements.txt依赖管理 - 新增Makefile提供常用命令 - 重构docker-compose.yml配置 - 增强docker-entrypoint.sh功能 - 改进Dockerfile多阶段构建 - 新增docker-deploy.sh一键部署脚本
This commit is contained in:
parent
2569b7fee7
commit
ced37047aa
113
.dockerignore
113
.dockerignore
@ -1,24 +1,99 @@
|
|||||||
# Exclude common Python files and directories
|
# Git 相关
|
||||||
venv/
|
|
||||||
__pycache__/
|
|
||||||
*.pyc
|
|
||||||
*.pyo
|
|
||||||
*.pyd
|
|
||||||
*.pyz
|
|
||||||
*.pyw
|
|
||||||
*.pyi
|
|
||||||
*.egg-info/
|
|
||||||
|
|
||||||
# Exclude development and local files
|
|
||||||
.env
|
|
||||||
.env.*
|
|
||||||
*.log
|
|
||||||
*.db
|
|
||||||
|
|
||||||
# Exclude version control system files
|
|
||||||
.git/
|
.git/
|
||||||
.gitignore
|
.gitignore
|
||||||
|
.gitattributes
|
||||||
.svn/
|
.svn/
|
||||||
|
|
||||||
storage/
|
# Python 相关
|
||||||
|
__pycache__/
|
||||||
|
*.py[cod]
|
||||||
|
*$py.class
|
||||||
|
*.so
|
||||||
|
.Python
|
||||||
|
build/
|
||||||
|
develop-eggs/
|
||||||
|
dist/
|
||||||
|
downloads/
|
||||||
|
eggs/
|
||||||
|
.eggs/
|
||||||
|
lib/
|
||||||
|
lib64/
|
||||||
|
parts/
|
||||||
|
sdist/
|
||||||
|
var/
|
||||||
|
wheels/
|
||||||
|
*.egg-info/
|
||||||
|
.installed.cfg
|
||||||
|
*.egg
|
||||||
|
MANIFEST
|
||||||
|
|
||||||
|
# 虚拟环境
|
||||||
|
.env
|
||||||
|
.env.*
|
||||||
|
.venv
|
||||||
|
venv/
|
||||||
|
ENV/
|
||||||
|
env.bak/
|
||||||
|
venv.bak/
|
||||||
|
|
||||||
|
# IDE 相关
|
||||||
|
.vscode/
|
||||||
|
.idea/
|
||||||
|
*.swp
|
||||||
|
*.swo
|
||||||
|
*~
|
||||||
|
|
||||||
|
# 操作系统相关
|
||||||
|
.DS_Store
|
||||||
|
.DS_Store?
|
||||||
|
._*
|
||||||
|
.Spotlight-V100
|
||||||
|
.Trashes
|
||||||
|
ehthumbs.db
|
||||||
|
Thumbs.db
|
||||||
|
|
||||||
|
# 日志和数据库文件
|
||||||
|
*.log
|
||||||
|
*.db
|
||||||
|
logs/
|
||||||
|
|
||||||
|
# 临时文件
|
||||||
|
*.tmp
|
||||||
|
*.temp
|
||||||
|
temp/
|
||||||
|
tmp/
|
||||||
|
|
||||||
|
# 存储目录(运行时生成的内容)
|
||||||
|
storage/temp/
|
||||||
|
storage/tasks/
|
||||||
|
storage/demo.py
|
||||||
|
|
||||||
|
# 缓存目录
|
||||||
|
.cache/
|
||||||
|
.pytest_cache/
|
||||||
|
|
||||||
|
# 文档(保留必要的)
|
||||||
|
docs/
|
||||||
|
*.md
|
||||||
|
!README.md
|
||||||
|
|
||||||
|
# Docker 相关文件(避免递归复制)
|
||||||
|
Dockerfile.*
|
||||||
|
docker-compose.*.yml
|
||||||
|
|
||||||
|
# 配置文件(使用示例配置)
|
||||||
config.toml
|
config.toml
|
||||||
|
|
||||||
|
# 资源文件中的大文件
|
||||||
|
resource/videos/
|
||||||
|
resource/songs/
|
||||||
|
|
||||||
|
# 测试文件
|
||||||
|
tests/
|
||||||
|
test_*
|
||||||
|
*_test.py
|
||||||
|
|
||||||
|
# 其他不必要的文件
|
||||||
|
*.bak
|
||||||
|
*.orig
|
||||||
|
*.rej
|
||||||
|
|||||||
92
Dockerfile
92
Dockerfile
@ -1,63 +1,97 @@
|
|||||||
# 构建阶段
|
# 多阶段构建 - 构建阶段
|
||||||
FROM python:3.10-slim-bullseye as builder
|
FROM python:3.12-slim-bookworm AS builder
|
||||||
|
|
||||||
|
# 设置构建参数
|
||||||
|
ARG DEBIAN_FRONTEND=noninteractive
|
||||||
|
|
||||||
# 设置工作目录
|
# 设置工作目录
|
||||||
WORKDIR /build
|
WORKDIR /build
|
||||||
|
|
||||||
# 安装构建依赖
|
# 安装构建依赖
|
||||||
RUN apt-get update && apt-get install -y \
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
|
build-essential \
|
||||||
git \
|
git \
|
||||||
git-lfs \
|
git-lfs \
|
||||||
|
pkg-config \
|
||||||
&& rm -rf /var/lib/apt/lists/*
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
# 创建虚拟环境
|
# 升级 pip 并创建虚拟环境
|
||||||
RUN python -m venv /opt/venv
|
RUN python -m pip install --upgrade pip setuptools wheel && \
|
||||||
|
python -m venv /opt/venv
|
||||||
|
|
||||||
|
# 激活虚拟环境
|
||||||
ENV PATH="/opt/venv/bin:$PATH"
|
ENV PATH="/opt/venv/bin:$PATH"
|
||||||
|
|
||||||
# 首先安装 PyTorch(因为它是最大的依赖)
|
# 复制 requirements.txt 并安装 Python 依赖
|
||||||
RUN pip install --no-cache-dir torch torchvision torchaudio
|
|
||||||
|
|
||||||
# 然后安装其他依赖
|
|
||||||
COPY requirements.txt .
|
COPY requirements.txt .
|
||||||
RUN pip install --no-cache-dir -r requirements.txt
|
RUN pip install --no-cache-dir --upgrade pip && \
|
||||||
|
pip install --no-cache-dir -r requirements.txt
|
||||||
|
|
||||||
# 运行阶段
|
# 运行阶段
|
||||||
FROM python:3.10-slim-bullseye
|
FROM python:3.12-slim-bookworm
|
||||||
|
|
||||||
|
# 设置运行参数
|
||||||
|
ARG DEBIAN_FRONTEND=noninteractive
|
||||||
|
|
||||||
# 设置工作目录
|
# 设置工作目录
|
||||||
WORKDIR /NarratoAI
|
WORKDIR /NarratoAI
|
||||||
|
|
||||||
# 从builder阶段复制虚拟环境
|
# 从构建阶段复制虚拟环境
|
||||||
COPY --from=builder /opt/venv /opt/venv
|
COPY --from=builder /opt/venv /opt/venv
|
||||||
ENV PATH="/opt/venv/bin:$PATH"
|
|
||||||
|
|
||||||
# 安装运行时依赖
|
# 设置环境变量
|
||||||
RUN apt-get update && apt-get install -y \
|
ENV PATH="/opt/venv/bin:$PATH" \
|
||||||
|
PYTHONPATH="/NarratoAI" \
|
||||||
|
PYTHONUNBUFFERED=1 \
|
||||||
|
PYTHONDONTWRITEBYTECODE=1 \
|
||||||
|
PYTHONIOENCODING=utf-8 \
|
||||||
|
LANG=C.UTF-8 \
|
||||||
|
LC_ALL=C.UTF-8
|
||||||
|
|
||||||
|
# 安装运行时系统依赖
|
||||||
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
imagemagick \
|
imagemagick \
|
||||||
ffmpeg \
|
ffmpeg \
|
||||||
wget \
|
wget \
|
||||||
|
curl \
|
||||||
git-lfs \
|
git-lfs \
|
||||||
&& rm -rf /var/lib/apt/lists/* \
|
ca-certificates \
|
||||||
&& sed -i '/<policy domain="path" rights="none" pattern="@\*"/d' /etc/ImageMagick-6/policy.xml
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
# 设置环境变量
|
# 配置 ImageMagick 策略(允许处理更多格式)
|
||||||
ENV PYTHONPATH="/NarratoAI" \
|
RUN sed -i 's/<policy domain="path" rights="none" pattern="@\*"/<policy domain="path" rights="read|write" pattern="@\*"/' /etc/ImageMagick-6/policy.xml || true
|
||||||
PYTHONUNBUFFERED=1 \
|
|
||||||
PYTHONDONTWRITEBYTECODE=1
|
|
||||||
|
|
||||||
# 设置目录权限
|
# 初始化 git-lfs
|
||||||
RUN chmod 777 /NarratoAI
|
|
||||||
|
|
||||||
# 安装git lfs
|
|
||||||
RUN git lfs install
|
RUN git lfs install
|
||||||
|
|
||||||
|
# 创建非 root 用户(安全最佳实践)
|
||||||
|
RUN groupadd -r narratoai && useradd -r -g narratoai -d /NarratoAI -s /bin/bash narratoai
|
||||||
|
|
||||||
# 复制应用代码
|
# 复制应用代码
|
||||||
COPY . .
|
COPY --chown=narratoai:narratoai . .
|
||||||
|
|
||||||
|
# 确保配置文件存在
|
||||||
|
RUN if [ ! -f config.toml ]; then cp config.example.toml config.toml; fi
|
||||||
|
|
||||||
|
# 创建必要的目录并设置权限
|
||||||
|
RUN mkdir -p storage/temp storage/tasks storage/json storage/narration_scripts storage/drama_analysis && \
|
||||||
|
chown -R narratoai:narratoai /NarratoAI && \
|
||||||
|
chmod -R 755 /NarratoAI
|
||||||
|
|
||||||
|
# 复制并设置入口点脚本
|
||||||
|
COPY --chown=narratoai:narratoai docker-entrypoint.sh /usr/local/bin/
|
||||||
|
RUN chmod +x /usr/local/bin/docker-entrypoint.sh
|
||||||
|
|
||||||
|
# 切换到非 root 用户
|
||||||
|
USER narratoai
|
||||||
|
|
||||||
# 暴露端口
|
# 暴露端口
|
||||||
EXPOSE 8501
|
EXPOSE 8501
|
||||||
|
|
||||||
# 使用脚本作为入口点
|
# 健康检查
|
||||||
COPY docker-entrypoint.sh /usr/local/bin/
|
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
|
||||||
RUN chmod +x /usr/local/bin/docker-entrypoint.sh
|
CMD curl -f http://localhost:8501/_stcore/health || exit 1
|
||||||
|
|
||||||
|
# 设置入口点
|
||||||
ENTRYPOINT ["docker-entrypoint.sh"]
|
ENTRYPOINT ["docker-entrypoint.sh"]
|
||||||
|
CMD ["webui"]
|
||||||
|
|||||||
63
Makefile
Normal file
63
Makefile
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
# NarratoAI Docker Makefile
|
||||||
|
|
||||||
|
.PHONY: help build up down restart logs shell clean deploy
|
||||||
|
|
||||||
|
# 默认目标
|
||||||
|
.DEFAULT_GOAL := help
|
||||||
|
|
||||||
|
# 变量定义
|
||||||
|
SERVICE_NAME := narratoai-webui
|
||||||
|
|
||||||
|
# 颜色定义
|
||||||
|
GREEN := \033[32m
|
||||||
|
YELLOW := \033[33m
|
||||||
|
BLUE := \033[34m
|
||||||
|
RESET := \033[0m
|
||||||
|
|
||||||
|
help: ## 显示帮助信息
|
||||||
|
@echo "$(GREEN)NarratoAI Docker 管理命令$(RESET)"
|
||||||
|
@echo ""
|
||||||
|
@echo "$(YELLOW)可用命令:$(RESET)"
|
||||||
|
@awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {printf " $(BLUE)%-15s$(RESET) %s\n", $$1, $$2}' $(MAKEFILE_LIST)
|
||||||
|
|
||||||
|
deploy: ## 一键部署
|
||||||
|
@echo "$(GREEN)执行一键部署...$(RESET)"
|
||||||
|
./docker-deploy.sh
|
||||||
|
|
||||||
|
build: ## 构建 Docker 镜像
|
||||||
|
@echo "$(GREEN)构建 Docker 镜像...$(RESET)"
|
||||||
|
docker-compose build
|
||||||
|
|
||||||
|
up: ## 启动服务
|
||||||
|
@echo "$(GREEN)启动服务...$(RESET)"
|
||||||
|
docker-compose up -d
|
||||||
|
@echo "$(GREEN)访问地址: http://localhost:8501$(RESET)"
|
||||||
|
|
||||||
|
down: ## 停止服务
|
||||||
|
@echo "$(YELLOW)停止服务...$(RESET)"
|
||||||
|
docker-compose down
|
||||||
|
|
||||||
|
restart: ## 重启服务
|
||||||
|
@echo "$(YELLOW)重启服务...$(RESET)"
|
||||||
|
docker-compose restart
|
||||||
|
|
||||||
|
logs: ## 查看日志
|
||||||
|
docker-compose logs -f
|
||||||
|
|
||||||
|
shell: ## 进入容器
|
||||||
|
docker-compose exec $(SERVICE_NAME) bash
|
||||||
|
|
||||||
|
ps: ## 查看服务状态
|
||||||
|
docker-compose ps
|
||||||
|
|
||||||
|
clean: ## 清理未使用的资源
|
||||||
|
@echo "$(YELLOW)清理未使用的资源...$(RESET)"
|
||||||
|
docker system prune -f
|
||||||
|
|
||||||
|
config: ## 检查配置文件
|
||||||
|
@if [ -f "config.toml" ]; then \
|
||||||
|
echo "$(GREEN)config.toml 存在$(RESET)"; \
|
||||||
|
else \
|
||||||
|
echo "$(YELLOW)复制示例配置...$(RESET)"; \
|
||||||
|
cp config.example.toml config.toml; \
|
||||||
|
fi
|
||||||
@ -1,38 +1,29 @@
|
|||||||
x-common: &common
|
|
||||||
build:
|
|
||||||
context: .
|
|
||||||
dockerfile: Dockerfile
|
|
||||||
image: linyq1/narratoai:latest
|
|
||||||
volumes:
|
|
||||||
- ./:/NarratoAI
|
|
||||||
environment:
|
|
||||||
- VPN_PROXY_URL=http://host.docker.internal:7890
|
|
||||||
- PYTHONUNBUFFERED=1
|
|
||||||
- PYTHONMALLOC=malloc
|
|
||||||
- OPENCV_OPENCL_RUNTIME=disabled
|
|
||||||
- OPENCV_CPU_DISABLE=0
|
|
||||||
restart: always
|
|
||||||
mem_limit: 4g
|
|
||||||
mem_reservation: 2g
|
|
||||||
memswap_limit: 6g
|
|
||||||
cpus: 2.0
|
|
||||||
cpu_shares: 1024
|
|
||||||
|
|
||||||
services:
|
services:
|
||||||
webui:
|
narratoai-webui:
|
||||||
<<: *common
|
build:
|
||||||
container_name: webui
|
context: .
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
image: narratoai:latest
|
||||||
|
container_name: narratoai-webui
|
||||||
|
|
||||||
ports:
|
ports:
|
||||||
- "8501:8501"
|
- "8501:8501"
|
||||||
command: ["webui"]
|
|
||||||
logging:
|
volumes:
|
||||||
driver: "json-file"
|
- ./storage:/NarratoAI/storage
|
||||||
options:
|
- ./config.toml:/NarratoAI/config.toml
|
||||||
max-size: "200m"
|
- ./resource:/NarratoAI/resource:ro
|
||||||
max-file: "3"
|
|
||||||
tmpfs:
|
environment:
|
||||||
- /tmp:size=1G
|
- PYTHONUNBUFFERED=1
|
||||||
ulimits:
|
- TZ=Asia/Shanghai
|
||||||
nofile:
|
|
||||||
soft: 65536
|
restart: unless-stopped
|
||||||
hard: 65536
|
|
||||||
|
# 健康检查
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "curl", "-f", "http://localhost:8501/_stcore/health"]
|
||||||
|
interval: 30s
|
||||||
|
timeout: 10s
|
||||||
|
retries: 3
|
||||||
|
start_period: 60s
|
||||||
|
|||||||
184
docker-deploy.sh
Executable file
184
docker-deploy.sh
Executable file
@ -0,0 +1,184 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# NarratoAI Docker 一键部署脚本
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# 颜色定义
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
RED='\033[0;31m'
|
||||||
|
NC='\033[0m'
|
||||||
|
|
||||||
|
# 日志函数
|
||||||
|
log_info() {
|
||||||
|
echo -e "${GREEN}[INFO]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
log_warning() {
|
||||||
|
echo -e "${YELLOW}[WARNING]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
log_error() {
|
||||||
|
echo -e "${RED}[ERROR]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 显示帮助信息
|
||||||
|
show_help() {
|
||||||
|
cat << EOF
|
||||||
|
NarratoAI Docker 一键部署脚本
|
||||||
|
|
||||||
|
使用方法:
|
||||||
|
$0 [选项]
|
||||||
|
|
||||||
|
选项:
|
||||||
|
-h, --help 显示此帮助信息
|
||||||
|
-b, --build 强制重新构建镜像
|
||||||
|
--no-cache 构建时不使用缓存
|
||||||
|
|
||||||
|
示例:
|
||||||
|
$0 # 标准部署
|
||||||
|
$0 -b # 重新构建并部署
|
||||||
|
$0 --no-cache # 无缓存构建
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
# 检查系统要求
|
||||||
|
check_requirements() {
|
||||||
|
log_info "检查系统要求..."
|
||||||
|
|
||||||
|
if ! command -v docker &> /dev/null; then
|
||||||
|
log_error "Docker 未安装,请先安装 Docker"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v docker-compose &> /dev/null && ! docker compose version &> /dev/null; then
|
||||||
|
log_error "Docker Compose 未安装,请先安装 Docker Compose"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! docker info &> /dev/null; then
|
||||||
|
log_error "Docker 服务未运行,请启动 Docker"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# 检查配置文件
|
||||||
|
check_config() {
|
||||||
|
if [ ! -f "config.toml" ]; then
|
||||||
|
if [ -f "config.example.toml" ]; then
|
||||||
|
log_warning "config.toml 不存在,复制示例配置文件"
|
||||||
|
cp config.example.toml config.toml
|
||||||
|
log_info "请编辑 config.toml 文件配置您的 API 密钥"
|
||||||
|
else
|
||||||
|
log_error "未找到配置文件模板"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# 构建镜像
|
||||||
|
build_image() {
|
||||||
|
log_info "构建 Docker 镜像..."
|
||||||
|
|
||||||
|
local build_args=""
|
||||||
|
if [ "$NO_CACHE" = "true" ]; then
|
||||||
|
build_args="--no-cache"
|
||||||
|
fi
|
||||||
|
|
||||||
|
docker-compose build $build_args
|
||||||
|
}
|
||||||
|
|
||||||
|
# 启动服务
|
||||||
|
start_services() {
|
||||||
|
log_info "启动 NarratoAI 服务..."
|
||||||
|
|
||||||
|
docker-compose down 2>/dev/null || true
|
||||||
|
docker-compose up -d
|
||||||
|
}
|
||||||
|
|
||||||
|
# 等待服务就绪
|
||||||
|
wait_for_service() {
|
||||||
|
log_info "等待服务就绪..."
|
||||||
|
|
||||||
|
local max_attempts=30
|
||||||
|
local attempt=1
|
||||||
|
|
||||||
|
while [ $attempt -le $max_attempts ]; do
|
||||||
|
if curl -f http://localhost:8501/_stcore/health &>/dev/null; then
|
||||||
|
log_info "服务已就绪"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
sleep 2
|
||||||
|
((attempt++))
|
||||||
|
done
|
||||||
|
|
||||||
|
log_warning "服务启动超时,请检查日志"
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# 显示部署信息
|
||||||
|
show_deployment_info() {
|
||||||
|
echo
|
||||||
|
log_info "NarratoAI 部署完成!"
|
||||||
|
echo "访问地址: http://localhost:8501"
|
||||||
|
echo
|
||||||
|
echo "常用命令:"
|
||||||
|
echo " 查看日志: docker-compose logs -f"
|
||||||
|
echo " 停止服务: docker-compose down"
|
||||||
|
echo " 重启服务: docker-compose restart"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 主函数
|
||||||
|
main() {
|
||||||
|
FORCE_BUILD=false
|
||||||
|
NO_CACHE=false
|
||||||
|
|
||||||
|
# 解析命令行参数
|
||||||
|
while [[ $# -gt 0 ]]; do
|
||||||
|
case $1 in
|
||||||
|
-h|--help)
|
||||||
|
show_help
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
-b|--build)
|
||||||
|
FORCE_BUILD=true
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
--no-cache)
|
||||||
|
NO_CACHE=true
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
log_error "未知选项: $1"
|
||||||
|
show_help
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
# 执行部署流程
|
||||||
|
log_info "开始 NarratoAI Docker 部署..."
|
||||||
|
|
||||||
|
check_requirements
|
||||||
|
check_config
|
||||||
|
|
||||||
|
if [ "$FORCE_BUILD" = "true" ] || ! docker images | grep -q "narratoai"; then
|
||||||
|
build_image
|
||||||
|
fi
|
||||||
|
|
||||||
|
start_services
|
||||||
|
|
||||||
|
if wait_for_service; then
|
||||||
|
show_deployment_info
|
||||||
|
else
|
||||||
|
log_error "部署失败,请检查日志"
|
||||||
|
docker-compose logs --tail=20
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# 执行主函数
|
||||||
|
main "$@"
|
||||||
@ -1,8 +1,87 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
if [ "$1" = "webui" ]; then
|
# 函数:打印日志
|
||||||
exec streamlit run webui.py --browser.serverAddress=127.0.0.1 --server.enableCORS=True --browser.gatherUsageStats=False
|
log() {
|
||||||
else
|
echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1"
|
||||||
exec "$@"
|
}
|
||||||
fi
|
|
||||||
|
# 函数:检查必要的文件和目录
|
||||||
|
check_requirements() {
|
||||||
|
log "检查应用环境..."
|
||||||
|
|
||||||
|
# 检查配置文件
|
||||||
|
if [ ! -f "config.toml" ]; then
|
||||||
|
if [ -f "config.example.toml" ]; then
|
||||||
|
log "复制示例配置文件..."
|
||||||
|
cp config.example.toml config.toml
|
||||||
|
else
|
||||||
|
log "警告: 未找到配置文件"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 检查必要的目录
|
||||||
|
for dir in "storage/temp" "storage/tasks" "storage/json" "storage/narration_scripts" "storage/drama_analysis"; do
|
||||||
|
if [ ! -d "$dir" ]; then
|
||||||
|
log "创建目录: $dir"
|
||||||
|
mkdir -p "$dir"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
log "环境检查完成"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 函数:启动 WebUI
|
||||||
|
start_webui() {
|
||||||
|
log "启动 NarratoAI WebUI..."
|
||||||
|
|
||||||
|
# 检查端口是否可用
|
||||||
|
if command -v netstat >/dev/null 2>&1; then
|
||||||
|
if netstat -tuln | grep -q ":8501 "; then
|
||||||
|
log "警告: 端口 8501 已被占用"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 启动 Streamlit 应用
|
||||||
|
exec streamlit run webui.py \
|
||||||
|
--server.address=0.0.0.0 \
|
||||||
|
--server.port=8501 \
|
||||||
|
--server.enableCORS=true \
|
||||||
|
--server.maxUploadSize=2048 \
|
||||||
|
--server.enableXsrfProtection=false \
|
||||||
|
--browser.gatherUsageStats=false \
|
||||||
|
--browser.serverAddress=0.0.0.0 \
|
||||||
|
--logger.level=info
|
||||||
|
}
|
||||||
|
|
||||||
|
# 主逻辑
|
||||||
|
log "NarratoAI Docker 容器启动中..."
|
||||||
|
|
||||||
|
# 检查环境
|
||||||
|
check_requirements
|
||||||
|
|
||||||
|
# 根据参数执行不同的命令
|
||||||
|
case "$1" in
|
||||||
|
"webui"|"")
|
||||||
|
start_webui
|
||||||
|
;;
|
||||||
|
"bash"|"sh")
|
||||||
|
log "启动交互式 shell..."
|
||||||
|
exec /bin/bash
|
||||||
|
;;
|
||||||
|
"health")
|
||||||
|
# 健康检查命令
|
||||||
|
log "执行健康检查..."
|
||||||
|
if curl -f http://localhost:8501/_stcore/health >/dev/null 2>&1; then
|
||||||
|
log "健康检查通过"
|
||||||
|
exit 0
|
||||||
|
else
|
||||||
|
log "健康检查失败"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
log "执行自定义命令: $*"
|
||||||
|
exec "$@"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
@ -1,45 +1,35 @@
|
|||||||
# 必须项
|
# 核心依赖
|
||||||
requests~=2.32.0
|
requests>=2.32.0
|
||||||
moviepy==2.1.1
|
moviepy==2.1.1
|
||||||
edge-tts==6.1.19
|
edge-tts==6.1.19
|
||||||
streamlit~=1.45.0
|
streamlit>=1.45.0
|
||||||
watchdog==6.0.0
|
watchdog==6.0.0
|
||||||
loguru~=0.7.3
|
loguru>=0.7.3
|
||||||
tomli~=2.2.1
|
tomli>=2.2.1
|
||||||
|
tomli-w>=1.0.0
|
||||||
pydub==0.25.1
|
pydub==0.25.1
|
||||||
pysrt==1.1.2
|
pysrt==1.1.2
|
||||||
|
|
||||||
openai~=1.77.0
|
# AI 服务依赖
|
||||||
|
openai>=1.77.0
|
||||||
google-generativeai>=0.8.5
|
google-generativeai>=0.8.5
|
||||||
azure-cognitiveservices-speech~=1.37.0
|
azure-cognitiveservices-speech>=1.37.0
|
||||||
|
|
||||||
# 待优化项
|
# 图像处理依赖
|
||||||
# opencv-python==4.11.0.86
|
Pillow>=10.3.0
|
||||||
# scikit-learn==1.6.1
|
|
||||||
|
|
||||||
|
# 进度条和重试机制
|
||||||
|
tqdm>=4.66.6
|
||||||
|
tenacity>=9.0.0
|
||||||
|
|
||||||
|
# 可选依赖(根据功能需要)
|
||||||
|
# 如果需要本地语音识别,取消注释下面的行
|
||||||
|
# faster-whisper>=1.0.1
|
||||||
|
|
||||||
# faster-whisper~=1.0.1
|
# 如果需要 OpenCV 图像处理,取消注释下面的行
|
||||||
# tomli~=2.0.1
|
# opencv-python>=4.11.0.86
|
||||||
# aiohttp~=3.10.10
|
|
||||||
# httpx==0.27.2
|
|
||||||
# urllib3~=2.2.1
|
|
||||||
|
|
||||||
# python-multipart~=0.0.9
|
# 如果需要 CUDA 支持,取消注释下面的行
|
||||||
# redis==5.0.3
|
# torch>=2.0.0
|
||||||
# opencv-python~=4.10.0.84
|
# torchvision>=0.15.0
|
||||||
# git-changelog~=2.5.2
|
# torchaudio>=2.0.0
|
||||||
# watchdog==5.0.2
|
|
||||||
# pydub==0.25.1
|
|
||||||
# psutil>=5.9.0
|
|
||||||
# scikit-learn~=1.5.2
|
|
||||||
# pillow==10.3.0
|
|
||||||
# python-dotenv~=1.0.1
|
|
||||||
|
|
||||||
# tqdm>=4.66.6
|
|
||||||
# tenacity>=9.0.0
|
|
||||||
# tiktoken==0.8.0
|
|
||||||
# pysrt==1.1.2
|
|
||||||
# transformers==4.50.0
|
|
||||||
|
|
||||||
# yt-dlp==2025.4.30
|
|
||||||
Loading…
x
Reference in New Issue
Block a user