nex_docus/deploy.sh

383 lines
9.5 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#!/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 "$@"