Sign inSign up

caomeiyouren/auto-backup-database

By caomeiyouren

Updated 18 days ago

服务器数据库自动备份方案,支持本地备份和异地备份(OSS/S3)

Image
0

7.6K

caomeiyouren/auto-backup-database repository overview

auto-backup-database

Version Docker Pulls GitHub Workflow Status Documentation Maintenance License: MIT

服务器数据库自动备份方案,支持本地备份和异地备份(OSS/S3)

功能特性

  • 多数据库支持: SQLite、MongoDB、PostgreSQL、MySQL
  • Glob 匹配: 支持 Glob 语法批量匹配数据库文件
  • 压缩加密: 自动压缩备份文件,支持可选的密码加密
  • 本地 + 远程存储: 同时支持本地备份和 OSS/S3 远程备份
  • 生命周期管理: 按天数和总大小自动清理旧备份
  • 定时调度: 基于 Cron 表达式的定时任务调度
  • 消息通知: 支持多种推送渠道(微信、钉钉、飞书等)

依赖要求

  • Node.js >= 20
  • tar(用于压缩)
  • openssl(用于加密,可选)
  • MongoDB Database Tools(仅在启用 MongoDB 备份时需要;Docker 镜像内已预装,宿主机部署需自行安装并确保 mongodump 可执行)
  • MySQL Client Tools(仅在启用 MySQL 备份时需要;Docker 镜像内已预装,宿主机部署需自行安装并确保 mysqldump 可执行)
  • PostgreSQL Client Tools(仅在启用 PostgreSQL 备份时需要;Docker 镜像内已预装,宿主机部署需自行安装并确保 pg_dump 可执行)

安装

# 使用 pnpm
pnpm install

# 使用 npm
npm install

配置

1. 创建配置文件 config.yml
oss:
  region: "${OSS_REGION}"
  accessKeyId: "${OSS_ACCESS_KEY_ID}"
  accessKeySecret: "${OSS_ACCESS_KEY_SECRET}"
  bucket: "${OSS_BUCKET}"
  endpoint: "${OSS_ENDPOINT}"

security:
  backupPassword: "${BACKUP_PASSWORD}"

projects:
  - name: my-app-db
    dbType: sqlite
    dbPath: "/data/apps/my-app/*.db" # 支持 Glob 语法
    backupSchedule: "0 2 * * *" # 每天凌晨 2 点
    compress:
      enabled: true
      password: true # 使用环境变量中的 BACKUP_PASSWORD 加密
    retention:
      local:
        days: 7
        maxSize: 2GB
      remote:
        days: 30
        maxSize: 10GB
    options:
      localEnabled: true
      remoteEnabled: true

  - name: mongo-prod
    dbType: mongodb
    connection:
      uri: "${MONGODB_URI}"
      database: "${MONGODB_DATABASE:-app}"
    dumpOptions:
      archive: true
      authenticationDatabase: "${MONGODB_AUTH_DB:-admin}"
      extraArgs: []
    backupSchedule: "0 3 * * *"
    compress:
      enabled: true
      password: true
    retention:
      local:
        days: 7
        maxSize: 5GB
      remote:
        days: 30
        maxSize: 20GB
    options:
      localEnabled: true
      remoteEnabled: true

  - name: mysql-prod
    dbType: mysql
    connection:
      uri: "${MYSQL_URI}"
      database: "${MYSQL_DATABASE:-app}"
    dumpOptions:
      singleTransaction: true
      quick: true
      routines: true
      events: true
      extraArgs: []
    backupSchedule: "0 3 * * *"
    compress:
      enabled: true
      password: true
    retention:
      local:
        days: 7
        maxSize: 5GB
      remote:
        days: 30
        maxSize: 20GB
    options:
      localEnabled: true
      remoteEnabled: true

  - name: postgres-prod
    dbType: postgresql
    connection:
      uri: "${POSTGRESQL_URI}"
      database: "${POSTGRESQL_DATABASE:-app}"
    dumpOptions:
      format: custom
      compression: 0
      noOwner: true
      extraArgs: []
    backupSchedule: "0 4 * * *"
    compress:
      enabled: true
      password: true
    retention:
      local:
        days: 7
        maxSize: 5GB
      remote:
        days: 30
        maxSize: 20GB
    options:
      localEnabled: true
      remoteEnabled: true

  - name: my-files
    dbType: file # 通用备份模式:直接备份指定的文件或文件夹
    paths: # 支持 Glob 语法,可混合文件和目录
      - "/data/apps/my-app/config"
      - "/data/archives/*.zip"
    backupSchedule: "0 1 * * *"
    compress:
      enabled: true
      password: true
      skipExtensions: [".zip", ".tar.gz"] # 已压缩文件扩展名白名单(可选,默认内置常见压缩格式)
    retention:
      local:
        days: 7
        maxSize: 2GB
      remote:
        days: 30
        maxSize: 10GB
    options:
      localEnabled: true
      remoteEnabled: true

