备份与恢复
本章节介绍 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:仅恢复业务数据
适用于误删数据、升级失败等。
- 停止写入(可暂停业务访问)
- 恢复 MySQL(SQL 导入)
- 恢复 uploads(如有)
- 重启服务并验证:
- 登录
- 题目/比赛是否正常
- 容器化题目能否启动
场景 2:整机/整站迁移
适用于服务器更换或跨机房迁移。
- 在新机器准备 docker/docker-compose
- 拉取同版本镜像
- 恢复 MySQL(SQL 或 volume)
- 恢复 uploads
- 检查出口配置/域名/反向代理
- 启动服务并验证
注意事项
- 不要把备份文件保存在容器内部:容器重建会丢失
- 备份要加密:尤其包含用户数据时
- 恢复要演练:仅有备份文件不等于可恢复