#!/bin/bash # iMeeting Docker 管理脚本 # 用于日常管理和维护 set -e # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' print_info() { echo -e "${BLUE}[INFO]${NC} $1" } print_success() { echo -e "${GREEN}[SUCCESS]${NC} $1" } print_warning() { echo -e "${YELLOW}[WARNING]${NC} $1" } print_error() { echo -e "${RED}[ERROR]${NC} $1" } # 确定使用的命令 if docker compose version &> /dev/null; then COMPOSE_CMD="docker compose" else COMPOSE_CMD="docker-compose" fi # 显示菜单 show_menu() { echo "" echo -e "${BLUE}==================================${NC}" echo -e "${BLUE} iMeeting 管理菜单${NC}" echo -e "${BLUE}==================================${NC}" echo "" echo "1) 查看服务状态" echo "2) 查看实时日志" echo "3) 重启所有服务" echo "4) 重启单个服务" echo "5) 进入容器终端" echo "6) 备份数据库" echo "7) 恢复数据库" echo "8) 清理Redis缓存" echo "9) 更新服务" echo "10) 查看资源使用" echo "11) 导出日志" echo "0) 退出" echo "" read -p "请选择操作 (0-11): " choice } # 查看服务状态 view_status() { print_info "服务状态:" $COMPOSE_CMD ps echo "" read -p "按任意键返回菜单..." -n 1 } # 查看实时日志 view_logs() { echo "选择要查看的服务:" echo "1) 所有服务" echo "2) Nginx" echo "3) 前端" echo "4) 后端" echo "5) MySQL" echo "6) Redis" read -p "请选择: " log_choice case $log_choice in 1) $COMPOSE_CMD logs -f ;; 2) $COMPOSE_CMD logs -f nginx ;; 3) $COMPOSE_CMD logs -f frontend ;; 4) $COMPOSE_CMD logs -f backend ;; 5) $COMPOSE_CMD logs -f mysql ;; 6) $COMPOSE_CMD logs -f redis ;; *) print_error "无效选择" ;; esac } # 重启服务 restart_services() { print_info "重启所有服务..." $COMPOSE_CMD restart print_success "服务已重启" read -p "按任意键返回菜单..." -n 1 } # 重启单个服务 restart_single_service() { echo "选择要重启的服务:" echo "1) Nginx" echo "2) 前端" echo "3) 后端" echo "4) MySQL" echo "5) Redis" read -p "请选择: " service_choice case $service_choice in 1) $COMPOSE_CMD restart nginx ;; 2) $COMPOSE_CMD restart frontend ;; 3) $COMPOSE_CMD restart backend ;; 4) $COMPOSE_CMD restart mysql ;; 5) $COMPOSE_CMD restart redis ;; *) print_error "无效选择"; return ;; esac print_success "服务已重启" read -p "按任意键返回菜单..." -n 1 } # 进入容器 enter_container() { echo "选择要进入的容器:" echo "1) Nginx" echo "2) 前端" echo "3) 后端" echo "4) MySQL" echo "5) Redis" read -p "请选择: " container_choice case $container_choice in 1) $COMPOSE_CMD exec nginx sh ;; 2) $COMPOSE_CMD exec frontend sh ;; 3) $COMPOSE_CMD exec backend bash ;; 4) $COMPOSE_CMD exec mysql bash ;; 5) $COMPOSE_CMD exec redis sh ;; *) print_error "无效选择" ;; esac } # 备份数据库 backup_database() { print_info "开始备份数据库..." mkdir -p backups backup_file="backups/imeeting_$(date +%Y%m%d_%H%M%S).sql" source .env 2>/dev/null || true MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD:-Unis@123} $COMPOSE_CMD exec mysql mysqldump -uroot -p"${MYSQL_ROOT_PASSWORD}" \ --single-transaction \ --routines \ --triggers \ imeeting > "$backup_file" print_success "数据库已备份到: $backup_file" read -p "按任意键返回菜单..." -n 1 } # 恢复数据库 restore_database() { print_warning "警告: 这将覆盖当前数据库!" if [ ! -d "backups" ] || [ -z "$(ls -A backups/*.sql 2>/dev/null)" ]; then print_error "未找到备份文件" read -p "按任意键返回菜单..." -n 1 return fi echo "" echo "可用的备份文件:" ls -lh backups/*.sql echo "" read -p "请输入备份文件名: " backup_file if [ ! -f "$backup_file" ]; then print_error "文件不存在: $backup_file" read -p "按任意键返回菜单..." -n 1 return fi read -p "确认恢复? (yes/no): " confirm if [ "$confirm" = "yes" ]; then print_info "开始恢复数据库..." source .env 2>/dev/null || true MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD:-Unis@123} $COMPOSE_CMD exec -T mysql mysql -uroot -p"${MYSQL_ROOT_PASSWORD}" imeeting < "$backup_file" print_success "数据库已恢复" else print_info "操作已取消" fi read -p "按任意键返回菜单..." -n 1 } # 清理Redis缓存 clear_redis() { print_warning "这将清空所有Redis缓存" read -p "确认清空? (yes/no): " confirm if [ "$confirm" = "yes" ]; then source .env 2>/dev/null || true REDIS_PASSWORD=${REDIS_PASSWORD:-Unis@123} $COMPOSE_CMD exec redis redis-cli -a "${REDIS_PASSWORD}" FLUSHALL print_success "Redis缓存已清空" else print_info "操作已取消" fi read -p "按任意键返回菜单..." -n 1 } # 更新服务 update_services() { echo "选择更新方式:" echo "1) 更新所有服务" echo "2) 仅更新前端" echo "3) 仅更新后端" read -p "请选择: " update_choice case $update_choice in 1) print_info "更新所有服务..." $COMPOSE_CMD build $COMPOSE_CMD up -d ;; 2) print_info "更新前端..." $COMPOSE_CMD build frontend $COMPOSE_CMD up -d frontend ;; 3) print_info "更新后端..." $COMPOSE_CMD build backend $COMPOSE_CMD up -d backend ;; *) print_error "无效选择" ;; esac print_success "更新完成" read -p "按任意键返回菜单..." -n 1 } # 查看资源使用 view_resources() { print_info "容器资源使用情况:" docker stats --no-stream $(docker ps --format "{{.Names}}" | grep imeeting) echo "" read -p "按任意键返回菜单..." -n 1 } # 导出日志 export_logs() { print_info "导出日志..." mkdir -p logs_export timestamp=$(date +%Y%m%d_%H%M%S) $COMPOSE_CMD logs --no-color > "logs_export/all_services_${timestamp}.log" $COMPOSE_CMD logs --no-color nginx > "logs_export/nginx_${timestamp}.log" $COMPOSE_CMD logs --no-color frontend > "logs_export/frontend_${timestamp}.log" $COMPOSE_CMD logs --no-color backend > "logs_export/backend_${timestamp}.log" $COMPOSE_CMD logs --no-color mysql > "logs_export/mysql_${timestamp}.log" $COMPOSE_CMD logs --no-color redis > "logs_export/redis_${timestamp}.log" print_success "日志已导出到: logs_export/" read -p "按任意键返回菜单..." -n 1 } # 主循环 main() { while true; do clear show_menu case $choice in 1) view_status ;; 2) view_logs ;; 3) restart_services ;; 4) restart_single_service ;; 5) enter_container ;; 6) backup_database ;; 7) restore_database ;; 8) clear_redis ;; 9) update_services ;; 10) view_resources ;; 11) export_logs ;; 0) print_info "退出管理脚本"; exit 0 ;; *) print_error "无效选择"; sleep 1 ;; esac done } # 运行主程序 main