#!/bin/sh # ============================================================================= # prestart.sh — Container entrypoint for CRM System # # Responsibilities: # 1. Run Alembic DB migrations (alembic upgrade head). # 2. Start uvicorn as PID 1 (so signals like SIGTERM are forwarded correctly). # # Notes: # - `set -e` ensures the container crashes loudly if migrations fail, # rather than starting a broken app on an inconsistent schema. # - `exec uvicorn ...` replaces the shell process with uvicorn, so uvicorn # becomes PID 1 and receives Docker's SIGTERM directly for graceful shutdown. # - `--workers 1` is intentional for v1: SQLite (dev) is single-threaded, # and asyncpg (prod) scales fine with one worker + an async connection pool. # ============================================================================= set -e echo "[prestart] $(date -u +%Y-%m-%dT%H:%M:%SZ) - Running alembic upgrade head..." alembic upgrade head echo "[prestart] DB migrations completed successfully." echo "[prestart] Starting uvicorn on 0.0.0.0:8000 (workers=1)..." exec uvicorn app.main:app \ --host 0.0.0.0 \ --port 8000 \ --workers 1