风险提示:虚拟货币不具有法定货币等同的法律地位,参与虚拟货币投资交易存在法律风险,继续浏览代表你同意以上所有声明,否则请立即关闭本站!

Bybit Live MVP 部署说明(PM2 维护进程)

文档版本:2026-04-27 与当前仓库一致(策略机默认 SQLite、可选 PostgreSQL 共库;策略机 HTTP 端口 18999;多机用 MVP_ENGINES_FILEengines.jsonMVP_ENGINES_JSONCONTROL_API_TOKEN 非空时 /api/engine/*/api/dashboard/* 均需 Bearer;策略机 MVP_ENV_FILE + instances/*.env 或单机 bybit/engine/.env;中控默认 9000、Docker 中控 5000;§2.7、§8.5、§8.12~8.14 为常见踩坑)。

本文说明在 Linux 服务器(推荐 Ubuntu 22.04 LTS)上使用 PM2 部署 策略机(FastAPI)中控(Flask) 的流程;数据库以 默认 SQLite 为最简单路径,需要多策略机 共库 时再安装 PostgreSQL(见 §2.0)。

重要:策略机进程内通过 守护线程 启动实盘决策循环(main.py_engine_loop)。必须使用单 worker 的 Uvicorn--workers 1),否则多进程会重复跑循环,导致重复请求交易所等异常行为。

零、术语速查(与《架构说明》一致)

术语指什么本仓库路径PM2 示例应用名(下文)
策略机跑实盘引擎的进程:FastAPI + 单 worker Uvicorn + 内置 _engine_loopbybit/engine/bybit-engine(见 ecosystem.config.cjs
中控只负责 Web 面板与 HTTP 调策略机,不下单bybit/control/bybit-mvp-control

最小可运行组合:一台机器上 策略机 + 中控;策略机不写 DB_URL 时即 SQLitedata/mvp.db)。PostgreSQL 仅在 共库 / Docker 模板 时需要。
分机部署(例如 3 台策略机 + 1 台中控):每台策略机独立部署 bybit/engine,中控只部署 bybit/control;中控 engines.jsonMVP_ENGINES_FILE)里每条 base_urlhttp://<该策略机可达 IP>:18999,与该机 MACHINE_ID / CONTROL_API_TOKENtoken)一致;策略机 18999 建议仅对中控出口 IP 放行。各机可用 各自 SQLite,不必共 PG。
单机多策略机(同机多进程):多个 Uvicorn(不同端口);共库时用 同一 DB_URL(PostgreSQL) + 不同 MACHINE_ID + 不同子账户 Key;或每进程 独立 SQLite 文件路径(勿多进程写同一 .db)。中控用 MVP_ENGINES_FILEMVP_ENGINES_JSON 列出各 base_url。详见 §2.0§2.6§4.2~4.3bybit/control/.env.example
不要在多进程或多机上对 同一 Bybit 账户 各起一套引擎。

逻辑关系、拓扑图与检查清单见 架构说明.md 第一章。


一、架构与端口(PM2 场景)

组件角色说明端口约定
业务库(默认 SQLite / 可选 PG)数据层默认 bybit/engine/data/mvp.db;多机共库时用 PostgreSQL,machine_id 区分实例SQLite 无端口;PG 常见 5432
Backend(Uvicorn)策略机一份 engine 副本 一个进程:FastAPI + 内置引擎循环;--workers 1单副本默认 18999;多副本各改端口并在中控 JSON 中列出
Control(Flask)中控统一操作面板,按 MVP_ENGINES_FILEMVP_ENGINES_JSON 轮询各策略机config_control 默认 9000infra/docker-compose.yml 内为 5000

中控连接策略机的方式(优先级MVP_ENGINES_FILE > MVP_ENGINES_JSON > 单项 MVP_ENGINE_*;不要多套同时生效导致困惑):

  1. MVP_ENGINES_FILE(推荐):指向 JSON 文件路径(如 engines.json,见 bybit/control/engines.json.example),内容为策略机数组,字段同下;PM2 的 ecosystem.config.cjs 只写路径,不把长 JSON 塞进启动配置。
  2. MVP_ENGINES_JSON(可选):环境变量内联 JSON 数组,每项至少 base_urlmachine_idname,可选 tokenip
  3. 单项:不设以上两者、且 MVP_ENGINE_ENABLED=true 时,使用 MVP_ENGINE_BASE_URL + MVP_ENGINE_MACHINE_ID 等(等价于只有一台)。

二、环境准备(先策略机,后中控)

以下顺序对应 先让策略机可连库、可连交易所,再配置中控指向该策略机。

2.0 数据库选型(推荐先读)

场景建议DB_URL
单机单进程、或 多台云主机各一套引擎各管各数据SQLite(默认)不写或 sqlite:///./data/mvp.db
多台策略机写入同一 PostgreSQL、或 Docker Compose 栈PostgreSQLpostgresql+psycopg2://…
  • SQLite:让多个 Uvicorn 进程 同时写同一个 .db 文件。
  • 使用 PostgreSQL 时继续 §2.2~2.3;仅用 SQLite 时可 跳过 §2.2~2.3,建表仍执行 python scripts/init_db.py(在 bybit/engine 下)。

2.1 系统依赖

  • Python 3.11+(与项目一致即可,推荐 3.12)
  • Node.js 18+(仅用于安装 PM2:npm i -g pm2
  • Git
  • (仅在使用 PostgreSQL 时) PostgreSQL 14+(推荐 16)

2.2 安装 PostgreSQL 服务(apt)与开机自启

若策略机使用默认 SQLite,本节可跳过。

策略机所在机器(或与策略机同机、本机监听 127.0.0.1:5432 的数据库机)上安装服务端(不是只装客户端):

apt update
apt install -y postgresql postgresql-contrib
systemctl enable postgresql
systemctl start postgresql
systemctl status postgresql
  • systemctl enable postgresql:把 PostgreSQL 注册为 systemd 开机自启。Ubuntu 用 apt install postgresql 后多数已默认 enable,仍建议显式执行一次,避免个别镜像未打开自启。
  • systemctl is-enabled postgresql 输出 enabled 即表示已随开机拉起。
  • 若使用本仓库 Docker 里的 postgres 容器:由 Docker 守护进程管理;宿主机 开机自启数据库 需保证 docker 服务已 systemctl enable docker,且 Compose 中服务使用 restart: unless-stopped(本仓库 infra/docker-compose.yml 已配置)。

确认监听:

ss -lntp | grep 5432

2.3 创建数据库与用户

以下 SQL 必须在 psql 里执行,不能贴在 root@...# 的 shell 里直接回车(否则会报 CREATE: command not found)。

进入 psql(Ubuntu 常见)

cd /tmp
sudo -u postgres psql

若提示 could not change directory to "/root": Permission denied,可忽略;用 cd /tmp 再进 psql 可避免该提示。

postgres=# 提示符下(注意:若是 postgres'# 表示上一句字符串未闭合,先按 Ctrl+C 清掉或 Ctrl+D 退出后重进),执行:

CREATE USER bybit_mvp WITH PASSWORD '你的强密码';
CREATE DATABASE bybit_live_mvp OWNER bybit_mvp;
\q
  • 密码必须用 成对的英文单引号 包住:'密码内容';漏写结尾 ' 会导致提示符变成 postgres'# 且后续命令无效。
  • 密码里含 @:在 SQL 中写 'woaini88@' 即可;写入 DB_URLbybit/engine/.env 或各进程的 MVP_ENV_FILE 指向的文件)时,密码段里的 @ 必须写成 URL 编码 %40,否则会被解析成「用户名/密码」与「主机名」之间的分隔符而连错库。可复制下面整行(示例:用户 bybit_mvp、密码 woaini88@、库 bybit_live_mvp、主机 127.0.0.1):
DB_URL=postgresql+psycopg2://bybit_mvp:woaini88%40@127.0.0.1:5432/bybit_live_mvp

2.4 拉取代码与虚拟环境

cd /opt   # 或你的部署目录
git clone <你的仓库地址> bybit-live-mvp
cd bybit-live-mvp

# 策略机、中控各自独立虚拟环境(推荐,互不混用)
cd bybit/engine && python3 -m venv .venv && source .venv/bin/activate && pip install -r requirements.txt && deactivate
cd ../control && python3 -m venv .venv && source .venv/bin/activate && pip install -r requirements.txt && deactivate
cd ../..

单机多策略机(推荐)整目录复制 bybit/engine 为多份(如 engine-aengine-b),每份只改 ecosystem.config.cjs 里的 name/args 端口.env(或 instances/*.env + MVP_ENV_FILE)。不要在同一目录里用一份 ecosystem 起三个进程,以免 env 与端口混用。

若坚持用 单目录 + 多 env 文件,可在 bybit/engine/instances/ 下准备各 *.env,并在 多个 PM2 进程 中分别设置不同的 MVP_ENV_FILE(此时需自行 pm2 start 多次或自写多 app 配置,仓库默认 只带单 app 示例)。

2.5 策略机(bybit/engine)环境变量

策略机由 app.core.settings 只从一个磁盘文件读取键值(UTF-8,支持 BOM),规则如下:

  1. 若进程环境变量 MVP_ENV_FILE 非空且指向 存在的文件只读该文件(路径为绝对路径,或相对 策略机程序根目录 bybit/engine/)。
  2. 否则 → 只读 bybit/engine/.env(Docker Compose、本机单进程等默认走此路径)。

同一键名不会跨多文件合并,批量部署时每个实例维护 一份完整 env 即可;PM2 / systemd 为各进程设置不同的 MVP_ENV_FILE(策略机 PM2 见 bybit/engine/ecosystem.config.cjs,中控 PM2 见 bybit/control/ecosystem.config.cjs,分开启动)与 MACHINE_ID

cp bybit/engine/.env.example bybit/engine/.env
  • 单机、不设 MVP_ENV_FILE:编辑 bybit/engine/.env,至少包含 MACHINE_IDBYBIT_API_KEY / BYBIT_API_SECRET 及策略与风控项(见 .env.example)。DB_URL:留空则用默认 SQLite;用 PostgreSQL 时写入连接串。
  • 多进程(PM2):按 §2.4 生成 instances/mvp-1.env 等;文件中写全 MACHINE_ID、密钥等;DB_URL 共库时各实例相同(PG),分库时各用 SQLite 路径或不同库名;进程 MVP_ENV_FILE 指向对应文件。

DB_URL 示例(PostgreSQL):postgresql+psycopg2://bybit_mvp:你的密码@127.0.0.1:5432/bybit_live_mvp密码中含 @须写成 %40(规则与 §2.3 一致)。若从 .env.example 复制了主机名 postgres,仅适用于 Docker 内;在 宿主机init_db / uvicorn 时请改为 127.0.0.1 或实际数据库 IP。

MACHINE_ID:多策略机共库时 每台进程不同(如 mvp-1),与中控 MVP_ENGINES_JSON 里的 machine_id 一致;单实例可保留默认 mvp-live

生产建议:设置 CONTROL_API_TOKEN(非空则保护 /api/engine/*/api/engine/state/api/dashboard/*,均需 Authorization: Bearer <token>);写在 bybit/engine/.env 或该进程 MVP_ENV_FILE 指向的文件中。中控在 engines.json 各条 token 或单项 MVP_ENGINE_TOKEN 中与之一致。未设置 token 时上述接口 不校验 Bearer(仅适合本机调试)。
可选通知WECHAT_WEBHOOK_URL / WECHAT_NOTIFY_ENABLE(企业微信群机器人,见 bybit/engine/.env.example)。

策略机建表(仅在该机器执行即可)

bybit/engine 目录下执行(脚本会把本目录加入 sys.path,无需再设 PYTHONPATH):

cd bybit/engine
source .venv/bin/activate
python scripts/init_db.py

已有旧库升级到「多机共库」:若使用 PostgreSQL,在 bybit/engine 目录执行一次 python scripts/migrate_add_machine_id.py,再为各进程配置不同 MACHINE_ID 与 Bybit Key。纯 SQLite 单机升级以脚本提示为准。

2.6 中控(bybit/control)环境变量

中控读取 bybit/control/config_control.py进程环境变量。在 PM2 或 shell 中建议显式设置:

变量含义
MVP_ENGINES_FILE推荐:指向中控目录下 JSON 文件(如 engines.json),数组每项含 base_url(如 http://10.0.1.11:18999)、machine_id、可选 name / token / ip;与 §4.3 分机部署配合
MVP_ENGINES_JSON与上表等价,但 JSON 写在环境变量里(长字符串易转义出错;仅作备选)
MVP_ENGINE_BASE_URL未配置 MVP_ENGINES_FILE / MVP_ENGINES_JSONMVP_ENGINE_ENABLED=true 时的 单台 策略机地址(默认 http://127.0.0.1:18999
MVP_ENGINE_TOKEN与策略机 CONTROL_API_TOKEN 一致(多机时 优先 写在 engines.json 各条 token
CONTROL_HOST默认 0.0.0.0
CONTROL_PORT默认 9000(Docker Compose 内会设为 5000
CONTROL_ADMIN_USERNAME / CONTROL_ADMIN_PASSWORD_HASH / CONTROL_SECRET_KEY生产务必修改(勿使用仓库默认值)

每台 MVP 卡片上的 Ollama 状态 来自 该台策略机GET /api/health / GET /api/engine/state(策略机进程按本机 OLLAMA_BASE_URL 探测);与中控是否安装 Ollama 无关。可选 LOCAL_OLLAMA_* 为旧版本地面板能力,见 config_control.py

2.7 MVP_ENV_FILEbybit/engine/.env 与 PM2 里 env 的区别(易混点)

位置是什么典型内容
MVP_ENV_FILE 指向的文件(如 instances/mvp-1.env多实例时 该进程唯一 的磁盘配置一份文件内写全 DB_URLMACHINE_IDBYBIT_*SOCKS_PROXY_URLOLLAMA_*
bybit/engine/.env未设置 MVP_ENV_FILE 或文件不存在时的 默认 磁盘配置单机 / Docker;多进程时 让多个 uvicorn 共用同一套 BYBIT_*
PM2 ecosystem.config.cjs 里每个 app 的 env: { }仅该进程 的环境变量至少 MACHINE_ID;多实例时设置 MVP_ENV_FILE 指向对应 instances/*.env;也可用 env 块覆盖文件中的同名项
中控一般 没有 单独的 bybit/control/.env 自动加载MVP_ENGINES_FILECONTROL_PORTMVP_ENGINES_JSON 等写在 PM2 中控 app 的 env,或 shell export 后再 pm2 start

结论:三台子账户的 Key 不要 都塞进同一份 bybit/engine/.env 又让三个进程去读;推荐 每进程 MVP_ENV_FILE + instances/<id>.env(模板 instances/instance.env.example,真实 instances/*.env 已加入 .gitignore)。进程环境变量优先级仍高于文件中的同名键。


三、安装 PM2

npm install -g pm2
pm2 startup systemd -u $USER --hp $HOME   # 按提示执行 sudo 命令,实现开机自启

四、PM2 进程配置示例

策略机与中控 分目录、分 PM2 配置、分虚拟环境,仓库内已提供:

  • bybit/engine/ecosystem.config.cjs仅 1 个 Uvicorn(默认 18999),cwdbybit/engine,使用 bybit/engine/.venv;配置默认读 本目录 .env(见 §2.5)。多实例请 复制整份 engine 目录 或自行增加 PM2 进程。
  • bybit/control/ecosystem.config.cjs:中控(9000),cwdbybit/control,使用 bybit/control/.venv

启动方式:script 指向 .venv/bin/python3args"-m uvicorn app.main:app …"(勿把 bin/uvicorn 单独填在 script 且不设解释器,否则 PM2 会按 Node 执行并报 SyntaxError: Invalid or unexpected token)。启动中控前可 export MVP_ENGINE_TOKEN=... 与策略机 CONTROL_API_TOKEN 对齐。勿将含真密钥的文件推送到公开仓库

Pydantic Settings 只读一个 env 文件(MVP_ENV_FILEbybit/engine/.env),且 进程环境变量覆盖 文件中同名项。

4.1 单策略机 + 中控(最简)

单进程可 只维护 bybit/engine/.env,且 不要 设置 MVP_ENV_FILE。多进程见 §2.5。分别在 bybit/enginebybit/controlmkdir -p logs 后执行 pm2 start ecosystem.config.cjs(各进各自目录执行一次)。

4.2 多台策略机 + 中控(同机或多进程)+ 共库(可选 PG)

  • :多进程 共库同一 DB_URL(PostgreSQL);表内用 machine_id 区分。若各进程 独立 SQLite,则 DB_URL 指向不同文件路径,无需 PostgreSQL。
  • 策略机:每台 一份 engine 目录副本(或等价部署),MACHINE_ID / Bybit Key / 监听端口 各不相同;ecosystem.config.cjs--port 与中控 JSON 中 base_url 一致(仓库默认 18999)。
  • 中控CONTROL_PORT=9000MVP_ENGINES_FILE=engines.json(或 MVP_ENGINES_JSON)中 base_url 指向各副本(同机示例:http://127.0.0.1:18999http://127.0.0.1:19000…)。

策略机 推荐固定 使用:script 指向 .venv/bin/python3args"-m uvicorn app.main:app …"(与各目录下 ecosystem.config.cjs 一致)。若日志出现 wrapSafe / SyntaxError 且栈在 cjs/loader,说明 PM2 误用 Node 执行了 uvicorn 启动脚本,请改为上述写法。

4.3 多台云主机 + 一台中控(分机)

  1. 每台云主机 只部署 bybit/engine,配置 .envMVP_ENV_FILEMACHINE_ID 唯一、BYBIT_* 建议一机一子账户、OLLAMA_BASE_URL该机可访问的 Ollama(常为 http://127.0.0.1:11434)。数据库可用 默认 SQLite(每机独立 data/mvp.db)。
  2. 中控机 只部署 bybit/control,维护 engines.json(复制 engines.json.example),示例:
[
  {"base_url": "http://10.0.1.11:18999", "machine_id": "mvp-1", "name": "机A", "token": "与A机CONTROL_API_TOKEN一致", "ip": "10.0.1.11"},
  {"base_url": "http://10.0.1.12:18999", "machine_id": "mvp-2", "name": "机B", "token": "…", "ip": "10.0.1.12"}
]
  1. PM2 / systemd 为中控设置 MVP_ENGINES_FILE=engines.json(路径相对 bybit/control 或绝对路径)。
  2. 安全组:各策略机 18999 仅允许 中控机出口 IP;中控 9000(或反代 443)按需对管理员开放。
  3. 登录中控 后可用 「导出 CSV / 导出 Excel」:中控会请求各机 GET /api/dashboard/fills(默认最多 4000 条)并合并下载;若某台配置了 CONTROL_API_TOKEN 但未在 JSON 写 token,该台导出可能为空或 401。

创建日志目录并启动(先 engine 目录,再 control 目录,各执行一次;每次 pm2 start 在 engine 侧 只拉起 1 个 进程):

cd bybit/engine && mkdir -p logs && pm2 start ecosystem.config.cjs
cd ../control && mkdir -p logs && pm2 start ecosystem.config.cjs
pm2 save
pm2 status

常用命令(多进程时替换应用名):

pm2 logs bybit-engine
pm2 logs bybit-mvp-control
pm2 restart bybit-engine
pm2 restart bybit-mvp-control
pm2 stop all

五、部署后自检

  1. 策略机健康:对每个监听端口执行
    curl -s http://127.0.0.1:<端口>/api/health
    返回 JSON 中 ok: true,且含 machine_id 字段(应与该进程 MACHINE_ID 一致)。
  2. 引擎状态(若设置了 CONTROL_API_TOKEN):
    curl -s -H "Authorization: Bearer <token>" http://127.0.0.1:<端口>/api/engine/state
    响应中同样含 machine_id
  3. 中控:浏览器访问 http://服务器IP:<CONTROL_PORT>(PM2 示例为 9000;Docker 为 5000)。登录后应出现 多台 卡片(engines.json / MVP_ENGINES_JSON)或 一台(单项 MVP_ENGINE_BASE_URL)。若某台离线,检查 base_url 是否从中控进程所在机器可达(分机勿写策略机本机的 127.0.0.1)、machine_id 是否与该机 MACHINE_ID 一致。
  4. 企业微信等(若已配置):策略机启动推送中会带 机器标识,便于区分多实例。
  5. 导出:登录后 导出 CSV / Excel,验证各机成交是否合并进文件。

六、防火墙与安全组

  • 按实际端口放行:单副本常见 18999(策略机)+ 9000(中控,PM2 默认);多副本为各 engine 监听端口 + 9000
  • 生产可 只对外开放中控端口,策略机端口 仅本机或仅中控所在安全组 访问。
  • 使用 HTTPS 反向代理(Nginx / Caddy)时,将 TLS 终止在代理层,后端仍监听本机端口。

七、Windows 说明(简要)

PM2 对 原生 Windows 支持有限,常见做法:

  1. 使用 WSL2(Ubuntu)按上文 Linux 流程部署;或
  2. 使用 NSSM / Windows 服务uvicornpython run_control.py 注册为服务。

若必须在 Windows 本机调试,可直接前台运行:

cd bybit/engine
.\.venv\Scripts\python -m uvicorn app.main:app --host 127.0.0.1 --port 18999 --workers 1

另开终端(中控端口默认 9000;若需 5000 请设置 CONTROL_PORT):

cd bybit/control
$env:CONTROL_PORT="9000"
$env:MVP_ENGINE_BASE_URL="http://127.0.0.1:18999"
.\.venv\Scripts\python run_control.py

多策略机时可在当前会话设置 MVP_ENGINES_JSON(单行 JSON 字符串),与 Linux 行为一致。


八、常见问题与处理

8.1 PM2 状态 errored 或不断重启

  • 查看日志pm2 logs <应用名> --lines 200
  • SyntaxError: Invalid or unexpected token 且栈在 Node loader.js:策略机 script 不要 单独指向 venv/bin/uvicorn 而不配解释器;应使用 script: …/python3 + args: "-m uvicorn app.main:app …"(见 §四bybit/engine/ecosystem.config.cjsbybit/control/ecosystem.config.cjs)。
  • 虚拟环境路径错误:确认各目录 ecosystem.config.cjs 里策略机的 script(python3) 与中控的 interpreter 指向 本目录 .venv 下的 python3,且已分别 pip install -r requirements.txt
  • 端口占用ss -lntp | grep 18999(或 9000 及你为多副本 engine 配置的其它端口),结束占用进程或改 ecosystem / 环境变量。
  • 工作目录错误cwd 分别为 bybit/enginebybit/control,脚本才能找到 app 包与 config_control

8.2 策略机日志出现数据库连接失败

  • 检查 DB_URL 主机、端口、库名、用户密码(bybit/engine/.env 或该进程的 MVP_ENV_FILE 指向的文件)。
  • 确认 PostgreSQL 已启动:systemctl status postgresql
  • 云服务器安全组是否放行 本机回环 一般无需;若 DB 在另一台机器,需放行对应 IP 的 5432。

8.3 relation "xxx" does not exist

未执行或未成功执行建表脚本:

cd bybit/engine && source .venv/bin/activate && python scripts/init_db.py

8.4 Bybit 下单失败 / 401 / 签名错误

  • 核对 BYBIT_API_KEY / BYBIT_API_SECRET(多机在各 instances/*.envMVP_ENV_FILE 中)、是否主网与 BYBIT_BASE_URL 一致。
  • API Key 是否开启合约权限、IP 白名单是否包含服务器出口 IP。

8.5 中控页面「离线」、engine/state 401 或导出为空

  • 策略机未启动,或 engines.json / MVP_ENGINES_JSON 中某条 base_url 不可达(核对监听 18999、安全组、分机场景下是否误用 策略机本机 127.0.0.1 而应改为 内网 IP)。
  • 若仅配单台:检查 MVP_ENGINE_BASE_URL(末尾多 / 一般可容忍)。
  • 若策略机开启了 CONTROL_API_TOKEN:须在 engines.json 各条 token(或单项 MVP_ENGINE_TOKEN)与之一致;否则 /api/engine/*/api/engine/state/api/dashboard/* 返回 401导出 CSV/Excel 也会拉不到 fills。
  • 实时价 / Ollama 状态GET /api/health 仍无需 Token;中控用它补全卡片。控制与导出依赖 Bearer 时请按上一条配置 token

8.6 疑似重复下单或行为异常

  • 几乎一定是 Uvicorn 开了多个 worker。请改为 --workers 1,并 pm2 restart bybit-engine(或你在 ecosystem 里自定义的 name)。

8.7 信号/门控异常或 Ollama 相关错误

  • 检查 OLLAMA_BASE_URLOLLAMA_MODELUSE_LLM(在 bybit/engine/.env 或各 MVP_ENV_FILE 文件中;多进程时每台模型/地址可不同)。临时关闭 LLM 可设 USE_LLM=false(逻辑会走硬规则分支,以代码为准)。
  • 若经 SOCKS 访问外网或 Ollama,核对 SOCKS_PROXY_URL(同上,按实例写在对应 instances/*.env 中)。
  • 确认服务器能访问 Ollama 地址(防火墙、内网互通)。

8.8 升级代码后如何平滑重启

git pull
source .venv/bin/activate
pip install -r bybit/engine/requirements.txt
pip install -r bybit/control/requirements.txt
cd bybit/engine && python scripts/init_db.py   # 新库或缺表时执行
# 若从旧版升级到「多机共库」且 PostgreSQL 已存在数据,再执行一次:
# python scripts/migrate_add_machine_id.py
cd ..
pm2 restart all

8.9 重启服务器后策略机连不上数据库

  • 执行 systemctl status postgresql,若为 inactive,则启动并打开自启:systemctl start postgresqlsystemctl enable postgresql
  • 若 PostgreSQL 在 Docker 中:执行 systemctl status dockerdocker ps,确认 postgres 容器在跑;必要时 docker compose -f infra/docker-compose.yml up -d postgres(路径以实际为准)。

8.10 多机共库但数据串了或仓位不对

  • 核对每台策略机进程 MACHINE_ID 是否与中控 MVP_ENGINES_JSON 里对应项的 machine_id 完全一致(区分大小写)。
  • 核对是否误用 同一套 Bybit API Key 跑多个引擎(应避免;每进程应独立 Key / 子账户)。
  • 若库是旧版升级:是否已执行 python scripts/migrate_add_machine_id.py

8.11 中控读不到多台 / 只显示一台

  • 若设置了 MVP_ENGINES_FILE 且文件存在,中控 只使用该文件中的列表(可为空数组)。
  • 若未设置文件、但设置了 MVP_ENGINES_JSON,中控 只使用 JSON 列表;此时单项 MVP_ENGINE_BASE_URL 不会合并进去。
  • JSON 必须是 合法 UTF-8;在 shell 里 export 时注意引号转义,推荐 使用 engines.json 文件 避免长环境变量。
  • 配置修改后需 重启中控进程(如 pm2 restart bybit-mvp-control)。

8.12 python scripts/init_db.pyModuleNotFoundError: No module named 'app'

  • 须在 bybit/engine 目录下执行cd bybit/engine && python scripts/init_db.py
  • 当前仓库脚本已把 bybit/engine 目录加入 sys.path,一般无需再设 PYTHONPATH。若仍异常,可尝试:PYTHONPATH=. python scripts/init_db.py

8.13 could not translate host name "postgres" / 数据库连接失败(name resolution)

  • DB_URL 里主机名为 postgres 时,仅适用于 Docker Compose 网络(与 postgres 服务同网)。
  • 宿主机 用 PM2 / 直接 python / uvicorn 跑策略机时,应把主机改为 127.0.0.1(本机 PostgreSQL)或 实际数据库 IP,否则会 DNS 解析失败(bybit/engine/.env 与各 MVP_ENV_FILEDB_URL 均需检查)。
  • 若密码含 @,连接串里须写成 %40,见 §2.3§2.5 中的完整示例行。

8.14 三台子账户:为什么 Key 不能只写在 bybit/engine/.env

  • bybit/engine/.env 只有一份,同一键名(如 BYBIT_API_KEY)只能存 一套 值;三个 uvicorn 若都读该文件,会 共用同一 Key,实盘上等于抢同一账户。
  • 推荐做法:每进程 MVP_ENV_FILE 指向 instances/<id>.env,文件内写全 DB_URL(可多台相同)、MACHINE_ID、各子账户 Key、止损止盈、代理Ollama 模型名 等。亦可把差异写在 PM2 各 app 的 env 或启动前 export,优先级高于文件。

九、与 Docker 部署的关系

本仓库 infra/docker-compose.yml 提供容器化一键环境(PostgreSQL + Compose 服务 backend(镜像来自 bybit/engine)+ 服务 control(镜像来自 bybit/control)。Compose 中为中控设置 CONTROL_PORT=5000,与源码默认 9000 区分,避免与宿主机 PM2 中控端口习惯冲突。

若生产已采用 PM2(尤其 单机多策略机),则 不必 再对同一台机重复起 Compose 里的 策略机,避免 双实例抢同一账户。容器与 PM2 二者选其一 即可。


十、文档与架构

  • 逻辑架构、数据表与 machine_id 含义见 架构说明.md
  • 中控多机环境变量示例见 bybit/control/.env.example;策略机示例见 bybit/engine/.env.example
  • 多实例可选模板见 bybit/engine/instances/instance.env.example(配合 PM2 MVP_ENV_FILE;勿提交真实 instances/*.env)。
  • PM2 示例:bybit/engine/ecosystem.config.cjs(单进程)bybit/control/ecosystem.config.cjs(分开启动)。

评论已关闭