GitリポジトリをDigitalOceanSpacesにバックアップする方法

提供:Dev Guides
移動先:案内検索

序章

バージョン管理のためにソースコードリポジトリに依存することは、コードの変更によってアプリケーションがクラッシュしたり、動作が不安定になったりした場合に、元に戻して実行できるようにするためのベストプラクティスです。 ただし、ブランチ全体が誤って削除されたり、リポジトリへのアクセスが失われたりするなどの壊滅的なイベントが発生した場合は、追加のディザスタリカバリ戦略を活用する必要があります。

コードリポジトリをオブジェクトストレージインフラストラクチャにバックアップすると、データのオフサイトコピーが提供され、必要に応じて復元できます。 Spaces は、DigitalOceanのオブジェクトストレージソリューションであり、ユーザーがデジタルアセット、ドキュメント、およびコードのバックアップを保存するための宛先を提供します。

SpacesはS3APIと互換性があり、S3cmdなどのS3ツールを使用してインターフェースをとることができます。 S3cmd は、コマンドラインまたはスクリプトを介してオブジェクトストレージからデータをアップロード、取得、および管理するために使用できるクライアントツールです。

このチュートリアルでは、S3cmdを使用してリモートGitリポジトリをDigitalOceanSpaceにバックアップする方法を示します。 この目標を達成するために、Gitをインストールして構成し、S3cmdをインストールして、GitリポジトリをSpaceにバックアップするスクリプトを作成します。

前提条件

Spacesを使用するには、DigitalOceanアカウントが必要です。 まだお持ちでない場合は、サインアップページで登録できます。

そこから、DigitalOcean SpaceをセットアップしてAPIキーを作成する必要があります。これは、チュートリアルDigitalOceanSpaceとAPIキーの作成方法に従って実行できます。

作成したら、スペースに関する次の詳細を手元に置いておく必要があります。

  • アクセスキー
  • シークレットキー(トークンとも呼ばれます)

さらに、sudo非rootユーザーでUbuntu16.04サーバーをセットアップする必要があります。 このUbuntu16.04初期サーバーセットアップチュートリアルに従うことで、これをセットアップするためのガイダンスを得ることができます。

Spaces情報とサーバーを設定したら、次のセクションに進んでGitをインストールします。

Gitをインストールする

このチュートリアルでは、サーバーにクローンするリモートGitリポジトリを使用します。 UbuntuにはGitがインストールされており、デフォルトのリポジトリで使用できるようになっていますが、このバージョンは最新の利用可能なリリースよりも古い可能性があります。

aptパッケージ管理ツールを使用して、ローカルパッケージインデックスを更新し、利用可能な最新バージョンのGitをダウンロードしてインストールできます。

sudo apt-get update
sudo apt-get install git

Gitをより柔軟にインストールし、最新のリリースを確実に入手するには、ソースからのGitのインストールを検討できます。

GitリポジトリのURLからバックアップするため、このチュートリアルでGitを構成する必要はありません。 Gitの構成に関するガイダンスについては、Gitのセットアップ方法のこのセクションをお読みください。

次に、リモートGitリポジトリのクローンを作成します。

リモートGitリポジトリのクローンを作成する

Gitリポジトリのクローンを作成するために、タスクを実行するためのスクリプトを作成します。 スクリプトを作成すると、変数を使用できるようになり、コマンドラインでエラーが発生しないようにすることができます。

実行可能スクリプトを作成するために、テキストエディタnanoを使用してcloneremote.shという新しいシェルスクリプトファイルを作成します。

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シェルによって実行されることを示しています。 そこから、コマンドで使用される変数を定義します。この変数は、スクリプトを実行すると実行されます。 これらの変数は、次の構成を定義します。

  • remoterepoには、バックアップ元のリモートGitリポジトリURLが割り当てられています
  • localclonedirは、リモートリポジトリのクローンを作成するサーバーディレクトリまたはフォルダを指します。この場合は、reposと呼びます。
  • clonefilenameは、ローカルの複製リポジトリに提供するファイル名を指します。この場合は、demoprojectlocal.gitと呼びます。

