CapRover

备份与恢复

备份与恢复

该功能在 v1.3.0 中加入。

备份/恢复功能仍处于实验阶段,未来会有更多改动。

备份/恢复是一个相对复杂的流程,需要你理解 CapRover 实例中各个组件是如何协同工作的。如果你计划使用该功能,请务必完整通读本文档,并先在测试服务器上演练并熟悉流程,再在生产环境中使用。

TDLR; 常规的备份/恢复对除镜像与卷以外的内容都有效。镜像需要使用 Docker 镜像仓库(各有利弊),卷需要使用自定义方案(同样各有利弊)。

备份流程

在你正在运行的 CapRover 实例上,打开网页控制台,进入设置页面,点击 "创建备份" 按钮。几秒后将开始下载。请妥善保存该 tar 文件,恢复 CapRover 实例时会用到它。

自动化备份流程

你可以写一个简单的 shell 脚本来自动备份:

    API_TOKEN=$(curl $CAPROVER_URL/api/v2/login \
        -H 'x-namespace: captain' \
        -H 'content-type: application/json;charset=UTF-8' \
        --data-raw "{\"password\":\"$CAPROVER_PASSWORD\"}" \
        --compressed --silent | jq -r ".data.token")

    DOWNLOAD_TOKEN=$(curl $CAPROVER_URL/api/v2/user/system/createbackup \
        -H "x-captain-auth: $API_TOKEN" \
        -H 'x-namespace: captain' \
        --data-raw '{"postDownloadFileName":"backup.tar"}' \
        --compressed --silent | jq -r ".data.downloadToken")

    if [ ${#DOWNLOAD_TOKEN} -le 10 ]; then
        echo "DOWNLOAD_TOKEN must be at least 10 char long"
        exit 1
    fi

    wget "$CAPROVER_URL/api/v2/downloads/?namespace=captain&downloadToken=$DOWNLOAD_TOKEN" -O backup.tar

恢复流程

该流程与全新安装 CapRover 非常相似,只是有少量差异。请按 快速开始 中的前置条件章节完成准备工作,并确保目标服务器已安装 Docker。

不要 运行安装命令 docker run -p 80:80 -p 443:443.....。请改为按以下步骤操作:

(将下文中的 123.123.123.123 替换为你的服务器 IP)

  1. 在服务器上创建一个空的 /captain 目录,运行
    ssh root@123.123.123.123 mkdir /captain
  2. 在你的桌面电脑上,将你要使用的备份文件重命名为 backup.tar
  3. backup.tar 复制到服务器:
    scp ./backup.tar root@123.123.123.123:/captain/
  4. 安装 CapRover:
docker run -p 80:80 -p 443:443 -p 3000:3000 -e ACCEPTED_TERMS=true -v /var/run/docker.sock:/var/run/docker.sock -v /captain:/captain caprover/caprover

CapRover 会自动检测到 backup.tar,解压并恢复你的所有配置与设置。

  1. 你需要配置 DNS,使 *.youroldroot.domain.com 指向新服务器的 IP。

保留旧服务器

有时你仍然在运行旧服务器,只是希望克隆出一台新服务器。由于你希望旧服务器继续对外提供服务,你不应该修改旧域名对应的 DNS。相反,你需要为新服务器分配一个新的域名。此时:

  1. 在 DNS 中新增一个通配符记录 *.yournewroot.domain.com,并指向新服务器
  2. 在你的桌面电脑上,在 etc/hosts 文件里添加一个临时条目,加入以下这一行
NEW-SERVER-IP-ADDRESS   captain.oldroot.domain.com

注意:hosts 文件不支持通配符,你只需要添加控制台的域名即可,以便临时访问。

  1. 在浏览器中访问 captain.oldroot.domain.com 并登录控制台。

注意:你可能会看到 SSL 错误提示,可以点“高级”等选项继续访问并忽略。出现该情况通常是因为 SSL 证书可能已过期;在你完成设置并重启 CapRover 后证书会重新续签。

  1. 登录控制台后,在控制台中将根域名修改为 yournewroot.domain.com

  2. 如有需要,为控制台与其他应用重新启用 SSL 证书并开启强制 HTTPS。

  3. 编辑 etc/hosts,移除你在步骤 2 添加的那一行。

会恢复哪些内容?

CapRover 的备份流程会备份 /captain/data/ 目录下的所有内容。这包括应用设置、配置、SSL 证书等。但不包含:容器镜像持久化目录

  1. 容器镜像: 恢复 CapRover 实例后,你会发现应用配置都还在,但所有应用会回到默认的 "你的应用会显示在这里!" 状态。因此你需要重新部署所有应用。这样做的优点是 backup.tar 文件非常小,便于管理;缺点当然是所有应用都需要重新部署。如果你确实希望备份中包含镜像,你需要使用 Docker 镜像仓库
  2. 持久化目录: 一些应用(例如数据库)会使用持久化目录。由于每种数据库都有其专用的备份机制,建议对特定数据库使用正确的备份方式,例如 MongoDB 用 mongodump,MySQL 用 mysqldump 等。这对数据库来说是最佳方案,因为不会造成停机。另一种方式是对卷创建快照,这种方式更通用,几乎适用于所有场景。例如你可以使用这个第三方项目。但在执行之前,为避免数据损坏,你需要确保容器已停止:docker service ls --format {{.Name}} | while read in; do docker service scale "$in"=0; done,然后创建快照,再恢复所有服务:docker service ls --format {{.Name}} | while read in; do docker service scale "$in"=1; done。在不久的将来,CapRover 预计会提供类似的内置方案。 其他用于备份持久化目录的工具包括:
Docker 镜像仓库

Docker 镜像仓库使用说明

如上所述,备份不包含容器镜像。为了确保恢复后你的应用不需要重新部署,你需要确保自己使用了 Docker 镜像仓库。Docker 镜像仓库是一个用于存放应用镜像的地方。

第三方镜像仓库

如果你在 CapRover 控制台的集群章节设置了 "默认推送镜像仓库",那么每次在服务器上构建完成镜像后,都会被推送到该镜像仓库。这通常是最佳选择,因为镜像仓库是一个独立组件,你无需自己负责在本机保留镜像;恢复 CapRover 实例后,一切会很顺畅地直接工作。

自托管镜像仓库

如果你将 "默认推送镜像仓库" 设置为 CapRover 自托管镜像仓库,那么恢复后应用可以开箱即用。不过缺点是 backup.tar 会非常大,因为它将包含在服务器上构建过的所有镜像。

如果你曾经启用过自托管镜像仓库,之后又改用第三方镜像仓库并禁用了自托管镜像仓库,你的备份文件仍然可能很大,因为这些镜像文件仍然保存在宿主机上。如果你想清理镜像仓库中存储的所有镜像,请删除镜像仓库目录:rm -rf /captain/data/registry

多节点部署

多节点

如果你使用了集群会怎样?备份与恢复流程基本与单节点相同,但在恢复过程中,脚本第一次运行时会检测到你在恢复集群,然后退出,并要求你编辑一个文件,补充新节点的 IP 地址。

例如,你之前有 2 个节点:

  • 222.222.222.10 (主节点)
  • 222.222.222.11

用于恢复时你准备了 2 个新节点:

  • 222.222.222.20 (主节点)
  • 222.222.222.21

你在 222.222.222.20 上运行恢复脚本,脚本会退出并提示你为第二个节点补充信息。你需要编辑恢复说明文件,将旧节点 222.222.222.11 的新 IP 填为 222.222.222.21

接着,你需要把你的私钥(通常名为 id_rsa)复制到服务器上。例如在 Linux 上:

scp /home/myuser/.ssh/id_rsa root@123.123.123.123:/captain/

请务必在恢复流程完成后从服务器上删除该文件

现在重新运行恢复脚本(也就是刚才退出并要求补充信息的那个脚本)。接下来流程会继续执行,集群节点会被恢复,应用也会调整为迁移到新节点上。例如如果你之前有一个持久化应用锁定在第二个节点,那么在恢复后的实例中它也会被锁定到第二个节点上。

集群的卷恢复会更复杂一些。但如果你正在使用集群,你大概率已经清楚自己在做什么 :-)