258 lines
8.6 KiB
Bash
258 lines
8.6 KiB
Bash
#!/bin/bash
|
||
# =============================================================================
|
||
# 企微IT智能服务台 — 一键构建 & 部署脚本(共享域名版)
|
||
# =============================================================================
|
||
# 说明:与 IT 数据查询平台共享域名 it-dataquery.dc.servyou-it.com
|
||
# 路由:
|
||
# / → IT 数据查询平台
|
||
# /itdesk/ → H5 员工咨询端
|
||
# /itagent/ → 坐席工作台
|
||
# /api/ → 后端 FastAPI
|
||
#
|
||
# 用法:
|
||
# bash scripts/deploy.sh # 完整构建 + 启动
|
||
# bash scripts/deploy.sh --build # 仅构建前端 + 后端镜像
|
||
# bash scripts/deploy.sh --up # 仅启动(已构建过)
|
||
# bash scripts/deploy.sh --down # 停止所有服务
|
||
# bash scripts/deploy.sh --status # 查看服务状态
|
||
# bash scripts/deploy.sh --pack # 打包部署文件(用于 SCP 到远程服务器)
|
||
# =============================================================================
|
||
|
||
set -e # 遇到错误立即退出
|
||
|
||
# 颜色输出
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
BLUE='\033[0;34m'
|
||
NC='\033[0m' # No Color
|
||
|
||
info() { echo -e "${BLUE}[INFO]${NC} $1"; }
|
||
ok() { echo -e "${GREEN}[OK]${NC} $1"; }
|
||
warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
|
||
error() { echo -e "${RED}[ERROR]${NC} $1"; exit 1; }
|
||
|
||
# 项目根目录(脚本所在目录的上级)
|
||
PROJECT_ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
||
cd "$PROJECT_ROOT"
|
||
|
||
# 部署包名(含日期)
|
||
DEPLOY_PKG="it-smart-desk-$(date +%Y%m%d%H%M).tar.gz"
|
||
|
||
# --------------------------------------------------------------------------
|
||
# 前置检查
|
||
# --------------------------------------------------------------------------
|
||
check_prerequisites() {
|
||
info "检查前置条件..."
|
||
|
||
# 检查 Docker
|
||
if ! command -v docker &> /dev/null; then
|
||
error "Docker 未安装,请先安装 Docker"
|
||
fi
|
||
ok "Docker 已安装"
|
||
|
||
# 检查 Docker Compose
|
||
if ! docker compose version &> /dev/null; then
|
||
error "Docker Compose 未安装或版本过低"
|
||
fi
|
||
ok "Docker Compose 可用"
|
||
|
||
# 检查 .env 文件
|
||
if [ ! -f .env ]; then
|
||
warn ".env 文件不存在,从模板创建..."
|
||
if [ -f .env.production ]; then
|
||
cp .env.production .env
|
||
warn "已创建 .env,请编辑填入真实配置后再部署"
|
||
warn "关键配置:WECOM_CORP_ID, WECOM_SECRET, WECOM_TOKEN, WECOM_ENCODING_AES_KEY"
|
||
exit 1
|
||
else
|
||
error ".env.production 模板不存在"
|
||
fi
|
||
fi
|
||
ok ".env 配置文件就绪"
|
||
}
|
||
|
||
# --------------------------------------------------------------------------
|
||
# 创建外部网络(与数据平台互联)
|
||
# --------------------------------------------------------------------------
|
||
ensure_network() {
|
||
info "检查外部网络 it-platform-net..."
|
||
if docker network inspect it-platform-net &> /dev/null; then
|
||
ok "外部网络 it-platform-net 已存在"
|
||
else
|
||
info "创建外部网络 it-platform-net..."
|
||
docker network create it-platform-net
|
||
ok "外部网络创建成功"
|
||
fi
|
||
}
|
||
|
||
# --------------------------------------------------------------------------
|
||
# 构建前端
|
||
# --------------------------------------------------------------------------
|
||
build_frontends() {
|
||
info "构建 H5 员工咨询端(/itdesk/)..."
|
||
cd "$PROJECT_ROOT/frontend-h5"
|
||
npm install --prefer-offline
|
||
npm run build
|
||
ok "H5 员工咨询端构建完成 (dist/ → /itdesk/)"
|
||
|
||
info "构建坐席工作台(/itagent/)..."
|
||
cd "$PROJECT_ROOT/frontend-agent"
|
||
npm install --prefer-offline
|
||
npm run build
|
||
ok "坐席工作台构建完成 (dist/ → /itagent/)"
|
||
|
||
cd "$PROJECT_ROOT"
|
||
}
|
||
|
||
# --------------------------------------------------------------------------
|
||
# 构建后端镜像
|
||
# --------------------------------------------------------------------------
|
||
build_backend() {
|
||
info "构建后端 Docker 镜像..."
|
||
docker compose build backend
|
||
ok "后端镜像构建完成"
|
||
}
|
||
|
||
# --------------------------------------------------------------------------
|
||
# 启动服务
|
||
# --------------------------------------------------------------------------
|
||
start_services() {
|
||
ensure_network
|
||
info "启动所有服务..."
|
||
docker compose up -d
|
||
ok "所有服务已启动"
|
||
|
||
echo ""
|
||
info "等待服务就绪(约 30 秒,含数据库迁移)..."
|
||
sleep 30
|
||
|
||
# 健康检查
|
||
if curl -sf http://localhost:18080/itdesk/health > /dev/null 2>&1; then
|
||
ok "后端服务健康检查通过"
|
||
else
|
||
warn "后端健康检查未通过,请查看日志:docker compose logs backend"
|
||
fi
|
||
}
|
||
|
||
# --------------------------------------------------------------------------
|
||
# 停止服务
|
||
# --------------------------------------------------------------------------
|
||
stop_services() {
|
||
info "停止所有服务..."
|
||
docker compose down
|
||
ok "所有服务已停止(数据卷保留,不丢失数据)"
|
||
}
|
||
|
||
# --------------------------------------------------------------------------
|
||
# 查看状态
|
||
# --------------------------------------------------------------------------
|
||
show_status() {
|
||
info "服务状态:"
|
||
docker compose ps
|
||
echo ""
|
||
info "资源占用:"
|
||
docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}" \
|
||
$(docker compose ps -q 2>/dev/null) 2>/dev/null || echo "服务未启动"
|
||
}
|
||
|
||
# --------------------------------------------------------------------------
|
||
# 打包部署文件(用于 SCP 到远程服务器)
|
||
# --------------------------------------------------------------------------
|
||
pack_deploy() {
|
||
info "打包部署文件..."
|
||
|
||
# 确保前端已构建
|
||
if [ ! -d "$PROJECT_ROOT/frontend-h5/dist" ] || [ ! -d "$PROJECT_ROOT/frontend-agent/dist" ]; then
|
||
warn "前端 dist 不存在,先构建..."
|
||
build_frontends
|
||
fi
|
||
|
||
# 打包所需文件(排除 node_modules、.git、本地数据库等)
|
||
tar czf "$PROJECT_ROOT/$DEPLOY_PKG" \
|
||
--exclude='node_modules' \
|
||
--exclude='.git' \
|
||
--exclude='__pycache__' \
|
||
--exclude='*.pyc' \
|
||
--exclude='*.db' \
|
||
--exclude='.env' \
|
||
--exclude='*.tar.gz' \
|
||
-C "$PROJECT_ROOT" \
|
||
backend/ \
|
||
frontend-h5/dist/ \
|
||
frontend-agent/dist/ \
|
||
nginx/ \
|
||
docker-compose.yml \
|
||
.env.production \
|
||
scripts/ \
|
||
docs/
|
||
|
||
ok "部署包已创建:$DEPLOY_PKG"
|
||
echo ""
|
||
info "远程部署步骤:"
|
||
echo " 1. scp $DEPLOY_PKG user@server:/opt/it-smart-desk/"
|
||
echo " 2. ssh user@server"
|
||
echo " 3. cd /opt/it-smart-desk && tar xzf $DEPLOY_PKG"
|
||
echo " 4. cp .env.production .env && vim .env # 填入真实配置"
|
||
echo " 5. bash scripts/deploy.sh"
|
||
}
|
||
|
||
# --------------------------------------------------------------------------
|
||
# 主流程
|
||
# --------------------------------------------------------------------------
|
||
main() {
|
||
echo "========================================="
|
||
echo " 企微IT智能服务台 — 部署工具"
|
||
echo " 共享域名: it-dataquery.dc.servyou-it.com"
|
||
echo "========================================="
|
||
echo ""
|
||
|
||
case "${1:-full}" in
|
||
--build)
|
||
check_prerequisites
|
||
build_frontends
|
||
build_backend
|
||
ok "构建完成!运行 bash scripts/deploy.sh --up 启动服务"
|
||
;;
|
||
--up)
|
||
check_prerequisites
|
||
start_services
|
||
;;
|
||
--down)
|
||
stop_services
|
||
;;
|
||
--status)
|
||
show_status
|
||
;;
|
||
--pack)
|
||
build_frontends
|
||
pack_deploy
|
||
;;
|
||
full|"")
|
||
check_prerequisites
|
||
build_frontends
|
||
build_backend
|
||
start_services
|
||
echo ""
|
||
echo "========================================="
|
||
ok "部署完成!"
|
||
echo "========================================="
|
||
echo ""
|
||
echo " H5 员工端:http://it-dataquery.dc.servyou-it.com/itdesk/"
|
||
echo " 坐席工作台:http://it-dataquery.dc.servyou-it.com/itagent/"
|
||
echo " API 文档: http://it-dataquery.dc.servyou-it.com/api/docs"
|
||
echo " 数据平台: http://it-dataquery.dc.servyou-it.com/"
|
||
echo ""
|
||
echo " 本地测试: http://localhost:18080/itdesk/"
|
||
echo " 查看日志:docker compose logs -f"
|
||
echo " 停止服务:bash scripts/deploy.sh --down"
|
||
;;
|
||
*)
|
||
echo "用法:bash scripts/deploy.sh [--build|--up|--down|--status|--pack]"
|
||
exit 1
|
||
;;
|
||
esac
|
||
}
|
||
|
||
main "$@"
|