diff --git a/.env.example b/.env.example index 11edd66a..2156a848 100644 --- a/.env.example +++ b/.env.example @@ -1,5 +1,15 @@ +# Required API Keys ALPHA_VANTAGE_API_KEY=alpha_vantage_api_key_placeholder OPENAI_API_KEY=openai_api_key_placeholder + +# Optional API Keys (for alternative LLM providers) CLAUDE_API_KEY=claude_api_key_placeholder GEMINI_API_KEY=gemini_api_key_placeholder -OPENROUTER_API_KEY=openrouter_api_key_placeholder \ No newline at end of file +OPENROUTER_API_KEY=openrouter_api_key_placeholder + +# Deployment Configuration +TRADINGAGENTS_RESULTS_DIR=/app/results +PYTHON_VERSION=3.13 + +# Frontend Configuration (for deployment) +NEXT_PUBLIC_API_URL=http://localhost:8000 \ No newline at end of file diff --git a/DEPLOY.md b/DEPLOY.md new file mode 100644 index 00000000..9285abe8 --- /dev/null +++ b/DEPLOY.md @@ -0,0 +1,471 @@ +# TradingAgents 雲端部署指南 🚀 + +本指南提供將 TradingAgents 部署到雲端的完整步驟,**重點介紹完全免費的部署方案**。 + +## 📋 目錄 + +- [免費部署方案(推薦)](#免費部署方案推薦) +- [部署前準備](#部署前準備) +- [方案 1: Vercel + Render (完全免費)](#方案-1-vercel--render-完全免費) +- [方案 2: Railway (免費額度)](#方案-2-railway-免費額度) +- [方案 3: Docker Compose (自有伺服器)](#方案-3-docker-compose-自有伺服器) +- [環境變數配置](#環境變數配置) +- [故障排除](#故障排除) + +--- + +## 🎯 免費部署方案(推薦) + +### 最佳免費組合:Vercel (Frontend) + Render (Backend) + +| 服務 | 平台 | 免費額度 | 限制 | +|------|------|----------|------| +| **Frontend** | Vercel | 無限制 | 100GB 頻寬/月 | +| **Backend** | Render | 750 小時/月 | 休眠機制(15分鐘無活動) | + +> [!TIP] +> Render 的免費方案會在 15 分鐘無活動後休眠,首次訪問需要 30-60 秒喚醒。這對於測試和個人使用完全足夠! + +--- + +## 🔧 部署前準備 + +### 1. 必要的 API 密鑰 + +您需要準備以下 API 密鑰: + +#### OpenAI API Key(必需) +- 註冊:https://platform.openai.com/ +- 獲取 API Key:https://platform.openai.com/api-keys +- 費用:按使用量計費(建議使用 gpt-4o-mini 節省成本) + +#### Alpha Vantage API Key(必需) +- 註冊:https://www.alphavantage.co/support/#api-key +- **完全免費**,TradingAgents 用戶享有 60 請求/分鐘 + +### 2. GitHub 帳號 +所有免費部署方案都需要 GitHub 帳號來連接代碼倉庫。 + +--- + +## 🎨 方案 1: Vercel + Render (完全免費) + +這是**最推薦的免費方案**,前端和後端分別部署。 + +### Step 1: 部署 Backend 到 Render + +#### 1.1 準備代碼 +確保您的代碼已推送到 GitHub。 + +#### 1.2 創建 Render 帳號 +訪問 https://render.com/ 並使用 GitHub 登入。 + +#### 1.3 創建新的 Web Service + +1. 點擊 "New +" → "Web Service" +2. 連接您的 GitHub 倉庫 +3. 配置如下: + +``` +Name: tradingagents-backend +Region: Singapore (或最近的區域) +Branch: main +Root Directory: backend +Runtime: Python 3 +Build Command: pip install -r requirements.txt +Start Command: uvicorn app.main:app --host 0.0.0.0 --port $PORT +``` + +#### 1.4 設置環境變數 + +在 Render 的 Environment 頁面添加: + +```bash +OPENAI_API_KEY=your_openai_api_key_here +ALPHA_VANTAGE_API_KEY=your_alpha_vantage_key_here +TRADINGAGENTS_RESULTS_DIR=/opt/render/project/src/results +PYTHON_VERSION=3.11 +``` + +#### 1.5 選擇免費方案 +- Instance Type: **Free** +- 點擊 "Create Web Service" + +部署需要 5-10 分鐘。完成後,您會獲得一個 URL,例如: +``` +https://tradingagents-backend.onrender.com +``` + +### Step 2: 部署 Frontend 到 Vercel + +#### 2.1 創建 Vercel 帳號 +訪問 https://vercel.com/ 並使用 GitHub 登入。 + +#### 2.2 導入項目 + +1. 點擊 "Add New..." → "Project" +2. 選擇您的 GitHub 倉庫 +3. 配置如下: + +``` +Framework Preset: Next.js +Root Directory: frontend +Build Command: npm run build +Output Directory: .next +Install Command: npm install +``` + +#### 2.3 設置環境變數 + +在 Environment Variables 添加: + +```bash +NEXT_PUBLIC_API_URL=https://tradingagents-backend.onrender.com +``` + +> [!IMPORTANT] +> 將 `tradingagents-backend.onrender.com` 替換為您在 Step 1 獲得的實際 Render URL。 + +#### 2.4 部署 + +點擊 "Deploy",等待 2-3 分鐘。完成後,您會獲得一個 URL,例如: +``` +https://tradingagents.vercel.app +``` + +### Step 3: 更新 Backend CORS 設置 + +為了讓前端能夠訪問後端,需要更新 Backend 的 CORS 配置。 + +編輯 `backend/app/main.py`,找到 CORS 配置部分,添加您的 Vercel URL: + +```python +app.add_middleware( + CORSMiddleware, + allow_origins=[ + "http://localhost:3000", + "https://tradingagents.vercel.app", # 添加您的 Vercel URL + ], + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) +``` + +提交並推送更改,Render 會自動重新部署。 + +### ✅ 完成! + +訪問您的 Vercel URL,應用程式現在已經在線上運行了! + +--- + +## 🚂 方案 2: Railway (免費額度) + +Railway 提供 $5 免費額度/月,可以同時部署前後端。 + +### Step 1: 創建 Railway 帳號 +訪問 https://railway.app/ 並使用 GitHub 登入。 + +### Step 2: 創建新項目 + +1. 點擊 "New Project" +2. 選擇 "Deploy from GitHub repo" +3. 選擇您的倉庫 + +### Step 3: 添加服務 + +#### 3.1 添加 Backend 服務 + +1. 點擊 "New Service" → "GitHub Repo" +2. 配置: + - Root Directory: `backend` + - Build Command: `pip install -r requirements.txt` + - Start Command: `uvicorn app.main:app --host 0.0.0.0 --port $PORT` + +3. 添加環境變數: +```bash +OPENAI_API_KEY=your_key_here +ALPHA_VANTAGE_API_KEY=your_key_here +TRADINGAGENTS_RESULTS_DIR=/app/results +``` + +4. 在 Settings → Networking 中生成一個公開域名 + +#### 3.2 添加 Frontend 服務 + +1. 點擊 "New Service" → "GitHub Repo" +2. 配置: + - Root Directory: `frontend` + - Build Command: `npm install && npm run build` + - Start Command: `npm start` + +3. 添加環境變數: +```bash +NEXT_PUBLIC_API_URL=https://your-backend-url.railway.app +``` + +4. 在 Settings → Networking 中生成一個公開域名 + +### ✅ 完成! + +兩個服務都會自動部署,您可以通過生成的域名訪問。 + +> [!WARNING] +> Railway 免費額度為 $5/月,通常可以運行約 500 小時。超出後需要付費。 + +--- + +## 🐳 方案 3: Docker Compose (自有伺服器) + +如果您有自己的 VPS(如 DigitalOcean、Linode、AWS EC2 等),可以使用 Docker Compose。 + +### 前置要求 +- 安裝 Docker 和 Docker Compose +- 至少 2GB RAM +- 開放端口 80 和 443 + +### Step 1: 準備環境變數 + +創建 `.env` 文件: + +```bash +cp .env.example .env +``` + +編輯 `.env`,填入您的 API 密鑰: + +```bash +OPENAI_API_KEY=your_openai_api_key +ALPHA_VANTAGE_API_KEY=your_alpha_vantage_key +TRADINGAGENTS_RESULTS_DIR=/app/results +``` + +### Step 2: 修改 docker-compose.yml + +確保 frontend 的環境變數指向正確的後端 URL: + +```yaml +environment: + - NEXT_PUBLIC_API_URL=http://your-server-ip:8000 +``` + +### Step 3: 構建並啟動 + +```bash +# 構建鏡像 +docker-compose build + +# 啟動服務 +docker-compose up -d + +# 查看日誌 +docker-compose logs -f +``` + +### Step 4: 訪問應用 + +- Frontend: http://your-server-ip:3000 +- Backend API: http://your-server-ip:8000 + +### 使用 Nginx 反向代理(可選) + +為了使用域名和 HTTPS,可以配置 Nginx: + +```nginx +server { + listen 80; + server_name yourdomain.com; + + location / { + proxy_pass http://localhost:3000; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + proxy_set_header Host $host; + proxy_cache_bypass $http_upgrade; + } + + location /api { + proxy_pass http://localhost:8000; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + } +} +``` + +使用 Certbot 獲取免費 SSL 證書: + +```bash +sudo certbot --nginx -d yourdomain.com +``` + +--- + +## 🔐 環境變數配置 + +### Backend 環境變數 + +| 變數名 | 必需 | 說明 | 範例 | +|--------|------|------|------| +| `OPENAI_API_KEY` | ✅ | OpenAI API 密鑰 | `sk-...` | +| `ALPHA_VANTAGE_API_KEY` | ✅ | Alpha Vantage API 密鑰 | `YOUR_KEY` | +| `TRADINGAGENTS_RESULTS_DIR` | ⚠️ | 結果存儲目錄 | `/app/results` | +| `PYTHON_VERSION` | ❌ | Python 版本(Render) | `3.11` | + +### Frontend 環境變數 + +| 變數名 | 必需 | 說明 | 範例 | +|--------|------|------|------| +| `NEXT_PUBLIC_API_URL` | ✅ | Backend API URL | `https://api.yourdomain.com` | + +> [!CAUTION] +> 永遠不要在前端代碼中硬編碼 API 密鑰!所有敏感信息應該在後端處理。 + +--- + +## 🔧 故障排除 + +### Backend 問題 + +#### 問題:Render 服務休眠 +**症狀**:首次訪問需要等待 30-60 秒 + +**解決方案**: +- 這是 Render 免費方案的正常行為 +- 可以使用 UptimeRobot 等服務定期 ping 您的 API 保持喚醒 +- 或升級到付費方案($7/月) + +#### 問題:ModuleNotFoundError +**症狀**:找不到 `tradingagents` 模組 + +**解決方案**: +確保 `backend/Dockerfile` 正確複製了 tradingagents 目錄: +```dockerfile +COPY ../tradingagents ./tradingagents +``` + +#### 問題:API 速率限制 +**症狀**:Alpha Vantage 返回 429 錯誤 + +**解決方案**: +- 確認使用的是 TradingAgents 專用 API key(60 req/min) +- 或在 `tradingagents/default_config.py` 中切換到其他數據源 + +### Frontend 問題 + +#### 問題:CORS 錯誤 +**症狀**:瀏覽器控制台顯示 CORS 錯誤 + +**解決方案**: +在 `backend/app/main.py` 中添加您的前端 URL 到 CORS 白名單: +```python +allow_origins=[ + "https://your-frontend-url.vercel.app", +] +``` + +#### 問題:API 連接失敗 +**症狀**:前端無法連接到後端 + +**解決方案**: +1. 檢查 `NEXT_PUBLIC_API_URL` 環境變數是否正確 +2. 確保後端服務正在運行 +3. 檢查後端 URL 是否可以公開訪問 + +### Docker 問題 + +#### 問題:構建失敗 +**症狀**:`docker-compose build` 失敗 + +**解決方案**: +```bash +# 清理舊的鏡像和緩存 +docker-compose down -v +docker system prune -a + +# 重新構建 +docker-compose build --no-cache +``` + +#### 問題:容器無法啟動 +**症狀**:`docker-compose up` 後容器立即退出 + +**解決方案**: +```bash +# 查看詳細日誌 +docker-compose logs backend +docker-compose logs frontend + +# 檢查環境變數 +docker-compose config +``` + +--- + +## 📊 成本估算 + +### 完全免費方案(Vercel + Render) + +| 項目 | 成本 | +|------|------| +| Frontend (Vercel) | **$0** | +| Backend (Render) | **$0** | +| Alpha Vantage API | **$0** | +| OpenAI API | 按使用量(建議使用 gpt-4o-mini) | + +**預估 OpenAI 成本**: +- 使用 `gpt-4o-mini`:約 $0.01-0.05 每次交易分析 +- 每天 10 次分析:約 $3-15/月 + +### Railway 方案 + +| 項目 | 成本 | +|------|------| +| Railway 免費額度 | $5/月(免費) | +| 超出後 | $0.000231/GB-s | +| OpenAI API | 按使用量 | + +--- + +## 🎯 推薦配置 + +### 個人測試使用 +- **平台**:Vercel + Render(免費) +- **LLM**:gpt-4o-mini(節省成本) +- **配置**: +```python +config["deep_think_llm"] = "gpt-4o-mini" +config["quick_think_llm"] = "gpt-4o-mini" +config["max_debate_rounds"] = 1 +``` + +### 生產環境 +- **平台**:Vercel + Railway(或 Render 付費方案) +- **LLM**:gpt-4o 或 o1-preview +- **配置**:使用默認配置 +- **監控**:添加 Sentry 或 LogRocket + +--- + +## 📚 相關資源 + +- [Vercel 文檔](https://vercel.com/docs) +- [Render 文檔](https://render.com/docs) +- [Railway 文檔](https://docs.railway.app/) +- [TradingAgents GitHub](https://github.com/TauricResearch/TradingAgents) +- [Alpha Vantage API](https://www.alphavantage.co/documentation/) + +--- + +## 🤝 需要幫助? + +如果遇到問題: +1. 查看上面的[故障排除](#故障排除)部分 +2. 檢查 GitHub Issues +3. 加入 [Discord 社群](https://discord.com/invite/hk9PGKShPK) + +--- + +**祝您部署順利!** 🚀 diff --git a/backend/Dockerfile b/backend/Dockerfile index 212282f8..0acca5d8 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -29,7 +29,8 @@ COPY --from=builder /usr/local/bin /usr/local/bin COPY ./app ./app # Copy tradingagents package from parent directory -COPY ../tradingagents ./tradingagents +# Note: This assumes docker-compose builds from project root with context +COPY ./tradingagents ./tradingagents # Create results directory RUN mkdir -p /app/results diff --git a/backend/app/core/config.py b/backend/app/core/config.py index d98210b2..793c787f 100644 --- a/backend/app/core/config.py +++ b/backend/app/core/config.py @@ -22,6 +22,9 @@ class Settings(BaseSettings): cors_origins: list = [ "http://localhost:3000", "http://frontend:3000", + "https://*.vercel.app", # Vercel deployments + "https://*.onrender.com", # Render deployments + "https://*.railway.app", # Railway deployments ] # TradingAgents Configuration diff --git a/deploy.sh b/deploy.sh new file mode 100755 index 00000000..4ecc4a25 --- /dev/null +++ b/deploy.sh @@ -0,0 +1,173 @@ +#!/bin/bash + +# TradingAgents Deployment Helper Script +# This script helps prepare your project for deployment + +set -e + +echo "🚀 TradingAgents Deployment Helper" +echo "==================================" +echo "" + +# Check if .env file exists +if [ ! -f .env ]; then + echo "⚠️ No .env file found. Creating from .env.example..." + cp .env.example .env + echo "✅ Created .env file. Please edit it with your API keys." + echo "" +fi + +# Function to check if API key is set +check_api_key() { + local key_name=$1 + local key_value=$(grep "^${key_name}=" .env | cut -d '=' -f2) + + if [ -z "$key_value" ] || [ "$key_value" = "${key_name,,}_placeholder" ]; then + echo "❌ $key_name is not set" + return 1 + else + echo "✅ $key_name is set" + return 0 + fi +} + +echo "Checking required API keys..." +echo "" + +# Check required keys +OPENAI_OK=false +ALPHA_OK=false + +if check_api_key "OPENAI_API_KEY"; then + OPENAI_OK=true +fi + +if check_api_key "ALPHA_VANTAGE_API_KEY"; then + ALPHA_OK=true +fi + +echo "" + +if [ "$OPENAI_OK" = false ] || [ "$ALPHA_OK" = false ]; then + echo "⚠️ Please set the required API keys in .env file before deploying." + echo "" + echo "Get your API keys from:" + echo " - OpenAI: https://platform.openai.com/api-keys" + echo " - Alpha Vantage: https://www.alphavantage.co/support/#api-key" + echo "" + exit 1 +fi + +echo "✅ All required API keys are configured!" +echo "" + +# Display deployment options +echo "📦 Deployment Options:" +echo "" +echo "1. Vercel (Frontend) + Render (Backend) - FREE" +echo " - Best for: Personal projects, testing" +echo " - See DEPLOY.md for detailed instructions" +echo "" +echo "2. Railway - FREE tier available" +echo " - Best for: All-in-one deployment" +echo " - See DEPLOY.md for detailed instructions" +echo "" +echo "3. Docker Compose - Self-hosted" +echo " - Best for: VPS deployment" +echo " - Run: docker-compose up -d" +echo "" + +# Ask user which deployment method +echo "Which deployment method would you like to use?" +echo "1) Vercel + Render (Recommended for free)" +echo "2) Railway" +echo "3) Docker Compose" +echo "4) Just show me the guide" +read -p "Enter your choice (1-4): " choice + +case $choice in + 1) + echo "" + echo "📖 Vercel + Render Deployment" + echo "==============================" + echo "" + echo "Step 1: Deploy Backend to Render" + echo " 1. Go to https://render.com and sign in with GitHub" + echo " 2. Click 'New +' → 'Web Service'" + echo " 3. Connect your repository" + echo " 4. Configure:" + echo " - Root Directory: backend" + echo " - Build Command: pip install -r requirements.txt" + echo " - Start Command: uvicorn app.main:app --host 0.0.0.0 --port \$PORT" + echo " 5. Add environment variables from your .env file" + echo " 6. Deploy!" + echo "" + echo "Step 2: Deploy Frontend to Vercel" + echo " 1. Go to https://vercel.com and sign in with GitHub" + echo " 2. Click 'Add New...' → 'Project'" + echo " 3. Select your repository" + echo " 4. Configure:" + echo " - Root Directory: frontend" + echo " - Framework: Next.js" + echo " 5. Add environment variable:" + echo " NEXT_PUBLIC_API_URL=" + echo " 6. Deploy!" + echo "" + echo "📚 For detailed instructions, see DEPLOY.md" + ;; + 2) + echo "" + echo "📖 Railway Deployment" + echo "====================" + echo "" + echo "1. Go to https://railway.app and sign in with GitHub" + echo "2. Click 'New Project' → 'Deploy from GitHub repo'" + echo "3. Select your repository" + echo "4. Add two services (Backend and Frontend)" + echo "5. Configure environment variables" + echo "" + echo "📚 For detailed instructions, see DEPLOY.md" + ;; + 3) + echo "" + echo "📖 Docker Compose Deployment" + echo "============================" + echo "" + echo "Running Docker Compose..." + if command -v docker-compose &> /dev/null; then + docker-compose up -d + echo "" + echo "✅ Services started!" + echo " - Frontend: http://localhost:3000" + echo " - Backend: http://localhost:8000" + echo "" + echo "To view logs: docker-compose logs -f" + echo "To stop: docker-compose down" + else + echo "❌ docker-compose not found. Please install Docker first." + echo " Visit: https://docs.docker.com/get-docker/" + fi + ;; + 4) + echo "" + echo "📚 Opening deployment guide..." + if [ -f "DEPLOY.md" ]; then + if command -v open &> /dev/null; then + open DEPLOY.md + elif command -v xdg-open &> /dev/null; then + xdg-open DEPLOY.md + else + cat DEPLOY.md + fi + else + echo "❌ DEPLOY.md not found" + fi + ;; + *) + echo "Invalid choice. Please run the script again." + exit 1 + ;; +esac + +echo "" +echo "🎉 Good luck with your deployment!" diff --git a/render.yaml b/render.yaml new file mode 100644 index 00000000..c5dec284 --- /dev/null +++ b/render.yaml @@ -0,0 +1,36 @@ +services: + # Backend API Service + - type: web + name: tradingagents-backend + runtime: python + region: singapore + plan: free + buildCommand: pip install -r requirements.txt + startCommand: uvicorn app.main:app --host 0.0.0.0 --port $PORT + envVars: + - key: PYTHON_VERSION + value: 3.11 + - key: OPENAI_API_KEY + sync: false + - key: ALPHA_VANTAGE_API_KEY + sync: false + - key: TRADINGAGENTS_RESULTS_DIR + value: /opt/render/project/src/results + healthCheckPath: /health + rootDir: backend + + # Frontend Web Service + - type: web + name: tradingagents-frontend + runtime: node + region: singapore + plan: free + buildCommand: npm install && npm run build + startCommand: npm start + envVars: + - key: NEXT_PUBLIC_API_URL + value: https://tradingagents-backend.onrender.com + - key: NODE_ENV + value: production + healthCheckPath: / + rootDir: frontend