e3164f34ec
Co-authored-by: multica-agent <github@multica.ai>
7.0 KiB
7.0 KiB
Work Log - 修复 Docker Flower 容器重启异常(2026-05-02)
-
背景:
docker compose ps显示fquiz-flower持续Restarting。docker compose logs flower报错:Error: No such command 'flower'.
-
根因:
flower服务命令使用celery ... flower,但api镜像依赖中未安装flower包。- 同时
docker compose在解析阶段对minio-init.command中的$MINIO_*进行了提前插值,导致每次执行出现变量未设置 warning。
-
本次改动(最小闭环):
- 文件:
api/requirements.txt- 新增依赖:
flower==2.0.1。
- 新增依赖:
- 文件:
api/pyproject.toml- 新增依赖:
flower>=2.0.0,<3.0.0,与 requirements 口径一致。
- 新增依赖:
- 文件:
docker-compose.ymlminio-init启动脚本中的变量引用改为$$MINIO_*,避免 compose 提前展开:"$MINIO_ENDPOINT" -> "$$MINIO_ENDPOINT""$MINIO_ACCESS_KEY" -> "$$MINIO_ACCESS_KEY""$MINIO_SECRET_KEY" -> "$$MINIO_SECRET_KEY""$MINIO_BUCKET" -> "$$MINIO_BUCKET"
- 文件:
-
验证:
- 执行:
docker compose up -d --build flower docker compose ps flower:Up,不再重启。docker compose logs flower:- 出现
Visit me at http://0.0.0.0:5555 - 出现
Connected to redis://redis:6379/0
- 出现
- 执行:
docker compose logs --since=10m ... | rg "ERROR|Traceback|Exception|No such command|CRITICAL|FATAL|UndefinedColumn|relation \"|failed|denied|permission"- 结果:近 10 分钟内无命中。
- 执行:
-
风险与影响:
- 影响面:
api镜像新增flower依赖,镜像体积与构建时长略有增加。 - 当前运行中的
api/celery-worker/celery-beat/scheduler/web仍为既有镜像;本次仅重建并替换了flower。
- 影响面:
Work Log - 固定 workflow WEB 端口为 3000(2026-05-02)
-
背景:
- 发布后
fquiz-web宿主机端口出现13000->3000,与 Nginx 固定代理127.0.0.1:3000不一致。 - 根因是 workflow 的
ensure_web_port_available在 3000 冲突时会自动回退到 13000+ 并写回.env。
- 发布后
-
本次改动(最小闭环):
- 文件:
.github/workflows/main.yml - 调整
ensure_web_port_available:- 每次部署前强制写入
WEB_PORT=3000(存在则覆盖,不存在则追加)。 - 移除自动回退到
13000+逻辑。 - 若
3000被其它容器占用,直接输出错误并终止部署。
- 每次部署前强制写入
- 文件:
-
预期效果:
- workflow 部署后,
fquiz-web宿主机端口稳定为3000,避免与 Nginx 前端代理端口漂移。
- workflow 部署后,
-
风险与影响:
- 若服务器上已有其他容器占用
3000,本次部署会失败(可预期失败),需先释放端口或手动调整冲突容器。
- 若服务器上已有其他容器占用
Work Log - 移除 scheduler 服务并统一任务调度为 API 直连 Celery(2026-05-02)
-
背景:
- 用户明确要求“去掉 scheduler”。
- 当前仓库默认调度本就为
celery_direct,scheduler仅作为可选分支与独立容器存在。
-
本次改动(最小闭环):
- 后端任务派发收敛为直连 Celery:
api/app/services/elevation_service.py- 删除
dispatch_mode分支与_enqueue_via_scheduler_api转发实现。 - 保留单一路径:
apply_elevation_for_line_job.delay(job_id)。
- 删除
api/app/api/v1/elevation.py- 删除
dispatchMode查询参数透传。
- 删除
- 后端路由与配置清理:
api/app/api/router.py- 移除
scheduler路由注册。
- 移除
api/app/core/config.py- 删除
scheduler_api_token/scheduler_default_queue/scheduler_api_base_url及其resolved_*属性。 - 保留
scheduler_expire_interval_seconds作为 Celery Beat 定时任务间隔配置。
- 删除
- 删除 scheduler 相关源文件:
api/app/api/v1/scheduler.pyapi/app/services/scheduler_service.pyapi/app/schemas/scheduler.pyapi/app/scheduler_main.py
- 运行与部署配置同步:
docker-compose.yml- 删除
scheduler服务。 - 删除
api/celery-worker/celery-beat的SCHEDULER_API_BASE_URL、SCHEDULER_API_TOKEN、SCHEDULER_DEFAULT_QUEUE。
- 删除
.env.example- 删除
SCHEDULER_API_BASE_URL、SCHEDULER_API_TOKEN、SCHEDULER_DEFAULT_QUEUE、SCHEDULER_PORT。
- 删除
.github/workflows/main.yml- 删除生产 compose 模板中的
scheduler服务块。 - 删除部署模板与默认
.env中的SCHEDULER_API_*/SCHEDULER_PORT。 - 删除故障诊断日志中的
fquiz-scheduler。
- 删除生产 compose 模板中的
- 长期记忆更新:
MEMORY.md- 将“调度与监控口径”更新为“API 直连 Celery,不再保留 scheduler 服务”。
- 后端任务派发收敛为直连 Celery:
-
验证:
- 语法检查通过:
python3 -m py_compile api/app/api/router.py api/app/api/v1/elevation.py api/app/services/elevation_service.py api/app/core/config.py
- 关键残留检查:
rg -n "scheduler_main|services/scheduler_service|api/v1/scheduler|SCHEDULER_API_BASE_URL|SCHEDULER_API_TOKEN|SCHEDULER_DEFAULT_QUEUE|scheduler_api|fquiz-scheduler|SCHEDULER_PORT|resolved_scheduler_" .- 仅命中文档历史记录,不再命中运行代码与部署配置。
- 语法检查通过:
-
风险与影响:
- 影响范围:任务调度入口、部署编排与环境模板。
- 行为变化:不再支持
dispatchMode=scheduler_api与独立 scheduler HTTP 网关调用。 - 保持不变:默认任务链路(API 直连 Celery)与 Flower 监控链路。
Work Log - 浏览器标签图标替换为高压电塔(2026-05-02)
-
背景:
- 需求要求将浏览器标签图标替换为工程内
高压电塔.png。
- 需求要求将浏览器标签图标替换为工程内
-
本次改动(最小闭环):
- 文件:
web/src/app/favicon.ico - 使用仓库根目录
高压电塔.png(200x200)重生成为 ICO,并覆盖现有favicon.ico。 - 页面标题与其他元数据未改动。
- 文件:
-
验证:
file web/src/app/favicon.ico- 结果:
MS Windows icon resource - 1 icon, 200x200 withPNG image data。
- 结果:
git diff -- web/src/app/favicon.ico- 结果:仅该二进制图标文件发生变更。
-
风险与影响:
- 影响面仅前端浏览器标签图标资源。
- 可能受浏览器 favicon 缓存影响,首次需强刷后看到新图标。
Work Log - 修复退出登录闪烁(2026-05-02)
-
背景:
- 当前退出登录会先把前端登录态置空,再触发页面跳转。
- 在后台页会先短暂渲染“请先登录”占位,再跳回登录页,造成肉眼可见闪烁。
-
本次改动(最小闭环):
- 文件:
web/src/components/auth-provider.tsx - 调整
logout的finally收尾顺序:- 浏览器环境下优先执行
window.location.replace("/")并直接返回; - 非浏览器环境才执行
clearAuth()。
- 浏览器环境下优先执行
- 效果:避免在跳转前先渲染未登录中间态页面。
- 文件:
-
风险与影响:
- 影响面仅前端退出流程。
- 行为变化为“直接跳登录页”,不会改变后端登出接口调用逻辑。
-
验证建议:
- 已登录状态下从任意后台页面点击“退出登录”,预期直接到登录页,不再出现“请先登录”闪屏。