Files

258 lines
8.6 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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 "$@"