feat: 添加自动化部署方案(Docker + 远程服务器两套方案)

- 新增 deploy/docker/:Docker 本机模拟部署,含 Dockerfile、docker-compose、deploy.sh 一键脚本
- 新增 deploy/remote/:远程服务器部署,含 SSH 自动上传、重启、回滚脚本
- 新增 deploy/README.md:完整使用手册,含现状分析、落地调整工作清单、命令速查
- 新增 build.sh/start.sh:本地构建和启动脚本(含飞书通知)
- 新增前端 .env.docker 环境配置,API 指向测试服务器
- 前端 package.json 新增 build-docker 命令
- 更新 .gitignore:排除 IDE 配置、SQL 数据、Docker 敏感文件
- 前端 UI 样式优化(多个页面组件)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
xqzp2026
2026-04-15 18:41:15 +09:30
parent d27abbb529
commit 8373460096
71 changed files with 8003 additions and 350 deletions

126
start.sh Executable file
View File

@@ -0,0 +1,126 @@
#!/bin/bash
#
# SmartClean 启动脚本
# 用法:
# ./start.sh # 启动所有服务 (public编译 + web + task + frontend)
# ./start.sh web # 仅启动后端 web 服务
# ./start.sh task # 仅启动后端 task 服务
# ./start.sh front # 仅启动前端
# ./start.sh backend # 启动后端 web + task
# ./start.sh stop # 停止所有服务
# 初始化 SDKMAN 并切换 Java 8
export SDKMAN_DIR="$HOME/.sdkman"
source "$SDKMAN_DIR/bin/sdkman-init.sh"
sdk use java 8.0.432-zulu > /dev/null 2>&1
ROOT_DIR="$(cd "$(dirname "$0")" && pwd)"
PUBLIC_DIR="$ROOT_DIR/backend/xiaoqu-intellectual-public"
WEB_DIR="$ROOT_DIR/backend/xiaoqu-intellectual-web"
TASK_DIR="$ROOT_DIR/backend/xiaoqu-intellectual-task"
FRONT_DIR="$ROOT_DIR/frontend/witcleansystem"
LOG_DIR="$ROOT_DIR/logs"
PROFILE="test"
mkdir -p "$LOG_DIR"
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
log_info() { echo -e "${GREEN}[INFO]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
install_public() {
log_info "编译安装 public 模块..."
cd "$PUBLIC_DIR" && mvn clean install -q -DskipTests
if [ $? -ne 0 ]; then
log_error "public 模块编译失败"
exit 1
fi
log_info "public 模块编译完成"
}
start_web() {
log_info "启动 Web 服务 (端口 8095, profile=$PROFILE)..."
cd "$WEB_DIR"
mvn spring-boot:run -Dspring-boot.run.profiles=$PROFILE -q > "$LOG_DIR/web.log" 2>&1 &
echo $! > "$LOG_DIR/web.pid"
log_info "Web 服务已启动, PID=$(cat "$LOG_DIR/web.pid"), 日志: $LOG_DIR/web.log"
}
start_task() {
log_info "启动 Task 服务 (端口 8097, profile=$PROFILE)..."
cd "$TASK_DIR"
mvn spring-boot:run -Dspring-boot.run.profiles=$PROFILE -q > "$LOG_DIR/task.log" 2>&1 &
echo $! > "$LOG_DIR/task.pid"
log_info "Task 服务已启动, PID=$(cat "$LOG_DIR/task.pid"), 日志: $LOG_DIR/task.log"
}
start_front() {
log_info "启动前端开发服务 (端口 8079)..."
cd "$FRONT_DIR"
if [ ! -d "node_modules" ]; then
log_warn "未检测到 node_modules, 正在安装依赖..."
npm install
fi
npm run dev > "$LOG_DIR/front.log" 2>&1 &
echo $! > "$LOG_DIR/front.pid"
log_info "前端服务已启动, PID=$(cat "$LOG_DIR/front.pid"), 日志: $LOG_DIR/front.log"
}
stop_all() {
log_info "停止所有服务..."
for name in web task front; do
pid_file="$LOG_DIR/$name.pid"
if [ -f "$pid_file" ]; then
pid=$(cat "$pid_file")
if kill -0 "$pid" 2>/dev/null; then
kill "$pid"
log_info "已停止 $name 服务 (PID=$pid)"
fi
rm -f "$pid_file"
fi
done
}
case "${1:-all}" in
web)
install_public
start_web
;;
task)
install_public
start_task
;;
backend)
install_public
start_web
start_task
;;
front)
start_front
;;
all)
install_public
start_web
start_task
start_front
;;
stop)
stop_all
;;
*)
echo "用法: $0 {all|web|task|backend|front|stop}"
exit 1
;;
esac
echo ""
log_info "========================================"
log_info " 前端: http://localhost:8079"
log_info " Web: http://localhost:8095"
log_info " Task: http://localhost:8097"
log_info "========================================"