跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Shell / BashAI算法

TradingAgents-CN 本地化部署实战指南

介绍 TradingAgents-CN 系统的本地化部署流程。通过 1Panel 面板管理服务器,独立部署 Redis 和 MongoDB 数据库,利用 Docker Compose 编排前后端服务及 Nginx 网关。配置 LLM Hub 获取模型密钥,并通过 Python 脚本初始化数据库与管理员账户。最终开放指定端口即可访问自托管的 AI 金融分析系统,实现数据私有化与灵活定制。

云朵棉花糖发布于 2026/4/8更新于 2026/7/2442 浏览

TradingAgents-CN 本地化部署实战指南

背景与优势

市面上能深度整合金融数据的 AI 工具并不多。TradingAgents-CN 针对中国市场进行了优化,支持接入 GPT-5.2、Claude Opus 4.5 等模型,并能直接读取 A 股、美股的实时行情和财报数据进行分析。核心优势在于数据掌握在自己手中,确保安全性、私密性和可定制性。

系统界面示意

环境准备

1. 服务器配置

推荐使用 Linux 服务器。由于本方案使用 LLM Hub 解决网络访问问题,国内购买的阿里云或腾讯云服务器即可满足需求。

  • CPU: 2 核及以上
  • 内存: 4GB 及以上(推荐 8GB)
  • 系统: Ubuntu 22.04 LTS
  • 带宽: 3M 及以上

服务器配置参考

2. 模型密钥

为了使用 GPT-5.2、Claude Opus 4.5 等顶尖模型,建议通过 LLM Hub 聚合平台获取密钥。该平台支持一站式接入 OpenAI、Claude、Gemini 以及国内 Qwen、DeepSeek 等主流大模型,无需单独注册多个账号或处理复杂的网络限制。

  1. 访问 LLM Hub 官网 注册账号。
  2. 在后台创建令牌 (Token),复制 sk- 开头的密钥备用。

密钥管理界面

3. 面板安装

登录服务器终端(SSH),执行以下命令安装 1Panel 面板,以便进行可视化管理。

# 更新系统软件包
sudo apt update && sudo apt upgrade -y
# 安装 1Panel 面板
bash -c "$(curl -sSL https://resource.fit2cloud.com/1panel/package/v2/quick_start.sh)"

安装完成后,登录 1Panel 面板即可拥有可视化的管理后台。

1Panel 安装完成

数据库部署

为了保证系统稳定性,建议通过 1Panel 的应用商店独立部署数据库服务。

1. 安装 Redis
  1. 进入 1Panel 应用商店,搜索 Redis。
  2. 点击安装。
  3. 关键设置:
    • 版本:选最新的 8.x。
    • 容器名称:1panel-redis(后续配置需引用此名称)。
    • 密码:1Panel 自动生成,请记录保存。

Redis 安装配置

2. 安装 MongoDB
  1. 在 应用商店 搜索 MongoDB。
  2. 点击安装。
  3. 关键设置:
    • 版本:选最新的 8.x。
    • 容器名称:1panel-mongodb(后续配置需引用此名称)。
    • Root 用户名与密码:1Panel 自动生成,请记录保存。

MongoDB 安装配置

应用部署

1. 创建项目目录

在 1Panel 的【主机】->【文件】管理中,逐级进入目录:/opt/1panel/docker/compose。新建文件夹命名为 tradingagents-cn 并进入该目录。

创建项目目录

2. 配置文件编写

在 tradingagents-cn 目录下,我们需要手动创建必要的子文件夹和配置文件。

Nginx 配置
  1. 新建文件夹:nginx。
  2. 进入 nginx 文件夹,新建文件:nginx.conf。
  3. 填入以下内容,用于反向代理前后端服务:
