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