1. 18 Dec, 2025 25 commits
    • shaw's avatar
      fix: 修复前端多个 bug · 14517146
      shaw authored
      1. 版本号闪烁问题
         - 将版本信息缓存到 Pinia store,避免每次路由切换都重新请求
         - 添加加载占位符,版本为空时显示骨架屏
      
      2. 管理员登录跳转问题
         - 管理员登录后现在正确跳转到 /admin/dashboard
         - 普通用户仍跳转到 /dashboard
      
      3. Dashboard 页面空白报错
         - 修复 API 返回 null 时访问 .length 导致的 TypeError
         - 为 computed 属性添加可选链操作符保护
         - 为数据赋值添加空数组默认值
      14517146
    • shaw's avatar
      feat: 实现后台在线更新功能 · 9b4fc424
      shaw authored
      - 前端添加更新和重启按钮,支持一键更新 Release 构建
      - 修复条件判断优先级问题,确保错误/成功状态正确显示
      - 后端使用原子文件替换模式,确保更新过程安全可靠
      - 在可执行文件同目录创建临时文件,保证 rename 原子性
      - 删除未使用的 copyFile 函数,保持代码整洁
      9b4fc424
    • shaw's avatar
      feat: 改进安装脚本的交互体验和自动化流程 · caae7e46
      shaw authored
      - 修复 curl | bash 管道模式下无法交互式输入的问题
        - 使用 /dev/tty 检测终端可用性替代 stdin 检测
        - 所有 read 命令从 /dev/tty 读取用户输入
      - 安装完成后自动启动服务和启用开机自启
      - 使用 ipinfo.io API 获取公网 IP 用于显示访问地址
      - 简化安装完成后的输出信息
      caae7e46
    • shaw's avatar
      fix: 修复前端页面刷新时偶发空白渲染的竞态条件问题 · a26db8b3
      shaw authored
      使用 router.isReady() 等待路由器完成初始导航后再挂载应用,
      避免 RouterView 在路由未就绪时渲染空的 Comment 节点。
      a26db8b3
    • shaw's avatar
      refactor: 使用行业标准方案重构服务重启逻辑 · 8e81e395
      shaw authored
      重构内容:
      - 移除复杂的 sudo systemctl restart 方案
      - 改用 os.Exit(0) + systemd Restart=always 的标准做法
      - 删除 sudoers 配置及相关代码
      - 删除 sub2api-sudoers 文件
      
      优势:
      - 代码从 85+ 行简化到 47 行
      - 无需 sudo 权限配置
      - 无需特殊用户 shell 配置
      - 更简单、更可靠
      - 符合行业最佳实践(Docker/K8s 等均采用此方案)
      
      工作原理:
      - 服务调用 os.Exit(0) 优雅退出
      - systemd 检测到退出后自动重启(Restart=always)
      8e81e395
    • shaw's avatar
      fix: 使用 setsid 确保重启命令独立于父进程执行 · f0e89992
      shaw authored
      问题原因:
      - cmd.Start() 启动的子进程与父进程在同一会话中
      - 当 systemctl restart 发送 SIGTERM 给父进程时
      - 子进程可能也会被终止,导致重启命令无法完成
      
      修复内容:
      - 使用 setsid 创建新会话,子进程完全独立于父进程
      - 分离标准输入/输出/错误流
      - 确保即使父进程被 kill,重启命令仍能执行完成
      f0e89992
    • shaw's avatar
      fix: 使用完整路径执行 sudo 和 systemctl 命令 · 4eaa0cf1
      shaw authored
      问题原因:
      - systemd 服务的 PATH 环境变量可能受限
      - 直接使用 "sudo" 可能找不到可执行文件
      
      修复内容:
      - 添加 findExecutable 函数动态查找可执行文件路径
      - 先尝试 exec.LookPath,再检查常见系统路径
      - 添加日志显示实际使用的路径,方便调试
      - 兼容不同 Linux 发行版的路径差异
      4eaa0cf1
    • shaw's avatar
      fix: 修复 sudo 在非交互模式下无法执行的问题 · e9ec2280
      shaw authored
      问题原因:
      - sudo 命令没有 -n 选项
      - 在后台服务中,sudo 会尝试从终端读取密码
      - 由于没有终端,命令静默失败
      
      修复内容:
      - 添加 sudo -n 选项强制非交互模式
      - 如果需要密码会立即失败并返回错误,而不是挂起
      e9ec2280
    • Wesley Liddick's avatar
      Merge pull request #1 from 7836246/fix/concurrent-proxy-race-condition · bb7bfb69
      Wesley Liddick authored
      fix: 修复并发请求时共享httpClient.Transport导致的竞态条件
      bb7bfb69
    • shaw's avatar
      fix: 修复 install.sh 优先使用旧 sudoers 文件的问题 · b66f97c1
      shaw authored
      问题原因:
      - install.sh 优先从 tar.gz 复制 sudoers 文件
      - 旧版 Release 中的 sudoers 文件没有 /usr/bin/systemctl 路径
      - 即使脚本更新了,仍然会使用旧的配置
      
      修复内容:
      - 移除对 tar.gz 中 sudoers 文件的依赖
      - 总是使用脚本中内嵌的最新配置
      - 确保新版脚本立即生效,无需等待新 Release
      b66f97c1
    • shaw's avatar
      fix: 修复 sudoers 中 systemctl 路径不兼容的问题 · b51ad0d8
      shaw authored
      问题原因:
      - sudoers 只配置了 /bin/systemctl 路径
      - 部分系统(如 Ubuntu 22.04+)的 systemctl 位于 /usr/bin/systemctl
      - 路径不匹配导致 sudo 仍然需要密码
      
      修复内容:
      - 同时支持 /bin/systemctl 和 /usr/bin/systemctl 两个路径
      - 兼容 Debian/Ubuntu 和 RHEL/CentOS 等不同发行版
      b51ad0d8
    • shaw's avatar
      fix: 修复服务用户 shell 导致无法执行 sudo 重启的问题 · 4eb22d8e
      shaw authored
      问题原因:
      - 服务用户 sub2api 的 shell 被设置为 /bin/false
      - 导致无法执行 sudo systemctl restart 命令
      - 安装/升级后服务无法自动重启
      
      修复内容:
      - 新安装时使用 /bin/sh 替代 /bin/false
      - 升级时自动检测并修复旧版本用户的 shell 配置
      - 修复失败时给出警告和手动修复命令,不中断安装流程
      4eb22d8e
    • 江西小徐's avatar
      fix: 修复并发请求时共享httpClient.Transport导致的竞态条件 · 2392e7cf
      江西小徐 authored
      问题描述:
      当多个请求并发执行且使用不同代理配置时,它们会同时修改共享的
      s.httpClient.Transport,导致请求可能使用错误的代理(数据泄露风险)
      或意外失败。
      
      修复方案:
      为需要代理的请求创建独立的http.Client,而不是修改共享的httpClient.Transport。
      
      改动内容:
      - 新增 buildUpstreamRequestResult 结构体,返回请求和可选的独立client
      - 修改 buildUpstreamRequest 方法,配置代理时创建独立client
      - 更新 Forward 方法,根据是否有代理选择合适的client
      2392e7cf
    • shaw's avatar
      fix: 修复安装/升级无法重启服务的问题 · 8e4bd42e
      shaw authored
      8e4bd42e
    • shaw's avatar
      fix: 修复脚本的一些参数问题 · ef3199f0
      shaw authored
      ef3199f0
    • shaw's avatar
      fix: release error · e440530a
      shaw authored
      e440530a
    • shaw's avatar
      fix: release error · e2ae9fe5
      shaw authored
      e2ae9fe5
    • shaw's avatar
      20aee89d
    • shaw's avatar
      fix: release error · 6cf60176
      shaw authored
      6cf60176
    • shaw's avatar
      fix: add missing deploy/DOCKER.md for Docker workflow · 268f4d28
      shaw authored
      The release workflow references ./deploy/DOCKER.md to update DockerHub
      description, but the file was missing causing ENOENT error.
      268f4d28
    • shaw's avatar
      fix: use environment variable to pass full tag message to GoReleaser · 882c2e1e
      shaw authored
      - Extract complete tag message body in workflow using git format
      - Pass tag message via TAG_MESSAGE environment variable
      - Update goreleaser config to use .Env.TAG_MESSAGE instead of .TagBody
      - Fix release notes being truncated to first paragraph only
      882c2e1e
    • shaw's avatar
      fix: release error · e63d9512
      shaw authored
      e63d9512
    • shaw's avatar
      fix: frontend build error · 3d05e503
      shaw authored
      3d05e503
    • shaw's avatar
      First commit · 642842c2
      shaw authored
      642842c2
    • Wesley Liddick's avatar
      Initial commit · 569f4882
      Wesley Liddick authored
      569f4882