Files
aurora-admin/openlist优化方案.md

123 lines
7.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# OpenList 卡顿优化方案 v2(含 CF 源保留 + 决策点 + 操作排期)
> 对象:容器 `1Panel-openlist-9Tuc` / 镜像 `openlistteam/openlist:v4.2.5` / 1Panel
> 数据目录:`/opt/1panel/apps/openlist/openlist/data`
> 状态:2026-09-06 只读诊断完成。28pan / sakura Cloudreve **在用且保留**(偶发 CF 假死)。**此文件为待决策方案**,未执行任何改动。
> 执行前先在 1Panel 备份该应用(或至少 `cp -a data`)。
---
## 0. 诊断结论速览(v2 修正)
| 项 | 实测 | 结论 |
|---|---|---|
| 数据库 | SQLite `data.db` 76KB,`x_meta`=0 行 | 只是配置库,无本地文件索引 |
| 缓存 | 3 源 30s,Local/139 = **0(从不缓存)** | 冷/大数据目录每次实时拉远端 |
| 搜索 | meilisearch 指向 `localhost:7700` 但**未部署** | 搜索实时遍历,无索引 |
| **出口代理** | 宿主设 `http_proxy/https_proxy=http://127.0.0.1:7890`、`ALL_PROXY=socks5://127.0.0.1:7890`(FlClash/Clash 类) | **关键**:openlist 访问 CF 源很可能经由该代理,代理抽风 → 源"假死" |
| **CF 源真因** | sakura DNS 只回 AAAA(2606:4700)+A(104.21);**宿主无 IPv6 默认路由**;直连 TCP 443 秒通,但 HTTPS 时通时超时 | 双层问题:①无 IPv6 出口却拿到 AAAA;②CF 应用层对出口间歇限流/掐断 → 偶发假死 |
| 自身性能 | 本地 API <2ms;容器 CPU ~0%、内存 587MB | 非资源瓶颈 |
**一句话根因**:OpenList 实时聚合多个远端源;其中 2 个 CF 源因"无 IPv6 出口 + 走抖动代理 + CF 偶发掐断"会间歇超时;数据越多 → 请求 CF 越频繁 → 越容易撞上假死窗口 → 整体越卡。
---
## 1. 方案总览(分 A/B/C 三档,可独立勾选执行)
### 档 A:保留 2 个 CF 源,做「绕代理 + IPv4 + 缓存」加固(推荐先做)
**A1|让 openlist 直连出网,不走 127.0.0.1:7890 抖动代理**
- 影响面:仅 openlist 这一个容器。宿主其他程序仍走代理。
- 做法:
1. 1Panel 应用编排(compose)给 openlist 增加环境变量 `NO_PROXY=*` / `no_proxy=*`(对 Go 应用需确认其代理读取实现;openlist 基于 Go,多数库读 `HTTP_PROXY`/`NO_PROXY`)。
2. 若 openlist 镜像默认信任系统代理,则用 `HTTP_PROXY=` 置空或设 `NO_PROXY=*`。
- 收益:CF 源不再随 7890 抖动而假死;直连可稳定复用 CF 边缘(实测直连 TCP 秒通)。
- 风险:低。仅容器代理行为变化;无数据改动。
**A2|规避无 IPv6 出口却解析到 AAAA**
- 根因:sakura DNS 返回 `2606:4700:...`(AAAA),宿主**没有 IPv6 默认路由** → Go 解析优先尝试 v6 → `network is unreachable` 超时。
- 做法(任一):
1. **首选**:给这两个域名在宿主/DNS 层固定 A 记录(hosts 或内部 DNS 覆写为 `104.21.x.x`),或让 DNS 只回 A。
2. 或:临时确认 openlist 是否支持 `ForceIPV4`/`ForceHostname` 类配置(需查该版本);若无则用 hosts 覆写最直接。
- 收益:消除一半以上"假死"来源。
- 风险:极低。不破坏源可用性,回滚=删掉 hosts 行。
**A3|保留源 + 调大缓存(按原表)**
- 给 5 个在用源按下表把 `cache_expiration` 调大(**28pan / sakura 保留,同样调大**,命中缓存时即使源假死,目录也能秒开):
| 挂载 | driver | 当前 cache | 建议 |
|---|---|---|---|
| /hi168s3 | S3 | 30s | 3600s |
| /189pan/oba | 189CloudPC | 30s | 3600s |
| /chunyu_local | Local | **0** | 600~3600s |
| /chunyu_139 | 139Yun | **0** | 600~3600s |
| /星辰云盘 | WebDav | 30s | 1800s |
| /drive.sakura… | Cloudreve V4 | 30s | 3600s(源易假死→高缓存收益最大) |
| /28pan webdav | WebDav | 30s | 3600s(同上) |
### 档 B:补搜索索引(meilisearch)— 中等改动,可选
- 部署一个 meilisearch 容器(同 `1panel-network`),改 config 指向它并配 `api_key`,重建索引。
- 效果:搜索从实时遍历 → 本地索引 <1s。
- 成本:多一个容器 + 首次全量建索引时间。
### 档 C:稳定性 / 维护(低风险顺手项)
1. 设容器资源上限(1Panel 改 compose:`cpus=4, memory=4GiB`)。
2. 清理旧日志(`/` 76%):`data/log` 50MB 旧档可删/轮转。
3. 可选:给 2 个 CF 源配置更短的失败超时/重试,减少假死窗口内的等待。
---
## 2. 决策点(请逐项拍板)
| # | 决策 | 选项 | 我的建议 |
|---|---|---|---|
| D1 | A1 让 openlist **绕开 7890 代理直连**? | ① 直连(NO_PROXY=*) ② 保持走代理 | **①**(直连 TCP 实测更稳) |
| D2 | A2 对 sakura/28pan 做 **IPv4 hosts 覆写**? | ① 做(固定 A 记录)② 不做 | **①**(消除 v6 超时) |
| D3 | A3 缓存表按上表**统一调大**? | ① 全按建议 ② 只调 CF 两个源 ③ 自定义 | **①** |
| D4 | B 档是否**部署 meilisearch**? | ① 是 ② 否 | ②(先做 A 档见效;B 可后续) |
| D5 | C 档资源上限 / 清日志是否执行? | ① 都做 ② 只清日志 ③ 都不 | **①** |
| D6 | 执行顺序 | A→C 分步、逐步验证 | 分步 |
---
## 3. 操作时间表(建议排期,均需维护窗口/低峰)
> 说明:每步之间隔开观察;改 compose/重启容器会造成 openlist 短时重启(秒级~数十秒)。
| 时段 | 操作 | 影响 | 回滚 |
|---|---|---|---|
| **T0(5 分钟)** | 1Panel 对该应用做备份/快照 | 无 | — |
| **T1(10 分钟)** | A1:compose 加 `NO_PROXY=*` 并重启容器 | openlist 重启 | 移除该环境变量重启 |
| **T2(15 分钟)** | A2:hosts 覆写 sakura/28pan → IPv4;重启或 reload | 同上 | 删除 hosts 行 |
| **T3(10 分钟)** | A3:调大 5~7 个源 cache_expiration;WebUI 保存/重启 | 同上 | 恢复原值 |
| **T4(验证 15 分钟)** | 逐源列目录/搜索实测;看 docker log 错误量 | 无 | — |
| **T5(可选)** | B 档 meilisearch(若 D4=是) | 多一容器 | 停容器即可 |
| **T6(可选)** | C 档资源上限 + 清日志 | 无业务影响 | 还原配置 |
**总窗口预估**:只做 A 档 ≈ **40 分钟**;加 B/C ≈ **60–90 分钟**。
**建议执行时间**:业务低峰(如深夜 00:00–02:00,当前时段流量最低时)执行 T1–T3,T4 观察半小时。
---
## 4. 验证命令(T4 用)
```bash
# openlist 自身
curl -sk -o /dev/null -w '%{http_code} %{time_total}s\n' http://127.0.0.1:5244/ping
docker logs --since 30m --tail 80 1Panel-openlist-9Tuc | grep -cE 'deadline exceeded|unreachable'
# 两 CF 源(容器视角需在容器内或 hosts 覆写后)
curl -4 -skI -m 8 https://drive.sakura.exp.dog
curl -4 -skI -m 8 https://www.28pan.com/api/webdav_server.php
# 容器代理是否已绕开(应无 7890)
docker exec 1Panel-openlist-9Tuc env | grep -i proxy
```
---
## 5. 回滚总则
- 所有改动均为容器配置/环境/hosts,不碰业务数据。
- 回滚 = 按表反向操作并重启;备份保留在 T0。
- 若某步验证不达预期,可单独撤销该步,不影响其余。
> 请按第 2 节 D1–D6 拍板;确认后我按第 3 节排期执行(可只先做 A 档)。