304 lines
7.5 KiB
Bash
Executable File
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
|