使用rsync和cron将备份复制到另一台服务器

I have a backup server that coordinates backups across many servers. I want my backup server to grab Discourse backups from my forum’s server.

I gave some thought to how I’d allow the backup server to access the backup files on the forum’s server. The best way I could come up with is allowing remote access as the www-data user (who owns Discourse’s backups).

I didn’t want to allow the backup server to shell into the forum’s server as root (for standard sysadmin reasons). I also wanted to avoid doing anything that I thought could cause Discourse to choke during backups or restores. I also wanted to avoid hosting another service on forum server.

Anyways, here’s how I did it.

Allow remote access as the www-data user

  1. Edit /etc/passwd and replace www-data’s shell with /bin/bash rather than /usr/sbin/nologin.
  2. Edit /etc/passwd again and replace www-data’s home directory with /home/www-data rather than /var/www (optional, but appealing to me).
  3. Add the backup server’s SSH key to /home/www-data/.ssh/authorized_keys.

rsync

Finally, on the backup server, I added an hourly cron command that ran the following script:

#!/usr/bin/env bash

set -xe

HOST="$1"
DIR="$2"
if [ -z "$HOST" ] || [ ! -d "$DIR" ]; then
	echo "$0 HOST DIR"
	exit 1
fi

# --ignore-existing will have rsync ignore any backups that have already been
# copied.
# --delay-updates ensures that only complete backups ever make it into $DIR. If
# this isn't specified, partial backups could end up in $DIR, and because
# --ignore-existing won't perform any kind of equality check, the problem will
# not be corrected or detected.
rsync --ignore-existing --delay-updates "$HOST:/var/discourse/shared/standalone/backups/default/*" "$DIR"

Hopefully this proves useful to someone out there.

8 个赞

哇!!
不过,如果您能更详细地解释以下步骤,我将不胜感激,这样像我这样的新手用户就不会出错(并且还能了解每个步骤的作用)。

这有什么作用?

您是指公钥吗?

1 个赞

允许 www-data 用户成功登录。这是在更改“登录 shell”,这是一个很好的关键词,可以用来搜索更多信息。

是的。私钥基本上永远不应该在主机机器之外的任何地方复制/共享。

1 个赞

鉴于您是一位比较新的搜索者,是否也有简单的方法可以通过 cron 作业将我们的本地服务器备份传输到不同的 S3 存储桶,例如 Google S3、iDrive S3?
(我知道我们可以通过使用其密钥和密码直接为其配置 AWS S3 存储桶)。

如果您配置了 S3 备份,它们会自动上传到 S3,尽管它们要么上传全部,要么不上传,因此除非您在 S3 上有上传,否则备份文件中将有多个上传副本。

2 个赞

这一点我早就知道了,而且到目前为止,自从6年前开始,我一直在使用这种设置(将所有媒体和备份上传到aws存储桶)。

但我上面问的是我遇到的另一种类型的问题。
现在,我设置在本地Ubuntu服务器上创建备份(包括媒体“上传”)。但是(正如在另一个线程中讨论的),我无法从那些(1GB大的)备份中恢复。有些东西丢失了/出了问题。所以我在考虑使用谷歌存储桶,完全放弃AWS。

1 个赞

我看不出 AWS S3 和 Google 的有何区别。但也许 https://restic.net/ 能帮到你?它是一个备份程序,可以将数据备份到 s3 存储桶。

我不确定你的恢复问题是什么。

2 个赞

对于像我一样来到这个帖子的人,我想进一步解释这个主题的第一个帖子。

  • 这是一个 bash 脚本,可以“按原样”粘贴到任何名为 .sh 扩展名的文件中。
  • 脚本的第一行只是设置脚本运行的环境,以及应该使用哪个 shell 或环境:#!/usr/bin/env bash:这会告诉系统使用通过 env 命令找到的 bash 解释器。
  • 标志 (set -xe)
    • -x:启用调试,这意味着每个命令及其参数将在执行前打印到终端。这有助于调试脚本。
    • -e:导致脚本在任何命令返回非零状态(表示错误)时立即退出。这有助于防止脚本在失败后继续运行。
  • 在下一步的重要步骤中,变量 (HOST="$1" DIR="$2")
    • HOST="$1":将传递给脚本的第一个参数 ($1) 分配给变量 HOST。也就是说,当运行此脚本时,它会要求用户输入一些信息,无论用户输入的第一个信息($1)是什么,都将被传递/视为“主机”值(数据可能从中复制)。
    • DIR="$2":将传递给脚本的第二个参数 ($2) 分配给变量 DIR。即,用户在输入第一个值(称为 ‘$2’)后输入的任何(目录路径)都将被脚本视为“目录 - 目标目录”。
      如果有人感兴趣,我也可以解释其余的 2 个步骤,但足以说明下一步只是检查用户在提示时是否提供了正确的主机和目标目录值。否则(最后一步)将返回 1 作为错误输出。
      我需要重申的主要一点是这是一个脚本,当运行时,它会要求用户提供主机(要从中复制数据)和目标目录(要粘贴数据的位置)。您会将此文件的路径包含在您的 cron 作业文件中,该文件可能会在一天中运行此脚本文件的次数与您在 cron 文件中设置的次数一样多。

但我一直未能理解的是,实际的复制粘贴(或备份)命令在哪里?
实际的同步将如何发生?

1 个赞