start_prod.sh 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. #!/usr/bin/env bash
  2. # Allow users to run `sh start_prod.sh` by auto-switching to bash.
  3. if [ -z "${BASH_VERSION:-}" ]; then
  4. exec bash "$0" "$@"
  5. fi
  6. set -euo pipefail
  7. SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
  8. cd "$SCRIPT_DIR"
  9. # Colors
  10. RED='\033[0;31m'
  11. GREEN='\033[0;32m'
  12. YELLOW='\033[0;33m'
  13. NC='\033[0m'
  14. log() { echo -e "${GREEN}[bx-backend-prod]${NC} $*"; }
  15. warn() { echo -e "${YELLOW}[bx-backend-prod]${NC} $*"; }
  16. err() { echo -e "${RED}[bx-backend-prod]${NC} $*" >&2; }
  17. # ---- Virtual Env ----
  18. if [ -d ".venv" ]; then
  19. log "Activating .venv"
  20. source .venv/bin/activate
  21. elif [ -d "venv" ]; then
  22. log "Activating venv"
  23. source venv/bin/activate
  24. else
  25. warn "No virtual environment found, using system Python"
  26. fi
  27. # Resolve python command (prefer python, fallback to python3)
  28. PYTHON_BIN="$(command -v python 2>/dev/null || true)"
  29. if [ -z "$PYTHON_BIN" ]; then
  30. PYTHON_BIN="$(command -v python3 2>/dev/null || true)"
  31. fi
  32. if [ -z "$PYTHON_BIN" ]; then
  33. err "Neither 'python' nor 'python3' command found. Install Python 3.11+ or activate a venv."
  34. exit 1
  35. fi
  36. PYTHON_MAJOR="$("$PYTHON_BIN" -c 'import sys; print(sys.version_info.major)' 2>/dev/null || echo 0)"
  37. PYTHON_MINOR="$("$PYTHON_BIN" -c 'import sys; print(sys.version_info.minor)' 2>/dev/null || echo 0)"
  38. if [ "$PYTHON_MAJOR" -lt 3 ] || { [ "$PYTHON_MAJOR" -eq 3 ] && [ "$PYTHON_MINOR" -lt 11 ]; }; then
  39. err "Python 3.11+ is required, but got: $("$PYTHON_BIN" --version 2>&1)"
  40. err "Please make sure 'python' or 'python3' points to a compatible version."
  41. exit 1
  42. fi
  43. PYTHON="$PYTHON_BIN"
  44. log "Using Python: $PYTHON ($($PYTHON --version 2>&1))"
  45. # ---- Dependency Check ----
  46. if ! "$PYTHON" -c "import uvicorn" >/dev/null 2>&1; then
  47. err "Python package 'uvicorn' is not installed in current environment."
  48. err "Please install backend dependencies first:"
  49. err " $PYTHON -m pip install -e ."
  50. err "Or (with dev dependencies):"
  51. err " $PYTHON -m pip install -e '.[dev]'"
  52. exit 1
  53. fi
  54. # ---- Load .env.production ----
  55. ENV_FILE=".env.production"
  56. if [ ! -f "$ENV_FILE" ]; then
  57. err "Missing ${ENV_FILE}. Please create it before starting production."
  58. exit 1
  59. fi
  60. log "Loading ${ENV_FILE}"
  61. set -a
  62. while IFS='=' read -r key value; do
  63. [[ -z "$key" || "$key" =~ ^# ]] && continue
  64. value="${value%\"}"
  65. value="${value#\"}"
  66. value="${value%\'}"
  67. value="${value#\'}"
  68. export "$key=$value"
  69. done < "$ENV_FILE"
  70. set +a
  71. HOST="${APP_HOST:-0.0.0.0}"
  72. PORT="${APP_PORT:-8011}"
  73. if [ "${DEBUG:-false}" = "true" ]; then
  74. warn "DEBUG=true in ${ENV_FILE}; production startup will ignore reload and run in normal mode."
  75. fi
  76. log "Starting 报销系统后端服务(生产) on ${HOST}:${PORT}"
  77. # ---- Start Server (production mode, no reload) ----
  78. $PYTHON -m uvicorn app.main:app --host "$HOST" --port "$PORT"