# goodBaby v2 ![GitHub go.mod Go version (subdirectory of monorepo)](https://img.shields.io/github/go-mod/go-version/ssdomei232/goodBaby) ![GitHub](https://img.shields.io/github/license/ssdomei232/goodBaby) ![GitHub tag (with filter)](https://img.shields.io/github/v/tag/ssdomei232/goodBaby) 根据《中国心血管健康与疾病报告2023》,中国 每年 猝死总人数(含心源性和非心源性)或达80万-100万,18-35岁人群占比为38%,也就是说,每天18-35岁人群有近1000人猝死 伴随着中国人口老龄化加剧,年轻人的牵挂越来越多,面对着可能的猝死,我们或许真的需要做好准备 所以我写了goodBaby来解决这个问题,他和apple app store里的“死了么”形式上有些接近,不过goodBaby支持了更多好玩的通知方式,比如bilibili动态,github仓库,邮件,OneBot,还可以方便的自托管 [![通过雨云一键部署](https://rainyun-apps.cn-nb1.rains3.com/materials/deploy-on-rainyun-cn.svg)](https://app.rainyun.com/apps/rca/store/7125/cat_) ## 功能 * **WebUI**:内置 Vue3 前端,注册 / 登录、定时器、规则、账号、执行日志、设置全部可视化操作 * **定时器 (Timer)**:设定签到周期与提前提醒时间,到期前通过钉钉机器人提醒你签到 * **规则 (Rule)**:定时器到期后要执行的动作,支持: * 发送邮件 (SMTP) * 发布 B 站动态 * 发送 QQ 消息 (OneBot / NapCat) * 发送钉钉机器人消息 * 公开 GitHub 仓库 * **账号 (Account)**:集中管理第三方凭据,支持连通性测试,敏感字段(密码/Cookie/Token)不会回显 * **消息网关 (Gateway)**:为外部系统生成 Webhook 地址,投递进来的消息会触发绑定在该网关上的「网关规则」 * **网关规则**:与定时器规则分开存储、分开管理,规则里的消息字段(msg / message / body)会被投递内容替换 * **执行日志**:每次规则执行与提醒都有记录,规则支持手动测试 * **配置测试**:账号可一键测试连通性;规则可手动触发验证 ## 快速开始 ### Docker Compose (推荐) ```bash docker compose up -d ``` 首次启动会在 `./data` 下自动生成 `config.json` 与 `data.db`。 打开 `http://localhost:8088`,按引导创建第一个账号即可。 ### 直接拉取镜像 每次发版会自动构建 `linux/amd64` 与 `linux/arm64` 镜像推送到 GitHub Container Registry: ```bash docker run -d --name goodbaby -p 8088:8088 -v ./data:/app/data ghcr.io/ssdomei232/goodbaby:latest ``` ### 下载预编译二进制 [Releases](https://github.com/ssdomei232/goodBaby/releases) 提供 Linux / Windows / macOS 的 amd64 与 arm64 产物, 解压后直接运行即可。压缩包旁的 `checksums.txt` 可校验完整性: ```bash sha256sum -c checksums.txt --ignore-missing ``` ### 从源码构建 需要 Go 1.25+ 与 Node.js 20+: ```bash # 1. 构建前端 cd web/frontend && npm install && npm run build && cd ../.. # 2. 构建后端 go build -o goodbaby . # 3. 运行 ./goodbaby ``` ### 本地开发 ```bash # 终端 1: 启动后端 (监听 :8088) go run . # 终端 2: 启动前端 dev server (监听 :5173,API 代理到 :8088) cd web/frontend && npm run dev ``` ## 配置 配置文件默认为工作目录下的 `config.json`,首次启动自动生成,字段均有默认值: | 字段 | 默认值 | 说明 | | --- | --- | --- | | `listen_addr` | `:8088` | HTTP 监听地址 | | `enable_registry` | `true` | 是否开放注册(系统无用户时始终允许注册第一个账号) | | `timeout_duration_hours` | `6` | 规则执行失败后指数退避重试的最长时间(小时) | | `check_interval_minutes` | `10` | 检查定时器的间隔(分钟) | | `database_driver` | `sqlite` | 数据库驱动,`sqlite` 或 `postgres` | | `database_path` | `data.db` | sqlite 数据库路径 | | `database_dsn` | 空 | postgres 连接串,见 [docs/database.md](docs/database.md) | | `session_secret` | 自动生成 | 会话加密密钥,自动生成并持久化 | | `session_max_age_hours` | `168` | 会话有效期(小时) | | `allowed_origins` | `[]` | 允许跨域的来源,前端本地开发时可填 `["http://localhost:5173"]` | | `log_retain_count` | `500` | 每个用户保留的执行日志条数 | 环境变量覆盖:`GOODBABY_CONFIG`(配置文件路径)、`GOODBABY_LISTEN_ADDR`、`GOODBABY_DB_DRIVER`、`GOODBABY_DB_PATH`、`GOODBABY_DB_DSN`、`GOODBABY_SESSION_SECRET`、`GOODBABY_ENABLE_REGISTRY`。 ### 管理员后台 **第一个注册的用户自动成为管理员**。 ### API Key 每个用户在注册时会自动生成 API Key,可在 WebUI 的“设置”页面查看。调用需要认证的 API 时,在请求头中任选其一: ```http X-API-Key: gb_ ``` 或: ```http Authorization: Bearer gb_ ``` ## 数据库 默认 SQLite,可选 PostgreSQL,详见 [docs/database.md](docs/database.md)。 ## 发版 推送 `v` 开头的 tag 即可自动构建产物、创建 Release 并推送镜像到 ghcr, 详见 [docs/release.md](docs/release.md)。 ## 驱动配置 各驱动的账号 / 规则配置说明见 [docs/](docs/): * [Bilibili](docs/bilibili-config.md) * [Email](docs/email-config.md) * [OneBot (QQ)](docs/onebot-config.md) * [钉钉机器人](docs/dingtalk-config.md) * [GitHub](docs/github-config.md) * [饭碗警告](docs/fwalert-config.md) * [消息网关](docs/gateway-config.md) ## 开发:新增一种规则类型 driver 只负责把动作做出去:规则本体与关联账号由 `handler/runner` 组装成 `model.RuleTask` 后传进来, driver 内部不访问数据库、不写日志,需要账号凭据时从 `task.Account` 里解析。 1. 在 `drivers//` 下实现: * `tool.go`:解析规则 / 账号配置的 `ParseXxx` 函数 * 规则验证器(实现 `ruleConfigChecker.RuleValidator`,`Meta()` 返回表单元数据) * 执行器(实现 `runner.RuleExecutor`,方法签名为 `Execute(ctx, *model.RuleTask)`) * 对外动作(底层函数)保持原子:一次调用只做一件事,用 `retry.Do(ctx, ...)` 包裹重试 * 如需第三方凭据,再实现账号验证器(`accountConfigChecker.AccountValidator`,可选实现 `AccountTester` 支持连通性测试) 2. 在 `internal/ruleConfigChecker/reg.go`、`internal/accountConfigChecker/reg.go`、`handler/runner/reg.go` 中注册 3. 前端无需改动 —— WebUI 会根据 `Meta()` 返回的字段描述自动渲染配置表单 ## 开发:新增一种消息网关 1. 在 `internal/gateway/` 下实现 `Gateway` 接口(`GetType()` / `Meta()` / `Deliver()`), `Deliver` 拿到的 `Task` 里已经包含网关与待触发的规则,实现里不访问数据库 2. 在 `internal/gateway/reg.go` 中注册 3. 前端无需改动 —— 新建网关时的类型选项与说明来自 `Meta()`