引言

当代码更改导致应用程序崩溃或者行为不规则时,依赖于原始码储存库版本控制是一个最佳实践,可以让我们重新启动并运行。 但是,如果发生灾难性事件,比如一个完整的分支被意外删除或失去对存储库的访问权,我们应该利用其他灾难恢复策略。

将代码存储库备份到对象存储基础结构中,可以提供数据的非现场副本,需要时可以进行恢复。 是 DigitalOcean 的对象存储解决方案,它为用户提供了一个存储数字资产、文档和代码备份的目的地。

与 S3 API 兼容,Spaces 允许我们使用像 S3cmd 这样的 S3工具与之接口。 S3cmd 是一个客户机工具,我们可以使用它通过命令行或脚本从对象存储中上传、检索和管理数据。

在本教程中,我们将演示如何使用 S3cmd 将远程 Git 存储库备份到 DigitalOcean Space。 为了实现这个目标,我们将安装和配置 Git,安装 S3cmd,并创建脚本来备份 Git 存储库到我们的 Space。

先决条件

为了使用 Spaces,你需要一个 DigitalOcean 帐户。 如果你还没有注册,你可以在注册页面上注册。

从那里,你需要设置你的 DigitalOcean 空间并创建一个 API 密钥,你可以通过遵循我们的教程如何创建一个 DigitalOcean 空间和 API 密钥来实现。

一旦创建完成,你需要将以下关于你的空间的细节放在手边:

  • 存取密码匙
  • 密钥(也称为令牌)

另外,你应该有一个带有 sudo 非 root 用户的 Ubuntu 16.04服务器。 你可以通过下面的 Ubuntu 16.04初始服务器设置教程来获得设置的指导。

一旦您设置好了 Spaces 信息和服务器,就可以进入下一部分安装 Git。

安装 Git

在本教程中,我们将使用一个远程 Git 存储库,并将其克隆到服务器上。 Ubuntu 已经安装了 Git,并且已经可以在它的默认存储库中使用,但是这个版本可能比最新的版本更早。

我们可以使用 apt 包管理工具来更新本地包索引,并下载和安装 Git 的最新版本。

  • sudo apt-get update
  • sudo apt-get install git

为了获得更灵活的方式来安装 Git 并确保您拥有最新版本,您可以考虑从 Source 安装 Git。

我们将从 Git 存储库的 URL 进行备份,因此在本教程中不需要配置 Git。 有关 Git 配置的指导,请阅读如何设置 Git 这一节。

现在我们将继续克隆远程 Git 存储库。

克隆远程 Git 存储库

为了克隆 Git 存储库,我们将创建一个脚本来执行这个任务。 创建一个脚本允许我们使用变量,并帮助确保我们不会在命令行上出错。

为了编写我们的可执行脚本,我们将创建一个名为 cloneremote 的新 shell 脚本文件。 文本编辑器 nano。

  • nano cloneremote.sh

在这个空白文件中,让我们编写以下脚本。

cloneremote.sh
#!/bin/bash

remoterepo=your_remote_repository_url
localclonedir=repos
clonefilename=demoprojectlocal.git

git clone --mirror $remoterepo $localclonedir/$clonefilename

让我们遍历这个脚本的每个元素。

第一行ー # ! / bin / Bash ー表示脚本将由 Bash shell 运行。 然后,我们定义命令中使用的变量,这些变量将在执行脚本后运行。 这些变量定义了以下配置:

  • Remoterepo 被分配到远程 Git 存储库 URL,我们将从该 URL 备份
  • Localclonedir 指的是要将远程存储库克隆到的服务器目录或文件夹,在本例中我们称之为 repos
  • Clonefilename 指的是我们将提供给本地克隆存储库的文件名,在本例中我们称之为 demoprojectlocal。 饭桶

然后在脚本结尾的命令中直接调用这些变量中的每个。

脚本的最后一行使用 Git 命令行客户端,以 Git 命令开头。 从那里,我们要求用克隆克隆一个存储库,并用 -- mirror 标记将其作为存储库的镜像版本执行。 这意味着克隆的存储库将与原始存储库完全相同。 我们在上面定义的三个变量用 $调用。

当您确信您编写的脚本是准确的时候,您可以通过键入 CTRL + x 键并在提示保存文件时按 y 退出 nano。

此时,我们可以使用以下命令运行 shell 脚本。

  • sh cloneremote.sh

运行该命令后,您将收到类似于下面的输出。

