如何将您的Git存储库备份到DigitalOcean Spaces

Digital Spaces的存储解决方案是Spaces。 由于其高可用性和持久性,Spaces是存储多种数据(包括数字资产,文档和代码)的理想之选。 在本教程中,我们将重点介绍如何创建Git备份并将其存储到Digitalocean的空间中。

介绍

依靠版本控制的源代码库是一个最佳实践,当代码更改导致我们的应用程序崩溃或行为不正常时,可以使我们恢复正常运行。 但是,如果发生灾难性事件,例如意外删除了完整分支或无法访问存储库,则应采用其他灾难恢复策略。

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

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

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

先决条件

为了与Spaces一起工作,您需要一个DigitalOcean帐户。 如果您还没有,可以在注册页面注册

从那里,您需要设置您的DigitalOcean空间并创建一个API密钥,您可以按照我们的教程如何创建一个DigitalOcean空间和API密钥来实现

一旦创建,您需要保留以下关于您的Space便捷的细节:

  • 访问密钥
  • 密钥(也称为令牌)

此外,你应该有一个Ubuntu的16.04服务器与sudo非root用户设置。 按照这个Ubuntu 16.04初始服务器设置教程,您可以获得设置的指导

一旦你设置了空间信息和服务器,进入下一节安装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仓库,我们将创建一个脚本来执行任务。 创建一个脚本允许我们使用变量,并有助于确保我们不会在命令行上发生错误。

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

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,我们将从中备份
  • localclonedir指的是我们将克隆远程仓库的服务器目录或文件夹,在这种情况下,我们称之为仓库
  • clonefilename是指我们将提供给本地克隆库的文件名,在这种情况下,我们称之为demoprojectlocal .git

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

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

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

在这一点上,我们可以用下面的命令运行shell脚本。

sh cloneremote.sh

一旦你运行这个命令,你会得到类似于下面的输出。

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存储库的发行版页面来检查是否有更新的S3cmd版本。 如果你找到一个更新的版本,你可以拷贝tar.gz URL并把它替换成上面的curl命令。

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

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

在上面的命令中,我们回到了主目录,然后执行了tar命令。 我们在命令中使用了两个标志, x表示我们想要从tar文件中读取,而f表示紧邻的字符串将是我们想要扩展的文件的完整路径名。 在tar文件的文件路径中,我们也指出它在tmp目录中。

一旦文件解压缩后,转到生成的目录并使用sudo安装软件:

cd s3cmd-*
sudo python setup.py install

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

通过向S3cmd索取版本信息来测试安装:

s3cmd --version
s3cmd version 2.0.1

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

配置S3cmd

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

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

s3cmd --configure

我们被提示输入我们的密钥,所以让我们粘贴他们,然后接受US默认地区 值得注意的是,能够修改默认区域与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)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代理服务器名称的提示符后,配置脚本提供了将使用的值的摘要,随后是测试它们的机会。 测试成功完成后,输入Y保存设置。

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

完成所有安装步骤后,可以通过运行以下命令仔细检查您的设置是否正确。

s3cmd ls

这个命令应该输出你提供的凭据下可用的Spaces列表。

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

这证实我们已成功连接到我们的DigitalOcean空间。 现在我们可以继续将我们的Git存储库备份到对象存储中。

将Git Repository备份到对象存储中

随着我们所有的工具的安装和配置,我们现在要创建一个脚本,将压缩本地存储库,并将其推入我们的DigitalOcean空间。

从我们的主目录中,我们调用我们的脚本movetospaces .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 .git

该脚本然后执行s3cmd put发送archivedemoproject .tar.gz到我们的目标空间s3:// demospace

在S3cmd中常用的命令中, put命令将文件发送到空格。 其他可能有用的命令包括从Space下载文件的get命令和用于删除文件的delete命令。 您可以通过执行s3cmd而不使用任何选项来获取S3cmd接受的所有命令的列表。

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

sh movetospaces.sh

您将看到以下输出:

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

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

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

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

结论

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

通过阅读以下教程,您可以了解更多关于可以存储在对象存储中的内容: