#!/bin/bash # 部署脚本 - 数字档案管理系统前端 set -e # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color # 配置变量 PROJECT_NAME="digital-archive" DEPLOY_DIR="${1:-/opt/${PROJECT_NAME}}" # 第一个参数作为部署目录,默认为/opt/digital-archive FRONTEND_DIR="${DEPLOY_DIR}/frontend" BACKUP_DIR="${DEPLOY_DIR}/backup" TIMESTAMP=$(date +%Y%m%d_%H%M%S) # 日志函数 log_info() { echo -e "${GREEN}[INFO]${NC} $1" } log_warn() { echo -e "${YELLOW}[WARN]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } # 检查Docker和Docker Compose check_dependencies() { log_info "检查依赖..." if ! command -v docker &> /dev/null; then log_error "Docker 未安装或不在PATH中" exit 1 fi if ! command -v docker-compose &> /dev/null; then log_error "Docker Compose 未安装或不在PATH中" exit 1 fi log_info "依赖检查完成" } # 检查proxy网络是否存在 check_network() { log_info "检查proxy网络..." if ! docker network ls | grep -q "proxy"; then log_error "proxy网络不存在,请先创建proxy网络:" log_error "docker network create proxy" exit 1 fi log_info "proxy网络检查完成" } # 检查后端服务是否运行 check_backend() { log_info "检查后端服务..." if ! docker ps | grep -q "digital-archive-app"; then log_warn "后端服务digital-archive-app未运行,请确保后端服务已启动" else log_info "后端服务运行正常" fi } # 创建部署目录 create_directories() { log_info "创建部署目录..." sudo mkdir -p "${DEPLOY_DIR}" sudo mkdir -p "${FRONTEND_DIR}" sudo mkdir -p "${BACKUP_DIR}" log_info "目录创建完成" } # 备份当前版本 backup_current() { log_info "备份当前版本..." if [ -d "${FRONTEND_DIR}" ] && [ "$(ls -A ${FRONTEND_DIR})" ]; then sudo mv "${FRONTEND_DIR}" "${BACKUP_DIR}/frontend_${TIMESTAMP}" log_info "当前版本已备份到: ${BACKUP_DIR}/frontend_${TIMESTAMP}" fi } # 复制文件到部署目录 copy_files() { log_info "复制文件到部署目录..." # 创建新的前端目录 sudo mkdir -p "${FRONTEND_DIR}" # 复制必要文件 sudo cp docker-compose.yml "${FRONTEND_DIR}/" sudo cp Dockerfile "${FRONTEND_DIR}/" sudo cp nginx.conf "${FRONTEND_DIR}/" sudo cp .dockerignore "${FRONTEND_DIR}/" sudo cp -r src "${FRONTEND_DIR}/" sudo cp package*.json "${FRONTEND_DIR}/" sudo cp vue.config.js "${FRONTEND_DIR}/" sudo cp babel.config.js "${FRONTEND_DIR}/" sudo cp jsconfig.json "${FRONTEND_DIR}/" # 设置权限 sudo chown -R $USER:$USER "${FRONTEND_DIR}" log_info "文件复制完成" } # 构建和启动服务 build_and_start() { log_info "构建和启动前端服务..." cd "${FRONTEND_DIR}" # 停止现有服务 docker-compose down || true # 构建镜像 docker-compose build --no-cache # 启动服务 docker-compose up -d log_info "前端服务启动完成" } # 验证部署 verify_deployment() { log_info "验证部署..." # 等待服务启动 sleep 10 # 检查容器状态 if docker-compose ps | grep -q "Up"; then log_info "前端服务运行正常" else log_error "前端服务启动失败" docker-compose logs exit 1 fi # 健康检查 log_info "执行健康检查..." if curl -f http://localhost/health > /dev/null 2>&1; then log_info "健康检查通过" else log_warn "健康检查失败,但服务可能仍在启动中" fi } # 清理旧镜像 cleanup() { log_info "清理旧镜像..." # 删除悬空镜像 docker image prune -f # 删除旧版本镜像(保留最近3个版本) OLD_IMAGES=$(docker images digital-archive-frontend --format "table {{.Repository}}:{{.Tag}}" | tail -n +2 | tail -n +4) if [ ! -z "$OLD_IMAGES" ]; then echo "$OLD_IMAGES" | xargs docker rmi -f || true fi log_info "清理完成" } # 显示部署信息 show_info() { log_info "部署完成!" echo "" echo "部署信息:" echo " 部署目录: ${FRONTEND_DIR}" echo " 访问地址: http://localhost" echo " 容器名称: digital-archive-frontend" echo " 备份位置: ${BACKUP_DIR}" echo "" echo "常用命令:" echo " 查看日志: cd ${FRONTEND_DIR} && docker-compose logs -f" echo " 重启服务: cd ${FRONTEND_DIR} && docker-compose restart" echo " 停止服务: cd ${FRONTEND_DIR} && docker-compose down" echo "" } # 显示使用帮助 show_help() { echo "用法: $0 [部署目录]" echo "" echo "参数:" echo " 部署目录 指定部署目录路径(可选,默认为/opt/digital-archive)" echo "" echo "示例:" echo " $0 # 使用默认目录 /opt/digital-archive" echo " $0 /root/xxx # 使用指定目录 /root/xxx" echo " $0 ./deploy # 使用当前目录下的deploy子目录" echo "" } # 主函数 main() { # 检查帮助参数 if [[ "$1" == "-h" || "$1" == "--help" ]]; then show_help exit 0 fi log_info "开始部署数字档案管理系统前端..." log_info "部署目录: ${DEPLOY_DIR}" check_dependencies check_network check_backend create_directories backup_current copy_files build_and_start verify_deployment cleanup show_info log_info "部署完成!" } # 执行主函数 main "$@"