Output
Cloning into bare repository './repos/demoprojectlocal.git'... remote: Counting objects: 3, done. remote: Total 3 (delta 0), reused 0 (delta 0) Receiving objects: 100% (3/3), done. Checking connectivity... done.

现在,如果你列出你的工作目录文件夹中的项目,你应该会看到你的备份目录,如果你移动到那个目录,你会看到你在脚本中提供的文件名的子文件夹。 这个子目录是 Git 存储库的克隆。

通过克隆远程 Git 存储库,我们现在可以继续安装 S3cmd,我们可以用它将存储库备份到对象存储中。

安装 S3cmd

S3cmd 工具允许我们从命令行连接到 Spaces 环境。 我们将从其公共 GitHub 存储库下载 S3cmd 的最新版本,并遵循推荐的安装指南。

在安装 S3cmd 之前,我们需要安装 Python 的 Setuptools,因为它有助于我们的安装(S3cmd 是用 Python 编写的)。

  • sudo apt-get install python-setuptools

按 y 继续。

下载完成后,我们现在可以使用 curl 下载 S3cmd tar.gz 文件。

  • cd /tmp
  • curl -LO https://github.com/s3tools/s3cmd/releases/download/v2.0.1/s3cmd-2.0.1.tar.gz

注意,我们正在将文件下载到 tmp 目录中。 这是下载文件到我们的服务器上的常见做法。

你可以通过访问工具的 GitHub 存储库的 Releases 页面来查看是否有新版本的 S3cmd。 如果找到了更新的版本,可以复制 tar.gz URL 并将其替换为上面的 curl 命令。

下载完成后,使用 tar 工具解压缩并解压缩文件:

  • cd ~
  • tar xf /tmp/s3cmd-*.tar.gz

在上面的命令中,我们改回到我们的主目录,然后执行 tar 命令。 我们在命令中使用了两个标志,x 表示我们希望从 tar 文件中选择 x,f 表示紧邻的字符串将是我们希望展开的文件的完整路径名。 在 tar 文件的文件路径中,我们还指示它位于 tmp 目录中。

一旦文件被解压缩,切换到结果目录并使用 sudo 安装软件:

  • cd s3cmd-*
  • sudo python setup.py install

要运行上面的命令,我们需要使用 sudo。 Python 命令调用 Python 解释器来安装 setup.py Python 脚本。

通过向 S3cmd 询问其版本信息来测试安装:

  • s3cmd --version
Output
s3cmd version 2.0.1

如果您看到类似的输出,则表明已经成功安装了 S3cmd。 接下来,我们将配置 S3cmd 连接到我们的对象存储服务。

配置 S3cmd

S3cmd 有一个交互式的配置过程,可以创建我们需要连接到对象存储服务器的配置文件。 在配置过程中,将要求您提供访问密钥和秘密密钥,因此要让它们随时可用。

让我们输入以下命令开始配置过程:

  • s3cmd --configure

我们被提示输入我们的键,所以让我们粘贴它们,然后为默认区域接受 US。 值得注意的是,能够修改 Default Region 与最初创建 S3cmd 工具使用的 AWS 基础设施相关。 因为 DigitalOcean 需要更少的配置信息,这是不相关的,所以我们接受默认。

Enter new values or accept defaults in brackets with Enter.
Refer to user manual for detailed description of all options.
Access key and Secret key are your identifiers for Amazon S3. Leave them empty for using the env variables.
Access Key []: EXAMPLE7UQOTHDTF3GK4
Secret Key []: b8e1ec97b97bff326955375c5example
Default Region [US]:

接下来,我们将进入 DigitalOcean 端点---- nyc3.digitaloceanspaces.com。

Use "s3.amazonaws.com" for S3 Endpoint and not modify it to the target Amazon S3.
S3 Endpoint [s3.amazonaws.com]: nyc3.digitaloceanspaces.com

因为 Spaces 支持基于 dns 的 bucket,所以在下一个提示符中,我们将以所需的格式提供 bucket 值:

%(bucket)s.nyc3.digitaloceanspaces.com
Use "%(bucket)s.s3.amazonaws.com" to the target Amazon S3. "%(bucket)s" and "%(location)s" vars c
an be used if the target S3 system supports dns based buckets.
DNS-style bucket+hostname:port template for accessing a bucket []: %(bucket)s.nyc3.digitaloceanspaces.com

此时,我们被要求提供一个加密密码。 我们将输入一个密码,以便在需要使用加密的情况下可以使用该密码。

