File size: 2,884 Bytes
d3c0495
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
bc3d895
d3c0495
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#!/bin/bash

# 部署脚本 - 在生产服务器上部署应用
# 使用方法: ./deploy.sh [port]

# 设置错误时退出
set -e

# 定义日志函数
log_info() {
    echo "$(date +"%Y-%m-%d %H:%M:%S") [INFO] $1"
}

log_warn() {
    echo "$(date +"%Y-%m-%d %H:%M:%S") [WARN] $1"
}

log_error() {
    echo "$(date +"%Y-%m-%d %H:%M:%S") [ERROR] $1"
}

# 获取脚本所在目录的绝对路径
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
cd "$SCRIPT_DIR"

# 获取上一层目录的路径
PARENT_DIR=$(dirname "$SCRIPT_DIR")

# 复制配置文件
if [ -f "$PARENT_DIR/config.ini" ]; then
    log_info "Found config.ini in parent directory, copying to project directory..."
    cp "$PARENT_DIR/config.ini" "$SCRIPT_DIR/config.ini"
else
    log_warn "No config.ini found in parent directory: $PARENT_DIR/config.ini"
    if [ -f "$SCRIPT_DIR/config.template.ini" ]; then
        cp "$SCRIPT_DIR/config.template.ini" "$SCRIPT_DIR/config.ini"
        log_warn "Created config.ini from template. Please update it with your settings."
        exit 1
    else
        log_error "Neither config.ini nor config.template.ini found!"
        exit 1
    fi
fi

# 默认端口
PORT=${1:-8000}
HOST=${2:-0.0.0.0}

# 确保日志目录存在
mkdir -p logs

# 显示版本信息
echo "===== 部署数据分析 API 服务 ====="
python --version
echo "当前目录: $(pwd)"

# 如果存在虚拟环境,则激活
if [ -d ".venv" ]; then
    echo "激活虚拟环境..."
    source .venv/bin/activate
fi
# 不存在的话创建一个
if [ ! -d ".venv" ]; then
    echo "创建虚拟环境..."
    python -m venv .venv
    source .venv/bin/activate
fi

# 拉取最新代码
echo "拉取最新代码..."
#git pull

# 安装/更新依赖
echo "安装/更新依赖..."
pip install -r requirements.txt

# 检查是否有旧的进程在运行
if [ -f "logs/server.pid" ]; then
    OLD_PID=$(cat logs/server.pid)
    if ps -p $OLD_PID > /dev/null; then
        echo "停止旧进程 (PID: $OLD_PID)..."
        kill $OLD_PID || true
        sleep 2
    fi
fi

# 获取当前日期和时间
DATE=$(date +"%Y-%m-%d_%H-%M-%S")

# 设置环境变量
export APP_ENV="production"
export PORT="$PORT"
export HOST="$HOST"

echo "以生产模式启动服务,主机: $HOST,端口: $PORT..."
# 启动服务
python start_server.py --env production --port $PORT --host $HOST > "logs/deploy_${DATE}.log"

# 保存进程 ID
PID=$!
echo $PID > logs/server.pid
echo "服务已启动,PID: $PID"
echo "日志保存在 logs 目录下"

# 等待服务启动
echo "等待服务启动..."
sleep 3

# 检查服务是否正常运行
if ps -p $PID > /dev/null; then
    echo "服务启动成功!"
    echo "API 可访问于: http://$HOST:$PORT"
    echo "API 文档可访问于: http://$HOST:$PORT/docs"
else
    echo "服务启动失败,请检查日志"
    exit 1
fi

echo "部署完成!"