# 2026-06-08 — 推送按钮改为后台任务提交

## 变更摘要

文件推送不再阻塞 HTTP 直至全部子机完成；点击「推送」后按钮仅短暂 loading，任务在后台执行，进度由 WebSocket + 下方进度列表展示。

## 动机

用户反馈推送按钮长时间转圈，期望与脚本执行类似：提交后立即进入后台任务。

## 根因

`POST /api/sync/files` 同步等待 `sync_engine_v2.sync_files` 全部 rsync 结束才返回；前端 `:loading="pushing"` 与 HTTP 阻塞绑定。

## 涉及文件

- `server/background/sync_push_runner.py`（新）
- `server/api/sync_v2.py` — 校验后 `schedule_sync_files`，返回 `accepted: true`
- `frontend/src/composables/push/usePushProgress.ts` — `submitting` 与 toast
- `frontend/src/components/push/PushToolbar.vue`
- `frontend/src/pages/PushPage.vue`

## 迁移 / 重启

- 需重启 API / 重建镜像
- 前端需 build

## 验证方式

1. 推送页选多台子机 → 点推送：按钮转圈仅数秒内结束，出现「推送已提交」toast，下方进度条持续更新
2. `pytest tests/test_sync_batch_id.py -q`
