diff --git a/README.md b/README.md index acd1d3c..e517dec 100644 --- a/README.md +++ b/README.md @@ -41,21 +41,15 @@ ## 快速开始 -**服务器(Ubuntu)** +**你自己部署(完整版 · 用 `main` 分支)** -```bash -git clone https://gitee.com/dekun/qihuo.git /opt/qihuo -cd /opt/qihuo -git fetch --tags -git checkout v1.0.0-user -bash deploy.sh -# 访问 http://:6600 -``` +见 [docs/DEPLOY.md](docs/DEPLOY.md) → **A. 你自己部署(完整版 · main)**。 -**本地开发** +**客户交付 / 个人用户版(`v1.0.0-user`)** -```bash -python3 -m venv venv +见 [docs/DEPLOY.md](docs/DEPLOY.md) → **B. 客户交付(个人用户版 · v1.0.0-user)**。**本地开发(当前分支为用户版代码)** + +```bashpython3 -m venv venv source venv/bin/activate # Windows: venv\Scripts\activate pip install -r requirements.txt cp .env.example .env diff --git a/deploy.sh b/deploy.sh index db6153b..eac3951 100644 --- a/deploy.sh +++ b/deploy.sh @@ -13,7 +13,8 @@ set -euo pipefail APP_DIR="/opt/qihuo" -REPO_URL="https://git.bz121.com/dekun/qihuo.git" +REPO_URL="${QIHUO_REPO_URL:-https://gitee.com/dekun/qihuo.git}" +USER_EDITION_TAG="${QIHUO_USER_TAG:-v1.0.0-user}" SERVICE_NAME="qihuo" # SimNow 前置候选(按优先级;部署时自动 nc 探测) @@ -45,18 +46,6 @@ ensure_locale_gen() { fi } -ensure_env_key() { - local file="$1" key="$2" val="$3" - if [ ! -f "$file" ]; then - return - fi - if grep -q "^${key}=" "$file"; then - return - fi - echo "${key}=${val}" >>"$file" - echo " .env 补全: ${key}=${val}" -} - pick_simnow_front() { local host td_port md_port for entry in "${SIMNOW_FRONTS[@]}"; do @@ -89,6 +78,33 @@ update_simnow_front_in_env() { fi } +ensure_env_key() { + local file="$1" key="$2" val="$3" + if [ ! -f "$file" ]; then + return + fi + if grep -q "^${key}=" "$file"; then + return + fi + echo "${key}=${val}" >>"$file" + echo " .env 补全: ${key}=${val}" +} + +is_user_edition_tree() { + [ -f "$APP_DIR/edition.py" ] && grep -q 'USER_EDITION = True' "$APP_DIR/edition.py" 2>/dev/null +} + +sync_git_repo() { + if is_user_edition_tree; then + echo "==> 个人用户版:同步 tag ${USER_EDITION_TAG}(不拉 main)" + git fetch origin --tags + git checkout -f "${USER_EDITION_TAG}" + return + fi + echo "==> 完整版:更新 main" + git pull origin main || git pull origin master || true +} + echo "==> 检查系统依赖..." export DEBIAN_FRONTEND=noninteractive apt-get update -qq @@ -141,7 +157,7 @@ mkdir -p "$(dirname "$APP_DIR")" if [ -d "$APP_DIR/.git" ]; then echo "==> 更新已有仓库..." cd "$APP_DIR" - git pull origin main || git pull origin master || true + sync_git_repo else if [ -d "$APP_DIR" ] && [ "$(ls -A "$APP_DIR" 2>/dev/null)" ]; then echo "目录 ${APP_DIR} 已存在且非 git 仓库,请手动处理后重试" @@ -149,6 +165,13 @@ else fi git clone "$REPO_URL" "$APP_DIR" cd "$APP_DIR" + if [ "${QIHUO_USER_EDITION:-}" = "1" ]; then + echo "==> 首次部署个人用户版:checkout ${USER_EDITION_TAG}" + git fetch origin --tags + git checkout -f "${USER_EDITION_TAG}" + else + git checkout main 2>/dev/null || git checkout master 2>/dev/null || true + fi fi echo "==> Python 虚拟环境与依赖..." diff --git a/docs/DEPLOY.md b/docs/DEPLOY.md index 7f928c8..163f164 100644 --- a/docs/DEPLOY.md +++ b/docs/DEPLOY.md @@ -4,19 +4,17 @@ --- -## 个人用户版 v1.0.0-user +## 先选部署场景(重要) -客户交付请使用 **tag**,勿部署 `main`: +| 场景 | 代码 | 说明 | +|------|------|------| +| **你自己**(完整版) | 分支 **`main`** | 含 K 线、可开仓品种表、复盘自动 K 线等 | +| **客户交付**(个人用户版) | tag **`v1.0.0-user`** | 不含上述三项,见 [RELEASE-v1.0.0-user.md](./RELEASE-v1.0.0-user.md) | -```bash -git clone https://gitee.com/dekun/qihuo.git /opt/qihuo -cd /opt/qihuo -git fetch --tags -git checkout v1.0.0-user -bash deploy.sh -``` +**不要混用**:客户服务器 checkout `v1.0.0-user`;你自己的服务器用 `main`。 -功能范围见 [RELEASE-v1.0.0-user.md](./RELEASE-v1.0.0-user.md)。**你自己**的开发服务器继续用 `main` 即可。 +**仓库地址(Gitee)**:https://gitee.com/dekun/qihuo.git +(私有镜像:`https://git.bz121.com/dekun/qihuo.git`,步骤相同,仅改 clone URL) --- @@ -29,7 +27,8 @@ bash deploy.sh | 服务端口 | `6600` | | 进程管理 | PM2,应用名 `qihuo` | | 数据库 | SQLite `futures.db` | -| 仓库 | https://git.bz121.com/dekun/qihuo.git | +| 完整版代码 | 分支 `main` | +| 用户版代码 | tag `v1.0.0-user` | --- @@ -40,9 +39,9 @@ bash deploy.sh - **Node.js + PM2**:进程守护与开机自启 - **编译工具**(安装 vnpy_ctp 时需要):`build-essential`、`python3-dev`、`pkg-config` - **网络**: - - `hq.sinajs.cn`(新浪行情) + - `hq.sinajs.cn`(新浪现价,内部逻辑) - 企业微信 API(若启用推送) - - `git.bz121.com`(拉取代码) + - `gitee.com` 或 `git.bz121.com`(拉取代码) - `pypi.org`(pip 安装依赖) - SimNow / 期货公司 **CTP 前置地址**(下单与持仓,见下文) @@ -50,22 +49,65 @@ bash deploy.sh ## 一键部署(推荐) -以 **root** 登录服务器后执行: +以 **root** 登录服务器后执行。 +`deploy.sh` 会装系统依赖、locale、venv、PM2 等;**首次须先 clone 并 checkout 到正确版本**。 + +### A. 你自己部署(完整版 · `main`) + +**首次:** + +```bash +git clone https://gitee.com/dekun/qihuo.git /opt/qihuo +cd /opt/qihuo +git checkout main +bash deploy.sh +nano /opt/qihuo/.env # ADMIN_*、SIMNOW_* 等 +pm2 restart qihuo +``` + +**已有目录、日常更新:** ```bash cd /opt/qihuo -# 若目录不存在,先克隆: -# git clone https://git.bz121.com/dekun/qihuo.git /opt/qihuo - +git checkout main bash deploy.sh ``` -`deploy.sh` 会自动完成: +### B. 客户交付(个人用户版 · `v1.0.0-user`) + +**首次(SSH 帮客户部署):** + +```bash +git clone https://gitee.com/dekun/qihuo.git /opt/qihuo +cd /opt/qihuo +git fetch --tags +git checkout v1.0.0-user +bash deploy.sh +nano /opt/qihuo/.env # 客户 ADMIN_*、SIMNOW_* 等 +pm2 restart qihuo +``` + +**已有目录、用户版小版本升级(如 v1.0.1-user):** + +```bash +cd /opt/qihuo +git fetch --tags +git checkout v1.0.1-user # 换成新 tag +bash deploy.sh +``` + +> 用户版再次执行 `deploy.sh` 时,脚本会识别 `edition.py` 并**保持在用户版 tag**,不会误拉到 `main`。 + +访问:`http://<服务器IP>:6600` + +--- + +### `deploy.sh` 会自动完成 1. 安装系统依赖:`python3`、`git`、`build-essential`、`python3-dev`、`pkg-config`、`locales`、`netcat-openbsd`、`pm2` 2. **时区**设为 `Asia/Shanghai`(与 SimNow 交易时段一致) 3. **locale**:生成 `zh_CN.GB18030`、`zh_CN.UTF-8`(CTP 登录必需,缺则进程崩溃) -4. `git pull` 或 `git clone` 到 `/opt/qihuo` +4. `git pull`(完整版 `main`)或 `git checkout` 用户版 tag,或 `git clone` 到 `/opt/qihuo` 5. 创建/保留虚拟环境 `venv`,`pip install -r requirements.txt`,验证 `vnpy_ctp` 6. 首次生成 `.env`,并补全 `SIMNOW_ENV=实盘`、`CTP_AUTO_RECONNECT=true` 等缺项 7. **自动探测 SimNow 前置**(`nc` 测端口),写入可用的 `SIMNOW_TD/MD_ADDRESS`(优先 `182.254.243.31`,其次 `180.168.146.187`) @@ -74,12 +116,15 @@ bash deploy.sh 部署完成后访问:`http://<服务器IP>:6600` -> 再次部署只需 `cd /opt/qihuo && bash deploy.sh`,无需手工装 locale 或改前置地址。 +> 完整版日常更新:`cd /opt/qihuo && git checkout main && bash deploy.sh` +> 用户版:`git checkout v1.0.0-user && bash deploy.sh`(见上文 B) --- ## 手动部署 +与一键部署相同,请先 **clone + checkout 到 `main` 或 `v1.0.0-user`**,再执行下列步骤。 + ### 1. 安装系统依赖 ```bash @@ -97,9 +142,21 @@ npm install -g pm2 ### 2. 克隆代码 +**完整版(自己):** + ```bash -git clone https://git.bz121.com/dekun/qihuo.git /opt/qihuo +git clone https://gitee.com/dekun/qihuo.git /opt/qihuo cd /opt/qihuo +git checkout main +``` + +**用户版(客户):** + +```bash +git clone https://gitee.com/dekun/qihuo.git /opt/qihuo +cd /opt/qihuo +git fetch --tags +git checkout v1.0.0-user ``` ### 3. Python 虚拟环境与依赖 @@ -187,18 +244,30 @@ mkdir -p /opt/qihuo/logs /opt/qihuo/uploads ## 更新部署 -代码已推送后,在服务器执行: +### 完整版(你自己 · `main`) ```bash cd /opt/qihuo git fetch origin +git checkout main git reset --hard origin/main source venv/bin/activate pip install -r requirements.txt pm2 restart qihuo ``` -若服务器曾用 SCP 覆盖文件导致 `git pull` 冲突,用 `git reset --hard origin/main` 与远端对齐。 +或:`git checkout main && bash deploy.sh` + +### 个人用户版(客户 · tag) + +```bash +cd /opt/qihuo +git fetch origin --tags +git checkout v1.0.0-user # 或新版本 tag +bash deploy.sh +``` + +若服务器曾用 SCP 覆盖文件导致冲突:完整版用 `git reset --hard origin/main`;用户版用 `git checkout -f v1.0.0-user`。 若 `vnpy_ctp` 安装失败(常见于缺少编译环境): @@ -215,7 +284,7 @@ pm2 restart qihuo 1. 浏览器登录 → **系统设置** 确认 **模拟盘 · SimNow** 2. 打开 **下单监控** 页 → 点击 **连接 CTP** -3. 连接成功后:权益来自柜台、显示 CTP 持仓、可报单与可开仓品种筛选 +3. 连接成功后:权益来自柜台、显示 CTP 持仓、可报单(用户版含小账户四品种限制) 详见 [TRADING.md](./TRADING.md)。 @@ -242,9 +311,12 @@ pm2 save # 保存进程列表 ## 本地开发 +**完整版(默认):** + ```bash -git clone https://git.bz121.com/dekun/qihuo.git +git clone https://gitee.com/dekun/qihuo.git qihuo cd qihuo +git checkout main python3 -m venv venv source venv/bin/activate # Windows: venv\Scripts\activate pip install -r requirements.txt @@ -274,7 +346,7 @@ python app.py | 路径 | 说明 | |------|------| | `/opt/qihuo/futures.db` | 主数据库 | -| `/opt/qihuo/uploads/` | 复盘截图、自动 K 线图 | +| `/opt/qihuo/uploads/` | 复盘截图(完整版含自动 K 线图) | | `/opt/qihuo/data/fee_rates.json` | 默认手续费表(可重载) | | `/root/qihuo_backup/` | 系统自动备份目录(`.tar.gz`) | @@ -351,7 +423,8 @@ ufw allow 6600/tcp | **下单监控无持仓** | 未连接 CTP 或确实无仓 | 先点「连接 CTP」 | | **`Could not resolve host`** | 服务器 DNS 故障 | 配置 systemd-resolved 公共 DNS,见下方 | | `database is locked` | SQLite 并发 | 更新代码后重启 | -| `git pull` 冲突 | 本地有修改 / SCP 部署 | `git fetch && git reset --hard origin/main` | +| `git pull` 冲突 | 本地有修改 / SCP 部署 | 完整版:`git reset --hard origin/main`;用户版:`git checkout -f v1.0.0-user` | +| 用户版跑完变成完整版 | `deploy.sh` 误拉 `main` | 先 `git checkout v1.0.0-user`,再 `bash deploy.sh`(新版脚本已防误拉) | 查看应用是否在监听: @@ -374,7 +447,7 @@ systemctl restart systemd-resolved resolvectl flush-caches ``` -验证:`resolvectl query git.bz121.com`、`curl cip.cc` +验证:`resolvectl query gitee.com`、`curl cip.cc` --- @@ -449,6 +522,7 @@ pm2 restart qihuo ## 相关文档 +- [个人用户版发行说明](./RELEASE-v1.0.0-user.md) - [功能说明文档](./FEATURES.md) - [SimNow 注册与接入说明](./SIMNOW.md) - [手续费与导航设置](./FEES.md)