170 lines
5.6 KiB
Bash
Executable File
170 lines
5.6 KiB
Bash
Executable File
#!/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=/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 <<CRONTAB
|
||
|
||
# --- bifitnex-trading-2 ---
|
||
$CRON_ENV
|
||
|
||
$CRON_MAIN
|
||
$CRON_SYNC
|
||
$CRON_CHECK
|
||
CRONTAB
|
||
) | crontab -
|
||
echo " crontab installed ✓"
|
||
fi
|
||
|
||
# --------------------------------------------------
|
||
# 完成
|
||
# --------------------------------------------------
|
||
echo ""
|
||
echo "=== Setup complete ==="
|
||
if [ "$ENV_READY" = true ]; then
|
||
echo "✅ 可以開始運行。測試方式:"
|
||
echo " cd $PROJECT_DIR"
|
||
echo " python3 main.py # 手動執行一次交易 cycle"
|
||
echo " python3 sync_cost_basis.py # 手動同步成本"
|
||
else
|
||
echo "⚠️ 請先完成 .env 設定,然後執行:"
|
||
echo " cd $PROJECT_DIR && python3 main.py"
|
||
fi
|
||
echo ""
|
||
echo "Crontab 排程:"
|
||
echo " main.py: 每 5 分鐘(延遲 30 秒)"
|
||
echo " sync_cost_basis.py: 每小時 :02 和 :32"
|
||
echo " check_errors.py: 每小時 :07(有錯才 Slack @channel)"
|