数据库备份工具

数据库备份脚本:DB Backup

功能

  • 支持 MySQL 和 PostgreSQL 数据库
  • 可同时上传到 Amazon S3 和 Cloudflare R2 进行云端存储
  • 支持配置多个备份任务
  • 提供 GitHub Actions 工作流示例,以此为依托定时自动执行

执行要求

  • Python
  • 要备份数据库的类型的客户端,mysqldumppg_dump

安装

git clone https://github.com/chris1ding1/db-backup

cd db-backup

uv sync

配置

数据库、云存储的密钥配置

cp .env.example .env

编辑 .env 文件:

# 远程存储,多个用逗号分隔,如 r2,s3,留空则只保存本地
STORAGE_REMOTE_DEFAULT=

# AWS S3 配置
AWS_BUCKET=
AWS_DEFAULT_REGION=
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=

# Cloudflare R2 配置
CLOUDFLARE_ACCOUNT_ID=
CLOUDFLARE_BUCKET=
CLOUDFLARE_ACCESS_KEY_ID=
CLOUDFLARE_SECRET_ACCESS_KEY=

# MySQL 连接
MYSQL_HOST=127.0.0.1
MYSQL_PORT=3306
MYSQL_USER=
MYSQL_PASSWORD=

# PostgreSQL 连接
PGSQL_HOST=127.0.0.1
PGSQL_PORT=5432
PGSQL_USER=
PGSQL_PASSWORD=

备份配置

编辑 config.py 文件

数据库连接配置

DATABASE_CONNECTIONS: dict[str, dict] = {
    "blog-db": { # 自定义 Key 名,在备份任务列表指定链接使用
        "driver": DatabaseDriver.MYSQL, # 数据库类型。 MySQL 为:DatabaseDriver.MYSQL。PostgreSQL 为 DatabaseDriver.PGSQL。
        "host": os.getenv("MYSQL_HOST", "127.0.0.1"),
        "port": int(os.getenv("MYSQL_PORT", "3306")),
        "user": os.getenv("MYSQL_USER"),
        "password": os.getenv("MYSQL_PASSWORD"),
    },
    "shop-db": {
        "driver": DatabaseDriver.PGSQL,
        "host": os.getenv("PGSQL_HOST", "127.0.0.1"),
        "port": int(os.getenv("PGSQL_PORT", "5432")),
        "user": os.getenv("PGSQL_USER"),
        "password": os.getenv("PGSQL_PASSWORD"),
    },
    # 可以添加更多连接...
}

# 备份任务列表
BACKUP_TASKS: list[dict] = [
    {
        "db_connection": "blog-db", # 使用哪个数据库连接。`DATABASE_CONNECTIONS` 中的 Key。
        "dump_command": "",  # 直接写导出备份命令。
        "result_filename": "production.my_database", # 备份文件的文件名称。末尾自动添加 UTC 时区的年月日
        "save_path": "my_database", # 备份文件的保存目录。本地将会保存到当前项目的 `backup/{save_path}` 下。云端的存储路径就本配置值。
    },
    # 可以添加更多任务...
]

执行

uv run python main.py

关于自动定时执行,可在服务器上配置 crontab。 另,本项目提供了 GitHub Actions 工作流配置示例,默认每月 1 号凌晨 1 点执行,也可手动触发。这样无需挂载在任何服务器上。使用方法:

  • Fork 本项目,记得可见性是非公开
  • 复制 backup.yml.examplebackup.yml
  • 按需修改自动执行时间
  • GitHub 仓库中配置环境变量 Secrets 和 Variables
  • 按需修改工作流内设置 .env 的命令,- name: Set environment variable 部分

项目仓库地址:https://github.com/chris1ding1/db-backup