Files

258 lines
8.6 KiB
Bash
Raw Permalink Normal View History

#!/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 "$@"