Резервное копирование репозитория Git в хранилище объектов

Использование репозитория исходного кода для управления версиями – это отличная практика, которая поможет вам восстановить и запустить приложение в случае сбоя из-за изменения кода. Однако бывают и критические ситуации – случайное удаление целой ветки, потеря доступа к репозиторию и т.п. При этом приходится использовать дополнительные стратегии аварийного восстановления.

Резервное копирование репозитория кода в инфраструктуру хранилища объектов предоставляет вам копию данных за пределами сайта, которую можно использовать для восстановления в случае необходимости.

Данный мануал поможет настроить резервное копирование репозитория Git в удаленное хранилище объектов. Для этого нужно установить Git и S3cmd, а затем создать сценарии для резервного копирования репозитория.

Требования

  • Удаленное хранилище объектов.
  • Access Key и Secret Key.
  • Сервер Ubuntu 16.04, настроенный по этому мануалу.

Установка Git

В данном мануале используется удаленный репозиторий Git, который нужно клонировать на сервер. Ubuntu поставляется с Git по умолчанию, но стандартная версия может быть устаревшей.

Используйте инструмент управления пакетами apt, чтобы обновить локальный индекс пакетов и загрузить последнюю версию Git.

sudo apt-get update
sudo apt-get install git

Более гибкий способ установки последней версии Git – компиляция из исходного кода.

Настраивать Git для этого мануала не нужно.

Читайте также: Установка Git в Ubuntu 16.04

Клонирование репозитория Git

Чтобы клонировать репозиторий Git, создайте сценарий для выполнения этой задачи. Такой сценарий позволяет использовать переменные и позволяет избежать ошибок в командной строке.

Создайте новый файл cloneremote.sh:

nano cloneremote.sh

Добавьте в файл такие строки:

#!/bin/bash
remoterepo=your_remote_repository_url
localclonedir=repos
clonefilename=demoprojectlocal.git
git clone --mirror $remoterepo $localclonedir/$clonefilename

Рассмотрим все компоненты сценария по порядку.

Первая строка (#!/bin/bash) указывает, что сценарий будет запущен оболочкой Bash. Здесь можно определить переменные для команды, которая будет запускаться после выполнения сценария. Эти переменные определяют следующие части конфигурации:

  • remoterepo: URL удаленного репозитория Git, который нужно скопировать.
  • localclonedir: каталог, в который нужно клонировать удаленный репозиторий (в этом мануале это каталог repos).
  • clonefilename: имя файла локальной копии репозитория (в данном случае это demoprojectlocal.git).

Каждая из этих переменных затем вызывается непосредственно в команде в конце сценария.

В последней строке сценария используется клиент командной строки Git (с помощью команды git). Здесь запрашивается клонирование репозитория с помощью команды clone; репозиторий клонируется как зеркальная версия с помощью тега —mirror. Это означает, что клонированный репозиторий будет точно таким же, как и исходный. Три переменных, которые вы определили выше, вызываются с помощью $.

Сохраните и закройте файл сценария.

Теперь можно запустить сценарий оболочки:

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.

Теперь можно перейти к установке инструмента S3cmd, который можно использовать для резервного копирования репозитория в хранилище объектов.

Установка S3cmd

Инструмент S3cmd позволяет подключаться к среде Spaces из командной строки. Загрузите последнюю версию S3cmd из публичного репозитория GitHub и следуйте рекомендациям по установке.

Перед установкой S3cmd нужно установить Python Setuptools, так как этот инструмент поможет вам с установкой (S3cmd написан на Python).

sudo apt-get install python-setuptools

Чтобы продолжить, нажмите y.

Теперь можно загрузить tar.gz S3cmd с помощью curl.

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

Загрузите файл в каталог tmp – это общий каталог для загрузки файлов на сервер.

Вы можете проверить наличие более новой версии S3cmd, посетив страницу Releases репозитория GitHub. Если вы найдете более новую версию, вы можете скопировать URL-адрес архива tar.gz и подставить его в приведенную выше команду curl.

Когда загрузка будет завершена, распакуйте файл:

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

Флаг x указывает, что файл tar нужно распаковать; после f следует полный путь к файлу. В пути к файлу tar также указывается, что он находится в каталоге tmp.

Перейдите в полученный каталог и установите программу:

cd s3cmd-*
sudo python setup.py install

Для запуска этой команды необходимы права sudo. Команда python вызывает интерпретатор Python, который устанавливает сценарий setup.py.

Проверьте установку, запросив версию S3cmd:

s3cmd --version
s3cmd version 2.0.1

Если вы видите аналогичный вывод, S3cmd был успешно установлен. Затем нужно настроить S3cmd для подключения к сервису хранения объектов.

Настройка S3cmd

S3cmd имеет интерактивный процесс настройки, который может создать файл конфигурации для подключения к серверу хранения объектов. Во время процесса настройки вам будет предложено ввести Access Key и Secret Key.

Запустите процесс настройки, введя следующую команду:

s3cmd --configure

Программа запросит ключи, введите их и укажите регион по умолчанию.

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]:

Затем нужно указать конечную точку:

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

Если ваше хранилище поддерживает корзины на основе DNS, укажите корзину в требуемом формате:

%(bucket)s.nyc3.my-provider.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.my-provider.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. Если ваше хранилище не поддерживает незашифрованных соединений, нажмите 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.

После этого сценарий конфигурации представляет сводку значений, которые он будет использовать, а затем дает возможность их протестировать. Если тест завершится успешно, введите Y, чтобы сохранить настройки.

После сохранения конфигурации вы получите подтверждение их местоположения.

Затем можно проверить, правильно ли настроена ваша установка, выполнив следующую команду.

s3cmd ls

Команда должна вернуть список доступных хранилищ:

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

Резервное копирование репозитория Git в хранилище объектов

Теперь можно создать сценарий, который заархивирует репозиторий и отправит его в удаленное хранилище объектов.

В домашнем каталоге создайте сценарий movetospaces.sh:

cd ~
nano 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 перед отправкой его в хранилище. В команде tar укажите четыре флага:

  • z сжимает архив с помощью gzip.
  • c создает новый файл, вместо того чтобы использовать существующий.
  • v выводит расширенный результат.
  • f определяет имя нового файла.

После флагов указывается имя сжатого файла, в этом случае archivedemoproject.tar.gz. также нужно предоставить имя каталога, который нужно заархивировать (/repos/demoprojectlocal.git).

Затем скрипт запускает s3cmd put для отправки archivedemoproject.tar.gz в место назначения.

Команда put отправляет файлы в хранилища. Вам могут пригодиться и другие команды: 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 в удаленном хранилище объектов. Это всего лишь один из десятков возможных методов использования хранилища объектов для восстановления после сбоев и согласования данных.

Читайте также:

Tags: ,