93 Commits

Author SHA1 Message Date
耗子 237b1bfcee feat: 证书支持关联多个网站,close #1587 2026-08-15 20:54:45 +08:00
耗子 dac99e9e00 chore: 清理代码 2026-08-15 07:58:26 +08:00
耗子 255cb98d9d perf: 优化监控与辅助数据库存储 2026-08-14 18:57:07 +08:00
耗子 d3ea65baf3 fix: 支持面板域名 ACME 证书 2026-08-12 15:57:43 +08:00
耗子 ea22c2f0a7 refactor(di): restore compile-time Wire injection
Replace the samber/do runtime container with explicit constructor dependencies and generated Wire graphs for ace and cli. Keep CLI application loading isolated and verify generated files in CI.
2026-07-27 02:54:44 +08:00
耗子 4e28fc60a3 feat: 添加通知与告警模块
- 通知渠道支持配置多个 SMTP 账号,配置整体加密落库,删除时清理规则与事件设置中的引用
- 告警规则支持 18 种指标:CPU/内存/Swap/负载/磁盘用量与 inode/磁盘与网卡速率/网站 5xx 与错误率、
  服务与项目与容器与应用与数据库运行状态、证书与网站剩余天数,可配连续命中次数与静默期
- 系统事件通知覆盖证书续签失败、备份失败、后台任务失败、计划任务失败、网站到期、防篡改拦截、
  面板健康问题、面板登录与爆破、SSH 登录与爆破
- 计划任务统一经 wrapper 执行以捕获退出码,flock 抢锁失败不计为失败
- 监控页改造为系统/告警/设置三 Tab
- 数据库驱动建连打通 context 并补齐连接超时,探测不再阻塞告警评估

close #1041

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-25 22:45:51 +08:00
耗子 f0d8acca31 fix: 优化 2026-07-21 18:54:59 +08:00
耗子 038ef2c44f fix(tamper): 修复重启恢复延迟与统计日志时效
定时任务支持启动后立即触发,面板重启即恢复保护不留空窗;
查看拦截日志前先落库缓冲即拦即见;受保护目录改按监控口径
统计,带后缀规则不再恒为零

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-21 00:58:57 +08:00
耗子 8fa5c6d881 feat(file): 文件分享下载支持面板间互传
生成免登录的临时下载链接,强制设置有效期并支持下载次数限制,
过期分享由定时任务每小时清理,链接可直接用于其他面板的远程下载。

Closes #1641

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-20 22:47:11 +08:00
耗子 5db94ee61c fix(tamper): 修复登记表脏映射与新建监控竞态并统一英文日志
- Unlock/Relock 同步维护事件回填表与统计,移动/替换文件后不再残留脏路径
- 新建目录补扫竞态窗口内已写入的文件,堵住 mkdir 后立即落文件的漏检
- chattr 整树模式下新建拦截需临时解除父目录 +a 才能删除
- inotify 监控失败聚合告警,便于发现 max_user_watches 耗尽
- 扫描器单网卡挂载失败仅跳过,聚合缓冲加上限防伪造源洪水耗尽内存
- ringbuf 解析改主机字节序,日志与错误串统一英文

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-20 05:53:14 +08:00
耗子 f151e29659 fix(tamper): 修复 eBPF 防护绕过并优化两处 BPF map 资源占用
- inode_rename 增查 new_dentry,堵住改名覆盖受保护文件的绕过
- 新增 inode_setattr 拦截点,堵住 truncate/chmod/chown 绕过
- 两处 hash map 加 BPF_F_NO_PREALLOC,消除数十 MB 内核内存预占
- 保护集合改批量更新,大目录树免逐键 syscall
- 扫描检测器 Supported() 在 lo 试挂 TCX,低版本内核不再误报支持
- lsm= 注入正则加词边界,防误改同后缀参数

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-20 05:28:26 +08:00
耗子 a0b5a356a8 feat(tamper): 面板内置网站文件防篡改
双模式运行时可选:
- chattr 模式:inode 属性锁定(+i/+a),内核 VFS 层事前强制,全发行版通用
- eBPF-LSM 模式:纯 Go asm 手写 LSM 程序 + 运行时 BTF 查偏移(零编译),
  拦截写/删/改名并溯源进程,bpf LSM 未激活时引导改 grub 重启激活

