From 1ed455174d866815682ca2f19341c46784c20f32 Mon Sep 17 00:00:00 2001 From: kroutony Date: Sun, 15 Mar 2026 10:24:31 +0000 Subject: [PATCH] Add setup.sh for new machine deployment Automates: Python check, pip install, .env init, Claude CLI check, data file creation, and crontab setup. Co-Authored-By: Claude Opus 4.6 (1M context) --- setup.sh | 161 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 161 insertions(+) create mode 100755 setup.sh diff --git a/setup.sh b/setup.sh new file mode 100755 index 0000000..5c87f2e --- /dev/null +++ b/setup.sh @@ -0,0 +1,161 @@ +#!/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. 安裝 pip 套件 +# -------------------------------------------------- +echo "[2/6] Installing Python packages..." +$PYTHON -m pip install --user -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..." + +CRON_MAIN="*/5 * * * * sleep 30 && cd $PROJECT_DIR && /usr/bin/python3 main.py >> cron.log 2>&1" +CRON_SYNC="2,32 * * * * cd $PROJECT_DIR && /usr/bin/python3 sync_cost_basis.py >> sync_cost_basis_cron.log 2>&1" +CRON_ENV="PATH=$HOME/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" +CRON_PYPATH="PYTHONPATH=$HOME/.local/lib/python3.12/site-packages" + +# 檢查是否已有此專案的 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 <