bifitnex-trading/setup.sh
kroutony 24c3f033d2 Add check_errors.py cron job for API error monitoring
- New check_errors.py: scans last 1 hour of logs, sends Slack @channel only on errors
- Add to system crontab (every 5 min)
- Update setup.sh to include check_errors.py in crontab setup

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-15 12:34:52 +00:00

165 lines
5.5 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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_CHECK="*/5 * * * * cd $PROJECT_DIR && /usr/bin/python3 check_errors.py 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
$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: 每 5 分鐘(有錯才 Slack @channel"