Mercurial — это кроссплатформенная распределенная система управления версиями. Не так давно появилась идея сделать достаточно необычную систему бекапирования данных сайта при помощи mercurial, причем хранилище системы управления версий должно находиться на одном сервере, а сайт с базой данных на другом. Плюсы такой организации хранения данных в том, что в любой момент можно восстановить или посмотреть любой файл сайта за любое время, можно восстановить сайт из системы управления версий также за любое время. О реализации такого решения я решил написать в посте ниже.
Для начала опишу исходные данные — 2 сервера под управлением СentOS, на одном из которых установлен bitrix-env4 с установленным сайтом под управлением 1С-Битрикс. Условно назовем «клиентом» — сервер с установленным сайтом, а «сервером» — сервер, где мы расположим хранилище.
Сначала подготовим сервер — там следует установить сам mercurial и mercurial-server.
1) Установка mercurial очень проста:
yum install mercuial
2) Установка серверного решения не так проста. Для начала нужно скачать на сервер пакет:
cd /usr/src/
wget http://dev.lshift.net/paul/mercurial-server/mercurial-server_1.3.tar.gz
Разархивировать:
tar -zxfv mercurial-server_1.3.tar.gz
cd mercurial-server_1.3
Далее необходимо подправить Makefile так:
строку installfiles: installetc installdoc pythoninstall
заменить на installfiles: installetc pythoninstall
В блоке кода:
useradd: useradd —system —shell /bin/sh \ —home /var/lib/mercurial-server —create-home \ —comment «Mercurial repositories» $(NEWUSER)
заменить —system на -r , т.к. CentOS не поддерживает опцию -system .
Затем нужно откомпилировать mercurial_server командой: make setup-useradd .
Если что-то пошло не так, то следует читать логи ошибок и действовать в соответствии с разумом. Ответы можно поискать в статье http://blog.zygonia.net/2011/10/26/mercurial-and-mercurial-server-on-centos/ .
Если mercurial-server собрался, то можно переходить к настройке клиента.
На клиенте нужно: поставить mercurial, настроить доступ к серверу с хранилищем по ssh, инициализировать хранилище и сделать скрипт бекапирования, который бы исполнялся раз в сутки.
Установка mercurial аналогична тому, что мы делали на сервере — yum install mercurial .
Чтобы настроить доступ по ssh по ключу к серверу, нужно на клиенте создать ключ:
ssh-keygen -t rsa -b 2048 -f ~/.ssh/id_rsa
скопировать его публичную часть на сервер:
ssh-copy-id -i ~/.ssh/id_rsa.pub hg@machine
И, если вы указывали пароль при создании ключа, то нужно выполнить такую команду:
ssh-add ~/.ssh/id_rsa
После этих действий, вы сможете заходить на сервер так:
ssh machine
Если не получается так зайти, то нужно проверить правильность действий, которые вы произвели.
Не забудьте проверить на сервере параметры в конфиге ssh демона (/etc/ssh/sshd_config):
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
Они должны быть не закомментированы.
Чтобы инициализировать хранилище, нужно перейти в папку сайта, который вы будете таким методом бекапировать и выполнить команду hg init — будет создана папка .hg . После этого нужно выполнить команду hg init ssh://hg@machine/site1 — так будет инициализировано удаленное хранилище.
Далее следует отредактировать файл .hg/hgrc таким образом:
[ui]
username = User
[paths]
default-push = ssh://hg@machine/site1
и вы можете добавить в .hgignore в папке сайта файлы, для которых вы не хотите, чтобы отслеживались их версии. Это могут быть крупные файлы, файлы кеша, логи и прочее.
Как туда добавить файлы можно почитать здесь http://mercurial.selenic.com/wiki/.hgignore .
После выполненных действий можно ввести команду hg add и добавить все файлы сайта в систему управления версией в первый раз. Это процедура может занять продолжительное время. Затем следует ввести команду hg commit -m «первый коммит» и все добавленные файлы будут отправлены в первый коммит в хранилище на клиенте. Затем нужно ввести hg push — это отправит файлы на удаленное хранилище на сервере.
Если ошибок не было и все прошло успешно, то можно сделать скрипт для бекапирования.
Я его создал для себя в таком виде:
#!/bin/sh
time=`date +’%d-%m-%Y’`
mysqldump -uroot -pqwerpoiu site1 > /home/site1/www/bitrix/backup/database.sql
cd /home/site1/www/
hg add
hg commit —message=»commit at date `echo $time`»
hg push
Этот скрипт нужно сохранить где-нибудь и добавить его запуск в планировщик задач.
В одной из следующий статей опишу как работать далее с таким бекапом, если вам понадобятся файлы из него.