DeltaFStation 宝塔 Linux 部署教程
基于实际部署验证 · Alibaba Cloud Linux 3 + 宝塔面板 · 2026-08-15
目录
- 环境要求
- [安装 Python 3.12](#安装 Python 3.12)
- [编译安装 TA-Lib C 库](#编译安装 TA-Lib C 库)
- 克隆项目
- 创建虚拟环境并安装依赖
- [配置 Supervisor 守护](#配置 Supervisor 守护)
- [配置 Nginx 反向代理](#配置 Nginx 反向代理)
- 日常运维命令
- 常见问题排查
- 附录:关键路径速查
一、环境要求
| 项目 | 要求 |
|---|---|
| 操作系统 | Alibaba Cloud Linux 3 / CentOS 8 / Ubuntu 20.04+(需已装宝塔面板) |
| Python | 3.12(推荐,3.10 也可用,3.6 不行) |
| 宝塔面板 | 7.x+,需安装 Supervisor 管理器 |
| 内存 | 2GB+(TA-Lib 编译 + numpy/pandas 需要内存) |
| 磁盘 | 5GB+ 可用空间 |
关键踩坑点: 系统自带的 Python 3.6.8 太旧,
blinker>=1.6.2等依赖装不上。必须先装 Python 3.12。
关于宝塔 Python 管理器的坑: 宝塔「Python 项目管理器」从云端拉版本列表时可能报xml.etree ParseError,这是宝塔自身的 bug。遇到时改用命令行编译安装 Python 3.12。
二、安装 Python 3.12
方式 A:宝塔 Python 项目管理器(推荐,如果不出 bug)
- 宝塔 → 软件商店 → 搜索「Python 项目管理器」→ 安装
- 打开 Python 项目管理器 → 版本管理 → 选 3.12.0 → 安装
- 自定义参数留空,直接点「确定」
- 等待编译完成(约 10-20 分钟,取决于 CPU 核数)
安装完成后,Python 3.12 路径为:
bash
# 查看宝塔安装的版本目录
ls /www/server/python_manager/versions/
# 输出示例: 3.12.0
# 完整路径
/www/server/python_manager/versions/3.12.0/bin/python3.12
方式 B:命令行源码编译(宝塔出 bug 时用)
bash
# 安装编译依赖
dnf install -y gcc make openssl-devel bzip2-devel libffi-devel \
zlib-devel readline-devel sqlite-devel xz-devel tk-devel wget perl
# 下载并编译 Python 3.12.7(约 3-5 分钟)
cd /usr/local/src
wget https://www.python.org/ftp/python/3.12.7/Python-3.12.7.tgz
tar -xzf Python-3.12.7.tgz
cd Python-3.12.7
./configure --enable-optimizations --prefix=/usr/local
make -j$(nproc)
make altinstall
# 验证
/usr/local/bin/python3.12 --version
# 应输出: Python 3.12.7
验证 Python 安装: 无论哪种方式,执行
python3.12 --version能输出版本号即成功。如果提示 command not found,用find / -name "python3.12" -type f 2>/dev/null查找实际路径。
三、编译安装 TA-Lib C 库
最易踩坑的依赖:
pip install TA-Lib在 Linux 上 99% 会失败,因为缺 C 库。必须先编译安装 TA-Lib 的 C 库,再 pip 装 Python 绑定。
bash
# 检查是否已安装
ldconfig -p | grep libta_lib
# 如果没有,开始编译(约 1-2 分钟)
cd /usr/local/src
wget http://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-src.tar.gz
tar -xzf ta-lib-0.4.0-src.tar.gz
cd ta-lib
./configure --prefix=/usr
make -j$(nproc)
make install
ldconfig
# 验证
ldconfig -p | grep libta_lib
# 应输出: libta_lib.so.0 -> /usr/lib/libta_lib.so.0
已安装会跳过: 后续重跑部署时,如果
ldconfig -p | grep libta_lib有输出,说明 C 库已装好,可跳过这步。
四、克隆项目
bash
# 克隆到宝塔站点目录(优先 gitcode,国内快)
cd /www/wwwroot
git clone https://gitcode.com/weixin_48616345/deltafstation.git
# 如果 gitcode 失败,回退 GitHub
# git clone https://github.com/Delta-F/deltafstation.git
cd /www/wwwroot/deltafstation
# 创建数据与日志目录
mkdir -p data/raw data/processed data/results data/strategies data/simulations logs
五、创建虚拟环境并安装依赖
bash
# 设置 PYTHON_BIN 为你的 Python 3.12 路径
# 宝塔安装的:
PYTHON_BIN=/www/server/python_manager/versions/3.12.0/bin/python3.12
# 命令行编译的:
# PYTHON_BIN=/usr/local/bin/python3.12
# 创建虚拟环境
$PYTHON_BIN -m venv /www/wwwroot/deltafstation/venv
# 激活
source /www/wwwroot/deltafstation/venv/bin/activate
# 升级 pip
pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple
# 安装依赖(用清华源加速)
pip install -r /www/wwwroot/deltafstation/requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
安装成功后会显示类似:
Successfully installed Flask-3.1.3 TA-Lib-0.7.1 numpy-2.5.2 pandas-2.3.3 ... # 共 73 个包
验证项目能否启动
bash
cd /www/wwwroot/deltafstation
FLASK_ENV=production PORT=5000 HOST=127.0.0.1 python run.py
看到以下输出即成功(Ctrl+C 退出):
==================================================
DeltaFStation 量化交易系统 v1.3.0
==================================================
启动地址: http://127.0.0.1:5000
调试模式: 关闭
自动重载: 关闭
==================================================
* Running on http://127.0.0.1:5000
关于 miniQMT 报错: 启动时会出现
miniQMT connect failed: requires xtquant,这是正常的------你没有连 QMT 客户端,不影响数据/回测/模拟/AI 功能。
六、配置 Supervisor 守护
创建启动脚本
宝塔 Supervisor 的坑: 宝塔的 Supervisor 管理器界面没有环境变量输入框,需用包装脚本绕过。
bash
# 创建启动脚本,把环境变量写在脚本里
cat > /www/wwwroot/deltafstation/start_prod.sh << 'EOF'
#!/bin/bash
export FLASK_ENV=production
export PORT=5000
export HOST=0.0.0.0
export FLASK_USE_RELOADER=0
cd /www/wwwroot/deltafstation
exec /www/wwwroot/deltafstation/venv/bin/python run.py
EOF
chmod +x /www/wwwroot/deltafstation/start_prod.sh
| 变量 | 说明 | 值 |
|---|---|---|
| FLASK_ENV | 运行模式 | production(关闭 debug) |
| PORT | Flask 监听端口 | 5000 |
| HOST | 监听地址 | 0.0.0.0(对外)或 127.0.0.1(仅 Nginx 反代) |
| FLASK_USE_RELOADER | 热重载 | 0(生产关闭) |
HOST 怎么选: 如果配 Nginx 反向代理用
127.0.0.1(更安全);如果直连端口访问用0.0.0.0(需放行 5000 端口)。
在宝塔 Supervisor 管理器中添加
- 宝塔 → 软件商店 → 搜索「Supervisor 管理器」→ 安装
- 打开 Supervisor 管理器 → 添加守护进程
| 字段 | 填写内容 |
|---|---|
| 名称 | deltafstation(必须英文) |
| 启动用户 | root |
| 运行目录 | /www/wwwroot/deltafstation |
| 启动命令 | /www/wwwroot/deltafstation/start_prod.sh |
| 进程数量 | 1 |
| 备注 | DeltaFStation 量化系统 |
点击「确定」后,状态应显示为 RUNNING。
命令行方式(替代图形界面)
bash
# 写配置文件
mkdir -p /www/server/supervisor/conf.d
cat > /www/server/supervisor/conf.d/deltafstation.ini << 'EOF'
[program:deltafstation]
command=/www/wwwroot/deltafstation/start_prod.sh
directory=/www/wwwroot/deltafstation
user=root
autostart=true
autorestart=true
startsecs=5
stopwaitsecs=30
stopsignal=TERM
stdout_logfile=/www/wwwroot/deltafstation/logs/supervisor_out.log
stderr_logfile=/www/wwwroot/deltafstation/logs/supervisor_err.log
stdout_logfile_maxbytes=20MB
stdout_logfile_backups=5
redirect_stderr=false
EOF
# 重载并启动
/www/server/supervisor/bin/supervisorctl update
/www/server/supervisor/bin/supervisorctl status deltafstation
命令行坑: 宝塔的 Supervisor 不在系统 PATH 里,直接执行
supervisorctl会报command not found。必须用完整路径/www/server/supervisor/bin/supervisorctl。
七、配置 Nginx 反向代理
方式 A:宝塔反向代理(推荐,简单)
- 宝塔 → 网站 → 添加站点 → 顶部选「反向代理」
- 填写:
| 字段 | 填写内容 |
|---|---|
| 域名 | 你的域名或服务器 IP(如 101.200.180.38) |
| 目标 | 下拉选「URL地址」,填 http://127.0.0.1:5000 |
| 发送域名(host) | $http_host(默认) |
| 备注 | deltafstation |
创建后,必须补充 SSE 配置(否则日志流和 AI 对话流式响应会失效):
bash
# 找到反代配置文件
CONF=$(grep -rl "127.0.0.1:5000" /www/server/panel/vhost/nginx/ | head -1)
echo "配置文件: $CONF"
# 在 proxy_pass 后追加 SSE 指令
sed -i '/proxy_pass/a\ proxy_http_version 1.1;\n proxy_set_header Connection "";\n proxy_buffering off;\n proxy_cache off;\n proxy_request_buffering off;\n chunked_transfer_encoding on;\n proxy_read_timeout 86400s;\n proxy_send_timeout 86400s;\n proxy_set_header Upgrade $http_upgrade;' "$CONF"
# 测试并重载
nginx -t && nginx -s reload
方式 B:手动改站点配置文件
宝塔 → 网站 → 站点设置 → 配置文件 → 找到 location / 段,整段替换为:
nginx
location / {
proxy_pass http://127.0.0.1:5000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# SSE / 流式响应关键配置
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_buffering off;
proxy_cache off;
proxy_request_buffering off;
chunked_transfer_encoding on;
proxy_read_timeout 86400s;
proxy_send_timeout 86400s;
proxy_set_header Upgrade $http_upgrade;
}
方式 C:直连端口(不配 Nginx)
如果不配 Nginx,直接通过端口访问:
- 启动脚本里
HOST设为0.0.0.0 - 宝塔 → 安全 → 放行端口
5000 - 阿里云安全组 → 放行
5000TCP - 访问
http://服务器IP:5000
八、日常运维命令
启动 / 停止 / 重启
| 操作 | 命令行 | 宝塔界面 |
|---|---|---|
| 启动 | /www/server/supervisor/bin/supervisorctl start deltafstation |
Supervisor 管理器 → deltafstation → 启动 |
| 停止 | /www/server/supervisor/bin/supervisorctl stop deltafstation |
Supervisor 管理器 → deltafstation → 停止 |
| 重启 | /www/server/supervisor/bin/supervisorctl restart deltafstation |
Supervisor 管理器 → deltafstation → 重启 |
| 查看状态 | /www/server/supervisor/bin/supervisorctl status deltafstation |
Supervisor 管理器列表直接显示 |
日志查看
bash
# 实时查看标准输出日志
tail -f /www/wwwroot/deltafstation/logs/supervisor_out.log
# 实时查看错误日志
tail -f /www/wwwroot/deltafstation/logs/supervisor_err.log
# 查看最近 50 行日志
tail -50 /www/wwwroot/deltafstation/logs/supervisor_out.log
更新项目代码
bash
cd /www/wwwroot/deltafstation
# 拉取最新代码
git pull
# 如果 requirements.txt 有变化,更新依赖
source venv/bin/activate
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
# 重启服务生效
/www/server/supervisor/bin/supervisorctl restart deltafstation
临时调试(不经过 Supervisor)
bash
cd /www/wwwroot/deltafstation
source venv/bin/activate
# 前台运行,直接看输出
FLASK_ENV=development PORT=5000 HOST=0.0.0.0 python run.py
# Ctrl+C 退出
一键运维脚本
将以下内容保存为 ops.sh:
bash
#!/bin/bash
# DeltaFStation 运维脚本
# 用法: bash ops.sh {start|stop|restart|status|log|log-err|update}
APP_DIR="/www/wwwroot/deltafstation"
SUPERCTL="/www/server/supervisor/bin/supervisorctl"
case "$1" in
start)
echo "启动 DeltaFStation..."
$SUPERCTL start deltafstation
;;
stop)
echo "停止 DeltaFStation..."
$SUPERCTL stop deltafstation
;;
restart)
echo "重启 DeltaFStation..."
$SUPERCTL restart deltafstation
sleep 2
$SUPERCTL status deltafstation
;;
status)
echo "=== Supervisor 状态 ==="
$SUPERCTL status deltafstation
echo ""
echo "=== 进程信息 ==="
ps aux | grep run.py | grep -v grep
echo ""
echo "=== 端口监听 ==="
ss -tlnp | grep 5000
;;
log)
echo "实时输出日志(Ctrl+C 退出):"
tail -f $APP_DIR/logs/supervisor_out.log
;;
log-err)
echo "实时错误日志(Ctrl+C 退出):"
tail -f $APP_DIR/logs/supervisor_err.log
;;
update)
echo "更新 DeltaFStation..."
cd $APP_DIR
git pull
source venv/bin/activate
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
$SUPERCTL restart deltafstation
echo "更新完成"
;;
*)
echo "DeltaFStation 运维脚本"
echo ""
echo "用法: bash ops.sh <命令>"
echo ""
echo "命令列表:"
echo " start 启动服务"
echo " stop 停止服务"
echo " restart 重启服务"
echo " status 查看状态(进程+端口)"
echo " log 实时查看输出日志"
echo " log-err 实时查看错误日志"
echo " update 更新代码并重启"
;;
esac
用法:
bash
bash ops.sh start # 启动
bash ops.sh stop # 停止
bash ops.sh restart # 重启
bash ops.sh status # 查看状态(进程+端口)
bash ops.sh log # 实时看输出日志
bash ops.sh log-err # 实时看错误日志
bash ops.sh update # 更新代码并重启
九、常见问题排查
Q1: pip install 报 blinker 版本找不到
原因: Python 版本太低(3.6),blinker>=1.6.2 需要 Python 3.7+。
解决: 安装 Python 3.12 后重建虚拟环境。
Q2: pip install 报 TA-Lib 编译失败
原因: 缺 TA-Lib C 库。
解决: 先执行第三步编译安装 TA-Lib C 库,再 pip install。
Q3: 宝塔 Python 管理器报 XML 解析错误
原因: 宝塔从云端拉版本列表时返回的 XML 格式坏了,是宝塔自身 bug。
解决: 改用命令行源码编译 Python 3.12(见第二步方式 B)。
Q4: supervisorctl: command not found
原因: 宝塔的 Supervisor 不在系统 PATH 里。
解决: 用完整路径 /www/server/supervisor/bin/supervisorctl,或在宝塔 Supervisor 管理器界面操作。
Q5: 访问页面打不开 / 502 Bad Gateway
排查顺序:
bash
# 1. 检查 Flask 是否在运行
/www/server/supervisor/bin/supervisorctl status deltafstation
# 应显示 RUNNING
# 2. 检查端口是否监听
ss -tlnp | grep 5000
# 应看到 127.0.0.1:5000 或 0.0.0.0:5000
# 3. 检查 Nginx 配置
nginx -t
# 应显示 syntax is ok
# 4. 检查防火墙
# 宝塔安全 → 确认 80 端口已放行
# 阿里云安全组 → 确认 80 端口已放行
# 5. 查看错误日志
tail -50 /www/wwwroot/deltafstation/logs/supervisor_err.log
Q6: 页面能打开但日志流不刷新 / AI 对话不流式输出
原因: Nginx 默认缓冲响应,SSE 被截断。
解决: 确认 Nginx 配置里有 proxy_buffering off; 和 proxy_read_timeout 86400s;(见第七步)。
Q7: Supervisor 状态显示 FATAL
bash
# 查看错误日志
cat /www/wwwroot/deltafstation/logs/supervisor_err.log
# 手动运行排查
cd /www/wwwroot/deltafstation
source venv/bin/activate
bash start_prod.sh
# 看具体报错
Q8: miniQMT connect failed 报错
正常现象。 没有连接 QMT 客户端就会报这个,不影响数据服务、回测、模拟交易、AI Agent 等功能。如需实盘交易,参考项目 docs/qmt-strategy-live.md。
附录:关键路径速查
| 项目 | 路径 |
|---|---|
| 项目根目录 | /www/wwwroot/deltafstation |
| 虚拟环境 | /www/wwwroot/deltafstation/venv |
| 启动脚本 | /www/wwwroot/deltafstation/start_prod.sh |
| Supervisor 配置 | /www/server/supervisor/conf.d/deltafstation.ini |
| Supervisor 命令 | /www/server/supervisor/bin/supervisorctl |
| 输出日志 | /www/wwwroot/deltafstation/logs/supervisor_out.log |
| 错误日志 | /www/wwwroot/deltafstation/logs/supervisor_err.log |
| Nginx 配置 | /www/server/panel/vhost/nginx/ 下对应站点 |
| Python 3.12(宝塔) | /www/server/python_manager/versions/3.12.0/bin/python3.12 |
| Python 3.12(编译) | /usr/local/bin/python3.12 |
| TA-Lib C 库 | /usr/lib/libta_lib.so |
DeltaFStation 部署文档 · 基于 v1.3.0 实际部署验证 · 2026-08-15
DeltaFStation脚本一键化部署
bash
#!/bin/bash
# ===========================================================================
# DeltaFStation 宝塔 Linux 部署脚本
# 适用:CentOS 7+/Ubuntu 18.04+ 已安装宝塔面板
# 方式:Supervisor 守护 python run.py + Nginx 反向代理(含 SSE 配置)
# 用法:bash deploy_deltafstation.sh
# ===========================================================================
set -e
# ---------------------------- 可配置变量 ----------------------------
# 项目安装目录(宝塔默认站点根目录习惯放在 /www/wwwroot/)
INSTALL_DIR="/www/wwwroot/deltafstation"
# Python 解释器(优先宝塔 Python 管理器的 3.12;找不到则回退系统 python3)
PYTHON_BIN="${PYTHON_BIN:-}"
# 对外监听端口(Flask 内部端口,Nginx 反代到这里)
APP_PORT=5000
# Git 仓库(优先 gitcode 国内快;github 备选)
GIT_REPO="${GIT_REPO:-https://gitcode.com/weixin_48616345/deltafstation.git}"
# 运行用户(宝塔默认 www)
RUN_USER="www"
# ---------------------------- 颜色输出 ----------------------------
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; NC='\033[0m'
info() { echo -e "${GREEN}[INFO]${NC} $1"; }
warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
error() { echo -e "${RED}[ERROR]${NC} $1"; exit 1; }
# ---------------------------- 0. root 检查 ----------------------------
[[ $EUID -ne 0 ]] && error "请用 root 执行:sudo bash deploy_deltafstation.sh"
info "开始部署 DeltaFStation(宝塔 Linux)"
# ---------------------------- 1. 检测包管理器 ----------------------------
if command -v apt-get &>/dev/null; then
PKG_MGR="apt"; info "检测到 Debian/Ubuntu 系"
elif command -v yum &>/dev/null; then
PKG_MGR="yum"; info "检测到 CentOS/RHEL 系"
else
error "未识别的系统,仅支持 apt/yum"
fi
# ---------------------------- 2. 安装系统级依赖 ----------------------------
info "安装编译工具与 Python 开发库(TA-Lib 编译需要)"
if [[ "$PKG_MGR" == "apt" ]]; then
apt-get update -y
apt-get install -y build-essential python3-dev python3-venv python3-pip \
git wget curl libssl-dev libffi-dev
else
yum groupinstall -y "Development Tools"
yum install -y python3-devel python3-pip git wget curl openssl-devel libffi-devel
fi
# ---------------------------- 3. 选择 Python 解释器 ----------------------------
# 优先宝塔 Python 管理器安装的 3.12,其次系统 python3.12,最后系统 python3
if [[ -z "$PYTHON_BIN" ]]; then
for cand in /www/server/pyproject_evn/versions/3.12*/bin/python3.12 \
/usr/local/bin/python3.12 /usr/bin/python3.12; do
if [[ -x "$cand" ]]; then PYTHON_BIN="$cand"; break; fi
done
[[ -z "$PYTHON_BIN" ]] && PYTHON_BIN=$(command -v python3)
fi
PY_VER=$($PYTHON_BIN -c 'import sys;print("%d.%d"%sys.version_info[:2])')
info "使用 Python: $PYTHON_BIN (版本 $PY_VER)"
[[ "$PY_VER" < "3.10" ]] && warn "Python 版本偏低,项目推荐 3.12,建议在宝塔软件商店安装 Python 3.12 后重跑"
# ---------------------------- 4. 编译安装 TA-Lib C 库 ----------------------------
# 这是最容易踩坑的依赖,必须先装 C 库再 pip install TA-Lib
if ! ldconfig -p | grep -q "libta_lib"; then
info "未检测到 TA-Lib C 库,开始源码编译(约 1-2 分钟)"
cd /usr/local/src
[[ -f ta-lib-0.4.0-src.tar.gz ]] || wget -q http://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-src.tar.gz
[[ -d ta-lib ]] || tar -xzf ta-lib-0.4.0-src.tar.gz
cd ta-lib
./configure --prefix=/usr
make -j$(nproc) && make install
ldconfig
info "TA-Lib C 库安装完成"
else
info "TA-Lib C 库已存在,跳过编译"
fi
# ---------------------------- 5. 克隆项目 ----------------------------
if [[ ! -d "$INSTALL_DIR/.git" ]]; then
info "克隆项目到 $INSTALL_DIR"
mkdir -p "$(dirname $INSTALL_DIR)"
[[ -d "$INSTALL_DIR" ]] && rm -rf "$INSTALL_DIR"
git clone "$GIT_REPO" "$INSTALL_DIR" || {
warn "gitcode 克隆失败,回退 GitHub"
git clone https://github.com/Delta-F/deltafstation.git "$INSTALL_DIR"
}
else
info "项目目录已存在,执行 git pull 更新"
cd "$INSTALL_DIR" && git pull --rebase || warn "git pull 失败,继续使用现有代码"
fi
cd "$INSTALL_DIR"
# ---------------------------- 6. 创建虚拟环境 ----------------------------
VENV_DIR="$INSTALL_DIR/venv"
info "创建虚拟环境: $VENV_DIR"
$PYTHON_BIN -m venv "$VENV_DIR"
VENV_PY="$VENV_DIR/bin/python"
$VENV_PY -m pip install --upgrade pip -q
# ---------------------------- 7. 安装 Python 依赖 ----------------------------
info "安装 Python 依赖(TA-Lib 此处为 wheel 绑定,已装好 C 库)"
$VENV_PY -m pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
# ---------------------------- 8. 创建数据目录 ----------------------------
info "创建数据与日志目录"
mkdir -p data/raw data/processed data/results data/strategies data/simulations logs
# 目录归属给 www 用户,避免宝塔 Nginx/Supervisor 权限问题
chown -R $RUN_USER:$RUN_USER "$INSTALL_DIR" 2>/dev/null || warn "chown 失败(可忽略,若用 root 运行)"
# ---------------------------- 9. 生成 Supervisor 配置 ----------------------------
info "生成 Supervisor 配置"
SUPERVISOR_CONF_DIR="/www/server/supervisor/conf.d"
mkdir -p "$SUPERVISOR_CONF_DIR" 2>/dev/null || true
cat > "$SUPERVISOR_CONF_DIR/deltafstation.ini" <<EOF
[program:deltafstation]
command=$VENV_PY $INSTALL_DIR/run.py
directory=$INSTALL_DIR
user=$RUN_USER
autostart=true
autorestart=true
startsecs=5
stopwaitsecs=30
stopsignal=TERM
; 环境变量:生产模式关闭 debug,固定端口
environment=FLASK_ENV="production",PORT="$APP_PORT",HOST="127.0.0.1",FLASK_USE_RELOADER="0"
stdout_logfile=$INSTALL_DIR/logs/supervisor_out.log
stderr_logfile=$INSTALL_DIR/logs/supervisor_err.log
stdout_logfile_maxbytes=20MB
stdout_logfile_backups=5
redirect_stderr=false
EOF
info "Supervisor 配置已写入: $SUPERVISOR_CONF_DIR/deltafstation.ini"
# ---------------------------- 10. 生成 Nginx 反代配置片段 ----------------------------
# SSE 关键:关闭缓冲、长超时、HTTP/1.1
NGINX_SNIPPET="$INSTALL_DIR/logs/nginx_deltafstation.conf"
cat > "$NGINX_SNIPPET" <<'EOF'
# ===== DeltaFStation Nginx 反向代理配置(含 SSE 支持)=====
# 在宝塔「网站 → 你的站点 → 配置文件」中,把 server{} 里的 location / 替换为以下内容
# 或在宝塔「网站 → 反向代理」中新增后,手动补充 SSE 相关指令
location / {
proxy_pass http://127.0.0.1:5000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# ===== SSE / 流式响应关键配置 =====
proxy_http_version 1.1;
proxy_set_header Connection ""; # 启用长连接
proxy_buffering off; # 关闭响应缓冲,SSE 必需
proxy_cache off; # 关闭缓存
proxy_request_buffering off;
chunked_transfer_encoding on;
# SSE/长连接超时(默认 60s 会断流,调大到 1 天)
proxy_read_timeout 86400s;
proxy_send_timeout 86400s;
# WebSocket 支持(如未来需要)
proxy_set_header Upgrade $http_upgrade;
}
EOF
info "Nginx 配置片段已生成: $NGINX_SNIPPET(稍后按提示配置到宝塔站点)"
# ---------------------------- 11. 完成,输出后续操作指引 ----------------------------
echo ""
echo -e "${GREEN}==========================================================${NC}"
echo -e "${GREEN} DeltaFStation 部署脚本执行完成${NC}"
echo -e "${GREEN}==========================================================${NC}"
echo ""
echo "项目目录: $INSTALL_DIR"
echo "虚拟环境 Python: $VENV_PY"
echo "Flask 监听: 127.0.0.1:$APP_PORT(仅本机,由 Nginx 对外)"
echo ""
echo -e "${YELLOW}【后续手动操作】${NC}"
echo ""
echo "1) 在宝塔软件商店安装「Supervisor管理器」(如未安装),然后:"
echo " - 进入 Supervisor 管理器 → 配置 → 重载配置"
echo " - 或命令行: supervisorctl update && supervisorctl restart deltafstation"
echo " - 查看状态: supervisorctl status deltafstation"
echo " - 查看日志: tail -f $INSTALL_DIR/logs/supervisor_out.log"
echo ""
echo "2) 在宝塔「网站」添加站点(纯静态即可,仅用其域名 + Nginx),然后:"
echo " - 打开站点「设置 → 配置文件」"
echo " - 参考 $NGINX_SNIPPET 的内容替换 location / 段(注意 SSE 指令必须保留)"
echo " - 保存后重载 Nginx: nginx -s reload"
echo ""
echo "3) 放行端口/绑定域名后,浏览器访问 http://你的域名 即可"
echo ""
echo "4) AI Agent / LLM 配置:"
echo " - 首次启动后,在 Web 界面的 AI 设置里配置 OpenAI 兼容 API Key"
echo " - 或编辑 config/config.py 里的 LLM_* 配置项"
echo ""
echo "5) 实盘 miniQMT(可选):"
echo " - 需在一台 Windows 机器上运行 miniQMT 客户端"
echo " - 详细见项目 docs/qmt-strategy-live.md"
echo ""