nex_docus/deploy.sh

383 lines
9.5 KiB
Bash
Raw Permalink Normal View History

2025-12-23 05:02:10 +00:00
#!/bin/bash
# NEX Docus 部署管理脚本
# 支持:初始化、启动、停止、重启、升级、日志查看等功能
set -e
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 项目目录
PROJECT_DIR="$(cd "$(dirname "$0")" && pwd)"
cd "$PROJECT_DIR"
# 检查 .env 文件
check_env() {
if [ ! -f ".env" ]; then
echo -e "${YELLOW}警告: .env 文件不存在${NC}"
echo -e "${BLUE}正在从 .env.example 创建 .env 文件...${NC}"
cp .env.example .env
echo -e "${GREEN}✓ .env 文件已创建${NC}"
echo -e "${YELLOW}请编辑 .env 文件,配置数据库和其他参数后再继续!${NC}"
exit 1
fi
}
# 检查 Docker 和 Docker Compose
check_docker() {
if ! command -v docker &> /dev/null; then
echo -e "${RED}错误: Docker 未安装${NC}"
echo "请访问 https://docs.docker.com/get-docker/ 安装 Docker"
exit 1
fi
if ! command -v docker-compose &> /dev/null && ! docker compose version &> /dev/null 2>&1; then
echo -e "${RED}错误: Docker Compose 未安装${NC}"
echo "请访问 https://docs.docker.com/compose/install/ 安装 Docker Compose"
exit 1
fi
}
# 获取 docker-compose 命令
get_compose_cmd() {
if docker compose version &> /dev/null 2>&1; then
echo "docker compose"
else
echo "docker-compose"
fi
}
# 初始化部署
init() {
echo -e "${BLUE}开始初始化 NEX Docus...${NC}"
echo "======================================"
check_env
check_docker
local COMPOSE_CMD=$(get_compose_cmd)
# 1. 拉取镜像
echo -e "\n${BLUE}1. 拉取 Docker 镜像...${NC}"
$COMPOSE_CMD pull
# 2. 构建服务
echo -e "\n${BLUE}2. 构建应用镜像...${NC}"
$COMPOSE_CMD build --no-cache
# 3. 启动数据库和 Redis
echo -e "\n${BLUE}3. 启动数据库和缓存服务...${NC}"
$COMPOSE_CMD up -d mysql redis
# 等待数据库就绪
echo -e "${BLUE}等待数据库就绪...${NC}"
sleep 15
# 4. 初始化数据库
echo -e "\n${BLUE}4. 初始化数据库...${NC}"
$COMPOSE_CMD run --rm backend python scripts/init_db.py
# 5. 启动所有服务
echo -e "\n${BLUE}5. 启动所有服务...${NC}"
$COMPOSE_CMD up -d
# 6. 显示状态
echo -e "\n${GREEN}======================================"
echo -e "✓ NEX Docus 初始化完成!"
echo -e "======================================${NC}"
show_info
}
# 启动服务
start() {
echo -e "${BLUE}启动 NEX Docus 服务...${NC}"
check_docker
local COMPOSE_CMD=$(get_compose_cmd)
$COMPOSE_CMD up -d
echo -e "${GREEN}✓ 服务已启动${NC}"
show_status
}
# 停止服务
stop() {
echo -e "${YELLOW}停止 NEX Docus 服务...${NC}"
check_docker
local COMPOSE_CMD=$(get_compose_cmd)
$COMPOSE_CMD stop
echo -e "${GREEN}✓ 服务已停止${NC}"
}
# 重启服务
restart() {
echo -e "${BLUE}重启 NEX Docus 服务...${NC}"
stop
sleep 2
start
}
# 查看服务状态
status() {
check_docker
local COMPOSE_CMD=$(get_compose_cmd)
$COMPOSE_CMD ps
}
# 查看日志
logs() {
check_docker
local COMPOSE_CMD=$(get_compose_cmd)
if [ -z "$1" ]; then
echo -e "${BLUE}查看所有服务日志 (Ctrl+C 退出)${NC}"
$COMPOSE_CMD logs -f
else
echo -e "${BLUE}查看 $1 服务日志 (Ctrl+C 退出)${NC}"
$COMPOSE_CMD logs -f "$1"
fi
}
# 升级部署
upgrade() {
echo -e "${BLUE}开始升级 NEX Docus...${NC}"
echo "======================================"
check_docker
local COMPOSE_CMD=$(get_compose_cmd)
# 1. 备份数据
echo -e "\n${YELLOW}1. 建议先备份数据库...${NC}"
read -p "是否继续升级?(y/n) " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
echo -e "${YELLOW}升级已取消${NC}"
exit 0
fi
# 2. 拉取最新代码
echo -e "\n${BLUE}2. 拉取最新代码...${NC}"
if [ -d ".git" ]; then
git pull
else
echo -e "${YELLOW}未检测到 Git 仓库,跳过拉取代码${NC}"
fi
# 3. 停止服务
echo -e "\n${BLUE}3. 停止当前服务...${NC}"
$COMPOSE_CMD stop backend frontend
# 4. 构建新镜像
echo -e "\n${BLUE}4. 构建新镜像...${NC}"
$COMPOSE_CMD build --no-cache backend frontend
# 5. 运行数据库迁移
echo -e "\n${BLUE}5. 更新数据库...${NC}"
$COMPOSE_CMD run --rm backend python scripts/init_db.py
# 6. 启动服务
echo -e "\n${BLUE}6. 启动服务...${NC}"
$COMPOSE_CMD up -d
# 7. 清理旧镜像
echo -e "\n${BLUE}7. 清理旧镜像...${NC}"
docker image prune -f
echo -e "\n${GREEN}======================================"
echo -e "✓ NEX Docus 升级完成!"
echo -e "======================================${NC}"
show_info
}
# 完全卸载
uninstall() {
echo -e "${RED}警告: 此操作将删除所有容器、镜像和数据!${NC}"
read -p "确认要卸载吗?(yes/no) " -r
echo
if [[ ! $REPLY == "yes" ]]; then
echo -e "${YELLOW}卸载已取消${NC}"
exit 0
fi
check_docker
local COMPOSE_CMD=$(get_compose_cmd)
echo -e "${YELLOW}停止并删除所有容器和数据...${NC}"
$COMPOSE_CMD down -v --remove-orphans
echo -e "${YELLOW}删除所有镜像...${NC}"
docker images | grep "nex-docus" | awk '{print $3}' | xargs -r docker rmi -f
echo -e "${GREEN}✓ NEX Docus 已卸载${NC}"
}
# 备份数据库
backup() {
check_docker
local COMPOSE_CMD=$(get_compose_cmd)
BACKUP_DIR="./backups"
mkdir -p "$BACKUP_DIR"
BACKUP_FILE="$BACKUP_DIR/nex_docus_$(date +%Y%m%d_%H%M%S).sql"
echo -e "${BLUE}正在备份数据库...${NC}"
# 从 .env 读取数据库配置
source .env
$COMPOSE_CMD exec -T mysql mysqldump \
-u"${DB_USER}" \
-p"${DB_PASSWORD}" \
"${DB_NAME}" > "$BACKUP_FILE"
if [ -f "$BACKUP_FILE" ]; then
echo -e "${GREEN}✓ 数据库备份成功!${NC}"
echo -e "备份文件: ${BACKUP_FILE}"
else
echo -e "${RED}✗ 数据库备份失败${NC}"
exit 1
fi
}
# 恢复数据库
restore() {
if [ -z "$1" ]; then
echo -e "${RED}错误: 请指定备份文件${NC}"
echo "用法: $0 restore <backup_file>"
exit 1
fi
if [ ! -f "$1" ]; then
echo -e "${RED}错误: 备份文件不存在: $1${NC}"
exit 1
fi
check_docker
local COMPOSE_CMD=$(get_compose_cmd)
echo -e "${YELLOW}警告: 此操作将覆盖当前数据库!${NC}"
read -p "确认要恢复吗?(yes/no) " -r
echo
if [[ ! $REPLY == "yes" ]]; then
echo -e "${YELLOW}恢复已取消${NC}"
exit 0
fi
echo -e "${BLUE}正在恢复数据库...${NC}"
# 从 .env 读取数据库配置
source .env
$COMPOSE_CMD exec -T mysql mysql \
-u"${DB_USER}" \
-p"${DB_PASSWORD}" \
"${DB_NAME}" < "$1"
echo -e "${GREEN}✓ 数据库恢复成功!${NC}"
}
# 显示访问信息
show_info() {
source .env 2>/dev/null || true
echo ""
echo -e "${GREEN}访问信息:${NC}"
echo " 前端地址: http://localhost:${FRONTEND_PORT:-8080}"
echo " 后端地址: http://localhost:${BACKEND_PORT:-8000}"
echo " API 文档: http://localhost:${BACKEND_PORT:-8000}/docs"
echo ""
echo -e "${GREEN}管理员账号:${NC}"
echo " 用户名: ${ADMIN_USERNAME:-admin}"
echo " 密码: ${ADMIN_PASSWORD:-Admin@123456}"
echo ""
echo -e "${YELLOW}提示: 请及时修改默认密码!${NC}"
echo ""
}
# 显示状态
show_status() {
echo ""
echo -e "${BLUE}服务状态:${NC}"
status
}
# 显示帮助
help() {
echo "NEX Docus 部署管理脚本"
echo ""
echo "用法: $0 <command> [options]"
echo ""
echo "命令:"
echo " init 初始化并部署(首次部署使用)"
echo " start 启动所有服务"
echo " stop 停止所有服务"
echo " restart 重启所有服务"
echo " status 查看服务状态"
echo " logs [服务名] 查看日志可选指定服务backend/frontend/mysql/redis"
echo " upgrade 升级部署"
echo " backup 备份数据库"
echo " restore <file> 恢复数据库"
echo " uninstall 完全卸载"
echo " help 显示帮助信息"
echo ""
echo "示例:"
echo " $0 init # 首次部署"
echo " $0 start # 启动服务"
echo " $0 logs backend # 查看后端日志"
echo " $0 backup # 备份数据库"
echo " $0 upgrade # 升级到最新版本"
echo ""
}
# 主函数
main() {
case "${1:-help}" in
init)
init
;;
start)
start
;;
stop)
stop
;;
restart)
restart
;;
status)
status
;;
logs)
logs "$2"
;;
upgrade)
upgrade
;;
backup)
backup
;;
restore)
restore "$2"
;;
uninstall)
uninstall
;;
help|--help|-h)
help
;;
*)
echo -e "${RED}错误: 未知命令 '$1'${NC}"
echo ""
help
exit 1
;;
esac
}
# 执行主函数
main "$@"