| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- #!/usr/bin/env bash
- # Allow users to run `sh start_prod.sh` by auto-switching to bash.
- if [ -z "${BASH_VERSION:-}" ]; then
- exec bash "$0" "$@"
- fi
- set -euo pipefail
- SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
- cd "$SCRIPT_DIR"
- # Colors
- RED='\033[0;31m'
- GREEN='\033[0;32m'
- YELLOW='\033[0;33m'
- NC='\033[0m'
- log() { echo -e "${GREEN}[bx-backend-prod]${NC} $*"; }
- warn() { echo -e "${YELLOW}[bx-backend-prod]${NC} $*"; }
- err() { echo -e "${RED}[bx-backend-prod]${NC} $*" >&2; }
- # ---- Virtual Env ----
- if [ -d ".venv" ]; then
- log "Activating .venv"
- source .venv/bin/activate
- elif [ -d "venv" ]; then
- log "Activating venv"
- source venv/bin/activate
- else
- warn "No virtual environment found, using system Python"
- fi
- # Resolve python command (prefer python, fallback to python3)
- PYTHON_BIN="$(command -v python 2>/dev/null || true)"
- if [ -z "$PYTHON_BIN" ]; then
- PYTHON_BIN="$(command -v python3 2>/dev/null || true)"
- fi
- if [ -z "$PYTHON_BIN" ]; then
- err "Neither 'python' nor 'python3' command found. Install Python 3.11+ or activate a venv."
- exit 1
- fi
- PYTHON_MAJOR="$("$PYTHON_BIN" -c 'import sys; print(sys.version_info.major)' 2>/dev/null || echo 0)"
- PYTHON_MINOR="$("$PYTHON_BIN" -c 'import sys; print(sys.version_info.minor)' 2>/dev/null || echo 0)"
- if [ "$PYTHON_MAJOR" -lt 3 ] || { [ "$PYTHON_MAJOR" -eq 3 ] && [ "$PYTHON_MINOR" -lt 11 ]; }; then
- err "Python 3.11+ is required, but got: $("$PYTHON_BIN" --version 2>&1)"
- err "Please make sure 'python' or 'python3' points to a compatible version."
- exit 1
- fi
- PYTHON="$PYTHON_BIN"
- log "Using Python: $PYTHON ($($PYTHON --version 2>&1))"
- # ---- Dependency Check ----
- if ! "$PYTHON" -c "import uvicorn" >/dev/null 2>&1; then
- err "Python package 'uvicorn' is not installed in current environment."
- err "Please install backend dependencies first:"
- err " $PYTHON -m pip install -e ."
- err "Or (with dev dependencies):"
- err " $PYTHON -m pip install -e '.[dev]'"
- exit 1
- fi
- # ---- Load .env.production ----
- ENV_FILE=".env.production"
- if [ ! -f "$ENV_FILE" ]; then
- err "Missing ${ENV_FILE}. Please create it before starting production."
- exit 1
- fi
- log "Loading ${ENV_FILE}"
- set -a
- while IFS='=' read -r key value; do
- [[ -z "$key" || "$key" =~ ^# ]] && continue
- value="${value%\"}"
- value="${value#\"}"
- value="${value%\'}"
- value="${value#\'}"
- export "$key=$value"
- done < "$ENV_FILE"
- set +a
- HOST="${APP_HOST:-0.0.0.0}"
- PORT="${APP_PORT:-8011}"
- if [ "${DEBUG:-false}" = "true" ]; then
- warn "DEBUG=true in ${ENV_FILE}; production startup will ignore reload and run in normal mode."
- fi
- log "Starting 报销系统后端服务(生产) on ${HOST}:${PORT}"
- # ---- Start Server (production mode, no reload) ----
- $PYTHON -m uvicorn app.main:app --host "$HOST" --port "$PORT"
|