383 lines
9.5 KiB
Bash
Executable File
383 lines
9.5 KiB
Bash
Executable File
#!/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 "$@"
|