From e980bd4e4d82b3d8e232307836044ee759ce188d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=95=E6=96=B0=E9=9B=A8?= Date: Mon, 9 Feb 2026 14:47:17 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E6=9B=B4=E6=96=B0=E5=AE=B9=E5=99=A8?= =?UTF-8?q?=E5=90=AF=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/docker-entrypoint.sh | 9 ++++++--- server/run.sh | 40 +++++++++++++++++++++++++++++++++---- 2 files changed, 42 insertions(+), 7 deletions(-) diff --git a/server/docker-entrypoint.sh b/server/docker-entrypoint.sh index 4471832..61eb6b2 100644 --- a/server/docker-entrypoint.sh +++ b/server/docker-entrypoint.sh @@ -25,9 +25,12 @@ if [ "${START_ALL:-0}" = "1" ]; then START_BEAT="1" fi -# Beat 只负责“投递任务到队列”,真正执行仍需要 Worker;避免误配。 -if [ "$START_BEAT" = "1" ] && [ "$START_WORKER" != "1" ]; then - log "提示:已启用 START_BEAT=1,自动同时启用 START_WORKER=1(否则队列无人执行)。" +# Beat 只负责“投递任务到队列”,真正执行仍需要 Worker。 +# 说明: +# - 单容器模式:若启动了 API(START_API=1)且同时启用了 Beat,则自动补齐 Worker,避免误配导致“只排程不执行”。 +# - 多容器模式:允许单独启动 beat 容器(START_API=0, START_BEAT=1),不做自动补齐。 +if [ "$START_API" = "1" ] && [ "$START_BEAT" = "1" ] && [ "$START_WORKER" != "1" ]; then + log "提示:已启用 START_BEAT=1(且 START_API=1),自动同时启用 START_WORKER=1(否则队列无人执行)。" START_WORKER="1" fi diff --git a/server/run.sh b/server/run.sh index e859f6b..d55c32a 100755 --- a/server/run.sh +++ b/server/run.sh @@ -7,25 +7,30 @@ set -euo pipefail # - 自动启动 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 --port 9000 # 改端口 # ./run.sh --no-reload # 关闭热更新 # ./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 # 只安装依赖,不启动 usage() { 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(如果存在)。 --host uvicorn host(默认 0.0.0.0) --port uvicorn port(默认 8000) --no-reload 关闭 uvicorn --reload + --api-only 只启动 API(不启动 Worker/Beat) --with-worker 同时启动 Celery Worker(处理异步/ETA 任务) --with-beat 同时启动 Celery Beat(定时调度,例如每日生成推送排程) + --all 同时启动 Worker + Beat(等价于 --with-worker --with-beat) --skip-install 跳过依赖安装(默认会安装/更新 requirements.txt) --install-only 只安装依赖,不启动服务 -h, --help 显示帮助 @@ -33,6 +38,7 @@ usage() { 说明: - 若你的 .env.* 不是 shell 可 source 的格式(例如包含空格/特殊字符未加引号),建议改成 KEY=value 形式。 - 仅启动 API 并不会生成 `push_send_log`;要测试“定时推送”,需要 Beat 调度 `tasks.push.generate_daily_schedule`,并由 Worker 执行后续 ETA 任务。 + - 也可以用环境变量一键启动:START_ALL=1 ./run.sh - 启动后访问: /healthz 健康检查 /docs OpenAPI 文档 @@ -49,8 +55,10 @@ PORT="8000" RELOAD="1" SKIP_INSTALL="0" INSTALL_ONLY="0" -WITH_WORKER="0" -WITH_BEAT="0" +API_ONLY="0" +# 默认:一键启动(满足“bash run.sh 就全部启动”) +WITH_WORKER="1" +WITH_BEAT="1" while [[ $# -gt 0 ]]; do case "$1" in @@ -70,6 +78,12 @@ while [[ $# -gt 0 ]]; do RELOAD="0" shift 1 ;; + --api-only) + API_ONLY="1" + WITH_WORKER="0" + WITH_BEAT="0" + shift 1 + ;; --with-worker) WITH_WORKER="1" shift 1 @@ -78,6 +92,11 @@ while [[ $# -gt 0 ]]; do WITH_BEAT="1" shift 1 ;; + --all) + WITH_WORKER="1" + WITH_BEAT="1" + shift 1 + ;; --skip-install) SKIP_INSTALL="1" shift 1 @@ -113,6 +132,19 @@ if [[ -f "$ENV_FILE" ]]; then set +a 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 前缀、定时任务配置等) export APP_ENV="${APP_ENV:-$ENV_NAME}"