Commit Graph

13 Commits

Author SHA1 Message Date
7ebebbc3a9 fix(icon): 补 /icons/favicon.ico —— 标签栏无图标的真因
上一版只改 index.html 注入 /favicon.svg,实测仍不显示。用 MutationObserver
在真实浏览器里观察到:**Dashy 前端 JS 在运行时把 <link rel=icon> 改写成
/icons/favicon.ico**,服务端注入的标签被它覆盖;而镜像里从来不存在
/icons/ 目录 ⇒ 请求落到 try_files 兜底的 index.html,content-type 是
text/html,浏览器当无效图标忽略(于是表现为「图标消失」)。

静态改 index.html 治不了本,只能把这个路径补上:
Dockerfile 与 zd-host.sh 都 COPY favicon.{ico,svg} 到 /app/dashy/icons/。
已先在 106 上热修(只 cp 不重启,无闪断)恢复显示。

实测:/icons/favicon.ico → 200 image/x-icon,浏览器解码 16x16 成功;
apple-touch-icon 180x180 正常。
2026-10-03 08:43:35 +08:00
e9097e5893 feat(icon): 纸飞机图标(站点 favicon + 扩展各尺寸)
站点首页此前显示的是 Dashy 上游的 logo —— index.html 里那几条
<link rel=icon href=/web-icons/favicon-*.png> 优先级高于我们的门户图标,
而扩展的 PNG 是占位图(128px 只有 9 种颜色、alpha 通道还是乱的)。

- portal/favicon.svg:纸飞机(圆角渐变底 + 白色折纸机头朝右上 + 两道尾迹),
  几何收在 8..56 安全区,避免贴边被圆角裁切
- 由该 SVG 派生 favicon.ico(16/32/48)、apple-touch-icon(180)、
  web-icons/favicon-{16,32,64}、扩展 icon{16,48,96,128}
- patch-index.py:删掉上游 icon link 并显式指向 /favicon.svg(幂等,
  重复执行 unchanged);上游 web-icons 那批也覆盖一份作双保险
