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) <noreply@anthropic.com>
This commit is contained in:
kroutony 2026-03-15 10:24:31 +00:00
parent 17303d5d3d
commit 1ed455174d

161
setup.sh Executable file
View File

@ -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 CLILLM 分析必需)
# --------------------------------------------------
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 <<CRONTAB
# --- bifitnex-trading-2 ---
$CRON_ENV
$CRON_PYPATH
$CRON_MAIN
$CRON_SYNC
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"