user nginx; worker_processes auto; error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost; location / { proxy_pass http://frontend:80; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } location /api/ { proxy_pass http://backend:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } }
初始化脚本
  1. 回到 tradingagents-cn 根目录。
  2. 新建文件夹:scripts。
  3. 进入 scripts 文件夹,新建文件:import_config_and_create_user.py。
  4. 填入以下 Python 脚本,用于导入配置数据并创建默认管理员用户:
#!/usr/bin/env python3
"""
导入配置数据并创建默认用户
功能:
1. 从导出的 JSON 文件导入配置数据到 MongoDB
2. 创建默认管理员用户(admin/admin123)
3. 支持选择性导入集合
4. 支持覆盖或跳过已存在的数据
使用方法:
python scripts/import_config_and_create_user.py <export_file.json>
python scripts/import_config_and_create_user.py <export_file.json> --overwrite
python scripts/import_config_and_create_user.py <export_file.json> --collections system_configs users
"""
import json
import sys
import hashlib
from datetime import datetime
from pathlib import Path
from typing import List, Dict, Any, Optional
import argparse
import os

# 添加项目根目录到路径
project_root = Path(__file__).parent.parent
sys.path.insert(0, str(project_root))
from pymongo import MongoClient
from bson import ObjectId

def load_env_config(script_dir: Path) -> dict:
    """从 .env 文件加载配置"""
    env_file = script_dir.parent / '.env'
    config = {
        'mongodb_port': int(os.environ.get('MONGODB_PORT', 27017)),
        'mongodb_host': os.environ.get('MONGODB_HOST', 'localhost'),
        'mongodb_username': os.environ.get('MONGODB_USERNAME', 'admin'),
        'mongodb_password': os.environ.get('MONGODB_PASSWORD', 'tradingagents123'),
        'mongodb_database': os.environ.get('MONGODB_DATABASE', 'tradingagents')
    }
    if env_file.exists():
        try:
            file_config = {}
            with open(env_file, 'r', encoding='utf-8') as f:
                for line in f:
                    line = line.strip()
                    if not line or line.startswith('#'): continue
                    if '=' in line:
                        key, value = line.split('=', 1)
                        key = key.strip()
                        value = value.strip()
                        file_config[key] = value
            # 仅当环境变量未设置时才采纳文件配置
            if 'MONGODB_PORT' not in os.environ and 'MONGODB_PORT' in file_config:
                config['mongodb_port'] = int(file_config['MONGODB_PORT'])
            if 'MONGODB_HOST' not in os.environ and 'MONGODB_HOST' in file_config:
                config['mongodb_host'] = file_config['MONGODB_HOST']
            if 'MONGODB_USERNAME' not in os.environ and 'MONGODB_USERNAME' in file_config:
                config['mongodb_username'] = file_config['MONGODB_USERNAME']
            if 'MONGODB_PASSWORD' not in os.environ and 'MONGODB_PASSWORD' in file_config:
                config['mongodb_password'] = file_config['MONGODB_PASSWORD']
        except Exception as e:
            print(f"⚠️ 警告:读取 .env 文件失败:{e}")
    else:
        if not os.environ.get("DOCKER_CONTAINER"):
            print(f"⚠️ 警告:.env 文件不存在:{env_file}")
    return config

DB_NAME = "tradingagents"
DEFAULT_ADMIN = {
    "username": "admin",
    "password": "admin123",
    "email": "[email protected]"
}
CONFIG_COLLECTIONS = [
    "system_configs", "users", "llm_providers", "market_categories",
    "user_tags", "datasource_groupings", "platform_configs",
    "user_configs", "model_catalog"
]

def hash_password(password: str) -> str:
    return hashlib.sha256(password.encode()).hexdigest()

def convert_to_bson(data: Any) -> Any:
    if isinstance(data, dict):
        result = {}
        for key, value in data.items():
            if key == "_id" or key.endswith("_id"):
                if isinstance(value, str) and len(value) == 24:
                    try:
                        result[key] = ObjectId(value)
                        continue
                    except: pass
            if key.endswith("_at") or key in ["created_at", "updated_at", "last_login", "added_at"]:
                if isinstance(value, str):
                    try:
                        result[key] = datetime.fromisoformat(value.replace('Z', '+00:00'))
                        continue
                    except: pass
            result[key] = convert_to_bson(value)
        return result
    elif isinstance(data, list):
        return [convert_to_bson(item) for item in data]
    else:
        return data

def load_export_file(file_path: str) -> Dict[str, Any]:
    print(f"\n📂 加载导出文件:{file_path}")
    try:
        with open(file_path, 'r', encoding='utf-8') as f:
            data = json.load(f)
            if "export_info" not in data or "data" not in data:
                print("❌ 错误:文件格式不正确,缺少 export_info 或 data 字段")
                sys.exit(1)
            export_info = data["export_info"]
            print(f"✅ 文件加载成功")
            print(f"  导出时间:{export_info.get('created_at', 'Unknown')}")
            print(f"  导出格式:{export_info.get('format', 'Unknown')}")
            print(f"  集合数量:{len(export_info.get('collections', []))}")
            return data
    except FileNotFoundError:
        print(f"❌ 错误:文件不存在:{file_path}")
        sys.exit(1)
    except json.JSONDecodeError as e:
        print(f"❌ 错误:JSON 解析失败:{e}")
        sys.exit(1)
    except Exception as e:
        print(f"❌ 错误:加载文件失败:{e}")
        sys.exit(1)

def connect_mongodb(use_docker: bool = True, config: dict = None) -> MongoClient:
    if config is None:
        config = {
            'mongodb_port': 27017,
            'mongodb_host': 'localhost',
            'mongodb_username': 'admin',
            'mongodb_password': 'tradingagents123',
            'mongodb_database': 'tradingagents'
        }
    host = 'mongodb' if use_docker else config['mongodb_host']
    port = config['mongodb_port']
    username = config['mongodb_username']
    password = config['mongodb_password']
    database = config['mongodb_database']
    mongo_uri = f"mongodb://{username}:{password}@{host}:{port}/{database}?authSource=admin"
    env_name = "Docker 容器内" if use_docker else "宿主机"
    print(f"\n🔌 连接到 MongoDB ({env_name})...")
    print(f" URI: mongodb://{username}:***@{host}:{port}/{database}?authSource=admin")
    try:
        client = MongoClient(mongo_uri, serverSelectionTimeoutMS=5000)
        client.admin.command('ping')
        print(f"✅ MongoDB 连接成功")
        return client
    except Exception as e:
        print(f"❌ 错误:MongoDB 连接失败:{e}")
        if use_docker:
            print(f"  请确保在 Docker 容器内运行,或使用 --host 参数在宿主机运行")
            print(f"  检查容器:docker ps | grep mongodb")
        else:
            print(f"  请确保 MongoDB 正在运行并监听端口 {port}")
            print(f"  检查端口:netstat -an | findstr {port}")
        sys.exit(1)

def import_collection(db: Any, collection_name: str, documents: List[Dict[str, Any]], overwrite: bool = False) -> Dict[str, int]:
    collection = db[collection_name]
    converted_docs = [convert_to_bson(doc) for doc in documents]
    if overwrite:
        result = collection.delete_many({})
        deleted_count = result.deleted_count
        if converted_docs:
            result = collection.insert_many(converted_docs)
            inserted_count = len(result.inserted_ids)
        else:
            inserted_count = 0
        return {"deleted": deleted_count, "inserted": inserted_count, "skipped": 0}
    else:
        inserted_count = 0
        skipped_count = 0
        for doc in converted_docs:
            query = {}
            if "_id" in doc:
                query["_id"] = doc["_id"]
            elif "username" in doc:
                query["username"] = doc["username"]
            elif "name" in doc:
                query["name"] = doc["name"]
            else:
                collection.insert_one(doc)
                inserted_count += 1
                continue
            existing = collection.find_one(query)
            if existing:
                skipped_count += 1
            else:
                collection.insert_one(doc)
                inserted_count += 1
        return {"deleted": 0, "inserted": inserted_count, "skipped": skipped_count}

def create_default_admin(db: Any, overwrite: bool = False) -> bool:
    print(f"\n👤 创建默认管理员用户...")
    users_collection = db.users
    existing_user = users_collection.find_one({"username": DEFAULT_ADMIN["username"]})
    if existing_user:
        if not overwrite:
            print(f"⚠️ 用户 '{DEFAULT_ADMIN['username']}' 已存在,跳过创建")
            return False
        else:
            print(f"⚠️ 用户 '{DEFAULT_ADMIN['username']}' 已存在,将覆盖")
            users_collection.delete_one({"username": DEFAULT_ADMIN["username"]})
    user_doc = {
        "username": DEFAULT_ADMIN["username"],
        "email": DEFAULT_ADMIN["email"],
        "hashed_password": hash_password(DEFAULT_ADMIN["password"]),
        "is_active": True,
        "is_verified": True,
        "is_admin": True,
        "created_at": datetime.utcnow(),
        "updated_at": datetime.utcnow(),
        "last_login": None,
        "preferences": {
            "default_market": "A 股",
            "default_depth": "深度",
            "ui_theme": "light",
            "language": "zh-CN",
            "notifications_enabled": True,
            "email_notifications": False
        },
        "daily_quota": 10000,
        "concurrent_limit": 10,
        "total_analyses": 0,
        "successful_analyses": 0,
        "failed_analyses": 0,
        "favorite_stocks": []
    }
    users_collection.insert_one(user_doc)
    print(f"✅ 默认管理员用户创建成功")
    print(f"  用户名:{DEFAULT_ADMIN['username']}")
    print(f"  密码:{DEFAULT_ADMIN['password']}")
    print(f"  邮箱:{DEFAULT_ADMIN['email']}")
    print(f"  角色:管理员")
    return True

def ensure_new_providers(db: Any):
    print(f"\n✨ 检查并补充缺失的新 Provider...")
    providers_collection = db.llm_providers
    now = datetime.utcnow()
    new_providers = [
        {
            "name": "oneapi",
            "display_name": "LLM Hub",
            "description": "LLM Hub 一站式人工智能集成平台",
            "website": "https://www.llmhub.com.cn",
            "api_doc_url": "https://docs.llmhub.com.cn/",
            "default_base_url": "https://api.llmhub.com.cn/v1",
            "is_active": True,
            "supported_features": ["chat", "completion", "embedding", "image", "vision", "function_calling", "streaming"],
            "is_aggregator": True,
            "aggregator_type": "openai_compatible",
            "logo_url": "/assets/logos/oneapi.png"
        }
    ]
    added_count = 0
    for provider in new_providers:
        existing = providers_collection.find_one({"name": provider["name"]})
        if not existing:
            provider["created_at"] = now
            provider["updated_at"] = now
            provider["extra_config"] = {}
            providers_collection.insert_one(provider)
            print(f" ➕ 已自动补全:{provider['display_name']} ({provider['name']})")
            added_count += 1
        else:
            if not existing.get("is_aggregator"):
                providers_collection.update_one(
                    {"_id": existing["_id"]},
                    {"$set": {"is_aggregator": True, "aggregator_type": "openai_compatible"}}
                )
                print(f" 🔄 已更新以支持聚合模式:{provider['display_name']}")
    if added_count == 0:
        print(" ✅ 所有新 Provider 已存在,无需补充")
    else:
        print(f" 🎉 成功补全 {added_count} 个 Provider")

def main():
    parser = argparse.ArgumentParser(
        description="导入配置数据并创建默认用户",
        formatter_class=argparse.RawDescriptionHelpFormatter,
        epilog="""示例:
# 在 Docker 容器内运行(默认)
python scripts/import_config_and_create_user.py
# 在宿主机运行(连接 localhost:27017)
python scripts/import_config_and_create_user.py --host
# 从指定文件导入(默认覆盖模式)
python scripts/import_config_and_create_user.py export.json
# 增量模式:跳过已存在的数据
python scripts/import_config_and_create_user.py --incremental
# 只导入指定的集合
python scripts/import_config_and_create_user.py --collections system_configs users
# 只创建默认用户,不导入数据
python scripts/import_config_and_create_user.py --create-user-only"""
    )
    parser.add_argument("export_file", nargs="?", help="导出的 JSON 文件路径(默认:install/database_export_config_*.json)")
    parser.add_argument("--host", action="store_true", help="在宿主机运行(连接 localhost:27017),默认在 Docker 容器内运行(连接 mongodb:27017)")
    parser.add_argument("--overwrite", action="store_true", default=True, help="覆盖已存在的数据(默认:覆盖)")
    parser.add_argument("--incremental", action="store_true", help="增量模式:跳过已存在的数据")
    parser.add_argument("--collections", nargs="+", help="指定要导入的集合(默认:所有配置集合)")
    parser.add_argument("--create-user-only", action="store_true", help="只创建默认用户,不导入数据")
    parser.add_argument("--skip-user", action="store_true", help="跳过创建默认用户")
    parser.add_argument("--mongodb-port", type=int, help="MongoDB 端口(覆盖 .env 配置)")
    parser.add_argument("--mongodb-host", type=str, help="MongoDB 主机(覆盖 .env 配置)")
    args = parser.parse_args()

    if args.incremental:
        args.overwrite = False

    if not args.create_user_only and not args.export_file:
        install_dir = project_root / "install"
        if install_dir.exists():
            config_files = list(install_dir.glob("database_export_config_*.json"))
            if config_files:
                args.export_file = str(sorted(config_files)[-1])
                print(f"💡 未指定文件,使用默认配置:{args.export_file}")
            else:
                parser.error("install 目录中未找到配置文件 (database_export_config_*.json)")
        else:
            parser.error("必须提供导出文件路径,或使用 --create-user-only")

    print("=" * 80)
    print("📦 导入配置数据并创建默认用户")
    print("=" * 80)

    script_dir = Path(__file__).parent
    env_config = load_env_config(script_dir)

    if args.mongodb_port:
        env_config['mongodb_port'] = args.mongodb_port
        print(f"💡 使用命令行指定的 MongoDB 端口:{args.mongodb_port}")
    if args.mongodb_host:
        env_config['mongodb_host'] = args.mongodb_host
        print(f"💡 使用命令行指定的 MongoDB 主机:{args.mongodb_host}")

    use_docker = not args.host
    client = connect_mongodb(use_docker=use_docker, config=env_config)
    db = client[DB_NAME]

    if not args.create_user_only:
        export_data = load_export_file(args.export_file)
        data = export_data["data"]
        if args.collections:
            collections_to_import = args.collections
        else:
            collections_to_import = [c for c in CONFIG_COLLECTIONS if c in data]

        print(f"\n📋 准备导入 {len(collections_to_import)} 个集合:")
        for col in collections_to_import:
            doc_count = len(data.get(col, []))
            print(f" - {col}: {doc_count} 个文档")

        print(f"\n🚀 开始导入...")
        print(f"  模式:{'覆盖' if args.overwrite else '增量'}")
        total_stats = {"deleted": 0, "inserted": 0, "skipped": 0}

        for collection_name in collections_to_import:
            if collection_name not in data:
                print(f"⚠️ 跳过 {collection_name}: 导出文件中不存在")
                continue
            documents = data[collection_name]
            print(f"\n 导入 {collection_name}...")
            try:
                stats = import_collection(db, collection_name, documents, args.overwrite)
                total_stats["deleted"] += stats["deleted"]
                total_stats["inserted"] += stats["inserted"]
                total_stats["skipped"] += stats["skipped"]
                if args.overwrite:
                    print(f" ✅ 删除 {stats['deleted']} 个,插入 {stats['inserted']} 个")
                else:
                    print(f" ✅ 插入 {stats['inserted']} 个,跳过 {stats['skipped']} 个")
            except Exception as e:
                print(f" ❌ 失败:{e}")

        print(f"\n📊 导入统计:")
        if args.overwrite:
            print(f" 删除:{total_stats['deleted']} 个文档")
            print(f" 插入:{total_stats['inserted']} 个文档")
        if not args.overwrite:
            print(f" 跳过:{total_stats['skipped']} 个文档")

    if not args.skip_user:
        create_default_admin(db, args.overwrite)

    ensure_new_providers(db)
    client.close()

    print("\n" + "=" * 80)
    print("✅ 操作完成!")
    print("=" * 80)
    if not args.skip_user:
        print(f"\n🔐 登录信息:")
        print(f"  用户名:{DEFAULT_ADMIN['username']}")
        print(f"  密码:{DEFAULT_ADMIN['password']}")
        print(f"\n📝 后续步骤:")
        print(f"  1. 重启后端服务:docker restart tradingagents-backend")
        print(f"  2. 访问前端并使用默认账号登录")
        print(f"  3. 检查系统配置是否正确加载")

if __name__ == "__main__":
    main()
环境变量配置

回到 tradingagents-cn 目录,创建 .env 文件,填入以下配置。注意:请务必根据实际安装的 Redis 和 MongoDB 容器名称及密码修改对应字段。

# TradingAgents-CN 生产环境配置 (.env)
# ==================== 1. 核心连接配置 ====================
MONGODB_ENABLED=true
MONGODB_HOST=1panel-mongodb
MONGODB_PORT=27017
MONGODB_USERNAME=mongo_zetJdx
MONGODB_PASSWORD=mongo_WHdXh8
MONGODB_DATABASE=tradingagents
MONGODB_AUTH_SOURCE=admin
MONGODB_CONNECTION_STRING=mongodb://mongo_zetJdx:mongo_WHdXh8@1panel-mongodb:27017/tradingagents?authSource=admin

REDIS_ENABLED=true
REDIS_HOST=1panel-redis
REDIS_PORT=6379
REDIS_PASSWORD=redis_3wPzP3
REDIS_URL=redis://:redis_3wPzP3@1panel-redis:6379/0

# ==================== 2. 应用端口 ====================
APP_PORT=18000

# ==================== 3. 安全配置 (必须修改) ====================
JWT_SECRET=334a40eb30d222bee16de8ac34b6ad9af9f25cc3c7e1ed2df536401ea9f88446
CSRF_SECRET=a97e64c9678b6c3948dc0d18072753df55303592ca6aa65c6337dcc4d90638b1
ACCESS_TOKEN_EXPIRE_MINUTES=480

# ==================== 4. API 密钥 (按需填写) ====================
DEEPSEEK_API_KEY=
DEEPSEEKS_ENABLED=false
DASHSCOPE_API_KEY=
DASHSCOPE_ENABLED=false
OPENAI_API_KEY=
OPENAI_ENABLED=false

# ==================== 5. 聚合渠道配置 (LLM Hub) ====================
ONEAPI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ONEAPI_BASE_URL=https://api.llmhub.com.cn/v1

# ==================== 6. 数据源配置 ====================
TUSHARE_TOKEN=
TUSHARE_ENABLED=false

# ==================== 7. 系统参数 ====================
TZ=Asia/Shanghai
TRADINGAGENTS_LOG_LEVEL=INFO
DEBUG=false
PYTHONDONTWRITEBYTECODE=1
Docker Compose 配置

新建 .docker-compose.yml 文件,填入以下配置:

services:
  backend:
    image: hsliup/tradingagents-backend:v1.0.0-preview
    container_name: tradingagents-backend
    restart: always
    expose:
      - "8000"
    volumes:
      - ./logs:/app/logs
      - ./data:/app/data
      - ./scripts/import_config_and_create_user.py:/app/scripts/import_config_and_create_user.py
    env_file:
      - .env
    networks:
      - 1panel-network
    deploy:
      resources:
        limits:
          memory: 2G
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8000/api/health"]
      interval: 30s
      timeout: 10s
      retries: 3

  frontend:
    image: hsliup/tradingagents-frontend:v1.0.0-preview
    container_name: tradingagents-frontend
    restart: always
    expose:
      - "80"
    environment:
      VITE_API_BASE_URL: "/api"
    networks:
      - 1panel-network
    healthcheck:
      test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:80"]
      interval: 30s
      timeout: 10s
      retries: 3

  nginx:
    image: nginx:alpine
    container_name: tradingagents-nginx
    restart: always
    ports:
      - "${APP_PORT:-18000}:80"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
      - ./logs/nginx:/var/log/nginx
    networks:
      - 1panel-network
    depends_on:
      - backend
      - frontend

networks:
  1panel-network:
    external: true
3. 启动应用

在终端执行以下命令启动服务:

cd /opt/1panel/docker/compose/tradingagents-cn
docker compose --env-file .env up -d

等待日志显示 Done 表示启动完成。

启动日志

4. 初始化数据

执行初始化脚本导入数据。

初始化数据 初始化完成

看到 ✅ 操作完成 即表示初始化成功。

5. 防火墙放行

进入 VPS 防火墙设置,放行 18000 端口。

防火墙设置

访问地址为 http://<服务器 IP>:18000,即可打开项目。

访问页面

目录

  1. TradingAgents-CN 本地化部署实战指南
  2. 背景与优势
  3. 环境准备
  4. 1. 服务器配置
  5. 2. 模型密钥
  6. 3. 面板安装
  7. 更新系统软件包
  8. 安装 1Panel 面板
  9. 数据库部署
  10. 1. 安装 Redis
  11. 2. 安装 MongoDB
  12. 应用部署
  13. 1. 创建项目目录
  14. 2. 配置文件编写
  15. Nginx 配置
  16. 初始化脚本
  17. 添加项目根目录到路径
  18. 在 Docker 容器内运行(默认)
  19. 在宿主机运行(连接 localhost:27017)
  20. 从指定文件导入(默认覆盖模式)
  21. 增量模式:跳过已存在的数据
  22. 只导入指定的集合
  23. 只创建默认用户,不导入数据
  24. 环境变量配置
  25. TradingAgents-CN 生产环境配置 (.env)
  26. ==================== 1. 核心连接配置 ====================
  27. ==================== 2. 应用端口 ====================
  28. ==================== 3. 安全配置 (必须修改) ====================
  29. ==================== 4. API 密钥 (按需填写) ====================
  30. ==================== 5. 聚合渠道配置 (LLM Hub) ====================
  31. ==================== 6. 数据源配置 ====================
  32. ==================== 7. 系统参数 ====================
  33. Docker Compose 配置
  34. 3. 启动应用
  35. 4. 初始化数据
  36. 5. 防火墙放行
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • PyCharm 安装配置与使用指南
  • FPGA 中 DDS 方案设计:频率、幅度与波形可调
  • WebSocket 核心原理与前后端实战用法详解
  • 基于 LangChain 与 OpenAI 构建 AI 客服应用
  • 天工 AI 辅助产品经理工作流程与多模态功能体验
  • Python 与大数据开发:核心技术体系与职业路径解析
  • Python dotenv 库 load_dotenv() 使用指南:环境变量管理与安全实践
  • CopilotKit 与 LangGraph 集成:构建 Agent 原生应用前端交互框架
  • C++ 继承入门:从概念定义到默认成员函数
  • Open WebUI MCPo 项目详解:MCP 协议转 OpenAPI 代理服务器实现
  • VS Code 远程调用 Claude Agent 报错“无效请求”的配置修正
  • C++ 继承进阶:友元、静态成员与菱形继承
  • AI 产品经理需要了解的算法知识
  • Linux 内核源码下载指南:官方源、镜像加速与完整性校验
  • 基于中间件与多模态模型的 AI Agent 自动化架构实战
  • TRAE 与 VSCode Git 版本管理实战
  • 利用 AI 智能体高效完成 C 语言及前端实训项目
  • 快速排序原理与实现详解
  • 基于 AI 智能体的 C 语言与前端实训项目快速开发指南
  • 机器学习:逻辑回归与线性回归的区别

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online