johncs
(John Sullivan)
1
我有一台备份服务器,用于协调多台服务器的备份工作。我希望我的备份服务器能够从论坛服务器上抓取 Discourse 的备份文件。
我思考过如何让备份服务器访问论坛服务器上的备份文件。我能想到的最佳方案是允许备份服务器以 www-data 用户(该用户拥有 Discourse 备份文件的所有权)进行远程访问。
我不想让备份服务器以 root 身份登录到论坛服务器(出于常规系统管理的原因)。我也希望避免做任何可能导致 Discourse 在备份或恢复过程中出错的事情。此外,我也不想在论坛服务器上托管其他服务。
无论如何,以下是我的实现方法。
允许以 www-data 用户进行远程访问
- 编辑
/etc/passwd,将 www-data 的 shell 从 /usr/sbin/nologin 替换为 /bin/bash。
- 再次编辑
/etc/passwd,将 www-data 的家目录从 /var/www 替换为 /home/www-data(此步骤可选,但我认为这样更合理)。
- 将备份服务器的 SSH 密钥添加到
/home/www-data/.ssh/authorized_keys 中。
rsync
最后,在备份服务器上,我添加了一个每小时执行一次的 cron 命令,运行以下脚本:
#!/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 会让 rsync 忽略已经复制过的备份文件。
# --delay-updates 确保只有完整的备份才会进入 $DIR。如果不指定此选项,不完整的备份可能会进入 $DIR,
# 而由于 --ignore-existing 不会执行任何类型的相等性检查,这个问题将不会被纠正或检测到。
rsync --ignore-existing --delay-updates "$HOST:/var/discourse/shared/standalone/backups/default/*" "$DIR"
希望这对某些人有所帮助。
8 个赞
Bathinda
(Bathinda Helper)
2
哇!!
不过,如果您能更详细地解释以下步骤,我将不胜感激,这样像我这样的新手用户就不会出错(并且还能了解每个步骤的作用)。
这有什么作用?
您是指公钥吗?
1 个赞
johncs
(John Sullivan)
3
允许 www-data 用户成功登录。这是在更改“登录 shell”,这是一个很好的关键词,可以用来搜索更多信息。
是的。私钥基本上永远不应该在主机机器之外的任何地方复制/共享。
1 个赞
Bathinda
(Bathinda Helper)
4
鉴于您是一位比较新的搜索者,是否也有简单的方法可以通过 cron 作业将我们的本地服务器备份传输到不同的 S3 存储桶,例如 Google S3、iDrive S3?
(我知道我们可以通过使用其密钥和密码直接为其配置 AWS S3 存储桶)。
pfaffman
(Jay Pfaffman)
5
如果您配置了 S3 备份,它们会自动上传到 S3,尽管它们要么上传全部,要么不上传,因此除非您在 S3 上有上传,否则备份文件中将有多个上传副本。
2 个赞
Bathinda
(Bathinda Helper)
6
这一点我早就知道了,而且到目前为止,自从6年前开始,我一直在使用这种设置(将所有媒体和备份上传到aws存储桶)。
但我上面问的是我遇到的另一种类型的问题。
现在,我设置在本地Ubuntu服务器上创建备份(包括媒体“上传”)。但是(正如在另一个线程中讨论的),我无法从那些(1GB大的)备份中恢复。有些东西丢失了/出了问题。所以我在考虑使用谷歌存储桶,完全放弃AWS。
1 个赞
pfaffman
(Jay Pfaffman)
7
我看不出 AWS S3 和 Google 的有何区别。但也许 https://restic.net/ 能帮到你?它是一个备份程序,可以将数据备份到 s3 存储桶。
我不确定你的恢复问题是什么。
2 个赞
Bathinda
(Bathinda Helper)
8
对于像我一样来到这个帖子的人,我想进一步解释这个主题的第一个帖子。
- 这是一个 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 个赞