Normalize fullwidth punctuation to ASCII across codebase.

Add scripts/normalize_ambiguous_unicode.py; fix corrupted patch_instance_theme_templates.py. Preserves curly quotes in string literals; removes Git homoglyph warnings on .env.example.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-07-08 23:42:26 +08:00
parent aaa72c7961
commit b733e551a0
392 changed files with 71522 additions and 71369 deletions
+16 -16
View File
@@ -1,15 +1,15 @@
# 环境一键部署Ubuntu / root /opt
# 环境一键部署(Ubuntu / root /opt)
**`/opt/crypto_monitor`** 下以 **root** 为各子项目创建 Python **`.venv`**安装依赖`.env.example` 生成 `.env`不覆盖已有),并可选安装 **PM2**
**`/opt/crypto_monitor`** 下以 **root** 为各子项目创建 Python **`.venv`**,安装依赖,`.env.example` 生成 `.env`(不覆盖已有),并可选安装 **PM2**.
完整系统要求Python / Node / PM2 版本启动顺序**[docs/ubuntu-server.md](../docs/ubuntu-server.md)**
完整系统要求(Python / Node / PM2 版本,启动顺序)**[docs/ubuntu-server.md](../docs/ubuntu-server.md)**.
---
## 前置条件
- **Ubuntu 22.04 / 24.04**用户 **root**
- 已安装 **git**仓库位于 **`/opt/crypto_monitor`**
- **Ubuntu 22.04 / 24.04**,用户 **root**
- 已安装 **git**,仓库位于 **`/opt/crypto_monitor`**
```bash
apt update
@@ -26,7 +26,7 @@ cd /opt/crypto_monitor
bash deploy/setup_env.sh --install-system-deps
```
常用参数
常用参数:
```bash
bash deploy/setup_env.sh --only binance,gate # 仅部分子项目
@@ -35,9 +35,9 @@ bash deploy/setup_env.sh --skip-pm2 # 不尝试安装 pm2
bash deploy/setup_env.sh --skip-env-copy # 不复制 .env.example
```
**整目录重装**保留 `.env`清库去脏 PM2**[reinstall-plan-b.md](./reinstall-plan-b.md)**执行 `bash deploy/reinstall.sh``setup_env.sh` 独立不影响首次一键安装
**整目录重装**(保留 `.env`,清库,去脏 PM2)**[reinstall-plan-b.md](./reinstall-plan-b.md)**,执行 `bash deploy/reinstall.sh`.`setup_env.sh` 独立,不影响首次一键安装.
若在其它环境编辑过脚本后报 `pipefail` 错误先转 LF
若在其它环境编辑过脚本后报 `pipefail` 错误,先转 LF:
```bash
sed -i 's/\r$//' deploy/setup_env.sh
@@ -53,16 +53,16 @@ sed -i 's/\r$//' deploy/setup_env.sh
| `crypto_monitor_*` | 各目录 `.venv` + `pip install -r ../requirements.txt` |
| `manual_trading_hub` | 独立 `requirements.txt` |
| `.env` | 不存在则从 `.env.example` 复制 |
| 部署密钥 | `python3 scripts/bootstrap_deploy_secrets.py`不覆盖已有值 |
| 目录 | `static/images``static/images/order_charts` |
| 部署密钥 | `python3 scripts/bootstrap_deploy_secrets.py`(不覆盖已有值) |
| 目录 | `static/images`,`static/images/order_charts` |
| PM2 | 已装 Node 时 `npm install -g pm2` |
---
## 部署之后
1. 编辑各子目录 **`.env`**交易所 API企业微信等**AI 请在中控系统设置 → AI 配置**)。
2. **仅用 PM2 常驻**见 [docs/ubuntu-server.md](../docs/ubuntu-server.md) §3):
1. 编辑各子目录 **`.env`**(交易所 API,企业微信等;**AI 请在中控系统设置 → AI 配置**).
2. **仅用 PM2 常驻**(见 [docs/ubuntu-server.md](../docs/ubuntu-server.md) §3):
```bash
cd /opt/crypto_monitor/crypto_monitor_binance && pm2 start ecosystem.config.cjs
@@ -71,13 +71,13 @@ sed -i 's/\r$//' deploy/setup_env.sh
pm2 save
```
或一条命令`bash deploy/pm2_start_all.sh`
或一条命令:`bash deploy/pm2_start_all.sh`
3. 三所 `.env` 同步脚本见 **[docs/env-sync-scripts.md](../docs/env-sync-scripts.md)**
3. 三所 `.env` 同步脚本见 **[docs/env-sync-scripts.md](../docs/env-sync-scripts.md)**.
---
## 依赖说明
- 三个监控子项目共用根目录 **[requirements.txt](../requirements.txt)**
- 走 SOCKS 须 **PySocks**已包含在 requirements 中)。
- 三个监控子项目共用根目录 **[requirements.txt](../requirements.txt)**.
- 走 SOCKS 须 **PySocks**(已包含在 requirements 中).
+5 -5
View File
@@ -1,9 +1,9 @@
#!/usr/bin/env bash
# 按推荐顺序启动三所 Flask + 中控 hub/三 agentPM2)。
# 用法仓库根或任意目录:
# 按推荐顺序启动三所 Flask + 中控 hub/三 agent(PM2).
# 用法(仓库根或任意目录):
# bash deploy/pm2_start_all.sh
#
# 与 deploy/setup_env.sh 独立setup_env 只建 venv本脚本负责 PM2 启动
# 与 deploy/setup_env.sh 独立:setup_env 只建 venv;本脚本负责 PM2 启动.
set -e
set -u
if [ -n "${BASH_VERSION:-}" ]; then
@@ -26,7 +26,7 @@ start_one() {
}
if ! command -v pm2 >/dev/null 2>&1; then
echo "未找到 pm2请先安装 Node.js 与 pm2见 docs/ubuntu-server.md" >&2
echo "未找到 pm2,请先安装 Node.js 与 pm2(见 docs/ubuntu-server.md)" >&2
exit 1
fi
@@ -37,5 +37,5 @@ start_one manual_trading_hub
pm2 save 2>/dev/null || true
echo ""
echo "PM2 进程"
echo "PM2 进程:"
pm2 list
+2 -2
View File
@@ -1,6 +1,6 @@
#!/usr/bin/env bash
# 服务器上拉代码同步 env应用强制清仓策略并重启 PM2
# 用法/opt/crypto_monitor 下 root):
# 服务器上拉代码,同步 env,应用强制清仓策略并重启 PM2.
# 用法(/opt/crypto_monitor 下 root):
# bash deploy/pull_and_restart.sh
# bash deploy/pull_and_restart.sh --dry-run
set -euo pipefail
+19 -19
View File
@@ -1,32 +1,32 @@
# Plan B整目录重装生产清库
# Plan B:整目录重装(生产清库)
适用于**保留三所 `.env` 与中控配置丢弃旧代码旧 SQLite脏 PM2 名单**例如移除 `gate_bot` 后偶发重启)。
适用于:**保留三所 `.env` 与中控配置,丢弃旧代码,旧 SQLite,脏 PM2 名单**(例如移除 `gate_bot` 后偶发重启).
**[setup_env.sh](./setup_env.sh)** 的关系
**[setup_env.sh](./setup_env.sh)** 的关系:
| 脚本 | 用途 |
|------|------|
| `setup_env.sh` | **首次安装 / 日常**建 venv装依赖`.env.example` 复制**不变** |
| `reinstall.sh` | **整目录重装**备份 → 移走旧目录 → `git clone` → 调 `setup_env.sh` → 恢复配置 → PM2 |
| `setup_env.sh` | **首次安装 / 日常**:建 venv,装依赖,`.env.example` 复制(**不变**) |
| `reinstall.sh` | **整目录重装**:备份 → 移走旧目录 → `git clone` → 调 `setup_env.sh` → 恢复配置 → PM2 |
---
## 一键执行推荐
## 一键执行(推荐)
在现有服务器安装上以 **root** 执行
在现有服务器安装上以 **root** 执行:
```bash
cd /opt/crypto_monitor
bash deploy/reinstall.sh --yes
```
交互确认不加 `--yes`):
交互确认(不加 `--yes`):
```bash
bash deploy/reinstall.sh
```
仅预览步骤
仅预览步骤:
```bash
bash deploy/reinstall.sh --dry-run
@@ -39,20 +39,20 @@ bash deploy/reinstall.sh --dry-run
1. 备份到 **`/root/backups/pre-reinstall-YYYYMMDD-HHMMSS/`**
- 三所 `crypto_monitor_*/.env`
- `manual_trading_hub/.env`
- `manual_trading_hub/hub_settings.json`若有
- 可选仓库内 `one_shot` 备份目录
- `manual_trading_hub/hub_settings.json`(若有)
- 可选:仓库内 `one_shot` 备份目录
2. **`pm2 stop all` + `pm2 delete all`**
3. **`mv /opt/crypto_monitor /opt/crypto_monitor.old.时间戳`**
4. **`git clone`** 到 `/opt/crypto_monitor`默认 `main`
4. **`git clone`** 到 `/opt/crypto_monitor`(默认 `main`)
5. **`bash deploy/setup_env.sh --skip-env-copy --recreate-venv --skip-pm2`**
6. 从备份 **恢复 `.env` / `hub_settings.json`**
7. **`deploy/sanitize_hub_settings.py`** 去掉 `gate_bot` / 第四账户
8. **`deploy/pm2_start_all.sh`** + `pm2 save`
9. 为三所重装 **每日 0 点备份 cron**可用 `--no-backup-cron` 跳过
9. 为三所重装 **每日 0 点备份 cron**(可用 `--no-backup-cron` 跳过)
**不会备份/恢复**`crypto.db`hub `data/*.db``static/images`符合「全新启动」)。
**不会备份/恢复**:`crypto.db`,hub `data/*.db`,`static/images`(符合「全新启动」).
**不会动**宝塔/Nginx 反代SSH SOCKS 隧道tmux 内)。
**不会动**:宝塔/Nginx 反代,SSH SOCKS 隧道(tmux 内).
---
@@ -77,13 +77,13 @@ pm2 list
curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:5100/
```
浏览器中控 `/monitor` 登录三所 LINK 绿监控区为空库
浏览器:中控 `/monitor` 登录,三所 LINK 绿,监控区为空库.
---
## 回滚
旧目录默认保留为 `/opt/crypto_monitor.old.时间戳`配置在 `/root/backups/pre-reinstall-*`
旧目录默认保留为 `/opt/crypto_monitor.old.时间戳`,配置在 `/root/backups/pre-reinstall-*`:
```bash
pm2 delete all
@@ -92,7 +92,7 @@ mv /opt/crypto_monitor.old.XXXXXXXX /opt/crypto_monitor
bash /opt/crypto_monitor/deploy/pm2_start_all.sh
```
确认新环境稳定后再删 `.old.*` 目录
确认新环境稳定后再删 `.old.*` 目录.
---
@@ -100,7 +100,7 @@ bash /opt/crypto_monitor/deploy/pm2_start_all.sh
| 文件 | 说明 |
|------|------|
| [pm2_start_all.sh](./pm2_start_all.sh) | 按顺序 PM2 启动三所 + hubsetup_env 之后手动用 |
| [pm2_start_all.sh](./pm2_start_all.sh) | 按顺序 PM2 启动三所 + hub(setup_env 之后手动用) |
| [sanitize_hub_settings.py](./sanitize_hub_settings.py) | 清理 `hub_settings.json` 中 gate_bot 条目 |
---
+20 -20
View File
@@ -1,11 +1,11 @@
#!/usr/bin/env bash
# Plan B整目录重装 /opt/crypto_monitor备份 .env → 移走旧目录 → git clone → setup_env → 恢复配置 → PM2
# Plan B:整目录重装 /opt/crypto_monitor(备份 .env → 移走旧目录 → git clone → setup_env → 恢复配置 → PM2)
#
# 与 deploy/setup_env.sh 分工
# setup_env.sh — 首次 / 日常建 venv装依赖复制 .env.example一键安装不变
# reinstall.sh — 生产清库重装保留密钥与 hub 配置丢弃旧代码/旧库/脏 PM2
# 与 deploy/setup_env.sh 分工:
# setup_env.sh — 首次 / 日常:建 venv,装依赖,复制 .env.example(一键安装,不变)
# reinstall.sh — 生产清库重装:保留密钥与 hub 配置,丢弃旧代码/旧库/脏 PM2
#
# 用法在现有安装目录以 root 执行:
# 用法(在现有安装目录以 root 执行):
# cd /opt/crypto_monitor
# bash deploy/reinstall.sh # 交互确认
# bash deploy/reinstall.sh --yes # 跳过确认
@@ -109,7 +109,7 @@ backup_configs() {
fi
done
if [[ "${copied}" -eq 0 ]]; then
echo "错误: 未备份到任何配置文件请检查 ${src_root}" >&2
echo "错误: 未备份到任何配置文件,请检查 ${src_root}" >&2
exit 1
fi
if [[ -f "${src_root}/scripts/one_shot_backup_config_before_cleanup.py" ]]; then
@@ -174,20 +174,20 @@ install_instance_backup_cron() {
}
verify_pm2() {
log "预期 PM2 进程7 个: crypto_binance crypto_gate crypto_okx manual-trading-hub manual-agent-*"
log "预期 PM2 进程(7 个): crypto_binance crypto_gate crypto_okx manual-trading-hub manual-agent-*"
if [[ "${DRY_RUN}" -eq 1 ]]; then
return 0
fi
pm2 list || true
if pm2 list 2>/dev/null | grep -qiE 'gate_bot|15203'; then
log "警告: PM2 列表仍含 gate_bot 相关进程请 pm2 delete 后 pm2 save"
log "警告: PM2 列表仍含 gate_bot 相关进程,请 pm2 delete 后 pm2 save"
fi
}
# --- 前置检查 ---
if [[ "$(id -u)" -ne 0 ]]; then
echo "请使用 root 执行推荐路径 ${INSTALL_ROOT}" >&2
echo "请使用 root 执行(推荐路径 ${INSTALL_ROOT})" >&2
exit 1
fi
@@ -197,7 +197,7 @@ if [[ ! -f "${REPO_ROOT}/deploy/setup_env.sh" ]]; then
fi
if [[ "${REPO_ROOT}" != "${INSTALL_ROOT}" ]]; then
log "提示: 当前仓库 ${REPO_ROOT} 与 INSTALL_ROOT=${INSTALL_ROOT} 不一致将备份当前仓库并克隆到 INSTALL_ROOT"
log "提示: 当前仓库 ${REPO_ROOT} 与 INSTALL_ROOT=${INSTALL_ROOT} 不一致;将备份当前仓库并克隆到 INSTALL_ROOT"
fi
STAMP="$(TZ="${TZ_NAME}" date +%Y%m%d-%H%M%S)"
@@ -216,9 +216,9 @@ echo " 旧目录移走: ${OLD_DIR}"
echo " 新克隆: ${GIT_URL} (${GIT_BRANCH}) -> ${INSTALL_ROOT}"
echo " 环境: deploy/setup_env.sh --skip-env-copy --recreate-venv --skip-pm2"
echo ""
echo " 将停止并 delete 全部 PM2 进程不备份 crypto.db / hub data / 图片"
echo " 将停止并 delete 全部 PM2 进程;不备份 crypto.db / hub data / 图片."
if ! confirm "确认执行 Plan B 整目录重装"; then
if ! confirm "确认执行 Plan B 整目录重装?"; then
log "已取消"
exit 0
fi
@@ -235,7 +235,7 @@ if command -v pm2 >/dev/null 2>&1; then
run pm2 stop all || true
run pm2 delete all || true
else
log "未安装 pm2跳过"
log "未安装 pm2,跳过"
fi
# --- 3. 移走旧目录 ---
@@ -248,7 +248,7 @@ if [[ -d "${INSTALL_ROOT}" ]]; then
mv "${INSTALL_ROOT}" "${OLD_DIR}"
fi
else
log "目标目录不存在跳过 mv"
log "目标目录不存在,跳过 mv"
fi
# --- 4. 克隆 ---
@@ -260,7 +260,7 @@ else
git clone -b "${GIT_BRANCH}" "${GIT_URL}" "${INSTALL_ROOT}"
fi
# --- 5. setup_env一键安装逻辑不复制 .env---
# --- 5. setup_env(一键安装逻辑,不复制 .env)---
step "重建 Python 虚拟环境 (setup_env.sh)"
if [[ "${DRY_RUN}" -eq 1 ]]; then
@@ -281,10 +281,10 @@ if command -v pm2 >/dev/null 2>&1; then
run bash "${INSTALL_ROOT}/deploy/pm2_start_all.sh"
run pm2 save
else
log "未安装 pm2请手动: bash ${INSTALL_ROOT}/deploy/pm2_start_all.sh"
log "未安装 pm2;请手动: bash ${INSTALL_ROOT}/deploy/pm2_start_all.sh"
fi
# --- 8. 定时备份 cron可选---
# --- 8. 定时备份 cron(可选)---
if [[ "${INSTALL_BACKUP_CRON}" -eq 1 ]]; then
step "安装三所每日备份 cron"
@@ -297,14 +297,14 @@ step "完成"
verify_pm2
echo ""
echo "备份: ${BACKUP_DIR}"
echo "旧目录确认无误后可删: ${OLD_DIR}"
echo "旧目录(确认无误后可删): ${OLD_DIR}"
echo ""
echo "验收建议:"
echo " pm2 list"
echo " curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:5100/"
echo " 浏览器打开中控 /monitor确认三所 LINK 正常"
echo " 浏览器打开中控 /monitor,确认三所 LINK 正常"
echo ""
echo "回滚未删旧目录时:"
echo "回滚(未删旧目录时):"
echo " pm2 delete all"
echo " rm -rf ${INSTALL_ROOT}"
echo " mv ${OLD_DIR} ${INSTALL_ROOT}"
+2 -2
View File
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
"""重装后清理 hub_settings.json 中已废弃的 gate_bot / 第四账户条目"""
"""重装后清理 hub_settings.json 中已废弃的 gate_bot / 第四账户条目."""
from __future__ import annotations
import json
@@ -92,7 +92,7 @@ def main(argv: list[str] | None = None) -> int:
for line in removed:
print(f" - {line}")
else:
print("无需修改未发现 gate_bot / 第四账户")
print("无需修改(未发现 gate_bot / 第四账户)")
return 0
+17 -17
View File
@@ -1,5 +1,5 @@
#!/usr/bin/env bash
# crypto_monitor 一键环境部署Ubuntu / root /opt/crypto_monitor
# crypto_monitor 一键环境部署(Ubuntu / root /opt/crypto_monitor)
#
# 用法:
# bash deploy/setup_env.sh
@@ -10,7 +10,7 @@
#
set -e
set -u
# 避免 Windows CRLF 导致 set -euo pipefail 一行报错pipefail 仅 bash 支持
# 避免 Windows CRLF 导致 set -euo pipefail 一行报错;pipefail 仅 bash 支持
if [ -n "${BASH_VERSION:-}" ]; then
set -o pipefail
fi
@@ -69,7 +69,7 @@ find_python() {
echo python
return
fi
echo "未找到 python3/python请先安装 Python 3.10+" >&2
echo "未找到 python3/python,请先安装 Python 3.10+" >&2
exit 1
}
@@ -81,7 +81,7 @@ check_python_version() {
major="${ver%%.*}"
minor="${ver#*.}"
if [[ "${major}" -lt 3 ]] || [[ "${major}" -eq 3 && "${minor}" -lt 10 ]]; then
echo "需要 Python 3.10+当前: ${ver}" >&2
echo "需要 Python 3.10+,当前: ${ver}" >&2
exit 1
fi
echo "Python: $("${py}" --version 2>&1)"
@@ -109,11 +109,11 @@ install_debian_venv_packages() {
local ver
ver="$(python_minor_version "${py}")"
if ! command -v apt-get >/dev/null 2>&1; then
echo " 未检测到 apt-get请手动安装 python${ver}-venv 与 python3-pip" >&2
echo " 未检测到 apt-get,请手动安装 python${ver}-venv 与 python3-pip" >&2
return 1
fi
if [[ "$(id -u)" -ne 0 ]]; then
echo " 需要 root 安装系统包请执行:" >&2
echo " 需要 root 安装系统包,请执行:" >&2
echo " sudo apt update && sudo apt install -y python${ver}-venv python3-pip curl" >&2
echo " 或: sudo bash deploy/setup_env.sh --install-system-deps" >&2
return 1
@@ -131,7 +131,7 @@ ensure_venv_prereqs() {
if check_venv_available "${py}"; then
return 0
fi
echo " 当前 Python 无法创建 venv缺少 ensurepip常见于未安装 python*-venv" >&2
echo " 当前 Python 无法创建 venv(缺少 ensurepip,常见于未安装 python*-venv)" >&2
if [[ "${INSTALL_APT_DEPS}" -eq 1 ]] || [[ "$(id -u)" -eq 0 ]]; then
install_debian_venv_packages "${py}" || exit 1
if check_venv_available "${py}"; then
@@ -171,7 +171,7 @@ setup_monitor() {
local dir_name="$1"
local proj="${REPO_ROOT}/${dir_name}"
if [[ ! -d "${proj}" ]]; then
echo " 跳过目录不存在: ${dir_name}"
echo " 跳过(目录不存在): ${dir_name}"
return
fi
step "${dir_name}"
@@ -188,7 +188,7 @@ setup_monitor() {
elif [[ -f .env ]]; then
echo " 保留已有 .env"
else
echo " 无 .env.example请手动配置 .env"
echo " 无 .env.example,请手动配置 .env"
fi
fi
mkdir -p static/images/order_charts
@@ -198,7 +198,7 @@ setup_monitor() {
setup_hub() {
local proj="${REPO_ROOT}/manual_trading_hub"
if [[ ! -d "${proj}" ]]; then
echo " 跳过 hub目录不存在"
echo " 跳过 hub(目录不存在)"
return
fi
step "manual_trading_hub"
@@ -219,9 +219,9 @@ install_pm2() {
if [[ "${SKIP_PM2}" -eq 1 ]]; then
return
fi
step "PM2可选"
step "PM2(可选)"
if ! command -v node >/dev/null 2>&1; then
echo " 未检测到 Node.js跳过安装后执行: npm install -g pm2"
echo " 未检测到 Node.js,跳过.安装后执行: npm install -g pm2"
return
fi
if command -v pm2 >/dev/null 2>&1; then
@@ -249,15 +249,15 @@ should_include hub && setup_hub
install_pm2
step "部署密钥首次自动生成不覆盖已有"
step "部署密钥(首次自动生成,不覆盖已有)"
if command -v python3 >/dev/null 2>&1; then
python3 "${REPO_ROOT}/scripts/bootstrap_deploy_secrets.py" || true
else
echo " 跳过 bootstrap_deploy_secrets未找到 python3"
echo " 跳过 bootstrap_deploy_secrets(未找到 python3)"
fi
echo ""
echo "部署完成下一步"
echo " 1. 编辑各子目录 .env交易所 API 等AI 请在中控系统设置配置"
echo " 2. 编辑各目录 .env 后使用 PM2: pm2 start ecosystem.config.cjs见 docs/ubuntu-server.md"
echo "部署完成.下一步:"
echo " 1. 编辑各子目录 .env(交易所 API 等;AI 请在中控系统设置配置)"
echo " 2. 编辑各目录 .env 后使用 PM2: pm2 start ecosystem.config.cjs(见 docs/ubuntu-server.md)"
echo ""