Files
goodBaby/docs/database.md
T
meiandClaude Fable 5 ae7082f13c feat: 管理员后台配置 + PostgreSQL 支持
管理员后台:
- User 新增 IsAdmin,第一个注册的用户自动成为管理员;
  老库升级时自动把最早注册的用户提升为管理员
- 新增 AdminMiddleware 与 /api/v1/admin/config 读写接口
- 可改开放注册、检查间隔、规则重试时长、日志保留条数,保存即生效
- 检查间隔改动后自动重排定时任务,为此把 cron 抽成 handler/scheduler
- 监听地址、数据库、会话密钥等启动项不开放,接口只返回只读展示
- 设置页新增"系统配置"区块,仅管理员可见

PostgreSQL:
- 新增 database_driver / database_dsn 配置,默认仍为 sqlite
- postgres 用独立连接池(20/5/1h),sqlite 保持单连接避免写锁
- 启动时先 Ping,配置写错在启动阶段就报错而不是等到首次查询
- 支持 GOODBABY_DB_DRIVER / GOODBABY_DB_DSN 环境变量,
  只给 DSN 时自动按 postgres 处理

文档: 新增 docs/database.md(含 compose 示例与切换说明),README 补充管理员与数据库章节

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-27 07:17:16 +08:00

2.5 KiB

数据库配置

goodBaby 默认使用 SQLite,零配置开箱即用;也可以切换到 PostgreSQL。

SQLite(默认)

{
  "database_driver": "sqlite",
  "database_path": "data.db"
}

用的是纯 Go 的 glebarez/sqlite,不需要 CGO,编译出来就是一个静态二进制。

已开启 WAL 与 10 秒 busy timeout;因为 SQLite 是单写模型,连接池被限制为 1 条连接,避免并发执行规则时出现 database is locked。

PostgreSQL

{
  "database_driver": "postgres",
  "database_dsn": "postgres://user:password@localhost:5432/goodbaby?sslmode=disable"
}

切换到 postgres 后 database_path 会被忽略。连接池为最大 20 条连接、5 条空闲、连接最长存活 1 小时。

启动时会先 Ping 一次,配置写错会在启动阶段直接报错退出,而不是等到第一次查询才失败。

环境变量

配置文件之外也可以用环境变量覆盖,适合容器部署:

变量 说明
GOODBABY_DB_DRIVER sqlite 或 postgres
GOODBABY_DB_DSN postgres 连接串
GOODBABY_DB_PATH sqlite 文件路径

只设置了 GOODBABY_DB_DSN 而没设置 GOODBABY_DB_DRIVER 时,会自动按 postgres 处理。

docker compose 示例

services:
  goodbaby:
    image: mei232/goodbaby:v2.1.0
    ports:
      - "8088:8088"
    environment:
      - TZ=Asia/Shanghai
      - GIN_MODE=release
      - GOODBABY_DB_DSN=postgres://goodbaby:goodbaby@postgres:5432/goodbaby?sslmode=disable
    volumes:
      - ./data:/app/data
    depends_on:
      postgres:
        condition: service_healthy
    restart: unless-stopped

  postgres:
    image: postgres:17-alpine
    environment:
      - POSTGRES_USER=goodbaby
      - POSTGRES_PASSWORD=goodbaby
      - POSTGRES_DB=goodbaby
    volumes:
      - pgdata:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U goodbaby"]
      interval: 5s
      timeout: 5s
      retries: 10
    restart: unless-stopped

volumes:
  pgdata:

切换数据库

两种数据库之间没有自动数据迁移。切换驱动后是一个全新的空库,需要重新注册账号并配置规则。

如果要搬运已有数据,得自己从 SQLite 导出再导入 PostgreSQL(表结构一致:users / timers / rules / accounts / execution_logs)。

建表

首次启动会自动执行 AutoMigrate 建表并补齐新增字段,不需要手动执行 SQL。