start.sh 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #!/usr/bin/env bash
  2. set -euo pipefail
  3. SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
  4. cd "$SCRIPT_DIR"
  5. # Colors
  6. RED='\033[0;31m'
  7. GREEN='\033[0;32m'
  8. YELLOW='\033[0;33m'
  9. NC='\033[0m'
  10. log() { echo -e "${GREEN}[bx-backend]${NC} $*"; }
  11. warn() { echo -e "${YELLOW}[bx-backend]${NC} $*"; }
  12. err() { echo -e "${RED}[bx-backend]${NC} $*" >&2; }
  13. # ---- Virtual Env ----
  14. if [ -d ".venv" ]; then
  15. log "Activating .venv"
  16. source .venv/bin/activate
  17. elif [ -d "venv" ]; then
  18. log "Activating venv"
  19. source venv/bin/activate
  20. else
  21. warn "No virtual environment found, using system Python"
  22. fi
  23. # Resolve python command (prefer python, fallback to python3)
  24. PYTHON_BIN="$(command -v python 2>/dev/null || true)"
  25. if [ -z "$PYTHON_BIN" ]; then
  26. PYTHON_BIN="$(command -v python3 2>/dev/null || true)"
  27. fi
  28. if [ -z "$PYTHON_BIN" ]; then
  29. err "Neither 'python' nor 'python3' command found. Install Python 3.11+ or activate a venv."
  30. exit 1
  31. fi
  32. PYTHON_MAJOR="$("$PYTHON_BIN" -c 'import sys; print(sys.version_info.major)' 2>/dev/null || echo 0)"
  33. PYTHON_MINOR="$("$PYTHON_BIN" -c 'import sys; print(sys.version_info.minor)' 2>/dev/null || echo 0)"
  34. if [ "$PYTHON_MAJOR" -lt 3 ] || { [ "$PYTHON_MAJOR" -eq 3 ] && [ "$PYTHON_MINOR" -lt 11 ]; }; then
  35. err "Python 3.11+ is required, but got: $("$PYTHON_BIN" --version 2>&1)"
  36. err "Please make sure 'python' or 'python3' points to a compatible version."
  37. exit 1
  38. fi
  39. PYTHON="$PYTHON_BIN"
  40. log "Using Python: $PYTHON ($($PYTHON --version 2>&1))"
  41. # ---- Load .env ----
  42. if [ -f ".env" ]; then
  43. log "Loading .env"
  44. set -a
  45. while IFS='=' read -r key value; do
  46. [[ -z "$key" || "$key" =~ ^# ]] && continue
  47. value="${value%\"}"
  48. value="${value#\"}"
  49. value="${value%\'}"
  50. value="${value#\'}"
  51. export "$key=$value"
  52. done < .env
  53. set +a
  54. fi
  55. HOST="${APP_HOST:-0.0.0.0}"
  56. PORT="${APP_PORT:-8011}"
  57. DEBUG="${DEBUG:-false}"
  58. log "Starting 报销系统后端服务 on ${HOST}:${PORT} (debug=${DEBUG})"
  59. # ---- Start Server ----
  60. if [ "$DEBUG" = "true" ]; then
  61. $PYTHON -m uvicorn app.main:app --host "$HOST" --port "$PORT" --reload
  62. else
  63. $PYTHON -m uvicorn app.main:app --host "$HOST" --port "$PORT"
  64. fi