Files
web/deploy.sh
2025-11-01 17:49:58 +08:00

238 lines
5.8 KiB
Bash
Executable File
Raw 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
# 部署脚本 - 数字档案管理系统前端
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
# 检查Docker Compose plugin
if ! docker compose version &> /dev/null; then
log_error "Docker Compose plugin 未安装"
exit 1
fi
log_info "依赖检查完成"
log_info "Docker版本: $(docker --version)"
log_info "Docker Compose版本: $(docker compose version)"
}
# 检查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 "$@"