test
This commit is contained in:
235
deploy.sh
Executable file
235
deploy.sh
Executable 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 "$@"
|
||||
Reference in New Issue
Block a user