Skip to content

备份与恢复

本章节介绍 Ocean CTF 的数据备份与恢复建议,覆盖数据库、缓存、用户上传文件、以及与容器环境相关的持久化数据。

需要备份哪些内容

1. MySQL(核心数据)

MySQL 中包含平台的核心业务数据,例如:

  • 用户与权限
  • 比赛与题目
  • 提交记录、成绩单
  • 系统设置
  • 模板/环境元数据(取决于版本与配置)

2. Redis(缓存/队列)

Redis 多用于缓存与任务队列。通常情况下 Redis 可不备份(可重建),但在你使用 Redis 保存了重要状态时建议备份。

3. 用户上传文件(uploads)

常见包括:

  • 用户头像
  • 题目附件
  • 公告/富文本中的图片

4. 容器相关持久化数据(可选)

如果你使用了 Docker Volume 保存:

  • MySQL 数据卷
  • Redis 数据卷
  • 平台的持久化目录

建议将这些卷纳入备份策略。

备份策略建议

  • 频率:每日 1 次(重要活动可提高频率)
  • 保留:保留最近 7-30 天
  • 校验:定期执行一次“演练恢复”验证备份可用
  • 位置:不要只放在服务器本机,建议至少同步到对象存储/异地服务器

后台内置备份功能(推荐)

平台管理后台提供了内置备份功能,入口:/admin/settings

你可以在该页面完成:

  • 创建备份:生成一份平台备份数据
  • 备份列表:查看历史备份
  • 下载备份:下载备份 ZIP 文件保存到本地/对象存储
  • 上传备份:将备份 ZIP 上传回平台
  • 执行恢复:从指定备份恢复数据(请谨慎操作)

注意

内置备份通常更适合做“平台级配置与业务数据”的快速备份与迁移,但不一定覆盖所有底层持久化数据(例如 MySQL 物理卷、上传目录、以及容器运行时数据等)。 对生产环境,仍建议保留数据库与 uploads 的独立备份。

推荐组合(生产环境)

  • 日常备份:使用后台内置备份创建 + 下载(便于运营同学操作)
  • 灾备兜底:定期执行 MySQL 逻辑备份(mysqldump)+ uploads 目录打包备份

使用 docker-compose 部署时的备份

以下示例以 docker-compose 部署为前提。请根据你的容器名称和数据库名调整。

备份 MySQL(推荐:mysqldump)

bash
# 导出数据库到本地文件
# 注意:ctf-mysql、ctf_db 为示例,请按你的 compose 容器名和库名修改

docker exec ctf-mysql mysqldump -u root -p${MYSQL_ROOT_PASSWORD} ctf_db > backup_$(date +%Y%m%d).sql

恢复 MySQL

bash
# 将 SQL 导入数据库

docker exec -i ctf-mysql mysql -u root -p${MYSQL_ROOT_PASSWORD} ctf_db < backup_20260304.sql

备份 Docker Volume(可选)

当你希望备份“完整运行数据卷”(而不仅是逻辑 SQL)时,可以用 tar 打包 volume。

bash
# 备份 MySQL 数据卷
# ocean-ctf_mysql_data 为示例 volume 名称,请按你的实际名称修改

docker run --rm -v ocean-ctf_mysql_data:/data -v $(pwd):/backup alpine \
  tar czf /backup/mysql_data.tar.gz -C /data .

恢复 Docker Volume(可选)

恢复前建议先停止服务,避免写入。

bash
# 1) 停止服务
docker compose down

# 2) 恢复 volume 内容(示例:MySQL 数据卷)
docker run --rm -v ocean-ctf_mysql_data:/data -v $(pwd):/backup alpine \
  sh -c "rm -rf /data/* && tar xzf /backup/mysql_data.tar.gz -C /data"

# 3) 启动服务
docker compose up -d

用户上传文件备份与恢复

如果你的 uploads 目录以 bind mount 或 volume 方式持久化,建议直接打包该目录。

bash
# 假设 uploads 在宿主机目录 /opt/ocean-ctf/uploads

tar czf uploads_$(date +%Y%m%d).tar.gz -C /opt/ocean-ctf uploads

恢复时解压回原位置即可。

Redis 备份(可选)

如需备份 Redis,请根据你的部署方式决定:

  • 使用 RDB/AOF(Redis 自带机制)
  • 备份 Redis 数据卷

多数情况下,只备份 MySQL + uploads 已足够支撑灾难恢复。

常见恢复流程(建议演练)

场景 1:仅恢复业务数据

适用于误删数据、升级失败等。

  1. 停止写入(可暂停业务访问)
  2. 恢复 MySQL(SQL 导入)
  3. 恢复 uploads(如有)
  4. 重启服务并验证:
    • 登录
    • 题目/比赛是否正常
    • 容器化题目能否启动

场景 2:整机/整站迁移

适用于服务器更换或跨机房迁移。

  1. 在新机器准备 docker/docker-compose
  2. 拉取同版本镜像
  3. 恢复 MySQL(SQL 或 volume)
  4. 恢复 uploads
  5. 检查出口配置/域名/反向代理
  6. 启动服务并验证

注意事项

  • 不要把备份文件保存在容器内部:容器重建会丢失
  • 备份要加密:尤其包含用户数据时
  • 恢复要演练:仅有备份文件不等于可恢复

Released under the MIT License.