imetting/manage.sh

304 lines
7.5 KiB
Bash
Executable File

#!/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