含独立审计库、拦截日志、保护规则、fsnotify 新建监控、面板写入自动解锁恢复,
以及备份修复适配。参考 pkg/firewall/scan 的 eBPF 运行时加载范式

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-20 04:20:37 +08:00
耗子 cbed8e4797 refactor(job): 定时任务改为声明式贡献,测试脱离环境变量
- 每个任务合并为单个 NewXxx(i do.Injector) (Job, error) 构造函数,
  直接返回声明式 Job{Spec, Task},删除 JobFn 闭包与 Register 包装层
- 调度器改为 registry.Collect[job.Job] 统一装配,与路由贡献模型对称
- InitGlobal 导出并读取 conf.App.Root(默认 /opt/ace),
  返回 error 不再 Fatalf,修复原先无视配置 root 字段的硬编码
- 容器装配测试改用内存配置 + do.OverrideValue 注入,
  不再依赖磁盘配置与 PANEL_CONFIG 环境变量(原测试实际会失败)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-09 22:31:56 +08:00
耗子 443516a2cf refactor!: 迁移至 samber/do 依赖注入与三层架构
依赖注入:
- 移除 google/wire(含 wire.go/wire_gen.go 与全部 ProviderSet),
  改用 samber/do v2 单注入器 + 双入口惰性构建
- 贡献模型替代命令式注册:路由 routes:、命令 commands:、
  任务 jobs: 前缀经 internal/registry 收集与校验
- 构造函数统一 func NewXxx(i do.Injector) (T, error)

三层架构:
- 补全用例层:每个 biz.XxxRepo 配 XxxUsecase,
  service/command/job 表现层只依赖用例,不再直接引用仓储

路由与文档:
- route/http.go 按域拆为声明式 Endpoint 贡献,
  Endpoint 承载登录白名单与端点限流语义
- 调试模式下提供 OpenAPI 3.1 文档:/openapi.json 与 /docs(Scalar),
  从 validate 标签生成

