如何将 Git 仓库备份到 DigitalOcean Spaces

介绍

依靠源代码存储库进行版本化是最好的做法,可以使我们备份并运行,当代码的变化导致我们的应用程序崩溃或不稳定的行为时。

将我们的代码存储库备份到对象存储基础设施中,会为我们提供我们需要时可以恢复的数据的外部副本。 Spaces是DigitalOcean的对象存储解决方案,为用户提供存储数字资产、文档和代码的备份的目的地。

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

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

前提条件

如果你还没有一个,你可以注册在 注册页面

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

一旦创建,您需要保持有关您的空间的下列细节:

  • 访问密钥 * 秘密密钥(也称为代币)

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

一旦您已设置了 Spaces 信息和服务器,请转到下一节来安装 Git。

安装 Git

在本教程中,我们将与我们将克隆到我们的服务器的远程Git存储库一起工作。Ubuntu安装了Git并准备在其默认存储库中使用,但这个版本可能比最新的可用版本更老。

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

1sudo apt-get update
2sudo apt-get install git

对于安装 Git 的更灵活的方式,并确保您有最新版本,您可以考虑安装 Git from Source(https://andsky.com/tech/tutorials/how-to-install-git-on-ubuntu-16-04# how-to-install-git-from-source)。

我们将从 Git 存储库的 URL 进行备份,所以我们不需要在本教程中配置 Git. 有关如何配置 Git 的说明,请阅读本节的 如何设置 Git

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

克隆远程 Git 存储库

为了克隆我们的Git存储库,我们将创建一个脚本来执行任务,创建一个脚本使我们能够使用变量,并有助于确保我们不会在命令行上犯错误。

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

1nano cloneremote.sh

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

1[label cloneremote.sh]
2#!/bin/bash
3
4remoterepo=your_remote_repository_url
5localclonedir=repos
6clonefilename=demoprojectlocal.git
7
8git clone --mirror $remoterepo $localclonedir/$clonefilename

让我们走过这个剧本的每个元素。

第一行 - # !/bin/bash - 表示脚本将由Bash壳运行. 从那里,我们定义了命令中使用的变量,一旦我们执行脚本,它将运行。

  • ‘remoterepo’正在分配给我们将备份的远程Git存储URL * ‘localclonedir’指我们将将远程存储归克隆的服务器目录或文件夹,在这种情况下,我们称它为‘repos’ * ‘clonefilename’指我们将提供给本地克隆存储的文件名,在这种情况下,我们称它为‘demoprojectlocal.git’

然后,这些变量中的每一个都被直接在脚本末尾的命令中调用。

脚本的最后一行使用Git命令行客户端以git命令开始,从那里,我们要求将一个存储库与克隆克隆,并以-- mirror标签作为存储库的镜像版本执行。

当您确信所写的脚本是准确的时,您可以通过键入CTRL +x键退出 nano,并在被要求保存文件时按y

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

1sh cloneremote.sh

一旦运行命令,您将收到类似于以下的输出。

1[secondary_label Output]
2Cloning into bare repository './repos/demoprojectlocal.git'...
3remote: Counting objects: 3, done.
4remote: Total 3 (delta 0), reused 0 (delta 0)
5Receiving objects: 100% (3/3), done.
6Checking connectivity... done.

在此时,如果您列出当前目录中的项目,您应该看到您的备份目录,如果您移动到该目录,您将看到您在脚本中提供的文件名子子文件夹。

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

安装 S3cmd

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

在安装S3cmd之前,我们需要安装Python的设置工具,因为它将有助于我们的安装(S3cmd是用Python写的)。

1sudo apt-get install python-setuptools

y来继续。

有了这个下载,我们现在可以下载 S3cmd tar.gz 文件与 curl

1cd /tmp
2curl -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 实用程序解压和解包文件:

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

在上面的命令中,我们回到我们的主目录,然后执行了tar命令. 我们使用了两个命令的旗帜,x表示我们想要从 tar 文件中提取 ex ,而f表示直接接近的字符串将是我们想要扩展的文件的完整路径名。

一旦文件被提取,切换到结果的目录并使用 sudo 安装软件:

1cd s3cmd-*
2sudo python setup.py install

要执行上述命令,我们需要使用sudopython命令是呼吁Python解释器安装setup.pyPython脚本。

通过询问 S3cmd 提供版本信息来测试安装:

1s3cmd --version
1[secondary_label Output]
2s3cmd version 2.0.1

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

配置 S3cmd

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

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

1s3cmd --configure

我们被要求输入我们的密钥,所以让我们粘贴它们,然后为 Default Region 接受US。值得注意的是,能够修改Default Region对于S3cmd工具最初创建的AWS基础设施是相关的,因为DigitalOcean需要更少的信息来配置,所以我们接受了默认。

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

接下来,我们将进入DigitalOcean终端,‘nyc3.digitaloceanspaces.com’。

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

由于Spaces支持基于DNS的桶,在下一个提示中,我们将以所需的格式提供桶值:

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

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

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

我们接下来会被要求通过HTTPS连接,但DigitalOcean Spaces不支持未加密的传输,所以我们会按ENTER来接受默认的Yes

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

由于我们不使用 HTTP 代理服务器,我们会把下一个提示留在空中,然后按ENTER

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

在提示 HTTP 代理服务器名称后,配置脚本会概括其将使用的值,随后有机会测试它们。

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

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

1s3cmd ls

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

1[secondary_label Output]
22017-12-15 02:52 s3://demospace

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

备份 Git 存储器到对象存储

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

从我们的主目录中,让我们叫我们的脚本movetospaces.sh,并用纳米打开它。

1cd ~
2nano movetospaces.sh

我们将以以下方式编写我们的剧本。

1[label movetospaces.sh]
2#!/bin/sh
3
4tar -zcvf archivedemoproject.tar.gz /repos/demoprojectlocal.git
5./s3cmd-2.0.1/s3cmd put archivedemoproject.tar.gz s3://demospace

在本教程中早些时候,我们已经使用了tar来解密s3cmd,现在我们正在使用tar来解密Git存储库,然后将其发送到Spaces。

  • z 使用 gzip 方法压缩 * c 创建一个新的文件,而不是使用现有的一个 * v 表示我们对包含在压缩文件中的文件感到困惑 * f 用下一个字符串定义的名称命名结果的文件

在旗帜之后,我们为压缩文件提供一个文件名称,在这种情况下是 archivedemoproject.tar.gz. 我们还提供我们想要 zip /repos/demoprojectlocal.git的目录名称。

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

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

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

1sh movetospaces.sh

您将看到以下结果:

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

您可以通过运行以下命令来验证该过程是否正确运行:

1s3cmd ls s3://demospace

您将看到以下输出,表示该文件位于您的空间中。

1[secondary_label Output]
22017-12-18 20:31 6866 s3://demospace/archivedemoproject.tar.gz

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

结论

在本教程中,我们涵盖了如何通过使用Git,S3cmd客户端和壳脚本将远程Git存储库备份到DigitalOcean Space。

您可以通过阅读以下教程来了解我们可以在对象存储中存储的内容:

Published At
Categories with 技术
comments powered by Disqus