初始化

This commit is contained in:
2026-04-02 23:40:04 +08:00
commit 381ea7085d
107 changed files with 11858 additions and 0 deletions
+362
View File
@@ -0,0 +1,362 @@
#!/bin/bash
# H3C ONU设备管理系统 - 部署脚本
# 使用方法: ./deploy.sh [环境] [操作]
# 环境: dev, prod (默认: prod)
# 操作: up, down, restart, logs, build (默认: up)
set -e
# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 默认值
ENV=${1:-prod}
ACTION=${2:-up}
COMPOSE_FILE="docker-compose.yml"
# 根据环境选择配置文件
if [ "$ENV" = "dev" ]; then
COMPOSE_FILE="docker-compose.dev.yml"
echo -e "${BLUE}使用开发环境配置${NC}"
elif [ "$ENV" = "prod" ]; then
COMPOSE_FILE="docker-compose.yml"
echo -e "${BLUE}使用生产环境配置${NC}"
else
echo -e "${RED}错误: 未知环境 '$ENV'${NC}"
echo "可用环境: dev, prod"
exit 1
fi
# 检查Docker Compose文件是否存在
if [ ! -f "$COMPOSE_FILE" ]; then
echo -e "${RED}错误: Docker Compose文件 '$COMPOSE_FILE' 不存在${NC}"
exit 1
fi
# 检查环境变量文件
if [ ! -f ".env" ]; then
echo -e "${YELLOW}警告: .env 文件不存在,从 .env.example 复制${NC}"
if [ -f ".env.example" ]; then
cp .env.example .env
echo -e "${YELLOW}请编辑 .env 文件并设置正确的配置${NC}"
exit 1
else
echo -e "${RED}错误: .env.example 文件也不存在${NC}"
exit 1
fi
fi
# 加载环境变量
set -a
source .env
set +a
# 函数:显示帮助信息
show_help() {
echo "H3C ONU设备管理系统 - 部署脚本"
echo ""
echo "使用方法: $0 [环境] [操作]"
echo ""
echo "环境:"
echo " dev 开发环境"
echo " prod 生产环境 (默认)"
echo ""
echo "操作:"
echo " up 启动服务 (默认)"
echo " down 停止服务"
echo " restart 重启服务"
echo " logs 查看日志"
echo " build 构建镜像"
echo " ps 查看服务状态"
echo " exec 进入容器"
echo " backup 备份数据"
echo " restore 恢复数据"
echo ""
echo "示例:"
echo " $0 prod up # 启动生产环境"
echo " $0 dev logs # 查看开发环境日志"
echo " $0 prod restart # 重启生产环境"
}
# 函数:检查Docker是否运行
check_docker() {
if ! docker info > /dev/null 2>&1; then
echo -e "${RED}错误: Docker未运行或当前用户无权限${NC}"
exit 1
fi
}
# 函数:检查Docker Compose是否安装
check_docker_compose() {
if ! command -v docker-compose &> /dev/null; then
echo -e "${RED}错误: Docker Compose未安装${NC}"
exit 1
fi
}
# 函数:启动服务
start_services() {
echo -e "${GREEN}启动服务...${NC}"
docker-compose -f "$COMPOSE_FILE" up -d
# 等待服务启动
echo -e "${BLUE}等待服务启动...${NC}"
sleep 10
# 检查服务状态
check_services_status
}
# 函数:停止服务
stop_services() {
echo -e "${YELLOW}停止服务...${NC}"
docker-compose -f "$COMPOSE_FILE" down
}
# 函数:重启服务
restart_services() {
echo -e "${YELLOW}重启服务...${NC}"
docker-compose -f "$COMPOSE_FILE" restart
}
# 函数:查看日志
show_logs() {
echo -e "${BLUE}查看日志 (Ctrl+C退出)...${NC}"
docker-compose -f "$COMPOSE_FILE" logs -f
}
# 函数:构建镜像
build_images() {
echo -e "${GREEN}构建Docker镜像...${NC}"
docker-compose -f "$COMPOSE_FILE" build --no-cache
# 清理未使用的镜像
echo -e "${BLUE}清理未使用的镜像...${NC}"
docker image prune -f
}
# 函数:查看服务状态
show_status() {
echo -e "${BLUE}服务状态:${NC}"
docker-compose -f "$COMPOSE_FILE" ps
echo -e "\n${BLUE}容器资源使用:${NC}"
docker stats --no-stream $(docker-compose -f "$COMPOSE_FILE" ps -q)
}
# 函数:进入容器
exec_container() {
echo -e "${BLUE}选择要进入的容器:${NC}"
echo "1) backend (后端API)"
echo "2) frontend (前端)"
echo "3) celery-worker (Celery Worker)"
echo "4) celery-beat (Celery Beat)"
echo "5) nginx (Nginx)"
echo "6) redis (Redis)"
read -p "请输入数字 (1-6): " choice
case $choice in
1) CONTAINER="backend" ;;
2) CONTAINER="frontend" ;;
3) CONTAINER="celery-worker" ;;
4) CONTAINER="celery-beat" ;;
5) CONTAINER="nginx" ;;
6) CONTAINER="redis" ;;
*)
echo -e "${RED}无效的选择${NC}"
exit 1
;;
esac
echo -e "${GREEN}进入 $CONTAINER 容器...${NC}"
docker-compose -f "$COMPOSE_FILE" exec "$CONTAINER" sh
}
# 函数:备份数据
backup_data() {
BACKUP_DIR="backups/$(date +%Y%m%d_%H%M%S)"
mkdir -p "$BACKUP_DIR"
echo -e "${GREEN}开始备份数据...${NC}"
# 备份数据库
echo -e "${BLUE}备份数据库...${NC}"
DB_CONTAINER=$(docker-compose -f "$COMPOSE_FILE" ps -q backend)
if [ -n "$DB_CONTAINER" ]; then
docker exec "$DB_CONTAINER" pg_dump "$DATABASE_URL" > "$BACKUP_DIR/database.sql"
echo "数据库备份完成: $BACKUP_DIR/database.sql"
else
echo -e "${YELLOW}警告: 数据库容器未运行${NC}"
fi
# 备份Redis数据
echo -e "${BLUE}备份Redis数据...${NC}"
REDIS_CONTAINER=$(docker-compose -f "$COMPOSE_FILE" ps -q redis)
if [ -n "$REDIS_CONTAINER" ]; then
docker exec "$REDIS_CONTAINER" redis-cli --rdb /data/dump.rdb
docker cp "$REDIS_CONTAINER:/data/dump.rdb" "$BACKUP_DIR/redis.rdb"
echo "Redis备份完成: $BACKUP_DIR/redis.rdb"
else
echo -e "${YELLOW}警告: Redis容器未运行${NC}"
fi
# 备份配置文件
echo -e "${BLUE}备份配置文件...${NC}"
cp .env "$BACKUP_DIR/"
cp "$COMPOSE_FILE" "$BACKUP_DIR/"
# 创建备份信息文件
echo "备份时间: $(date)" > "$BACKUP_DIR/backup.info"
echo "环境: $ENV" >> "$BACKUP_DIR/backup.info"
echo "版本: $(git describe --tags 2>/dev/null || echo '未知')" >> "$BACKUP_DIR/backup.info"
# 压缩备份文件
echo -e "${BLUE}压缩备份文件...${NC}"
tar -czf "$BACKUP_DIR.tar.gz" "$BACKUP_DIR"
rm -rf "$BACKUP_DIR"
echo -e "${GREEN}备份完成: $BACKUP_DIR.tar.gz${NC}"
}
# 函数:恢复数据
restore_data() {
echo -e "${YELLOW}警告: 恢复数据将覆盖现有数据${NC}"
read -p "请输入要恢复的备份文件路径: " BACKUP_FILE
if [ ! -f "$BACKUP_FILE" ]; then
echo -e "${RED}错误: 备份文件不存在${NC}"
exit 1
fi
# 解压备份文件
BACKUP_DIR="${BACKUP_FILE%.tar.gz}"
echo -e "${BLUE}解压备份文件...${NC}"
tar -xzf "$BACKUP_FILE"
# 停止服务
echo -e "${BLUE}停止服务...${NC}"
docker-compose -f "$COMPOSE_FILE" down
# 恢复数据库
if [ -f "$BACKUP_DIR/database.sql" ]; then
echo -e "${BLUE}恢复数据库...${NC}"
# 这里需要根据实际情况调整数据库恢复命令
# 例如: psql -d database -f backup.sql
echo "数据库恢复命令需要根据实际情况配置"
fi
# 恢复Redis
if [ -f "$BACKUP_DIR/redis.rdb" ]; then
echo -e "${BLUE}恢复Redis数据...${NC}"
# 这里需要根据实际情况调整Redis恢复命令
echo "Redis恢复命令需要根据实际情况配置"
fi
# 恢复配置文件
if [ -f "$BACKUP_DIR/.env" ]; then
echo -e "${BLUE}恢复配置文件...${NC}"
cp "$BACKUP_DIR/.env" .
fi
# 清理临时文件
rm -rf "$BACKUP_DIR"
# 启动服务
echo -e "${BLUE}启动服务...${NC}"
docker-compose -f "$COMPOSE_FILE" up -d
echo -e "${GREEN}数据恢复完成${NC}"
}
# 函数:检查服务状态
check_services_status() {
echo -e "${BLUE}检查服务健康状态...${NC}"
# 检查后端服务
if curl -f http://localhost:8000/health > /dev/null 2>&1; then
echo -e "${GREEN}✓ 后端服务运行正常${NC}"
else
echo -e "${RED}✗ 后端服务异常${NC}"
fi
# 检查前端服务
if curl -f http://localhost:8080 > /dev/null 2>&1; then
echo -e "${GREEN}✓ 前端服务运行正常${NC}"
else
echo -e "${RED}✗ 前端服务异常${NC}"
fi
# 检查Redis
REDIS_CONTAINER=$(docker-compose -f "$COMPOSE_FILE" ps -q redis)
if [ -n "$REDIS_CONTAINER" ] && docker exec "$REDIS_CONTAINER" redis-cli ping > /dev/null 2>&1; then
echo -e "${GREEN}✓ Redis服务运行正常${NC}"
else
echo -e "${RED}✗ Redis服务异常${NC}"
fi
echo -e "\n${GREEN}部署完成!${NC}"
echo -e "前端访问: ${BLUE}http://localhost:8080${NC}"
echo -e "API文档: ${BLUE}http://localhost:8000/docs${NC}"
echo -e "健康检查: ${BLUE}http://localhost:8000/health${NC}"
}
# 主程序
main() {
# 显示标题
echo -e "${GREEN}========================================${NC}"
echo -e "${GREEN} H3C ONU设备管理系统 - 部署工具${NC}"
echo -e "${GREEN}========================================${NC}"
echo ""
# 检查依赖
check_docker
check_docker_compose
# 根据操作执行相应命令
case "$ACTION" in
up)
start_services
;;
down)
stop_services
;;
restart)
restart_services
;;
logs)
show_logs
;;
build)
build_images
;;
ps)
show_status
;;
exec)
exec_container
;;
backup)
backup_data
;;
restore)
restore_data
;;
help|--help|-h)
show_help
;;
*)
echo -e "${RED}错误: 未知操作 '$ACTION'${NC}"
show_help
exit 1
;;
esac
}
# 执行主程序
main "$@"