如何将Git存储库备份到DigitalOceanSpaces
介绍
依赖源代码存储库进行版本控制是一种最佳实践,当代码更改导致我们的应用程序崩溃或行为不正常时,它可以让我们恢复并运行。 但是,如果发生灾难性事件,例如完整分支被意外删除或失去对存储库的访问权限,我们应该利用额外的灾难恢复策略。
将我们的代码存储库备份到对象存储基础架构中为我们提供了数据的异地副本,我们可以在需要时进行恢复。 Spaces 是 DigitalOcean 的对象存储解决方案,它为用户提供了存储数字资产、文档和代码备份的目的地。
与 S3 API 兼容,Spaces 允许我们使用 S3 工具(如 S3cmd)与其交互。 S3cmd 是一个客户端工具,我们可以使用它通过命令行或脚本从对象存储中上传、检索和管理数据。
在本教程中,我们将演示如何使用 S3cmd 将远程 Git 存储库备份到 DigitalOcean Space。 为了实现这一目标,我们将安装和配置 Git,安装 S3cmd,并创建脚本以将 Git 存储库备份到我们的空间中。
先决条件
为了使用 Spaces,您需要一个 DigitalOcean 帐户。 如果您还没有,您可以在注册页面上注册。
从那里,您需要设置您的 DigitalOcean Space 并创建一个 API 密钥,您可以按照我们的教程 如何创建 DigitalOcean Space 和 API 密钥 来实现。
创建后,您需要将有关空间的以下详细信息放在手边:
- 访问密钥
- 密钥(也称为令牌)
此外,您应该使用 sudo 非 root 用户设置 Ubuntu 16.04 服务器。 您可以按照 this Ubuntu 16.04 initial server setup tutorial 获得有关设置的指导。
设置好 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 存储库,我们将创建一个脚本来执行任务。 创建脚本允许我们使用变量并帮助确保我们不会在命令行上出错。
为了编写我们的可执行脚本,我们将使用文本编辑器 nano 创建一个名为 cloneremote.sh
的新 shell 脚本文件。
nano cloneremote.sh
在这个空白文件中,让我们编写以下脚本。
克隆远程.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
命令开头的 Git 命令行客户端。 从那里,我们请求使用 clone
克隆存储库,并将其作为具有 --mirror
标签的存储库的镜像版本执行。 这意味着克隆的存储库将与原始存储库完全相同。 我们上面定义的三个变量用 $
调用。
当您确信您编写的脚本准确无误时,您可以通过键入 CTRL
+ x
键退出 nano,并在提示保存文件时按 y
。
此时我们可以使用以下命令运行 shell 脚本。
sh cloneremote.sh
运行该命令后,您将收到类似于以下内容的输出。
OutputCloning 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 文件中提取 xtract,并且 f
表示紧邻的字符串将是我们要扩展的文件的完整路径名。 在tar文件的文件路径中,我们也注明在tmp
目录下。
解压缩文件后,切换到生成的目录并使用 sudo 安装软件:
cd s3cmd-* sudo python setup.py install
要运行上述命令,我们需要使用 sudo
。 python
命令是对 Python 解释器的调用以安装 setup.py
Python 脚本。
通过询问 S3cmd 的版本信息来测试安装:
s3cmd --version
Outputs3cmd 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)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
此命令应输出您提供的凭据下可用的空间列表。
Output2017-12-15 02:52 s3://demospace
这证实我们已经成功连接到我们的 DigitalOcean Spaces。 我们现在可以继续将 Git 存储库备份到对象存储中。
将 Git 存储库备份到对象存储中
安装和配置完所有工具后,我们现在将创建一个脚本,该脚本将压缩本地存储库并将其推送到我们的 DigitalOcean Space 中。
在我们的主目录中,调用我们的脚本 movetospaces.sh
并在 nano 中打开它。
cd ~ nano movetospaces.sh
我们将按如下方式编写脚本。
移动空间.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
。 我们还提供了我们要压缩的目录的名称 /repos/demoprojectlocal.git
。
然后脚本执行 s3cmd put
将 archivedemoproject.tar.gz
发送到我们的目标空间 s3://demospace
。
在您可能经常与 S3cmd 一起使用的命令中,put
命令将文件发送到 Spaces。 其他可能有用的命令包括从空间下载文件的 get
命令和删除文件的 delete
命令。 您可以通过不带选项执行 s3cmd
来获取 S3cmd 接受的所有命令的列表。
要将您的备份复制到您的空间中,我们将执行该脚本。
sh movetospaces.sh
您将看到以下输出:
Outputdemoprojectlocal.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
您将看到以下输出,表明该文件在您的空间中。
Output2017-12-18 20:31 6866 s3://demospace/archivedemoproject.tar.gz
我们现在已经成功地将我们的 Git 存储库备份到我们的 DigitalOcean Space 中。
结论
为了确保在需要时可以快速恢复代码,维护备份很重要。 在本教程中,我们介绍了如何使用 Git、S3cmd 客户端和 shell 脚本将远程 Git 存储库备份到 DigitalOcean Space。 这只是您可以使用 Spaces 帮助您制定灾难恢复和数据一致性策略的数十种可能方案中的一种方法。
您可以通过阅读以下教程了解更多关于我们可以在对象存储中存储的内容: