16 Commits
Author SHA1 Message Date
cbb 1b2ddded38 feat: v1.5.6 — 「打开 Gitea」按钮链接可显式配置
远程访问时 CGI/代理环境常常无法可靠转发 Host 头(fnOS
CGI 里 $HTTP_HOST 可能为空、Referer 被剥离),导致自动推断
出的'真实主机'就是面板本机的 127.0.0.1,按钮指向 localhost 没法用。

新增设置「打开 Gitea 链接」(cfg.open_url),按钮地址优先级:
  1. 环境变量 GITEA_URL
  2. cfg.open_url(本次新增,留空走推断)
  3. cfg.gitea_host + 推断(XFH/Host/Referer)

- UI:Gitea 与同步设置卡片里新增「打开 Gitea 链接」输入框
  (含「保存」按钮,placeholder 提示一般不用填)
- 校验:必须带协议头(http/https)、不能含路径;非法值拒绝
- /api/settings 暴露 open_url
- 留空时维持原有自动推断行为,向后兼容
- manifest 1.5.5 → 1.5.6
2026-10-15 01:31:07 +08:00
cbb 58197fd35b fix: v1.5.5 — 「打开 Gitea」远程地址推断三重保险
根因:gitea_ui() 有个判断 bug——当请求 Host 是 127.0.0.1:8899
(CGI 内部连接面板的本地地址)时,面板把它当作"远程主机名"
去替换 gitea_host 中的 127.0.0.1,结果还是 127.0.0.1:3000。

修复:
1. 修判断 bug:只有推断出的真实主机名不是 loopback 时才替换
   gitea_host 中的 127.0.0.1(本地直连保持原样,不再被错误"替换")
2. gitea_ui 新增 Referer 兜底:即使 CGI 没转发 Host/X-Forwarded-Host
   (fnOS CGI 环境里 $HTTP_HOST 可能为空),也能从浏览器自带的
   Referer 头里推断出真实主机名
3. CGI 代理兜底转发:从 X-Forwarded-Host / HTTP_HOST / Referer
   多源提取真实主机,作为 Host 和 X-Forwarded-Host 转发
4. 调用方传入 X-Forwarded-Host / Host / Referer 三个头

