- 添加完整的 Docker 配置 (Dockerfile, docker-compose.yml) - 修复前端硬编码端口 4000,改用相对路径 /api - 实现多 OCR 提供商架构 (Tesseract.js/Baidu/RapidOCR) - 修复 Docker 环境中图片上传路径问题 - 添加用户设置页面和 AI 分析服务 - 更新 Prisma schema 支持 AI 分析结果 - 添加部署文档和 OCR 配置指南 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
231 lines
5.2 KiB
Bash
231 lines
5.2 KiB
Bash
#!/bin/bash
|
||
|
||
# PicAnalysis Docker 部署脚本
|
||
# 使用方法: ./deploy.sh [command]
|
||
|
||
set -e
|
||
|
||
# 颜色定义
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
BLUE='\033[0;34m'
|
||
NC='\033[0m' # No Color
|
||
|
||
# 打印带颜色的消息
|
||
print_info() {
|
||
echo -e "${BLUE}ℹ${NC} $1"
|
||
}
|
||
|
||
print_success() {
|
||
echo -e "${GREEN}✓${NC} $1"
|
||
}
|
||
|
||
print_warning() {
|
||
echo -e "${YELLOW}⚠${NC} $1"
|
||
}
|
||
|
||
print_error() {
|
||
echo -e "${RED}✗${NC} $1"
|
||
}
|
||
|
||
# 检查 Docker 是否安装
|
||
check_docker() {
|
||
if ! command -v docker &> /dev/null; then
|
||
print_error "Docker 未安装,请先安装 Docker Engine"
|
||
exit 1
|
||
fi
|
||
|
||
if ! command -v docker compose &> /dev/null && ! docker compose version &> /dev/null; then
|
||
print_error "Docker Compose 未安装,请先安装 Docker Compose"
|
||
exit 1
|
||
fi
|
||
|
||
print_success "Docker 环境检查通过"
|
||
}
|
||
|
||
# 检查环境变量文件
|
||
check_env() {
|
||
if [ ! -f .env ]; then
|
||
print_warning ".env 文件不存在,从模板创建..."
|
||
|
||
if [ -f .env.production.example ]; then
|
||
cp .env.production.example .env
|
||
print_info "已创建 .env 文件"
|
||
|
||
# 生成随机 JWT_SECRET
|
||
JWT_SECRET=$(openssl rand -base64 32 2>/dev/null || echo "change-this-secret-key-in-production")
|
||
sed -i "s/CHANGE_THIS_TO_A_STRONG_RANDOM_KEY/$JWT_SECRET/g" .env 2>/dev/null || \
|
||
sed -i.bak "s/CHANGE_THIS_TO_A_STRONG_RANDOM_KEY/$JWT_SECRET/g" .env
|
||
|
||
print_success "已自动生成 JWT_SECRET"
|
||
print_warning "请检查 .env 文件并根据需要修改其他配置"
|
||
else
|
||
print_error "找不到 .env.production.example 模板文件"
|
||
exit 1
|
||
fi
|
||
else
|
||
print_success ".env 文件已存在"
|
||
fi
|
||
}
|
||
|
||
# 启动服务
|
||
start_services() {
|
||
print_info "启动 Docker 服务..."
|
||
docker compose up -d
|
||
|
||
print_success "服务启动成功"
|
||
echo ""
|
||
print_info "访问地址:"
|
||
echo " - 前端: http://localhost:80"
|
||
echo " - 后端: http://localhost:80/api"
|
||
echo ""
|
||
print_info "默认测试账号:"
|
||
echo " - 用户名: testuser"
|
||
echo " - 密码: Password123@"
|
||
}
|
||
|
||
# 停止服务
|
||
stop_services() {
|
||
print_info "停止 Docker 服务..."
|
||
docker compose stop
|
||
print_success "服务已停止"
|
||
}
|
||
|
||
# 重启服务
|
||
restart_services() {
|
||
print_info "重启 Docker 服务..."
|
||
docker compose restart
|
||
print_success "服务已重启"
|
||
}
|
||
|
||
# 查看日志
|
||
view_logs() {
|
||
SERVICE=$1
|
||
if [ -z "$SERVICE" ]; then
|
||
docker compose logs -f
|
||
else
|
||
docker compose logs -f "$SERVICE"
|
||
fi
|
||
}
|
||
|
||
# 查看状态
|
||
view_status() {
|
||
docker compose ps
|
||
}
|
||
|
||
# 清理服务
|
||
clean_services() {
|
||
print_warning "这将删除所有容器、卷和镜像,请确认是否继续? (y/N)"
|
||
read -r confirm
|
||
|
||
if [ "$confirm" = "y" ] || [ "$confirm" = "Y" ]; then
|
||
print_info "清理 Docker 资源..."
|
||
docker compose down -v --rmi all
|
||
print_success "清理完成"
|
||
else
|
||
print_info "已取消清理操作"
|
||
fi
|
||
}
|
||
|
||
# 重新构建
|
||
rebuild() {
|
||
print_info "重新构建并启动服务..."
|
||
docker compose up -d --build
|
||
print_success "重新构建完成"
|
||
}
|
||
|
||
# 数据库备份
|
||
backup_db() {
|
||
BACKUP_DIR="./backups"
|
||
mkdir -p "$BACKUP_DIR"
|
||
|
||
BACKUP_FILE="$BACKUP_DIR/picanalysis-$(date +%Y%m%d-%H%M%S).db"
|
||
|
||
print_info "备份数据库到: $BACKUP_FILE"
|
||
docker compose exec backend cp /app/data/prod.db "/app/data/backup-$(date +%Y%m%d-%H%M%S).db"
|
||
docker compose cp backend:/app/data/backup-$(date +%Y%m%d-%H%M%S).db "$BACKUP_FILE"
|
||
print_success "数据库备份完成: $BACKUP_FILE"
|
||
}
|
||
|
||
# 数据库迁移
|
||
migrate_db() {
|
||
print_info "运行数据库迁移..."
|
||
docker compose exec backend npx prisma migrate deploy
|
||
print_success "数据库迁移完成"
|
||
}
|
||
|
||
# 显示帮助信息
|
||
show_help() {
|
||
cat << EOF
|
||
PicAnalysis Docker 部署脚本
|
||
|
||
使用方法: ./deploy.sh [command]
|
||
|
||
命令:
|
||
start 启动所有服务 (默认)
|
||
stop 停止所有服务
|
||
restart 重启所有服务
|
||
logs 查看所有日志
|
||
logs [服务] 查看指定服务日志 (backend/frontend/rapidocr)
|
||
status 查看服务状态
|
||
clean 清理所有容器、卷和镜像
|
||
rebuild 重新构建并启动服务
|
||
backup 备份数据库
|
||
migrate 运行数据库迁移
|
||
help 显示此帮助信息
|
||
|
||
示例:
|
||
./deploy.sh # 启动服务
|
||
./deploy.sh logs backend # 查看后端日志
|
||
./deploy.sh backup # 备份数据库
|
||
|
||
EOF
|
||
}
|
||
|
||
# 主函数
|
||
main() {
|
||
check_docker
|
||
|
||
case "${1:-start}" in
|
||
start)
|
||
check_env
|
||
start_services
|
||
;;
|
||
stop)
|
||
stop_services
|
||
;;
|
||
restart)
|
||
restart_services
|
||
;;
|
||
logs)
|
||
view_logs "$2"
|
||
;;
|
||
status)
|
||
view_status
|
||
;;
|
||
clean)
|
||
clean_services
|
||
;;
|
||
rebuild)
|
||
rebuild
|
||
;;
|
||
backup)
|
||
backup_db
|
||
;;
|
||
migrate)
|
||
migrate_db
|
||
;;
|
||
help|--help|-h)
|
||
show_help
|
||
;;
|
||
*)
|
||
print_error "未知命令: $1"
|
||
show_help
|
||
exit 1
|
||
;;
|
||
esac
|
||
}
|
||
|
||
main "$@"
|