@@ -7,25 +7,30 @@ set -euo pipefail
# - 自动启动 uvicorn( 默认开启 --reload)
# - 自动启动 uvicorn( 默认开启 --reload)
#
#
# 用法示例:
# 用法示例:
# ./run.sh # 默认 host=0.0.0.0 port=8000 env=dev reload=on
# ./run.sh # 默认一键启动: API + Celery Worker + Celery Beat
# ./run.sh --env prod # 使用 .env.prod( 若存在且可被 source)
# ./run.sh --env prod # 使用 .env.prod( 若存在且可被 source)
# ./run.sh --port 9000 # 改端口
# ./run.sh --port 9000 # 改端口
# ./run.sh --no-reload # 关闭热更新
# ./run.sh --no-reload # 关闭热更新
# ./run.sh --with-worker --with-beat # 同时启动 Celery Worker + Beat( 用于定时推送)
# ./run.sh --with-worker --with-beat # 同时启动 Celery Worker + Beat( 用于定时推送)
# ./run.sh --all # 等价于 --with-worker --with-beat
# START_ALL=1 ./run.sh # 用环境变量一键启动(适合写到脚本/别名里)
# ./run.sh --api-only # 只启动 API( 不启动 Worker/Beat)
# ./run.sh --install-only # 只安装依赖,不启动
# ./run.sh --install-only # 只安装依赖,不启动
usage( ) {
usage( ) {
cat <<'EOF'
cat <<'EOF'
用法:
用法:
./run.sh [--env dev|prod] [--host 0.0.0.0] [--port 8000] [--no-reload] [--with-worker] [--with-beat] [--skip-install] [--install-only]
./run.sh [--env dev|prod] [--host 0.0.0.0] [--port 8000] [--no-reload] [--api-only] [--with-worker] [--with-beat] [--all] [--skip-install] [--install-only]
参数:
参数:
--env dev|prod 优先尝试加载 .env.dev 或 .env.prod( 如果存在) 。
--env dev|prod 优先尝试加载 .env.dev 或 .env.prod( 如果存在) 。
--host <host> uvicorn host( 默认 0.0.0.0)
--host <host> uvicorn host( 默认 0.0.0.0)
--port <port> uvicorn port( 默认 8000)
--port <port> uvicorn port( 默认 8000)
--no-reload 关闭 uvicorn --reload
--no-reload 关闭 uvicorn --reload
--api-only 只启动 API( 不启动 Worker/Beat)
--with-worker 同时启动 Celery Worker( 处理异步/ETA 任务)
--with-worker 同时启动 Celery Worker( 处理异步/ETA 任务)
--with-beat 同时启动 Celery Beat( 定时调度, 例如每日生成推送排程)
--with-beat 同时启动 Celery Beat( 定时调度, 例如每日生成推送排程)
--all 同时启动 Worker + Beat( 等价于 --with-worker --with-beat)
--skip-install 跳过依赖安装(默认会安装/更新 requirements.txt)
--skip-install 跳过依赖安装(默认会安装/更新 requirements.txt)
--install-only 只安装依赖,不启动服务
--install-only 只安装依赖,不启动服务
-h, --help 显示帮助
-h, --help 显示帮助
@@ -33,6 +38,7 @@ usage() {
说明:
说明:
- 若你的 .env.* 不是 shell 可 source 的格式(例如包含空格/特殊字符未加引号),建议改成 KEY=value 形式。
- 若你的 .env.* 不是 shell 可 source 的格式(例如包含空格/特殊字符未加引号),建议改成 KEY=value 形式。
- 仅启动 API 并不会生成 `push_send_log`;要测试“定时推送”,需要 Beat 调度 `tasks.push.generate_daily_schedule`,并由 Worker 执行后续 ETA 任务。
- 仅启动 API 并不会生成 `push_send_log`;要测试“定时推送”,需要 Beat 调度 `tasks.push.generate_daily_schedule`,并由 Worker 执行后续 ETA 任务。
- 也可以用环境变量一键启动: START_ALL=1 ./run.sh
- 启动后访问:
- 启动后访问:
/healthz 健康检查
/healthz 健康检查
/docs OpenAPI 文档
/docs OpenAPI 文档
@@ -49,8 +55,10 @@ PORT="8000"
RELOAD = "1"
RELOAD = "1"
SKIP_INSTALL = "0"
SKIP_INSTALL = "0"
INSTALL_ONLY = "0"
INSTALL_ONLY = "0"
WITH_WORKER = "0"
API_ONLY = "0"
WITH_BEAT = "0"
# 默认: 一键启动( 满足“bash run.sh 就全部启动”)
WITH_WORKER = "1"
WITH_BEAT = "1"
while [ [ $# -gt 0 ] ] ; do
while [ [ $# -gt 0 ] ] ; do
case " $1 " in
case " $1 " in
@@ -70,6 +78,12 @@ while [[ $# -gt 0 ]]; do
RELOAD = "0"
RELOAD = "0"
shift 1
shift 1
; ;
; ;
--api-only)
API_ONLY = "1"
WITH_WORKER = "0"
WITH_BEAT = "0"
shift 1
; ;
--with-worker)
--with-worker)
WITH_WORKER = "1"
WITH_WORKER = "1"
shift 1
shift 1
@@ -78,6 +92,11 @@ while [[ $# -gt 0 ]]; do
WITH_BEAT = "1"
WITH_BEAT = "1"
shift 1
shift 1
; ;
; ;
--all)
WITH_WORKER = "1"
WITH_BEAT = "1"
shift 1
; ;
--skip-install)
--skip-install)
SKIP_INSTALL = "1"
SKIP_INSTALL = "1"
shift 1
shift 1
@@ -113,6 +132,19 @@ if [[ -f "$ENV_FILE" ]]; then
set +a
set +a
fi
fi
# 允许通过环境变量一键开启(适合写到别名/CI 脚本里)
if [ [ " ${ START_ALL :- 0 } " = = "1" ] ] ; then
WITH_WORKER = "1"
WITH_BEAT = "1"
fi
# 允许通过环境变量强制只启动 API
if [ [ " ${ START_API_ONLY :- 0 } " = = "1" ] ] ; then
API_ONLY = "1"
WITH_WORKER = "0"
WITH_BEAT = "0"
fi
# 让 API/Celery 统一使用同一个 APP_ENV( 影响 Redis key 前缀、定时任务配置等)
# 让 API/Celery 统一使用同一个 APP_ENV( 影响 Redis key 前缀、定时任务配置等)
export APP_ENV = " ${ APP_ENV :- $ENV_NAME } "
export APP_ENV = " ${ APP_ENV :- $ENV_NAME } "