- 系统架构总览:技术栈、目录结构、数据流向 - 指标引擎详解:16个指标完整原理与参数(含源码行号) - 信号评分引擎:多指标共振评分机制、动态阈值、案例分析 - 大周期偏向判定:assessBigTimeframeBias 完整说明 - EWO转换检测机制:evaluateEwoTurnForUser 逐步流程 - 飞书通知格式规范:三类通知完整格式模板 - 类型系统参考:所有 TypeScript 类型完整文档 - 数据库与存储:MySQL 表结构、缓存机制、维护指南 - 部署运维指南:Docker Compose、Nginx、飞书配置 - 开发历史与TODO:功能状态表、优先级路线图 - 优化建议汇总:9项优化建议含源码位置和预期效果
6.2 KiB
6.2 KiB
tradehk 部署运维指南
返回:tradehk 文档中心 源文件:
docker-compose.yml、deploy/deploy.sh、deploy/nginx.conf
概述
tradehk 采用 Docker Compose 部署,包含三个容器:Node.js 应用服务、MySQL 数据库、Nginx 反向代理。支持一键部署脚本。
环境要求
| 组件 | 版本要求 |
|---|---|
| Docker | 20.10+ |
| Docker Compose | 2.0+ |
| 服务器内存 | 最低 2GB |
| 服务器磁盘 | 最低 20GB |
| 操作系统 | Ubuntu 20.04+ / CentOS 7+ |
快速部署
第一步:克隆仓库
git clone ssh://git@git.hk.hao.work:2222/hao/tradehk.git
cd tradehk
第二步:配置环境变量
复制并编辑环境变量文件:
cp .env.example .env
关键环境变量说明:
| 变量 | 必填 | 说明 | 示例 |
|---|---|---|---|
DATABASE_URL |
✅ | MySQL 连接字符串 | mysql://user:pass@mysql:3306/tradehk |
JWT_SECRET |
✅ | JWT 签名密钥(随机字符串) | your-secret-key-here |
LARK_WEBHOOK_URL |
⭕ | 飞书 Webhook URL | https://open.feishu.cn/... |
MARKET_ENGINE_POLL_MS |
⭕ | 引擎轮询间隔(毫秒) | 30000 |
MARKET_SUMMARY_INTERVAL_HOURS |
⭕ | 汇总通知间隔(小时) | 4 |
BINANCE_API_KEY |
⭕ | Binance API Key(自动交易需要) | your-api-key |
BINANCE_API_SECRET |
⭕ | Binance API Secret | your-api-secret |
第三步:一键部署
chmod +x deploy/deploy.sh
./deploy/deploy.sh
部署脚本会自动完成:
- 构建 Docker 镜像
- 启动 MySQL 容器并等待就绪
- 运行数据库迁移(Drizzle migrate)
- 启动 Node.js 应用容器
- 启动 Nginx 反向代理
Docker Compose 结构
services:
app:
build: .
ports:
- "3000:3000"
environment:
- DATABASE_URL
- JWT_SECRET
- LARK_WEBHOOK_URL
depends_on:
mysql:
condition: service_healthy
mysql:
image: mysql:8.0
volumes:
- mysql_data:/var/lib/mysql
- ./deploy/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 5
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./deploy/nginx.conf:/etc/nginx/conf.d/default.conf
depends_on:
- app
volumes:
mysql_data:
Nginx 配置说明
tradehk 的 Nginx 配置实现了:
- 前端静态文件服务:React 构建产物(
/dist) - API 反向代理:
/api/*转发到 Node.js 应用(localhost:3000) - WebSocket 代理:支持 tRPC WebSocket 连接
- HTTPS 支持:可配置 SSL 证书
关键配置片段:
server {
listen 80;
server_name your-domain.com;
# 前端静态文件
location / {
root /app/dist;
try_files $uri $uri/ /index.html;
}
# API 代理
location /api/ {
proxy_pass http://app:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
}
}
数据库管理
运行迁移
docker compose exec app pnpm drizzle-kit migrate
查看数据库
docker compose exec mysql mysql -u root -p tradehk
常用 SQL 查询
查看最近信号:
SELECT symbol, interval, direction, strength, price,
FROM_UNIXTIME(signalAt/1000) as signal_time
FROM signals
ORDER BY signalAt DESC
LIMIT 20;
查看 EWO 转换统计:
SELECT symbol, interval, direction, COUNT(*) as count
FROM signals
WHERE direction IN ('long', 'short')
GROUP BY symbol, interval, direction
ORDER BY count DESC;
日常运维
查看日志
# 应用日志
docker compose logs -f app
# 最近100行
docker compose logs --tail=100 app
# 只看错误
docker compose logs app 2>&1 | grep -i error
重启服务
# 重启应用(不重启数据库)
docker compose restart app
# 完整重启
docker compose down && docker compose up -d
更新部署
git pull
docker compose build app
docker compose up -d app
备份数据库
docker compose exec mysql mysqldump -u root -p tradehk > backup_$(date +%Y%m%d).sql
飞书 Webhook 配置
获取 Webhook URL
- 在飞书群中添加自定义机器人
- 复制 Webhook URL(格式:
https://open.feishu.cn/open-apis/bot/v2/hook/xxx) - 设置到环境变量
LARK_WEBHOOK_URL
测试通知
curl -X POST "https://open.feishu.cn/open-apis/bot/v2/hook/xxx" \
-H "Content-Type: application/json" \
-d '{"msg_type":"text","content":{"text":"tradehk 通知测试"}}'
性能调优
MySQL 配置(deploy/mysql/my.cnf)
| 参数 | 推荐值 | 说明 |
|---|---|---|
innodb_buffer_pool_size |
服务器内存的50% | InnoDB 缓冲池 |
max_connections |
200 | 最大连接数 |
query_cache_size |
64M | 查询缓存 |
引擎轮询间隔
- 默认:30秒(
MARKET_ENGINE_POLL_MS=30000) - 激进:10秒(更快响应,更高 API 消耗)
- 保守:60秒(减少 API 调用,适合多币对监控)
注意:Binance API 有速率限制,监控超过20个币对时建议将轮询间隔设为60秒以上。
常见问题
Q:EWO 转换通知没有收到?
检查顺序:
LARK_WEBHOOK_URL是否正确配置- 用户设置中
larkWebhookEnabled是否为 true ewoTurnRules中是否有对应币对的规则且enabled=true- 查看应用日志是否有推送错误
Q:信号通知太频繁?
调整 signalLarkThrottleMinutes 参数(在用户设置中),默认10分钟,可以增加到30-60分钟。
Q:数据库磁盘占用增长过快?
signals 表会持续增长。建议设置定期清理任务:
DELETE FROM signals WHERE signalAt < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 30 DAY)) * 1000;