# 通知配置(可选)
notify:
  enabled: true
  type: Dingtalk # 支持多种推送方式,详见 push-all-in-one
  config:
    DINGTALK_ACCESS_TOKEN: "${DINGTALK_ACCESS_TOKEN}"
    DINGTALK_SECRET: "${DINGTALK_SECRET}"
2. 创建环境变量文件 .env
# OSS 配置(支持阿里云 OSS、腾讯云 COS、AWS S3 等)
OSS_REGION=oss-cn-hangzhou
OSS_ACCESS_KEY_ID=your-access-key-id
OSS_ACCESS_KEY_SECRET=your-access-key-secret
OSS_BUCKET=your-bucket-name
OSS_ENDPOINT=https://oss-cn-hangzhou.aliyuncs.com

# 备份加密密码(可选)
BACKUP_PASSWORD=your-secure-password

# MongoDB(可选)
MONGODB_URI=mongodb://username:[email protected]:27017/app?authSource=admin
MONGODB_DATABASE=app
MONGODB_AUTH_DB=admin

# MySQL(可选)
MYSQL_URI=mysql://root:[email protected]:3306
MYSQL_DATABASE=app

# PostgreSQL(可选)
POSTGRESQL_URI=postgresql://postgres:[email protected]:5432
POSTGRESQL_DATABASE=app

# 通知配置(可选)
DINGTALK_ACCESS_TOKEN=your-token
DINGTALK_SECRET=your-secret
3. MongoDB 备份说明

MongoDB 备份计划基于官方 mongodump 工具实现:

  • Docker 部署时,镜像内预装 MongoDB Database Tools,无需额外安装。
  • 非 Docker 部署时,需要自行安装 MongoDB Database Tools,并确保 mongodump --version 可以直接执行。
  • 配置文件中的敏感值统一通过占位符从 .env 注入,避免在 config.yml.env 之间维护两套配置结构。
4. MySQL 备份说明

MySQL 备份基于官方 mysqldump 工具实现:

  • Docker 部署时,镜像内预装 mariadb-clientmariadb-connector-c,默认优先调用 mysqldump,仅在缺失时回退到 mariadb-dump
  • 非 Docker 部署时,需要自行安装 MySQL Client Tools,并确保 mysqldump --version 可以直接执行。
  • 当前实现默认输出单个 .sql 逻辑备份文件,并复用现有压缩、加密、本地存储和远程上传流程。
  • 单项目支持 3 种目标模式:单数据库、显式多数据库和 dumpOptions.allDatabases;若配置 dumpOptions.tables,则只能用于单数据库场景。
  • 推荐在 InnoDB 场景下启用 dumpOptions.singleTransaction: truedumpOptions.quick: true,减少锁表影响并改善大表导出行为。
  • connection.uri 中仅会转换少量已知兼容的查询参数,如 ssl-modetlstls-versionssl-cassl-certssl-keycharset;其他应用层 DSN 参数会被忽略。如需显式传递 CLI 参数,请使用 dumpOptions.extraArgs
  • 如果 MySQL 8 实例使用默认的 caching_sha2_password 认证方式,Docker/Alpine 环境必须确保安装了 mariadb-connector-c,否则会报缺少 caching_sha2_password.so 插件的连接错误。
  • 若 TiDB Cloud 返回 usage quota being exhausted,说明实例配额已耗尽,属于服务端限制,需提升额度或等待恢复后再重试。
5. PostgreSQL 备份说明

