主要更新内容
- Metric Store 重构:运行期监控数据读写全部迁移至专用 metric store,支持 SQLite / MySQL / PostgreSQL 后端;默认启用并自带自动迁移与版本备份
- Metric Store 高级特性:新增分层降采样(rollup)、保留策略管理、存储空间检查和回收、后台压缩与过期清理
- Metric Store 迁移工具:支持 store-to-store 启动迁移和运行时热迁移,进度持久化,支持暂停/恢复和中断重启
- Metric 报告批处理:引入批处理器,多个 Agent 报告合并为单事务写入,显著提升写入性能
- 访客审计 RPC 端点:新增
public:recordVisitorEvent接口,支持主题前端记录访客事件至审计日志,带令牌桶限流和字段校验 - 访客审计日志加固:后端自动记录真实 IP 和 User Agent,不信任前端传入值;支持启用开关和字段长度限制
- 启动生命周期重构:将
RunServer拆分为显式阶段(Bootstrap → InitStores → InitProviders → StartBackground → BuildRouter → Run → Shutdown),资源按 LIFO 顺序关闭 - 配置热重载管理器:统一隔离各配置监听器,panic 不影响其他 handler
- 主题操作路径遍历修复:防止通过主题名称进行路径遍历攻击(DeleteTheme / UpdateTheme / SetTheme)
- Telegram 通知改进:非 200 响应时返回 API 返回的错误描述,而非仅状态码
- 移除 Cloudflare tunnel 内置支持:移除
cloudflared二进制依赖、相关环境变量和 Docker 镜像层 - 移除 Cloudflare Access OAuth 提供商
- 移除 Nezha 兼容层和相关 gRPC / protobuf 依赖
- 废弃数据库字段清理:移除旧 CLI 中隐藏的
--db-host/--db-port/--db-user/--db-pass/--db-name,配置仅通过环境变量或配置文件管理 - GitHub Actions 重构:提取可复用的
build-frontend/restore-frontend/setup-zigactions;Snapshot 构建确认只从main分支触发 - Docker 镜像 CI 拆分:前端构建与二进制编译解耦,支持手动触发版本标签
- 新增 loong64 (LoongArch) 架构支持:包含构建矩阵、安装脚本和二进制发布
- Snapshot 版本命名:改为 UTC+8 时区生成
Bug修复
- 主题路径遍历安全漏洞:在 DeleteTheme / UpdateTheme / SetTheme 操作中防止利用主题名读取任意文件
- Telegram 通知:非 200 响应时返回 API 错误描述而非仅状态码
- 访客审计日志加固:硬编码 IP/UA 来源,增加字段长度限制和限流
- 数据库时间查询:改用
FromTime()确保时区正确处理,修复缓存清理 - SQLite 写锁定:避免 metric 写入和迁移期间的
database is locked错误 - Metric 迁移性能:批量写入 + keyset 分页,迁移进度在恢复时不从头计数
- Metric 粒度聚合:保留序列身份,修复 rollup 查询中兼容间隔选择
- Metric 压缩:每指标独立游标,避免单指标失败阻塞整个压缩流程;修复零保留指标定义
- GET /api/rpc2 节点列表:
common:getNodes返回 uuid 键映射而非数组 - Metric 数据清理:在删除客户端或 Ping 任务前清理对应 metric store 数据
其他
What's Changed
- fix(security): prevent path traversal in theme name (DeleteTheme/UpdateTheme/SetTheme) by @guocn in #584
- fix(telegram): 非 200 响应时返回 API 错误描述而非仅状态码 by @Torther in #583
- feat(rpc): add public visitor audit event endpoint by @sanrokamlan-prog in #597
- fix: harden visitor audit logging by @sanrokamlan-prog in #602
Commits
- feat: route metric reads and writes to dedicated store (f2c46db) @Akizon77
- fix(database): use FromTime() for time queries and improve cache cleanup (f0877d6) @Akizon77
- fix(telegram): include API error description in non-200 responses (da047cf) @Torther
- refactor(metrics): route all storage through metric store when enabled (6a5f3ef) @Akizon77
- fix(rpc): common:getNodes returns uuid-keyed map instead of array (ff6daa6) @Akizon77
- Merge branch 'refactor/metrics-unify-storage': unify storage through metric store + getNodes map (0132d1c) @Akizon77
- fix(theme): prevent path traversal in theme operations (404d97d) @guocn
- fix(theme): prevent path traversal in theme operations (#584) (92ec774) @Akizon77
- Merge pull request #583 from Torther/main (b6fcdd3) @Akizon77
- fix: avoid sqlite database is locked failures for record writes (332053d) @Akizon77
- feat(metrics): hot-reload metrics DB config with connection test before save (9e5b6df) @Akizon77
- fix: avoid sqlite table locks during metric migration (64998b5) @Akizon77
- feat(metrics): infer DB driver from DSN automatically (d02d934) @Akizon77
- merge: metrics DSN autodetect (be6af33) @Akizon77
- perf: 优化 metrics 迁移性能 - 批量写入 + keyset 分页 (5c2bd4e) @Akizon77
- feat(metrics): 支持迁移暂停/恢复,进度持久化与重启后孤儿状态修复 (416ea87) @Akizon77
- fix(migration): 恢复迁移时保留已迁移进度计数,避免从0重新累计 (43c80d2) @Akizon77
- ci: align snapshot workflow behavior (eb4ca83) @airium
- refactor: split startup into app lifecycle stages (6ddb143) @Akizon77
- feat(metrics): always enable metric store with startup migration and version-based backup (4ad190a) @Akizon77
- refactor: remove built-in Cloudflare tunnel support (73071ff) @Akizon77
- refactor(oauth): remove Cloudflare Access provider support (ab31fc6) @Akizon77
- Use UTC+8 for snapshot versions (e009444) @Akizon77
- fix: run metric store migrations before startup migration (84130df) @Akizon77
- refactor(metrics): use metric retention for cleanup settings (7e0d542) @Akizon77
- feat: add metric retention policy management (7d95240) @Akizon77
- fix(metric): preserve series identity during aggregation (8911c08) @Akizon77
- feat(metricstore): add scheduled rollup compaction (5ad791f) @Akizon77
- fix(metricstore): rotate compaction cursor per metric (46b4e37) @Akizon77
- ci: reuse frontend and toolchain actions in workflows (8a529b4) @Akizon77
- feat(metricstore): aggregate record queries via series rollups (b2fe9ab) @Akizon77
- ci: generate AI-assisted release notes from stable tags (8910c2e) @Akizon77
- feat(metricstore): track ping packet loss in metrics (855ff82) @Akizon77
- Improve release notes generation (5ade710) @Akizon77
- Read release note workflow inputs (0660ee7) @Akizon77
- Use stable release base for snapshot notes (29eecf5) @Akizon77
- feat(metric): preserve series identity in rollup queries (9831df0) @Akizon77
- Include commits in release notes (39c5f7b) @Akizon77
- feat(metricstore): add downsampling toggle, raise default retention to 90d, and cleanup expired data on compact (42ef993) @Akizon77
- fix(metrics): select compatible rollup intervals (3b48339) @Akizon77
- Fix metric rollup compaction and retention (ff358ed) @Akizon77
- refactor: improve metric store lifecycle management with context-aware close and operation gate (c828653) @Akizon77
- disable downsampling by default (724dd3b) @Akizon77
- feat: add visitor audit rpc endpoint (7679430) @sanrokamlan-prog
- Update generate-release-notes.yml (5c73eba) @Akizon77
- Merge pull request #597 from sanrokamlan-prog/visitor-audit-rpc (1eb3549) @Akizon77
- fix: harden visitor audit logging (0c80f0f) @sanrokamlan-prog
- Merge pull request #602 from sanrokamlan-prog/fix/visitor-audit-hardening (5fa59ab) @Akizon77
- refactor: replace static retention config with dynamic retention summary (7f36881) @Akizon77
- fix: preserve zero-retention metric definitions across operations (66b7691) @Akizon77
- refactor(metrics): remove DefaultRetentionDays config option and enforce explicit retention (7baf2ed) @Akizon77
- fix: reduce default built-in metric retention to 1 day for testing (c1178eb) @Akizon77
- fix(metricstore): use Series to read ping records for rollup support (e2a8284) @Akizon77
- feat: clean metric store before deleting client or ping task (43547b9) @Akizon77
- feat(metric): add compaction watermark upsert and update storage queries (5b90804) @Akizon77
- feat: #414 add support for loong64 architecture (fc3febc) @Akizon77
- refactor: remove unused database functions for sessions, clients, and metric store (0f6f2f4) @Akizon77
- refactor: remove Nezha compatibility (f42cfe7) @Akizon77
- Make metric chart gaps adaptive (73c3c43) @Akizon77
- refactor: remove deprecated WriteRecord/WriteGPURecord and refactor cron jobs (312e320) @Akizon77
- feat(metricstore): batch metric report writes in single transactions (a78ef87) @Akizon77
- refactor(jsonrpc): remove deprecated Tag field from public metric types (d853a83) @Akizon77
- feat: add legacy upgrade server and refactor OAuth initialization (3c27823) @Akizon77
- feat(admin): add database compression inspection and configuration endpoints (fee8c86) @Akizon77
- Revert "feat(admin): add database compression inspection and configuration endpoints" (7f12850) @Akizon77
- refactor: clean up metric constants and refactor record downsampling (99fda6b) @Akizon77
- refactor: standardize time fields (42b290f) @Akizon77
- remove unused database connection parameters (be3daa4) @Akizon77
- fix: #609 #612 continue compaction on per-metric errors and add separate compaction gate (5a66f28) @Akizon77
- fix: remove orphaned metric data before space reclaim and reject unknown metrics (cdfd5bd) @Akizon77
- feat: drop obsolete builtin metrics and expose definition creation (b554368) @Akizon77
- feat: make metric deletion async and add UpdateMetricRetention (b4d3977) @Akizon77
New Contributors
- @guocn made their first contribution in #584
- @Torther made their first contribution in #583
- @sanrokamlan-prog made their first contribution in #597
Full Changelog: 1.2.5-fix1...Snapshot-2607201644