#!/bin/bash # market_data_sync 启动脚本 # 用法:./start.sh 启动 API(默认端口 8100) # ./start.sh worker 仅启动调度器 + 同步 worker(无 web) # ./start.sh sync 手动执行一次同步任务 # ./start.sh status 查看调度器 / 数据源 / 同步任务状态 set -e SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" cd "$SCRIPT_DIR" # ---- venv ---- VENV_DIR="$SCRIPT_DIR/.venv" if [ ! -d "$VENV_DIR" ]; then echo "[market_data_sync] creating venv ..." python3 -m venv "$VENV_DIR" fi source "$VENV_DIR/bin/activate" # ---- deps ---- if [ ! -f "$VENV_DIR/.deps_installed" ] || [ requirements.txt -nt "$VENV_DIR/.deps_installed" ]; then echo "[market_data_sync] installing deps ..." pip install --upgrade pip -q pip install -r requirements.txt -q touch "$VENV_DIR/.deps_installed" fi # ---- .env ---- if [ ! -f "$SCRIPT_DIR/.env" ]; then echo "[market_data_sync] no .env found, copying .env.example" cp "$SCRIPT_DIR/.env.example" "$SCRIPT_DIR/.env" echo "[market_data_sync] ⚠️ please edit .env with your real MySQL credentials before continuing" fi # ---- export PYTHONPATH ---- export PYTHONPATH="$SCRIPT_DIR${PYTHONPATH:+:$PYTHONPATH}" # ---- ensure logs dir ---- mkdir -p "$SCRIPT_DIR/logs" # ---- dispatch ---- MODE="${1:-api}" case "$MODE" in api) PORT="${API_PORT:-8100}" HOST="${API_HOST:-0.0.0.0}" echo "[market_data_sync] starting API on $HOST:$PORT" exec uvicorn app.api.main:app --host "$HOST" --port "$PORT" --log-level info ;; worker) echo "[market_data_sync] starting scheduler worker (no web)" exec python -m app.entrypoints.worker ;; sync) TASK_ID="${2:?usage: ./start.sh sync }" echo "[market_data_sync] manual sync: $TASK_ID" exec python -m app.entrypoints.cli sync "$TASK_ID" ;; status) exec python -m app.entrypoints.cli status ;; list) exec python -m app.entrypoints.cli list ;; datasources) exec python -m app.entrypoints.cli datasources ;; *) echo "usage: $0 {api|worker|sync |status|list|datasources}" exit 1 ;; esac