PostgreSQL 备份基于官方 pg_dump 工具实现:

  • Docker 部署时,镜像内预装 PostgreSQL Client Tools,无需额外安装。
  • 非 Docker 部署时,需要自行安装 PostgreSQL Client Tools,并确保 pg_dump --version 可以直接执行。
  • 默认使用单文件 custom 格式导出,便于后续通过 pg_restore 做选择性恢复。
  • 当项目级 compress.enabled 开启时,默认关闭 pg_dump 内置压缩,避免重复压缩;若显式设置 dumpOptions.compression > 0,将被视为配置冲突。
  • PostgreSQL 备份必须提供数据库名,可以放在 connection.uri 中,也可以通过 connection.database 单独指定。
6. 通用文件/文件夹备份说明

通用备份模式(dbType: file)直接备份指定的文件或文件夹,复用完整的压缩、加密、本地/远程存储与生命周期清理流程:

  • paths 为必填数组,支持 Glob 语法,可混合指定文件与目录;目录会递归复制并保留目录结构,同名文件自动追加序号避免覆盖。
  • 压缩策略(方案 A):仅当全部备份产物都是压缩文件时跳过压缩、原样传输;只要存在目录或未压缩文件,就整体打包为 .tar.gz
  • 已压缩文件的判定按扩展名白名单进行:默认内置常见压缩格式(.zip.tar.gz.tgz.gz.7z.rar 等),可通过 compress.skipExtensions 自定义。
  • 加密与压缩解耦:即使跳过压缩,配置了 compress.password 时仍会对每个备份产物逐个加密。
  • 压缩、加密、存储和清理行为与数据库备份完全一致,不依赖任何外部数据库工具。

使用

命令行
# 启动调度器(默认模式)
pnpm run start

# 单次执行所有项目备份
pnpm run start -- -m once

# 单次执行指定项目备份
pnpm run start -- -m once -p my-app-db

# 指定配置文件
pnpm run start -- -c /path/to/config.yml -e /path/to/.env
命令行参数
参数说明默认值
-c, --config <path>配置文件路径config.yml
-e, --env <path>环境变量文件路径.env
-o, --output <path>本地备份目录./backups
-m, --mode <mode>运行模式: oncescheduleschedule
-p, --project <name>指定项目名称(单次模式)-
-h, --help显示帮助信息-

Docker 部署

使用 docker-compose
# 构建并启动
docker-compose up -d

# 查看日志
docker-compose logs -f
手动构建
# 构建镜像
docker build -t auto-backup-database .

# 运行容器
docker run -d \
  --name auto-backup-database \
  -v $(pwd)/config:/app/config:ro \
  -v $(pwd)/backups:/app/backups \
  -v /path/to/databases:/app/data:ro \
  auto-backup-database

开发

# 开发模式
pnpm run dev

# 构建
pnpm run build

# 代码检查
pnpm run lint

# 运行测试
pnpm run test

# 提交代码
pnpm run commit

项目结构

src/
├── cli.ts              # CLI 入口
├── index.ts            # 模块导出
├── config/
│   └── loader.ts       # 配置加载器
├── providers/
│   ├── database.ts     # 数据库提供者抽象类
│   ├── mongodb.ts      # MongoDB 提供者
│   ├── mysql.ts        # MySQL 提供者
│   ├── postgresql.ts   # PostgreSQL 提供者
│   └── sqlite.ts       # SQLite 提供者
├── services/
│   ├── backup.ts       # 备份服务
│   └── scheduler.ts    # 调度服务
├── storage/
│   ├── local.ts        # 本地存储
│   └── oss.ts          # OSS 存储
├── notify/
│   └── index.ts        # 通知服务
├── types/
│   └── config.ts       # 配置类型定义
└── utils/
    ├── compress.ts     # 压缩工具
    └── encrypt.ts      # 加密工具

作者

CaoMeiYouRen

贡献

欢迎贡献、提问或提出新功能!请查看 issues pagecontributing guide

支持

如果觉得这个项目有用的话请给一颗⭐️,非常感谢

在爱发电支持我

Star History

Star History Chart

License

Copyright © 2026 CaoMeiYouRen.
This project is MIT licensed.


This README was generated with ❤️ by cmyr-template-cli

Tag summary

Content type

Image

Digest

sha256:0b8d9b14f

Size

89 MB

Last updated

18 days ago

docker pull caomeiyouren/auto-backup-database