Encryption password is used to protect your files from reading
by unauthorized persons while in transfer to S3
Encryption password: secure_password
Path to GPG program [/usr/bin/gpg]:

我们接下来需要通过 HTTPS 连接,但是 DigitalOcean Spaces 不支持未加密的传输,所以我们将按 ENTER 键接受默认值 Yes。

When using secure HTTPS protocol all communication with Amazon S3
servers is protected from 3rd party eavesdropping. This method is
slower than plain HTTP, and can only be proxied with Python 2.7 or newer
Use HTTPS protocol [Yes]: 

因为我们没有使用 HTTP 代理服务器,所以我们将保留下一个提示符为空,然后按 ENTER。

On some networks all internet access must go through a HTTP proxy.
Try setting it here if you can't connect to S3 directly
HTTP Proxy server name:

在提示输入 HTTP Proxy 服务器名称之后,配置脚本将显示它将使用的值的摘要,然后提供测试它们的机会。 测试成功完成后,输入 y 以保存设置。

一旦您保存了配置,您将收到其位置的确认。

完成所有安装步骤后,可以通过运行以下命令再次检查安装是否正确。

  • s3cmd ls

这个命令应该输出您提供的凭据下可用的空间列表。

Output
2017-12-15 02:52 s3://demospace

这证实了我们已经成功地连接到我们的数字天空。 现在我们可以将 Git 存储库备份到对象存储中。

将 Git 存储库备份到对象存储

随着我们所有的工具安装和配置,我们现在要创建一个脚本,将压缩本地存储库,并把它推到我们的数字天空。

从我们的主目录,让我们调用我们的脚本 movetospace.sh 并用 nano 打开它。

  • cd ~
  • nano movetospaces.sh

我们将按照以下步骤编写脚本。

movetospaces.sh
#!/bin/sh

tar -zcvf archivedemoproject.tar.gz /repos/demoprojectlocal.git
./s3cmd-2.0.1/s3cmd put archivedemoproject.tar.gz s3://demospace

在本教程的前面,我们使用 tar 解压缩 s3cmd,我们现在使用 tar 压缩 Git 存储库,然后将其发送到 Spaces。 在 tar 命令中,我们指定了四个标志:

  • Z 使用 gzip 方法进行压缩
  • C 创建一个新文件,而不是使用现有文件
  • V 表示我们对包含在压缩文件中的文件过于详细
  • F 用下一个字符串中定义的名称命名结果文件

在标志之后,我们为压缩文件提供一个文件名,在本例中是 archivedemoproject。 Tar.gz. 我们还提供了要 zip / repos / demoprojectlocal 目录的名称。 饭桶。

然后该脚本执行 s3cmd put 以发送 archivedemoproject。 Tar.gz 到我们的目标 Space s3: / / demospace。

在 S3cmd 通常使用的命令中,put 命令将文件发送到 Spaces。 其他可能有用的命令包括从 Space 下载文件的 get 命令和删除文件的 delete 命令。 通过执行没有选项的 S3cmd,可以获得 S3cmd 接受的所有命令的列表。

要将备份文件复制到您的空间中,我们将执行脚本。

  • sh movetospaces.sh

您将看到以下输出:

Output
demoprojectlocal.git/ ... demoprojectlocal.git/packed-refs upload: 'archivedemoproject.tar.gz' -> 's3://demobucket/archivedemoproject.tar.gz' [1 of 1] 6866 of 6866 100% in 0s 89.77 kB/s done

你可以通过运行以下命令来检查进程是否正常工作:

  • s3cmd ls s3://demospace

您将看到下面的输出,指示文件在您的空间中。

Output
2017-12-18 20:31 6866 s3://demospace/archivedemoproject.tar.gz

我们现在已经成功地将 Git 存储库备份到了我们的 DigitalOcean 空间。

总结

为了确保在需要时可以快速恢复代码,维护备份非常重要。 在本教程中,我们介绍了如何使用 Git、 S3cmd 客户机和 shell 脚本将远程 Git 存储库备份到 DigitalOcean Space。 这只是众多可能场景中的一种方法,在这些场景中,您可以使用 Spaces 来帮助实现灾难恢复和数据一致性策略。

通过阅读以下教程,你可以了解更多关于我们可以在对象存储中存储什么的信息:

  • 如何在 Ubuntu 16.04上使用 Logrotate 和 S3cmd 将日志归档到对象存储
  • 如何备份数据到对象存储服务与恢复备份客户端
  • 如何将 NAS 概要备份到数字空间