]> acesimba.cloud Git - words.git/commit
feat: HTTPS 同源部署 + 离线预取修复(PWA 离线缓存生效)
authorroot <root@localhost.localdomain>
Fri, 14 Aug 2026 10:11:28 +0000 (18:11 +0800)
committerroot <root@localhost.localdomain>
Fri, 14 Aug 2026 10:11:28 +0000 (18:11 +0800)
commit426858a86bd98d197ea6d107c9e2f88b63f90011
tree3c848866076a11deb531d00ae5502f6ea7f7a535
parent11fff5b1fbab0b22c88e865e0ecaa40b38c4cdfc
feat: HTTPS 同源部署 + 离线预取修复(PWA 离线缓存生效)

## 背景
思维导图/语音此前在离线模式不缓存,根因是 Service Worker 在非安全上下文
(http://IP:端口)下不激活。本次完成 HTTPS 部署(Let's Encrypt 证书 + nginx
反代),使 SW 在安全上下文中激活,并修复预取逻辑两处 bug,离线缓存终于生效。

## 改动点
1. HTTPS 同源部署(零风险,原 :55 完全不动)
   - api.js: API_BASE 改为读取 REACT_APP_API_BASE(默认值仍为本机 IP:1060,:55 行为不变)
   - 新增 build-https(REACT_APP_API_BASE="" → 同源相对路径)
   - 新增 deploy/lexicon-frontend-https.service(:8444 同源前端 serve)
   - 新增 deploy/certbot-auth-hook.sh(DNS-01 手动挑战钩子,轮询等待 TXT 生效)
   - 新增 deploy/nginx-words-https.conf(:8443 TLS → /:8444,/api/:1060)
   - 新增 deploy/nginx-conf.d-words.conf.disabled(原占用 :55 的旧 nginx 站点,已停用)
   - 在 /etc/nginx 中禁用占用 :55 的 lexicon 与 conf.d/words.conf,避免与 :55 冲突
   - certbot 签发 acesimba.cloud 证书(DNS-01 手动,Plan B),已配置自动续期

2. 修复离线预取(sync.js)
   - 去重逻辑由 meta.prefetchedGroups 改为直接查 SW 缓存 caches.match(url),
     避免 SW 未接管时请求绕过 SW 未真正缓存却被误标"已完成"导致永久跳过
   - 预取目标仍为 G48–G60(未完成组 + 未开始组前 10 组)的每组首词思维导图 + 每词语音

3. SW 接管时机(index.js)
   - 在 navigator.serviceWorker.ready 之后再触发一次同步+预取,
     确保预取请求被 SW 拦截并写入缓存(首屏即可缓存,无需手动刷新)

4. 前端标题(index.html):单词学习 → Words

5. 云端日志:补充 G38 review3(完成时间 2026-08-03)

## 验证
- https://acesimba.cloud:8443 可打开,SW 激活
- 联网同步后 G48–G60 思维导图/语音写入 Cache Storage(words-pwa-v1)
- 离线模式打开 G48–G60 各组思维导图正常显示
- :55 原学习路径保持可用
.gitignore
backend/db/bcd.db
deploy/certbot-auth-hook.sh [new file with mode: 0644]
deploy/lexicon-frontend-https.service [new file with mode: 0644]
deploy/nginx-conf.d-words.conf.disabled [new file with mode: 0644]
deploy/nginx-words-https.conf [new file with mode: 0644]
frontend/.gitignore
frontend/public/index.html
frontend/src/api.js
frontend/src/index.js
frontend/src/sync.js