これらの各変数は、スクリプトの最後にあるコマンドで直接呼び出されます。

スクリプトの最後の行は、gitコマンドで始まるGitコマンドラインクライアントを使用しています。 そこから、cloneを使用してリポジトリのクローンを作成し、--mirrorタグを使用してリポジトリのミラーバージョンとして実行するように要求しています。 これは、複製されたリポジトリが元のリポジトリとまったく同じになることを意味します。 上で定義した3つの変数は、$で呼び出されます。

作成したスクリプトが正確であることに満足したら、CTRL + xキーを入力してnanoを終了し、ファイルを保存するように求められたらyを押します。

この時点で、次のコマンドを使用してシェルスクリプトを実行できます。

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環境に接続できます。 S3cmdの最新バージョンをパブリックGitHubリポジトリからダウンロードし、インストールの推奨ガイドラインに従います。

S3cmdをインストールする前に、PythonのSetuptoolsをインストールする必要があります。これは、インストールに役立ちます(S3cmdはPythonで記述されています)。

sudo apt-get install python-setuptools

yを押して続行します。

これをダウンロードすると、curlを含むS3cmdtar.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コマンドを実行しました。 コマンドで2つのフラグを使用しました。xはtarファイルからex を取得することを示し、fはすぐ隣の文字列が展開元のファイルのフルパス名にします。 tarファイルのファイルパスには、tmpディレクトリにあることも示されています。

ファイルが抽出されたら、結果のディレクトリに移動し、sudoを使用してソフトウェアをインストールします。

cd s3cmd-*
sudo python setup.py install

上記のコマンドを実行するには、sudoを使用する必要があります。 pythonコマンドは、setup.pyPythonスクリプトをインストールするためのPythonインタープリターの呼び出しです。

S3cmdにバージョン情報を要求して、インストールをテストします。

s3cmd --version
Outputs3cmd 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

このコマンドは、指定したクレデンシャルで使用可能なスペースのリストを出力する必要があります。

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

これにより、DigitalOceanSpacesへの接続に成功したことが確認されます。 これで、Gitリポジトリのオブジェクトストレージへのバックアップに進むことができます。

Gitリポジトリをオブジェクトストレージにバックアップする

すべてのツールをインストールして構成したら、ローカルリポジトリを圧縮してDigitalOceanSpaceにプッシュするスクリプトを作成します。

ホームディレクトリから、スクリプト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コマンドでは、次の4つのフラグを指定します。

  • zはgzip方式を使用して圧縮します
  • cは、既存のファイルを使用する代わりに、新しいファイルを作成します
  • vは、圧縮ファイルに含まれているファイルについて詳細に説明していることを示します
  • fは、次の文字列で定義された名前で結果のファイルに名前を付けます

フラグの後に、圧縮ファイルのファイル名(この場合はarchivedemoproject.tar.gz)を指定します。 また、zipするディレクトリの名前/repos/demoprojectlocal.gitも提供しています。

次に、スクリプトはs3cmd putを実行して、archivedemoproject.tar.gzを宛先スペースs3://demospaceに送信します。

S3cmdで一般的に使用できるコマンドの中で、putコマンドはファイルをSpacesに送信します。 役立つ可能性のある他のコマンドには、Spaceからファイルをダウンロードするためのgetコマンド、およびファイルを削除するためのdeleteコマンドが含まれます。 オプションなしでs3cmdを実行すると、S3cmdで受け入れられるすべてのコマンドのリストを取得できます。

バックアップをSpaceにコピーするために、スクリプトを実行します。

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リポジトリをDigitalOceanSpaceに正常にバックアップできました。

結論

必要に応じてコードを迅速に回復できるようにするには、バックアップを維持することが重要です。 このチュートリアルでは、Git、S3cmdクライアント、およびシェルスクリプトを使用して、リモートGitリポジトリをDigitalOceanSpaceにバックアップする方法について説明しました。 これは、Spacesを使用してディザスタリカバリとデータ整合性戦略を支援できる、考えられる数十のシナリオの1つの方法にすぎません。

次のチュートリアルを読むことで、オブジェクトストレージに保存できるものについて詳しく知ることができます。