服务器数据库自动备份方案,支持本地备份和异地备份(OSS/S3)
7.6K
服务器数据库自动备份方案,支持本地备份和异地备份(OSS/S3)
mongodump 可执行)mysqldump 可执行)pg_dump 可执行)# 使用 pnpm
pnpm install
# 使用 npm
npm install
config.ymloss:
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}"
.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
MongoDB 备份计划基于官方 mongodump 工具实现:
mongodump --version 可以直接执行。.env 注入,避免在 config.yml 与 .env 之间维护两套配置结构。MySQL 备份基于官方 mysqldump 工具实现:
mariadb-client 与 mariadb-connector-c,默认优先调用 mysqldump,仅在缺失时回退到 mariadb-dump。mysqldump --version 可以直接执行。.sql 逻辑备份文件,并复用现有压缩、加密、本地存储和远程上传流程。dumpOptions.allDatabases;若配置 dumpOptions.tables,则只能用于单数据库场景。dumpOptions.singleTransaction: true 与 dumpOptions.quick: true,减少锁表影响并改善大表导出行为。connection.uri 中仅会转换少量已知兼容的查询参数,如 ssl-mode、tls、tls-version、ssl-ca、ssl-cert、ssl-key、charset;其他应用层 DSN 参数会被忽略。如需显式传递 CLI 参数,请使用 dumpOptions.extraArgs。caching_sha2_password 认证方式,Docker/Alpine 环境必须确保安装了 mariadb-connector-c,否则会报缺少 caching_sha2_password.so 插件的连接错误。usage quota being exhausted,说明实例配额已耗尽,属于服务端限制,需提升额度或等待恢复后再重试。PostgreSQL 备份基于官方 pg_dump 工具实现:
pg_dump --version 可以直接执行。custom 格式导出,便于后续通过 pg_restore 做选择性恢复。compress.enabled 开启时,默认关闭 pg_dump 内置压缩,避免重复压缩;若显式设置 dumpOptions.compression > 0,将被视为配置冲突。connection.uri 中,也可以通过 connection.database 单独指定。通用备份模式(dbType: file)直接备份指定的文件或文件夹,复用完整的压缩、加密、本地/远程存储与生命周期清理流程:
paths 为必填数组,支持 Glob 语法,可混合指定文件与目录;目录会递归复制并保留目录结构,同名文件自动追加序号避免覆盖。.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> | 运行模式: once 或 schedule | schedule |
-p, --project <name> | 指定项目名称(单次模式) | - |
-h, --help | 显示帮助信息 | - |
# 构建并启动
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 page 或 contributing guide。
如果觉得这个项目有用的话请给一颗⭐️,非常感谢
Copyright © 2026 CaoMeiYouRen.
This project is MIT licensed.
This README was generated with ❤️ by cmyr-template-cli
Content type
Image
Digest
sha256:0b8d9b14f…
Size
89 MB
Last updated
18 days ago
docker pull caomeiyouren/auto-backup-database