实测 6 种场景(远程 CGI / 远程直连 / 只有 Referer / 本地直连 /
全部为空 / 远程 IP)全部生成正确地址
manifest 1.5.4 → 1.5.5
2026-10-15 01:23:57 +08:00
cbb b4673d05a7 fix: v1.5.4 — 远程访问时「打开 Gitea」用真实主机名 + 移除页面泄漏文本
- CGI 代理 (index.cgi) 现在把真实访问 Host 头和 X-Forwarded-Proto
  转发给面板;面板据此把「打开 Gitea」按钮的地址从 127.0.0.1
  替换成用户实际访问的主机名(远程访问时从 nas.local:5667 变为
  http://nas.local:3000)
- 移除 PAGE_SETTINGS 末尾两行 // ---- 模态弹窗:... ----
  注释(之前在 </script> 外面泄漏成了页面上的可见文本垃圾)
- manifest 1.5.3 → 1.5.4
2026-10-15 01:19:44 +08:00
cbb 4bdb9fe267 fix: v1.5.3 — 弹窗输入框样式统一为 Gitea 地址框
去掉弹窗输入框的自定义 1.5px 边框/浅灰底/聚焦光晕,
改为与 .addrow input(也就是 Gitea 地址框)完全一致:
1px #d0d5dd 边框、padding 11px 14px、focus 紫色边框。
带图标的输入框仍保留 ✏️/🔑 前缀。
manifest 1.5.2 → 1.5.3
2026-10-15 01:14:55 +08:00
cbb afc08a1761 fix: v1.5.2 — 修弹窗拖动误关 + 备注名/Token 输入框加图标
- 修拖动误关 bug:在弹窗内 mousedown 后拖到遮罩再松开
  会被当作"点遮罩"关闭。改为只有 mousedown 和 click 都在
  遮罩上才算关闭;弹窗内的文本选择/拖动不再误关
- 备注名输入框加 ✏️ 图标前缀、Token 输入框加 🔑 图标前缀,
  输入聚焦时图标变紫色,更精致现代
- 备注名字体加粗、纯白背景,作为"主"字段视觉更突出
- Token 字段用等宽字体(像密码框该有的样子)
- manifest 1.5.1 → 1.5.2
2026-10-15 01:12:04 +08:00
cbb dc6231b321 fix: v1.5.1 — 美化账号添加/编辑弹窗
- 头部:加紫色渐变圆形头像(首字母=用户名首字符)+ 标题+副标题
- 字段布局:标签/输入/提示文字分层堆叠,视觉更清晰
- GitHub 用户名(只读):从 input 改为带虚线边框的信息块,
  「账号标识 · 不可修改」标签 + 等宽字体值
- Personal Access Token:上方单独显示「当前 Token」小行(绿点=已配/橙点=未配),
  下方输入框改为「粘贴新 Token 以替换(留空不修改)」更清晰
- 私有复选框:独立一行整行可点(hover 反馈)
- 输入框:1.5px 边框 + 浅灰底 + 紫色聚焦环,悬停加深边框
- 底部按钮:自定义「取消」(白底灰边)和「保存修改」/「验证并添加」
  (紫渐变带阴影+hover 上移),布局更平衡
- 弹窗整体:更圆角、加 backdrop 模糊、进入动画更柔和
- 移动端(窄屏)适配:弹窗圆角和内边距自动收紧
- manifest 1.5.0 → 1.5.1
2026-10-15 01:09:13 +08:00
cbb ca2fb7e735 feat: v1.5.0 — GitHub 账号添加/编辑改为弹窗式(带✏️编辑按钮)
- 「添加 GitHub 账号」改为卡片里的按钮,点击弹出填写弹窗
  (模态:备注/用户名/Token/私有,含取消/验证并添加/ESC/点背景关闭)
- 表格每行新增 ✏️ 编辑按钮:弹出编辑弹窗,预填当前值
  (Token 字段空着+占位符显示当前掩码,留空则保留原 Token,
  只改备注/私有时无需重新输入 Token)
- 后端新增 /api/accounts/edit 端点(按 id 改备注/私有/Token),
  add 改为严格新增(gh_user 重复则拒绝并引导用编辑功能)
- 顶部横幅「去添加 Token」直接打开当前账号的编辑弹窗并聚焦 Token
- 移除了原来表内的「添加 Token」按钮(编辑弹窗已覆盖该流程)
- manifest 1.4.1 → 1.5.0
2026-10-15 01:03:47 +08:00
cbb 43b4d757bb feat: v1.4.1 — 数值设置改动即生效,去掉保存按钮
- 同步间隔/并发数/重试次数三个数值输入改 onchange 自动保存:
  改完失焦或按回车即生效并显示「✓ 已生效」(2 秒后淡出),
  不再需要点保存按钮
- 非法值(超范围/非数字)自动回滚成服务器值并红字提示原因
- 防重复保存:值没变不触发请求;空值前端拦截不发请求
- 修复 saveInterval 等包装函数未 return 内部 Promise 导致调用方
  无法等待保存完成的问题
- manifest 1.4.0 → 1.4.1
2026-10-13 21:58:18 +08:00
cbb 62f059921d feat: v1.4.0 — 同步失败自动重试(每 60s 一次,次数可调默认 5)
- 独立重试线程:整轮同步有仓库失败时,把失败仓库排入重试队列,
  每隔 60 秒并行重试一次(复用并行度设置),与同步间隔无关——
  即使同步间隔是 1 天,网络抖动也能在几分钟内自愈
- 重试计数:每个仓库连续失败计数,达到上限(默认 5,可调 0~20,
  0=不重试)后放弃并记日志,等下一轮同步或手动同步再次尝试;
  手动同步成功立即退出重试队列;被其他同步占用(busy)不计次数
- 设置页新增「失败重试次数」;状态页新增「失败重试」统计卡片,
  重试中的仓库显示「⏳ 重试中 x/N」;日志记录排程/重试/放弃全过程
- 修复 retry_next_at 缺少 global 声明导致重试每 2 秒空转的 bug
  (线上实测发现:next_in 显示 0 而非 60)
- manifest 1.3.0 → 1.4.0
2026-10-13 20:32:46 +08:00
cbb 1acd60894f feat: v1.3.0 — 多项目同时同步(并行度可调 1~8,默认 3)
- run_sync 改线程池并行:每轮最多 N 个项目同时克隆/推送,项目多时
  显著缩短单轮耗时(实测 6 个仓库 3 并发 3 倍加速)
- 按仓库防重入:同一仓库同时只允许一个同步,后到者提示
  「该仓库正在同步中,请稍候」,避免并发 git 操作损坏镜像
- 状态页单仓库「同步」按钮不再被整轮同步全局拦截(旧版报
  「已有同步任务正在进行」),与进行中的整轮真正并行
- 新增「同时同步项目数」设置(1~8),设置页可调,立即生效
- 统计计数与日志写入加锁,修正并行下的计数漂移与日志交错风险
- 首页/状态页显示当前并行数;manifest 1.2.0 → 1.3.0
2026-10-13 20:14:57 +08:00
cbb 870612ff93 feat: v1.2.0 — Gitea 地址可更改(默认 http://127.0.0.1:3000)
- 设置页新增「Gitea 地址」输入:同步引擎的 API/克隆/拉取全部改用该地址,
  适配 Gitea 换了端口或部署在别处的场景
- 地址规范化:自动补 http://、去尾部斜杠,校验 scheme/主机名,非法值明确拒绝
- 保存前探测连通性(/api/v1/version),连不上拒绝保存并提示
- 改地址后自动把已有镜像仓库的 origin 重指到新地址,无需重新克隆
- 「打开 Gitea」按钮随设置端口 + 访问面板的主机名自适应(不再写死 3000)
- 改地址/用户名不再误清 Gitea 密码(密码仅在密码行保存时提交)
- 启动日志记录当前 Gitea 地址,便于排障
- manifest 1.1.2 → 1.2.0
2026-10-13 19:59:45 +08:00
cbb 7260f402d3 fix: v1.1.2 — 设置页改版:解释 SSH 账号为何不能自动建库 + 排版优化
- 顶部新增提示横幅:当前账号无 Token 时说明「GitHub 创建仓库接口只认
  Token 认证,SSH 私钥只能推已存在的仓库」,并给出「去添加 Token」入口
- 账号表格:「不支持」改为「需 Token」徽章(带悬停说明),推送方式改用
  徽章区分(Token·HTTPS / SSH 私钥),自动建库显示 私有/公开 徽章
- 每个 SSH 账号行新增「添加 Token」按钮:一键预填添加表单并聚焦
- 排版优化:表单加字段标签、开关/间隔收进选项框、表格列宽/悬停/操作列对齐
- manifest 1.1.1 → 1.1.2
2026-10-13 19:50:46 +08:00
cbb 6661354bfa fix: 安装脚本版本号改为从 manifest 动态读取,避免升级后忘记改硬编码 2026-10-13 19:43:51 +08:00
cbb 3ec3fd01c0 feat: v1.1.1 — 同步间隔可调(5 秒 ~ 1 天,默认 10 秒,改完立即生效)
- 间隔存入 settings.json,带范围校验(5~86400 秒),非法值明确拒绝
- 设置页新增「同步间隔」输入框,附人性化时长提示(秒/分钟/小时)
- 同步循环每轮读取最新间隔,保存后下一轮生效,无需重启
- 首页/状态页的间隔文案改为动态显示(原来硬编码 10 秒)
- manifest 1.1.0 → 1.1.1
2026-10-13 19:37:06 +08:00
cbb 6dcd246567 feat: v1.1.0 — GitHub 多账号切换 + 自动创建仓库 + 私有 Gitea 仓库支持
面向大众使用的三项核心能力:

1. GitHub 多账号(设置页)
   - 添加多个 GitHub 账号(用户名 + Personal Access Token),一键切换推送目标
   - Token 自动识别账号名;添加时先调 /user 验证,失败给出明确原因
   - 每个账号独立记录同步进度(状态目录 .last-pushed/<账号>/<仓库>),
     切回原账号不会重复推送
   - 旧版「默认(SSH 私钥)」账号自动迁移生成,升级后行为不变;
     首次添加 Token 账号会自动切换

2. 自动创建 GitHub 仓库
   - 添加/同步时 GitHub 上不存在同名仓库,自动按账号设置建为私有/公开
   - 「自动创建」可开关;无 Token 时提示去设置页配置

3. 私有 Gitea 仓库支持
   - 设置页新增 Gitea 用户名/密码;密码经 git credential store 文件
     (.gitcreds,600)供 clone/fetch 使用,镜像仓库 remote 不落密码
   - API 查询同步改用 Basic Auth,私有仓库可被列出和克隆

其他:
- 首页/状态页显示当前 GitHub 目标账号与推送方式
- GitHub Token、Gitea 密码在日志和报错中自动打码
- accounts.json / settings.json / .gitcreds 均 600 权限
- manifest 版本 1.0.0 → 1.1.0,README 补充大众用法说明
2026-10-13 19:30:18 +08:00
cbb 4d6f71af5b feat: GiteaHubSync v1.0.0 — fnOS 原生应用:Gitea→GitHub 镜像同步
- 每次推送到飞牛 Gitea(3000 端口)的代码 10 秒内自动镜像到 GitHub 7 个私有仓库
  (SMB_Android / DCU_APP / GD32E50X_BOOT / DCU_DesktopController / Motor_v2 /
  DCU_ECAT_Master / GD32_BOOT),真镜像语义(删分支/标签同步删)
- 标准 .fpk 原生应用:不进 Docker,依赖 python312,安装后进入应用中心已安装列表
  和桌面启动台,支持启动/停止/重启/卸载,NAS 重启自动恢复
- 控制面板(:8899):自动同步开关、立即同步、仓库状态、同步日志、打开 Gitea
- GitHub 推送走 SSH 22 端口直连(HTTPS 443 本地网络被断),部署私钥随应用本地分发
- 附 fnos-install.js(命令行自动安装)、build.sh(重新构建 fpk)、genicon.py(图标生成)

注意:GitHub 部署私钥(GiteaHubSync/app/ssh/id_ed25519)与打包产物 .fpk
按 .gitignore 规则不进仓库,仅保留在工作目录本地分发。
2026-10-13 19:12:49 +08:00