#!/usr/bin/env bash # ============================================================ # bifitnex-trading-2 — 新機器前置設定腳本 # 使用方式: chmod +x setup.sh && ./setup.sh # ============================================================ set -euo pipefail PROJECT_DIR="$(cd "$(dirname "$0")" && pwd)" PYTHON=${PYTHON:-python3} echo "=== bifitnex-trading-2 setup ===" echo "Project dir: $PROJECT_DIR" echo "" # -------------------------------------------------- # 1. 檢查 Python 版本(需 3.12+) # -------------------------------------------------- echo "[1/6] Checking Python..." if ! command -v $PYTHON &>/dev/null; then echo "ERROR: $PYTHON not found. Install Python 3.12+ first." exit 1 fi PY_VER=$($PYTHON -c 'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}")') PY_MAJOR=$($PYTHON -c 'import sys; print(sys.version_info.major)') PY_MINOR=$($PYTHON -c 'import sys; print(sys.version_info.minor)') if [ "$PY_MAJOR" -lt 3 ] || [ "$PY_MINOR" -lt 12 ]; then echo "ERROR: Python 3.12+ required, got $PY_VER" exit 1 fi echo " Python $PY_VER ✓" # -------------------------------------------------- # 2. 建立 venv 並安裝 pip 套件 # -------------------------------------------------- echo "[2/6] Setting up venv and installing packages..." VENV_DIR="$PROJECT_DIR/.venv" if [ ! -d "$VENV_DIR" ]; then $PYTHON -m venv "$VENV_DIR" echo " created .venv" fi VENV_PYTHON="$VENV_DIR/bin/python" "$VENV_PYTHON" -m pip install -r "$PROJECT_DIR/requirements.txt" -q echo " packages installed ✓" # -------------------------------------------------- # 3. 檢查 .env # -------------------------------------------------- echo "[3/6] Checking .env..." if [ ! -f "$PROJECT_DIR/.env" ]; then cp "$PROJECT_DIR/.env.example" "$PROJECT_DIR/.env" echo " Created .env from .env.example" echo " ⚠️ 請編輯 .env 填入以下資訊:" echo " - BFX_API_KEY" echo " - BFX_API_SECRET" echo " - SLACK_WEBHOOK_URL" echo " - PAPER_TRADING=false (正式交易)" ENV_READY=false else # 檢查必填欄位 ENV_READY=true for key in BFX_API_KEY BFX_API_SECRET SLACK_WEBHOOK_URL; do val=$(grep "^$key=" "$PROJECT_DIR/.env" | cut -d= -f2-) if [ -z "$val" ] || [[ "$val" == *"your_"* ]]; then echo " ⚠️ $key 尚未設定" ENV_READY=false fi done if [ "$ENV_READY" = true ]; then echo " .env configured ✓" else echo " 請編輯 $PROJECT_DIR/.env 填入缺少的值" fi fi # -------------------------------------------------- # 4. 檢查 Claude CLI(LLM 分析必需) # -------------------------------------------------- echo "[4/6] Checking Claude CLI..." if command -v claude &>/dev/null; then CLAUDE_VER=$(claude --version 2>/dev/null || echo "unknown") echo " claude $CLAUDE_VER ✓" else echo " ⚠️ Claude CLI 未安裝" echo " 安裝方式: npm install -g @anthropic-ai/claude-code" echo " 安裝後執行 claude 登入 Anthropic 帳號" fi # -------------------------------------------------- # 5. 初始化資料檔案 # -------------------------------------------------- echo "[5/6] Initializing data files..." cd "$PROJECT_DIR" # positions.json if [ ! -f positions.json ]; then echo '{"total_balance_usdt": 0, "available_usdt": 0, "positions": {}, "trade_history": []}' > positions.json echo " created positions.json" fi # cost_tracking.json if [ ! -f cost_tracking.json ]; then echo '{}' > cost_tracking.json echo " created cost_tracking.json" fi # stop_orders.json if [ ! -f stop_orders.json ]; then echo '{}' > stop_orders.json echo " created stop_orders.json" fi # bot_state.json if [ ! -f bot_state.json ]; then echo '{"last_status_report": 0, "run_count": 0}' > bot_state.json echo " created bot_state.json" fi echo " data files ✓" # -------------------------------------------------- # 6. 設定 crontab # -------------------------------------------------- echo "[6/6] Setting up crontab..." VENV_PYTHON="$PROJECT_DIR/.venv/bin/python" CRON_MAIN="*/5 * * * * sleep 30 && cd $PROJECT_DIR && $VENV_PYTHON main.py >> cron.log 2>&1" CRON_SYNC="2,32 * * * * cd $PROJECT_DIR && $VENV_PYTHON sync_cost_basis.py >> sync_cost_basis_cron.log 2>&1" CRON_CHECK="7 * * * * cd $PROJECT_DIR && $VENV_PYTHON check_errors.py 2>&1" CRON_ENV="PATH=$HOME/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" # 檢查是否已有此專案的 crontab if crontab -l 2>/dev/null | grep -q "bifitnex-trading"; then echo " crontab already has bifitnex entries, skipping" echo " 現有 crontab:" crontab -l 2>/dev/null | grep "bifitnex" || true else # 備份現有 crontab 並附加 (crontab -l 2>/dev/null || true; cat <