目录与依赖:
- internal/http/{middleware,request,rule} 拍平至 internal/*
- CLI 命令拆至 internal/command
- 日志轮转 timberjack 换为 libtnb/logrotate
- 升级 validator/cron/sessions/gormstore/sqlite/securecookie
- 数据库迁移保持 gormigrate 不变

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-09 21:54:22 +08:00
耗子 f024381660 feat(panel): 数据库故障降级、健康告警与检测
- 网站统计聚合器 flush 失败也 commit(丢弃已 drain 增量),防止 DB
  长期不可写时内存无界累积导致 OOM/CPU 100%
- 势态感知同样在 upsert 失败时上报健康问题
- 新增 internal/app.Health 全局健康状态注册表,通过 /home/health 暴露
- 前端 layout 顶部新增 HealthBanner,DB 故障时红色横幅提醒并给出修复引导
- acepanel fix 检测数据库损坏改用 PRAGMA quick_check,能识别 malformed
  等仅在查询时才暴露的静默损坏
- 主库与辅助库 DSN 一律设为 synchronous(FULL),减少宿主 write-back
  缓存丢失 fsync 导致的损坏概率
- 移除 debug.SetMemoryLimit(256MB):软上限在活对象超限时会驱动 GC 反复
  追赶不可回收对象,反而放大 CPU 打满

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-07-03 04:21:10 +08:00
耗子 00a5acbc45 feat(panel): 重写自升级流程并精简面板备份 (close #1674)
升级改为覆盖式:只替换程序文件,storage 原地不动,中断安全无需 fix;新增 WS 实时进度,前端等待重启自动刷新。面板备份改为仅打包核心文件(ace/panel.db/config.yml/cert/cli),排除统计/扫描大库,体积大幅下降。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-03 02:12:52 +08:00
耗子 c41dab89f8 refactor: 替换 robfig/cron/v3 为 libtnb/cron
robfig/cron 已停止维护,迁移到 libtnb/cron(零三方依赖,API 设计更现代)

主要变更:
- pkg/cron/logger.go 删除,libtnb/cron 直接吃 *slog.Logger
- bootstrap.NewCron 用 wrap.Recover() / wrap.SkipIfRunning() 替代旧 cron.Recover / SkipIfStillRunning
- app.Ace.Run 处理 c.Start() error 返回值;c.Stop(ctx) 接受 context
- 6 个 job (Monitoring/FirewallScan/CertRenew/PanelTask/WebsiteStat/WebsiteExpire) 的 Run 签名从 () 改为 (context.Context) error
- jobs.Register 用 c.Add 替代 c.AddJob
- 重新生成 wire 代码

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 18:55:39 +08:00
耗子 c0d8642cb5 fix: 优化代码 2026-04-28 06:05:34 +08:00
Copilot 6a7c856fe8 feat: 网站到期自动关闭 (#1561)
* Initial plan

* feat: 网站到期自动关闭功能

- biz.Website 新增 ExpireAt 字段(*time.Time,可空,默认不限时)
- 新增数据库迁移自动添加 expire_at 列
- 新增 API 端点 POST /website/{id}/expire_at
- 新增定时任务每分钟检查到期网站并自动关闭
- 前端网站列表新增到期时间列(证书有效期与备注之间)

Agent-Logs-Url: https://github.com/acepanel/panel/sessions/af33abcf-bbcd-4306-a680-76307c699774

Co-authored-by: h2zi <5967335+h2zi@users.noreply.github.com>

* refactor: 优化到期任务查询和数据更新

- 到期检查任务直接查询已到期且运行中的网站,避免加载全量数据
- UpdateExpireAt 使用直接 UPDATE 避免不必要的 SELECT 查询

Agent-Logs-Url: https://github.com/acepanel/panel/sessions/af33abcf-bbcd-4306-a680-76307c699774

Co-authored-by: h2zi <5967335+h2zi@users.noreply.github.com>

* refactor: ExpireAt 改为 time.Time,日志使用英文

- ExpireAt 从 *time.Time 改为 time.Time,零值表示不限时
- 日志消息改为英文,与其他 job 文件风格保持一致
- 前端适配零值时间判断

Agent-Logs-Url: https://github.com/acepanel/panel/sessions/00c49c64-7614-48d1-98bb-0d742d5f10ad

Co-authored-by: h2zi <5967335+h2zi@users.noreply.github.com>

* Revert "refactor: ExpireAt 改为 time.Time,日志使用英文"

This reverts commit ac3dfdb7e4.

* fix: lint

* fix: lint

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: h2zi <5967335+h2zi@users.noreply.github.com>
Co-authored-by: 耗子 <haozi@loli.email>
2026-04-22 03:06:43 +08:00
耗子 e799cb4031 feat: 重构面板证书逻辑 2026-03-30 20:28:11 +08:00
耗子 d8515f9883 feat: 监控采集间隔支持设置 2026-02-27 00:11:07 +08:00
耗子 44f569b478 feat: 扫描感知支持自动屏蔽IP 2026-02-26 04:04:02 +08:00
耗子 38ec8b63d2 feat: 扫描感知支持自动屏蔽IP 2026-02-26 03:58:06 +08:00
半岛的蒟蒻bddjr e947259b86 fix: go.mod module github.com/acepanel/panel/v3 (#1423) 2026-02-25 18:07:00 +08:00
耗子 7de339b3f7 feat: 统计添加ISP数据 2026-02-22 20:47:37 +08:00
耗子 3445d2396e feat: 数据库优化 2026-02-22 20:06:11 +08:00
耗子 d216a72ac9 feat: 数据库优化 2026-02-22 19:58:20 +08:00
耗子 1d7f0a2f22 feat: 优化IP解析性能 2026-02-22 07:39:35 +08:00
耗子 6c589d0350 revert: 网站统计默认值调整 2026-02-22 00:35:29 +08:00
耗子 ec1e069b84 feat: 优化网站统计数据压力 2026-02-21 22:12:59 +08:00
耗子 67a4b2f8f1 feat: 网站统计优化 2026-02-20 04:46:58 +08:00
耗子 b39785fc34 feat: 网站统计优化 2026-02-20 04:29:40 +08:00
耗子 6809969b25 feat: 新增IP库保存下载 2026-02-20 03:13:32 +08:00
耗子 c64cf8ac18 feat: 新增IP库可选自动更新 2026-02-20 02:22:47 +08:00
耗子 2d8f014d20 feat: 新增IP地理位置显示 2026-02-20 00:02:26 +08:00
耗子 cc895d4df7 fix: 网站统计的一系列问题 2026-02-19 06:21:53 +08:00
耗子 da70928767 fix: 网站统计的一系列问题 2026-02-19 06:09:19 +08:00
耗子 19a3a92216 fix: 修复网站统计一些逻辑问题 2026-02-19 03:00:19 +08:00
耗子 2b48fd5fe3 feat: 完善网站统计 2026-02-18 19:50:33 +08:00
耗子 7d368536d0 feat: 完善网站统计 2026-02-18 19:18:50 +08:00
耗子 fa30728753 feat: 网站统计 2026-02-18 18:17:16 +08:00
耗子 9a1555c48a feat: 防火墙扫描感知功能 & 首页容器统计 & lint 修复
- 新增 eBPF 扫描感知:TC ingress 检测 SYN/UDP 扫描,端口白名单过滤
- 新增首页容器数量统计卡片,未安装容器环境时自动隐藏
- 扫描概览页:统计卡片、趋势图、Top IP/端口、事件列表
- 扫描设置页:启用开关、保留天数、网卡选择
- 统计对比改为同长度上一周期,替代固定昨日对比
- eBPF ports map MaxEntries 扩展至 65535 覆盖全端口
- 修复 WriteString(fmt.Sprintf()) lint 问题,改用 fmt.Fprintf
- 修复 database_redis.go 非常量格式字符串和 govet 警告

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-18 02:52:32 +08:00
耗子 c56b4e00d9 feat: 监控添加Top进程记录 2026-02-10 21:55:11 +08:00
Copilot 0724a042ef feat: HTTP/3 (QUIC) 支持 + TLS 证书热重载 (#1356)
* Initial plan

* feat: 添加 HTTP/3 (QUIC) 协议支持,TLS 启用时自动启用

Co-authored-by: devhaozi <115467771+devhaozi@users.noreply.github.com>

* refactor: 优化证书路径复用,修正注释和依赖标记

Co-authored-by: devhaozi <115467771+devhaozi@users.noreply.github.com>

* feat: 添加证书热重载,TLS 握手时自动检测并加载变更的证书文件

Co-authored-by: devhaozi <115467771+devhaozi@users.noreply.github.com>

* refactor: 使用 fsnotify 替代每次握手 os.Stat 实现证书热重载

Co-authored-by: devhaozi <115467771+devhaozi@users.noreply.github.com>

* fix: lint

* fix: lint

* fix: 使用 wire 工具重新生成 wire_gen.go 替代手动编辑

Co-authored-by: devhaozi <115467771+devhaozi@users.noreply.github.com>

* feat: 通过 Wire 注入 *tlscert.Reloader,优雅关闭时正确释放资源

Co-authored-by: devhaozi <115467771+devhaozi@users.noreply.github.com>

* fix: lint

* fix: lint

* fix: lint

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: devhaozi <115467771+devhaozi@users.noreply.github.com>
Co-authored-by: 耗子 <haozi@loli.email>
2026-02-09 20:10:13 +08:00
耗子 cef8d7caa7 fix: 面板IP证书续签 2026-01-31 18:40:41 +08:00
耗子 5269924ca4 feat: 证书添加超时 2026-01-23 22:45:38 +08:00
耗子 d173755f98 feat: 伪静态配置本地化 2026-01-23 21:57:05 +08:00
耗子 f64b06b774 feat: 备份优化 2026-01-22 03:44:20 +08:00
耗子 72ecb6904d feat: 备份重构1 2026-01-20 02:18:13 +08:00
Copilot f2e41a3364 feat: 添加操作日志记录功能和前端日志查看页面 (#1227)
* Initial plan

* feat: 添加操作日志记录功能和前端日志查看页面

Co-authored-by: devhaozi <115467771+devhaozi@users.noreply.github.com>

* fix: 修复 HttpLog 中 IP 字符串处理的类型安全问题

Co-authored-by: devhaozi <115467771+devhaozi@users.noreply.github.com>

* fix: lint

* feat: 完善面板内日志记录,添加网站/数据库/项目/计划任务/备份CRUD日志

Co-authored-by: devhaozi <115467771+devhaozi@users.noreply.github.com>

* feat: 完善更多模块的日志记录(证书/SSH/Webhook/用户/设置/安全)

Co-authored-by: devhaozi <115467771+devhaozi@users.noreply.github.com>

* fix: 改进cert_dns删除方法,在删除前获取实体信息用于日志记录

Co-authored-by: devhaozi <115467771+devhaozi@users.noreply.github.com>

* fix: lint

* feat: 从session获取操作员ID并在前端显示用户名

Co-authored-by: devhaozi <115467771+devhaozi@users.noreply.github.com>

* fix: lint

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: devhaozi <115467771+devhaozi@users.noreply.github.com>
Co-authored-by: 耗子 <haozi@loli.email>
2026-01-12 23:31:22 +08:00