This commit is contained in:
2025-11-01 17:46:50 +08:00
parent f41af59f4b
commit 27196c00d8
6 changed files with 636 additions and 0 deletions

235
deploy.sh Executable file
View File

@@ -0,0 +1,235 @@
#!/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 "$@"