From fda92fde7123f2860f6f53fcab38c46e244403ec Mon Sep 17 00:00:00 2001 From: aaron <> Date: Mon, 28 Apr 2025 16:30:08 +0800 Subject: [PATCH] update --- .dockerignore | 55 +++++++++ Dockerfile | 40 +++++++ README.md | 100 +++++++++++++++- cryptoai/config/config.yaml | 12 +- .../__pycache__/config_loader.cpython-313.pyc | Bin 5173 -> 6960 bytes cryptoai/utils/config_loader.py | 45 +++++++- cryptoai/utils/db_manager.py | 27 ++++- docker-compose.yml | 21 ++++ qinglong_setup.md | 108 ++++++++++++++++++ qinglong_task.sh | 76 ++++++++++++ requirements.txt | 3 +- 11 files changed, 469 insertions(+), 18 deletions(-) create mode 100644 .dockerignore create mode 100644 Dockerfile create mode 100644 docker-compose.yml create mode 100644 qinglong_setup.md create mode 100755 qinglong_task.sh diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..76df526 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,55 @@ +# 虚拟环境 +venv/ +.venv/ +env/ +ENV/ + +# Git相关 +.git/ +.gitignore + +# Python缓存文件 +__pycache__/ +*.py[cod] +*$py.class +*.so +.Python +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg + +# 本地数据和日志 +logs/* +*/data/* +*.log +*.csv +*.json +*.db + +# IDE配置 +.idea/ +.vscode/ +*.swp +*.swo + +# Docker相关 +Dockerfile +docker-compose*.yml +.dockerignore + +# 其他 +.DS_Store +.env +.env.local +node_modules/ \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..8dfe81e --- /dev/null +++ b/Dockerfile @@ -0,0 +1,40 @@ +FROM python:3.11-slim + +# 设置工作目录 +WORKDIR /app + +# 安装基本依赖 +RUN apt-get update && apt-get install -y \ + build-essential \ + libpq-dev \ + && rm -rf /var/lib/apt/lists/* + +# 复制项目文件 +COPY . /app/ + +# 安装Python依赖 +RUN pip install -i https://mirrors.aliyun.com/pypi/simple/ --no-cache-dir -r requirements.txt + +# 设置环境变量 +ENV PYTHONUNBUFFERED=1 +ENV PYTHONPATH=/app + +# 创建配置文件目录 +RUN mkdir -p /app/config + +# 如果需要从示例配置创建配置文件 +RUN if [ -f "/app/cryptoai/config/config.example.yaml" ] && [ ! -f "/app/cryptoai/config/config.yaml" ]; then \ + cp /app/cryptoai/config/config.example.yaml /app/cryptoai/config/config.yaml; \ + fi + +# 创建数据目录 +RUN mkdir -p /app/cryptoai/data /app/logs + +# 暴露端口(如果有Web服务) +# EXPOSE 8000 + +# 设置容器启动命令 +ENTRYPOINT ["python", "run.py"] + +# 默认参数,可在docker run时覆盖 +CMD ["--agent", "crypto"] \ No newline at end of file diff --git a/README.md b/README.md index b66c0de..19453ae 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ - 利用DeepSeek大模型进行市场分析和预测 - 提供市场趋势、价格预测和交易建议 - 支持多种加密货币分析 +- 通过钉钉机器人发送分析结果 ## 项目结构 @@ -24,12 +25,105 @@ cryptoai/ ## 安装与设置 +### 本地部署 + 1. 克隆项目仓库 2. 安装依赖:`pip install -r requirements.txt` -3. 在`config/config.yaml`中配置Binance API密钥和DeepSeek API密钥 -4. 运行`python main.py`启动应用 +3. 在`cryptoai/config/config.yaml`中配置Binance API密钥和DeepSeek API密钥 +4. 运行`python run.py`启动应用 + +### Docker部署 + +1. 构建Docker镜像: + ```bash + docker build -t cryptoai . + ``` + +2. 运行容器: + ```bash + docker run -d --name cryptoai \ + -v $(pwd)/cryptoai/config/config.yaml:/app/cryptoai/config/config.yaml \ + -v cryptoai_data:/app/cryptoai/data \ + -v cryptoai_logs:/app/logs \ + -e BINANCE_API_KEY=your_key \ + -e BINANCE_API_SECRET=your_secret \ + cryptoai + ``` + +3. 使用Docker Compose部署: + ```bash + # 创建.env文件(可以基于.env-example复制) + cp .env-example .env + # 编辑.env文件,填入API密钥和其他配置 + vi .env + # 启动服务 + docker-compose up -d + ``` + +## 配置方式 + +项目支持两种配置方式: + +### 1. 配置文件 + +在`cryptoai/config/config.yaml`中配置所有设置。示例可参考`cryptoai/config/config.example.yaml`。 + +### 2. 环境变量 + +通过环境变量覆盖配置文件中的设置,支持以下环境变量: + +``` +# 数据库配置 +DB_HOST=数据库主机 +DB_PORT=数据库端口 +DB_USER=数据库用户名 +DB_PASSWORD=数据库密码 +DB_NAME=数据库名称 + +# Binance API +BINANCE_API_KEY=币安API密钥 +BINANCE_API_SECRET=币安密钥 +BINANCE_TEST_MODE=true/false + +# DeepSeek API +DEEPSEEK_API_KEY=DeepSeek API密钥 +DEEPSEEK_MODEL=使用的模型 + +# OKX API +OKX_API_KEY=OKX API密钥 +OKX_API_SECRET=OKX密钥 +OKX_PASSPHRASE=OKX密码 + +# 钉钉机器人 +DINGTALK_ENABLED=true/false +DINGTALK_WEBHOOK_URL=钉钉Webhook地址 +DINGTALK_SECRET=钉钉密钥 +``` + +在Docker中可以通过`-e`参数或`.env`文件传递环境变量。 + +## 常用命令 + +```bash +# 运行一次分析 +python run.py --run-once + +# 分析特定加密货币 +python run.py --symbol BTCUSDT + +# 使用黄金分析智能体 +python run.py --agent gold + +# Docker中运行 +docker run cryptoai --run-once --agent crypto +``` ## 环境要求 - Python 3.9+ -- 详细依赖见`requirements.txt` \ No newline at end of file +- MySQL 8.0+(使用远程MySQL数据库) +- 详细依赖见`requirements.txt` + +## 数据库配置 + +项目使用SQLAlchemy ORM连接MySQL数据库,用于存储分析结果。默认连接到远程MySQL服务器,可以通过环境变量或配置文件自定义连接信息。 \ No newline at end of file diff --git a/cryptoai/config/config.yaml b/cryptoai/config/config.yaml index 103a1f6..76c571a 100644 --- a/cryptoai/config/config.yaml +++ b/cryptoai/config/config.yaml @@ -27,13 +27,13 @@ alltick: crypto: base_currencies: - "BTC" - # - "ETH" - # - "BNB" - # - "SOL" - # - "SUI" + - "ETH" + - "BNB" + - "SOL" + - "SUI" # - "WLD" quote_currency: "USDT" - time_interval: "4h" # 可选: 1m, 5m, 15m, 30m, 1h, 4h, 1d + time_interval: "1h" # 可选: 1m, 5m, 15m, 30m, 1h, 4h, 1d # 黄金市场分析配置 gold: @@ -53,7 +53,7 @@ gold: # 数据设置 data: storage_path: "./cryptoai/data" - historical_days: 180 + historical_days: 90 update_interval: 60 # 数据更新间隔(分钟) # Agent设置 diff --git a/cryptoai/utils/__pycache__/config_loader.cpython-313.pyc b/cryptoai/utils/__pycache__/config_loader.cpython-313.pyc index 99ba80b7f0e4dd748b7fb2ea1d43c5b223253a92..d2cc8d65501a4406645c973fbad51247f2f1749d 100644 GIT binary patch delta 2191 zcma)7Uu;uV7(e&+e{Xx+wfoa{%ynxwdW97jgN(vv2Ai;9H`rMfWwLbbUFq1`dTxiz zkdzm7OTtGFhC3hh=mMNK^CcD)hA0Hrd~U& zAJz^V+E@*-X=9}F~v_z&8Nhvxy zIW4_5(Go+cme%oIkwh|u{A9qN784OMk&Z-1{gLG4z2F%DWHm}A(~k^YVNYx8?%nO} zvOa>QQ|V+leoZ5*Pba0ctWG5n!6`{ZvOX1-q}P)uD(j-7BMDV_QpCqKzcD}I=d??0 z?{I5cV5*)Q`taljC-a=|mZP`es4F<0DQwwVsBOAW!slnYvqxu-&KbWkdDc|GBrHAD z{>U7wC(DuzJ?A1~DjiQI1T|`)Bg`1$lv(ZE*wV_p zinEpy^LI;K8P*nS8xzLIttHl?)m?^l+uF{Fo8miN@oX99M->4+PML?5l@P#;uA1#v z;R|LjpI}bX<59|>8ed_X8zH-g9tJ7CVg{e;psLNlz( zK4H-O*q~%cv^C|l8=d>SP$+@KL9jw(SDG(#R* zpcPj5H3>Gv;*_c~vuAyy?BIwMfGKiNskRflXqJkScF+XCiLQ{c^+6i|9B_jW;{}3k zs)`u?^6qDMvRCe2Uc7tp`kl}5y*DrZ{Ka)dY=ErmJ~(n@01hF0sdsE(a0tTTZ8?Z|t(NDSl4riOAcc$($|xxjp9u5(eydkzrh zNPOAkUeklB=b1vKvry?OI6Q@#2J!&7j5GY24b%!NF8{L2|D9{+Y~ReGg2nc&#Zzc# zp7UV-z6R9pBF0wd4ZQ==e^X$UX8_S#D=_^+4gR~L_iz*GA^N5w`Zg#}Lh-B*&~6un z9twRF`Y8-jc#*;@6i!i?#BbZ`+NhV}%c7$#3e=foCWrPG_+H&{UtO=^uO3-|x!|9G zG}jI?c*VB5{UKmA+t&2;8t2ua186>WN8{re>O8q*CvBGwmQ2yCrq7xIKdzaDn8U%Md##p)47-J zN$_C|y$C)!pY+LT@k#Je1YZjA#rlK#D&kKW>Vx1tvB-1@l z4&(A?YWNDZJKP7%SFjnNFZlO#OW+fJNVCBjw-Bj`!dtAW%xQ#n&6LM4PMw{+VDdzx zze0LIXL%B*sc;9*)Jow+9Md3^W2mwY$S{abUq$k`pYq~HoTB%mJLx$wqgw3n9wty- zWy2$=TM~>rbT^IR;y; zT5UdNc~m}*l{TD&%B_GDgUOKy#36|Bn7NL=(f5udAO+Wq@PIe~emLm`Yz7Phh5;jh zQNTXH7~l|{NVNAu1LEGWAVdJ@Q~kkk6}{xQedRU3b$icUd+ERmV&Rt_`XupM|Bg6+ uw>zHem_Z_f-$|b)jikHj-!C_Wp^3>;)91&B$%z}OPWdRt-QN(<^?w6zY`^&c diff --git a/cryptoai/utils/config_loader.py b/cryptoai/utils/config_loader.py index 50447b0..88d785f 100644 --- a/cryptoai/utils/config_loader.py +++ b/cryptoai/utils/config_loader.py @@ -31,6 +31,16 @@ class ConfigLoader: # 加载配置 self.config = self._load_config() + + # 确保database配置存在 + if 'database' not in self.config: + self.config['database'] = { + 'host': 'gz-cynosdbmysql-grp-2j1cnopr.sql.tencentcdb.com', + 'port': 27469, + 'user': 'root', + 'password': 'Aa#223388', + 'db_name': 'cryptoai' + } def _load_config(self) -> Dict[str, Any]: """ @@ -94,4 +104,37 @@ class ConfigLoader: def get_dingtalk_config(self) -> Dict[str, Any]: """获取钉钉机器人配置""" - return self.get_config('dingtalk') \ No newline at end of file + return self.get_config('dingtalk') + + def get_database_config(self) -> Dict[str, Any]: + """获取数据库配置""" + # 首先从配置文件获取 + db_config = self.get_config('database') + + # 使用环境变量覆盖(如果存在) + if os.environ.get('DB_HOST'): + db_config['host'] = os.environ.get('DB_HOST') + if os.environ.get('DB_PORT'): + db_config['port'] = int(os.environ.get('DB_PORT')) + if os.environ.get('DB_USER'): + db_config['user'] = os.environ.get('DB_USER') + if os.environ.get('DB_PASSWORD'): + db_config['password'] = os.environ.get('DB_PASSWORD') + if os.environ.get('DB_NAME'): + db_config['db_name'] = os.environ.get('DB_NAME') + + # 确保返回默认值(如果配置不存在) + default_config = { + 'host': 'gz-cynosdbmysql-grp-2j1cnopr.sql.tencentcdb.com', + 'port': 27469, + 'user': 'root', + 'password': 'Aa#223388', + 'db_name': 'cryptoai' + } + + # 合并默认配置和实际配置 + for key, value in default_config.items(): + if key not in db_config: + db_config[key] = value + + return db_config \ No newline at end of file diff --git a/cryptoai/utils/db_manager.py b/cryptoai/utils/db_manager.py index 04134ed..d7ba2ec 100644 --- a/cryptoai/utils/db_manager.py +++ b/cryptoai/utils/db_manager.py @@ -13,6 +13,8 @@ from sqlalchemy.orm import sessionmaker from sqlalchemy.dialects.mysql import JSON from sqlalchemy.pool import QueuePool +from utils.config_loader import ConfigLoader + # 配置日志 logging.basicConfig( level=logging.INFO, @@ -244,12 +246,25 @@ def get_db_manager(host: Optional[str] = None, if _db_instance is not None: return _db_instance - # 从环境变量获取配置 - db_host = host or os.environ.get('DB_HOST', 'gz-cynosdbmysql-grp-2j1cnopr.sql.tencentcdb.com') - db_port = port or int(os.environ.get('DB_PORT', '27469')) - db_user = user or os.environ.get('DB_USER', 'root') - db_password = password or os.environ.get('DB_PASSWORD', 'Aa#223388') - db_name = db_name or os.environ.get('DB_NAME', 'cryptoai') + # 如果未指定参数,从配置加载器获取数据库配置 + if host is None or port is None or user is None or password is None or db_name is None: + config_loader = ConfigLoader() + db_config = config_loader.get_database_config() + + # 使用配置中的值或默认值 + db_host = host or db_config.get('host') + db_port = port or db_config.get('port') + db_user = user or db_config.get('user') + db_password = password or db_config.get('password') + db_name = db_name or db_config.get('db_name') + + logger.info(f"从配置加载数据库连接信息: {db_host}:{db_port}/{db_name}") + else: + db_host = host + db_port = port + db_user = user + db_password = password + db_name = db_name # 创建实例 _db_instance = DBManager( diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..702619f --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,21 @@ +version: '3.8' + +services: + cryptoai: + build: + context: . + dockerfile: Dockerfile + container_name: cryptoai + image: cryptoai:0.0.1 + restart: unless-stopped + volumes: + # 挂载配置文件 + - ./cryptoai/config/config.yaml:/app/cryptoai/config/config.yaml + # 持久化数据和日志 + - cryptoai_data:/app/cryptoai/data + - cryptoai_logs:/app/logs + command: ["--run-once", "--agent", "crypto"] + +volumes: + cryptoai_data: + cryptoai_logs: \ No newline at end of file diff --git a/qinglong_setup.md b/qinglong_setup.md new file mode 100644 index 0000000..183f91e --- /dev/null +++ b/qinglong_setup.md @@ -0,0 +1,108 @@ +# 在青龙面板中部署CryptoAI项目 + +本文档介绍如何在青龙面板中部署和运行CryptoAI加密货币分析项目。 + +## 一、前提条件 + +1. 已经安装并配置好青龙面板 +2. 拥有青龙面板的管理权限 +3. 已获取必要的API密钥(Binance、DeepSeek等) + +## 二、部署步骤 + +### 1. 上传项目到青龙容器 + +有两种方法可以将项目上传到青龙容器: + +#### 方法一:使用青龙面板的文件管理功能 + +1. 在青龙面板中,点击左侧菜单的【文件管理】 +2. 点击【新建目录】,创建 `/ql/scripts/cryptoai` 目录 +3. 将CryptoAI项目文件上传到该目录中 + +#### 方法二:使用Docker CP命令 + +1. 确定青龙容器的ID或名称 + ```bash + docker ps | grep qinglong + ``` + +2. 将项目文件复制到容器中 + ```bash + docker cp /path/to/cryptoai container_name:/ql/scripts/ + ``` + +### 2. 创建定时任务脚本 + +1. 创建 `qinglong_task.sh` 脚本文件(已在项目中提供) +2. 编辑脚本中的API密钥和其他配置,确保填入正确的值 +3. 将脚本上传到青龙容器的 `/ql/scripts/` 目录下 + +### 3. 配置青龙定时任务 + +1. 在青龙面板中,点击左侧菜单的【定时任务】 +2. 点击【创建任务】,填写以下信息: + - 名称:CryptoAI加密货币分析 + - 命令:bash /ql/scripts/qinglong_task.sh + - 定时规则:根据需要设置,例如每天执行一次可设置为 `0 8 * * *` + - 其他选项根据需要设置 + +## 三、环境变量配置 + +为便于管理,可以在青龙面板中设置环境变量: + +1. 在青龙面板中,点击左侧菜单的【环境变量】 +2. 点击【创建变量】,添加以下变量(根据实际情况填写): + +| 名称 | 值 | 备注 | +|------|----|----| +| DB_HOST | gz-cynosdbmysql-grp-2j1cnopr.sql.tencentcdb.com | 数据库主机 | +| DB_PORT | 27469 | 数据库端口 | +| DB_USER | root | 数据库用户名 | +| DB_PASSWORD | Aa#223388 | 数据库密码 | +| DB_NAME | cryptoai | 数据库名 | +| BINANCE_API_KEY | your_key | 币安API密钥 | +| BINANCE_API_SECRET | your_secret | 币安密钥 | +| DEEPSEEK_API_KEY | your_key | DeepSeek API密钥 | +| DINGTALK_ENABLED | true | 是否启用钉钉通知 | +| DINGTALK_WEBHOOK_URL | your_url | 钉钉Webhook地址 | +| DINGTALK_SECRET | your_secret | 钉钉加签密钥 | + +## 四、验证部署 + +1. 在青龙面板的【定时任务】页面,找到刚创建的任务 +2. 点击【运行】按钮进行测试运行 +3. 点击【日志】查看执行情况,确认是否正常运行 + +## 五、常见问题 + +### 依赖安装问题 + +如果遇到依赖安装问题,可以在青龙容器中手动安装: + +```bash +cd /ql/scripts/cryptoai +pip install -r requirements.txt +``` + +### 权限问题 + +如果遇到权限问题,可以修改脚本权限: + +```bash +chmod +x /ql/scripts/qinglong_task.sh +``` + +### 数据库连接问题 + +确保数据库能够从青龙容器所在网络访问。如果使用内网数据库,可能需要配置网络连接。 + +## 六、更新方式 + +当需要更新CryptoAI项目时,只需替换 `/ql/scripts/cryptoai` 目录下的文件即可。 + +确保配置文件和数据不被覆盖,最好在更新前备份数据目录: + +```bash +docker cp container_name:/ql/scripts/cryptoai/data /backup/path +``` \ No newline at end of file diff --git a/qinglong_task.sh b/qinglong_task.sh new file mode 100755 index 0000000..ac0b627 --- /dev/null +++ b/qinglong_task.sh @@ -0,0 +1,76 @@ +#!/bin/bash +# 青龙面板定时任务脚本 - CryptoAI加密货币分析 + +# 设置工作目录 +WORKDIR="/ql/scripts/cryptoai" + +# 如果目录不存在则退出 +if [ ! -d "$WORKDIR" ]; then + echo "工作目录不存在,请先将CryptoAI项目上传到青龙容器内的 /ql/scripts/cryptoai 路径" + exit 1 +fi + +# 进入工作目录 +cd "$WORKDIR" + +# 设置Python路径 +export PYTHONPATH=$WORKDIR + +# 设置环境变量 +# 数据库配置 +export DB_HOST="gz-cynosdbmysql-grp-2j1cnopr.sql.tencentcdb.com" +export DB_PORT="27469" +export DB_USER="root" +export DB_PASSWORD="Aa#223388" +export DB_NAME="cryptoai" + +# API配置 - 请替换为自己的API密钥 +export BINANCE_API_KEY="HCpeel8g6fsTK2630b7BvGBcS09Z3qfXkLVcAY2JkpaiMm1J6DWRvoQZBQlElDJg" +export BINANCE_API_SECRET="TySs6onlHOTrGzV8fMdDxLKTWWYnQ4rCHVAmjrcHby17acKflmo7xVTWVsbqtxe7" +export BINANCE_TEST_MODE="false" + +export DEEPSEEK_API_KEY="sk-9f6b56f08796435d988cf202e37f6ee3" +export DEEPSEEK_MODEL="deepseek-chat" + +export OKX_API_KEY="7abe4037-3d93-40d4-a77b-c77f4a1e9490" +export OKX_API_SECRET="654946A2045F44CC2853D47F96C62F4E" +export OKX_PASSPHRASE="Aa@123456" +export OKX_TEST_MODE="false" + +# 钉钉配置 +export DINGTALK_ENABLED="true" +export DINGTALK_WEBHOOK_URL="https://oapi.dingtalk.com/robot/send?access_token=2278b723cd363bb6f85592c743b59b166e70b9e02a275bb5cedbc33b53a5cbdc" +export DINGTALK_SECRET="your_dingtalk_secret" + +# 确保日志目录存在 +if [ ! -d "$WORKDIR/logs" ]; then + mkdir -p "$WORKDIR/logs" +fi + +# 记录开始时间 +echo "==============================" +echo "开始执行CryptoAI分析: $(date)" +echo "==============================" + +# 检查是否有Python虚拟环境 +if [ -d "/ql/scripts/cryptoai/venv" ]; then + echo "使用项目虚拟环境" + source /ql/scripts/cryptoai/venv/bin/activate +fi + +# 检查依赖是否安装 +if ! pip list | grep -q "sqlalchemy"; then + echo "安装依赖..." + pip install -r requirements.txt +fi + +# 运行加密货币分析 +python run.py --run-once --agent crypto + +# 如果需要运行黄金分析,取消下面的注释 +# python run.py --run-once --agent gold + +# 记录结束时间 +echo "==============================" +echo "CryptoAI分析完成: $(date)" +echo "==============================" \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index c2aba77..973c669 100644 --- a/requirements.txt +++ b/requirements.txt @@ -13,5 +13,4 @@ langchain>=0.0.267 pydantic>=2.3.0 fastapi>=0.103.1 uvicorn>=0.23.2 -alltick-api==0.0.1 -okx-api==0.0.1 \ No newline at end of file +sqlalchemy==2.0.31