- Dockerfile 与 zd-host.sh 都 COPY 这些图标进镜像
- 验证:nginx 沙箱实测 /favicon.svg、/web-icons/*、/apple-touch-icon.png 均 200;
  16px 下人眼仍可辨识为纸飞机
- .amo-upload-uuid(web-ext 生成的 UUID)改为忽略
2026-10-03 08:37:54 +08:00
c84461d828 fix(deploy): zd-host 增量构建重打扩展包(此前继承基镜像 3 周前的旧 zip/xpi)
实测踩坑:增量 Dockerfile 只 COPY install.html,navi-chrome.zip/navi-firefox.xpi
全部来自基镜像 jianf-navi:latest。v99 升级后容器里的 chrome 包仍是旧版
(e6b8f9bf ≠ 仓库 51347771),扩展的修复永远上不了线。
现从当前源码重打两个包并 COPY 进镜像。
2026-10-02 11:53:20 +08:00
700775866a fix(deploy): 修掉远端引号嵌套导致切换中途崩溃 + 补最终名字断言
真实事故:探测域名提取用了 `tr -d '"'"'"'` 这种引号嵌套,远端 bash 报
"unexpected EOF while looking for matching `'`",脚本在"停旧容器→起新容器→
改名"的改名之前中断,容器留在 navi-next(服务正常但名字不对,
且验收里 docker inspect navi 全为空,看起来像数据丢失)。

修复:
- 改用无引号的字符类提取域名(grep -oE '[A-Za-z0-9][A-Za-z0-9.-]*\.[A-Za-z]{2,}'),
  彻底避开引号嵌套
- 收尾加断言:docker inspect navi 必须成功;若发现仍在 navi-next,
  明确提示可直接改名,而不是静默"成功"

现场已手动补齐:navi-next 完整核验(healthz/conf.yml/admin/schema 200、
入口 302/404/200/200/200、22 条路由、端口 3080/3081、门户标题与备案号完整、
env COOKIE_DOMAIN=1 明文 PASSWORD=0、数据卷凭据文件在)后改名为 navi,
回滚点 navi-prev-20260912104324(ui-v53) 保留。
2026-09-12 10:46:09 +08:00
b850a478fe fix(deploy): 入口自检改为域名无关(脱敏把探测域名换成了占位符导致误判失败)
真实部署失败原因:脱敏时把仓库里所有 example.com 换成 example.com,连
deploy/zd-host.sh 的三个入口自检探测域名也一起换了 → 自检去探测
dashy.example.com(用户路由表里不存在)→ 404 → 判定失败并回滚。

修复:
- 探测域名默认取数据卷 gateway.yml 路由表第一条的 host(或 NAVI_CHECK_HOST 显式指定),
  不再把任何具体域名写进脚本
- 已配置域名接受 200/302(门户 200、受保护 302 都算正常);
  000(未监听)/404(不在路由表)/5xx 才算失败;未知域名仍必须 404;3081 必须 302
- apply 后先轮询等待 reload 就绪再探测(异步 reload 会误判)

另修复上一轮引入的隐患:等待循环引用了脚本里不存在的 $CHECK_HOST/$ENTRY_PORT,
set -u 下会直接崩(与第一轮 HOST 未定义同类错误),本次一并纠正并改为先定义后使用。
2026-09-12 10:43:13 +08:00
dbdfe0faef fix(deploy): 默认不改门户口令 + apply 后等待监听就绪
两个问题,都由本轮真实部署暴露:

1) 口令轮换不该默认执行
   集成明文 env 清理时顺手加了"重置为强随机口令",但重置会让所有受保护域名
   (含用户访问 agent 界面的入口)立即要求新口令,用户若没读到日志就等于被锁在门外。
   而生效凭据本是数据卷里的加盐哈希(/app/data/portal-auth.json),删掉明文 env
   对登录毫无影响。→ 改为仅清理 env,轮换必须显式 NAVI_ROTATE_PORTAL_PASSWORD=1。

2) apply 触发的 nginx reload 是异步的
   本次部署因此误判失败:受保护域名探测到 404(旧配置仍在生效),脚本判定
   "应 302 实际 404" 并回滚。→ apply 之后、入口自检之前加入轮询等待就绪(最多 10s),
   与 README「接口注意事项」第 4 条同一原因。
2026-09-12 10:42:44 +08:00
2eeaabb200 fix(deploy): NAVI_COOKIE_DOMAIN/NAVI_HOME_URL 未转发到远端,升级被自家守卫拦下
现象:本地已传 NAVI_COOKIE_DOMAIN=example.com,部署仍在远端报
"缺少 PORTAL_COOKIE_DOMAIN ... "(守卫在远端执行,而远端 heredoc 是引号形式,
不会展开本地变量)→ 升级被拦,生产保持 ui-v53 未变。

修复:在 ssh 命令行显式转发这两个变量(本地展开后作为远端环境变量传入)。
实测:远端能读到传入值。
2026-09-12 10:39:59 +08:00
ff4af5fa31 fix(deploy): 必填校验插在 HOST 赋值之前,set -u 下直接崩
现象:NAVI_HOST=... bash deploy/zd-host.sh v54 直接报
line 21: HOST: unbound variable 并退出(生产未受影响,纯脚本缺陷)。

原因:上一轮加 NAVI_HOST 必填校验时,把校验插到了 STAMP 之后、HOST 赋值之前,
而脚本是 set -u,提前引用未赋值变量即中止。

修复:校验移到 HOST 赋值之后;zd-host.sh 与 zd.sh 都改。
自测:不给 NAVI_HOST → 友好提示 + 退出码 2;给了则继续执行(实测进入构建阶段)。
2026-09-12 10:38:17 +08:00
7c2bed2f2d feat: 门户页卡片可配置 + 升级前域名校验 + 清理明文门户口令
按用户选择实施三件事:

1) 门户页服务卡片可配置(不再写死真实域名)
   - portal/index.html 卡片区加 <!--NAVI_CARDS_START/END--> 标记,内置卡片改为通用示例
   - renderPortalPage 支持数据卷 <data>/portal/cards.html 覆盖标记区间(清空即回落内置)
   - 新增 GET/POST /api/portal-cards 读写该片段
   - 测试:覆盖替换成功、空白片段回落内置
   - 仓库内真实域名由此清零

2) 升级前必须提供跨子域单点登录变量(防止"去掉写死默认值"造成 SSO 静默失效)
   - zd-host.sh 在切换前检查 PORTAL_COOKIE_DOMAIN:缺失且未传 NAVI_COOKIE_DOMAIN
     时直接拒绝升级(退出码 2)并给出正确命令;PORTAL_HOME_URL 可用 NAVI_HOME_URL 补
   - README 新增「升级已有部署前必须确认的两个变量」含失败表现与正确命令

3) 清理明文门户口令
   - 迁移旧容器 env 时丢弃 PORTAL_PASSWORD(docker inspect 可见 = 泄露面)
   - 升级后写入强随机口令并通过接口生效,部署日志只打印一次;失败不阻断升级并提示后台可改
2026-09-12 10:14:22 +08:00
b99319b38b chore(sanitize): 备案号与域名一律可配置,仓库不再预置真实域名/备案号/内网地址
用户要求:备案号与域名都应当可配置,仓库内容要脱敏。

功能(不只是替换字面量):
- 被代理页面注入的备案号改为读后台「站点信息」的 icp/gongan,**未配置就不注入**;
  原先写死具体备案号,等于每个部署者都会把别人的备案信息印到自己页面上
- 注入内容做 nginx 安全处理(去引号/反斜杠/换行/美元符),并有测试覆盖
- auth.go:PORTAL_COOKIE_DOMAIN / PORTAL_HOME_URL 不再预置域名,
  cookie 默认 host-only、首页默认相对路径 "/"
- gateway.go:默认 loginUrl 不再预置域名(受保护路由缺配置会明确报错,不静默生成跳不出去的登录页)
- 首装脚本在给了 NAVI_DOMAIN 时自动注入 PORTAL_COOKIE_DOMAIN/PORTAL_HOME_URL,
  避免"去掉写死默认值"导致跨子域单点登录失效

脱敏:内网 IP(10.0.0.10)与真实备案号清零;真实域名仅剩门户页内容 8 处(待定);
测试夹具/示例/错误页/脚本/后台占位提示全部通用化。

README:新增「跨子域单点登录需要的两个环境变量」;环境变量表改为 NAVI_HOST 必填。
测试:新增备案号注入三条(用配置、未配置不注入、危险字符清理)。
2026-09-12 10:10:52 +08:00
13ab2336c6 fix(deploy): host 部署后自动重新生成一次网关配置
事故:门户首页改为由 admin-server 渲染(/portal-page)后,镜像里的门户模板带
HTML 占位符,而线上 gateway.conf 仍是上一版生成的(未引用渲染器),导致
门户页占位符裸露、标题为空。

在 zd-host.sh 的入口自检之后加入 apply 步骤(用同一份 env 里的 admin token),
失败即中止并回滚,避免镜像已更新但配置没跟上这类静默不一致。
2026-09-12 09:16:38 +08:00
a78c5180ca fix(deploy): host 模式远端显式接收 VER
首次 host 部署在停旧容器后因远端 VER 未定义触发 unbound variable 而失败
(当时旧容器仅被改名未恢复,已手工恢复)。此处只补参数传递,不改动
heredoc 结构与回滚顺序。
2026-09-12 07:36:20 +08:00
b1e4367937 fix(theme): 深色改为整套主题变量覆盖,不再改写 data-theme
用户反馈"深色区域有的方形、有的根本没变深"。根因有两层,都是我的做法错了:

1. navi.js 会把 <html data-theme> 改成 "dark"。Dashy 的配色变量是按主题名
   作用域输出的(本站主题 jianf-glass),改掉它 → 整套主题变量失配 →
   有的区域完全没变深。
2. navi.css 之前只覆盖"页面底色 + 我们自己的悬浮件",Dashy 自己的卡片/侧栏/
   头部仍走原主题 → 与深底色拼在一起,就成了直角圆角混杂。

改法:
- navi.js 只切 <html class="navi-dark">(并设 color-scheme),绝不碰 data-theme
- navi.css 用 html.navi-dark 一次性覆盖 jianf-glass 的全部配色变量(47 个:
  背景/卡片分组/条目文字/侧栏/头部导航/搜索框/设置面板/弹层/滚动条/语义色),
  Dashy 自身界面随之整体一致变深;形状由元素自身样式决定,不再混杂
- 选择器 html.navi-dark 特异度(0,1,1) 高于 [data-theme=…](0,1,0),与注入顺序无关

需要目视确认配色层次(变量值只能看着调)。
2026-09-11 23:31:27 +08:00