现在很多项目会使用 docker 部署,我最常用的 docker 项目是 uptime-kuma 和 umami。之前运行亚马逊云 AWS 的 light sail 上,三个月的试用期马上就到了,前几天发现谷歌云长期免费服务器,每月200GB流量也够折腾。所以打算把 uptime-kuma 这个 docker 项目迁移到谷歌云上,迁移和备份过程如下:

1、提取原主机 uptime-kuma 的数据文件

得益于之前部署 uptime-kuma 项目的时候将项目的数据文件挂载到宿主机目录,所以提取数据文件很简单。以下是原 docker-compose.yml 文件内容:

services:
  uptime-kuma:
    image: louislam/uptime-kuma
    container_name: uptime-kuma
    volumes:
      - ./uptime-kuma:/app/data
    ports:
      - 3001:3001

可看出之前已将 /app/data 中的数据挂载到宿主机的 ./uptime-kuma 目录中,这就方便了,来到项目目录路径 /uptime-kuma 下,执行如下代码,进行压缩,取名为backup.tar.gz。

tar -czf backup.tar.gz uptime-kuma

2、将提取的数据文件转移至新主机,部署项目

将步骤1中的备份文件通过 FTP 或 SCP 传到新主机,这次为了以后迁移更加方便,直接将项目部署在 /var/docker/uptime-kuma 目录,参考如下 docker-compose.yml 文件内容:

services:
  uptime-kuma:
    image: louislam/uptime-kuma
    container_name: uptime-kuma
    volumes:
      - /var/docker/uptime-kuma:/app/data
    ports:
      - 3001:3001

所以要提前创建 /var/docker/uptime-kuma 目录,同时将备份的压缩文件上传到该目录下。

mkdir -p /var/docker/uptime-kuma

操作完成后,在 /var/docker/uptime-kuma 目录下直接运行:

docker-compose up -d

完成项目部署,直接在浏览器打开http://ip+端口3001,如果恢复的成功,则是直接登录的窗口,如失败,会是让你创建账号的窗口。这点可以判断是否恢复成功。

3、备份到电报群组

提前准备好电报机器人的API和频道ID,然后按如下操作:

在 /var/docker/uptime-kuma 目录下创建 backup.sh 脚本

cd /var/docker/uptime-kuma
vim backup.sh

拷贝以下脚本内容到 backup.sh 文件中:

#!/bin/bash

# Telegram Bot API token
token="替换为你的电报机器人 API "

# Chat ID of the group
chat_id="替换为你电报的频道ID"

# 定义备份目录
backup_dir="/backup"

# 创建一个备份目录(如果不存在)
mkdir -p "$backup_dir"

# 备份docker_volumes目录中的数据到备份目录
cp -r /var/docker/uptime-kuma "$backup_dir"

# 压缩备份文件夹
timestamp=$(date +"%Y-%m-%d_%H-%M-%S")
backup_file="docker_uptime_kuma_$timestamp.tar.gz"
tar -czf "$backup_dir/$backup_file" -C "$backup_dir" uptime-kuma

# 发送备份文件到电报群组
curl -F chat_id="$chat_id" -F document=@"$backup_dir/$backup_file" "https://api.telegram.org/bot$token/sendDocument"

给 backup.sh 添加执行权限:

chmod + x backup.sh

然后在当前目录执行如下命令:

bash back.sh

此时,如果电报群组中收到了备份文件,则说明成功,否则,再仔细检查一下,是否哪里出了问题。

1714279476286.webp

既然手动执行可行,那么我们完全可以加入到系统自动执行命令中,我们输入:

crontab -e

首次执行,会要求选择编辑器,我习惯了 nano,直接选择1即可。

之后,我们在打开的文件中添加:

0 8 * * * /bin/bash /var/docker/uptime-kuma/back.sh

这句代码的意思是在每天早上八点会自动执行该脚本,如果担心哪里有误,可以先将时间改为测试的下一分钟,看是否执行成功,然后再改为一个固定的时间点。