#!/bin/bash # # DataOps Platform 启动问题快速修复脚本 # set -e # 配置变量 APP_NAME="dataops-platform" APP_DIR="/opt/dataops-platform" VENV_DIR="${APP_DIR}/venv" LOG_DIR="${APP_DIR}/logs" # 颜色输出 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' echo_info() { echo -e "${GREEN}[INFO]${NC} $1" } echo_warn() { echo -e "${YELLOW}[WARN]${NC} $1" } echo_error() { echo -e "${RED}[ERROR]${NC} $1" } echo "==========================================" echo " DataOps Platform 快速修复" echo "==========================================" # 1. 创建日志目录 echo_info "1. 检查并创建日志目录..." if [ ! -d "${LOG_DIR}" ]; then sudo mkdir -p "${LOG_DIR}" sudo chown ubuntu:ubuntu "${LOG_DIR}" echo_info "✓ 日志目录已创建: ${LOG_DIR}" else echo_info "✓ 日志目录已存在" fi # 2. 安装 tzdata(时区数据) echo_info "2. 检查并安装时区数据..." if ! dpkg -l | grep -q tzdata; then echo_info "正在安装 tzdata..." sudo DEBIAN_FRONTEND=noninteractive apt-get update sudo DEBIAN_FRONTEND=noninteractive apt-get install -y tzdata echo_info "✓ tzdata 已安装" else echo_info "✓ tzdata 已安装" fi # 3. 检查 Python 版本 echo_info "3. 检查 Python 版本..." if [ -f "${VENV_DIR}/bin/python" ]; then PYTHON_VERSION=$(${VENV_DIR}/bin/python --version 2>&1 | awk '{print $2}') echo_info "Python 版本: ${PYTHON_VERSION}" # 检查是否为 Python 3.9+ MAJOR=$(echo ${PYTHON_VERSION} | cut -d. -f1) MINOR=$(echo ${PYTHON_VERSION} | cut -d. -f2) if [ "${MAJOR}" -eq 3 ] && [ "${MINOR}" -ge 9 ]; then echo_info "✓ Python 版本支持 zoneinfo" else echo_warn "Python 版本 < 3.9,zoneinfo 可能不可用" echo_info "建议使用 Python 3.9 或更高版本" fi else echo_error "✗ Python 虚拟环境不存在" exit 1 fi # 4. 测试时区模块 echo_info "4. 测试时区模块..." cd "${APP_DIR}" ${VENV_DIR}/bin/python -c " try: from zoneinfo import ZoneInfo except ImportError: from backports.zoneinfo import ZoneInfo from datetime import datetime tz = ZoneInfo('Asia/Shanghai') now = datetime.now(tz) print(f'✓ 时区模块正常,当前东八区时间: {now}') " 2>&1 || { echo_error "✗ 时区模块测试失败" echo_info "尝试安装 backports.zoneinfo..." ${VENV_DIR}/bin/pip install backports.zoneinfo echo_info "重新测试..." ${VENV_DIR}/bin/python -c " try: from zoneinfo import ZoneInfo except ImportError: from backports.zoneinfo import ZoneInfo from datetime import datetime tz = ZoneInfo('Asia/Shanghai') now = datetime.now(tz) print(f'✓ 时区模块正常,当前东八区时间: {now}') " 2>&1 } # 5. 测试应用导入 echo_info "5. 测试应用导入..." ${VENV_DIR}/bin/python -c " import sys sys.path.insert(0, '${APP_DIR}') from app import create_app app = create_app() print('✓ 应用导入成功') " 2>&1 || { echo_error "✗ 应用导入失败,查看详细错误:" ${VENV_DIR}/bin/python -c " import sys sys.path.insert(0, '${APP_DIR}') try: from app import create_app app = create_app() except Exception as e: import traceback traceback.print_exc() " 2>&1 exit 1 } # 6. 修复文件权限 echo_info "6. 修复文件权限..." sudo chown -R ubuntu:ubuntu "${APP_DIR}" sudo chmod -R 755 "${APP_DIR}/scripts" echo_info "✓ 文件权限已修复" # 7. 重新加载 supervisor 配置 echo_info "7. 重新加载 Supervisor 配置..." sudo supervisorctl reread sudo supervisorctl update echo_info "✓ Supervisor 配置已重新加载" # 8. 停止并清理旧进程 echo_info "8. 清理旧进程..." sudo supervisorctl stop ${APP_NAME} 2>/dev/null || true sleep 2 # 检查是否有残留进程 if pgrep -f "gunicorn.*dataops" > /dev/null; then echo_warn "发现残留的 gunicorn 进程,正在清理..." sudo pkill -f "gunicorn.*dataops" || true sleep 2 fi # 9. 启动应用 echo_info "9. 启动应用..." sudo supervisorctl start ${APP_NAME} sleep 3 # 10. 检查状态 echo_info "10. 检查应用状态..." status=$(sudo supervisorctl status ${APP_NAME} | awk '{print $2}') if [ "$status" = "RUNNING" ]; then echo_info "✓ ${APP_NAME} 启动成功!" sudo supervisorctl status ${APP_NAME} else echo_error "✗ ${APP_NAME} 启动失败!" echo_info "查看错误日志:" echo "" if [ -f "/var/log/supervisor/${APP_NAME}-stderr.log" ]; then echo "=== Supervisor stderr 日志 ===" sudo tail -30 "/var/log/supervisor/${APP_NAME}-stderr.log" fi if [ -f "${LOG_DIR}/gunicorn_error.log" ]; then echo "" echo "=== Gunicorn 错误日志 ===" tail -30 "${LOG_DIR}/gunicorn_error.log" fi exit 1 fi # 11. 健康检查 echo_info "11. 进行健康检查..." sleep 3 response=$(curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1:5500/api/system/health 2>/dev/null || echo "000") if [ "$response" = "200" ]; then echo_info "✓ 健康检查通过! HTTP 状态码: ${response}" else echo_warn "健康检查返回: ${response}" echo_info "服务可能需要更多时间启动" fi echo "" echo "==========================================" echo_info "修复完成!" echo "==========================================" echo_info "访问地址: http://localhost:5500" echo_info "查看日志: sudo tail -f /var/log/supervisor/${APP_NAME}-stderr.log"