Backup JIRA
Стратегия бэкапа JIRA описана на сайте Atlassian - https://confluence.atlassian.com/adminjiraserver071/backing-up-data-802592964.html
Встроенный механизм резервного копирования JIRA создает XML файл. Однако как пишет сам Atlassian, крайне рекомендуется использовать штатные средства бэкапирования, которые есть в БД.
Backup БД PostgreSQL
За основу бэкапа БД возьмем скрипты с https://wiki.postgresql.org/wiki/Automated_Backup_on_Linux
Создадим каталоги для этих целей и скопируем скрипты для бэкапа:
mkdir /var/backups/scripts mkdir /var/backups/atlassian/jira/db mkdir /var/backups/atlassian/jira/dir cd /var/backups/scripts
Скопируем скрипты с сайта по ссылке выше в соответствующие файлы и сделаем их исполняемыми:
vim pg_backup.config vim pg_backup.sh chmod ug+x pg_backup.sh vim pg_backup_rotated.sh chmod ug+x pg_backup_rotated.sh
Файл pg_backup.sh можно использовать для единоразового бэкапа. В дальнейшем мы будем использовать скрипт pg_backup_rotated.sh, который удаляет (ротирует) старые файлы.
Настроим файл pg_backup.config для определения параметров бэкапа БД. В нашем случае ежедневный бэкап будет храниться в течении 7 дней (более старые файлы будут автоматически удаляться), еженедельный бэкап будет делаться в воскресение и храниться 4 недели. Формат файла - custom. Итоговый файл pg_backup.config будет выглядеть:
############################## ## POSTGRESQL BACKUP CONFIG ## ############################## # Optional system user to run backups as. If the user the script is running as doesn't match this # the script terminates. Leave blank to skip check. BACKUP_USER=root # Optional hostname to adhere to pg_hba policies. Will default to "localhost" if none specified. HOSTNAME=127.0.0.1 # Optional username to connect to database as. Will default to "postgres" if none specified. USERNAME= # This dir will be created if it doesn't exist. This must be writable by the user the script is # running as. BACKUP_DIR=/var/backups/atlassian/jira/db/ # List of strings to match against in database name, separated by space or comma, for which we only # wish to keep a backup of the schema, not the data. Any database names which contain any of these # values will be considered candidates. (e.g. "system_log" will match "dev_system_log_2010-01") SCHEMA_ONLY_LIST="" # Will produce a custom-format backup if set to "yes" ENABLE_CUSTOM_BACKUPS=yes # Will produce a gzipped plain-format backup if set to "yes" ENABLE_PLAIN_BACKUPS= # Will produce gzipped sql file containing the cluster globals, like users and passwords, if set to "yes" ENABLE_GLOBALS_BACKUPS= #### SETTINGS FOR ROTATED BACKUPS #### # Which day to take the weekly backup from (1-7 = Monday-Sunday) DAY_OF_WEEK_TO_KEEP=7 # Number of days to keep daily backups DAYS_TO_KEEP=7 # How many weeks to keep weekly backups WEEKS_TO_KEEP=4 ######################################
Для того, чтобы скрипт мог исполняться автоматически по cron (не запрашивался пароль), необходимо добавить HOSTNAME из файла pg_backup.config в файл pg_hba.conf как trust:
sudo vim /var/lib/pgsql/data/pg_hba.conf sudo systemctl reload postgresql.service
Получится:
# IPv4 local connections: host all postgres 127.0.0.1/32 trust host all all 127.0.0.1/32 md5
Чтобы проверить, что скрипт бэкапа работает как нужно, запустите и убедитесь в создании файла бэкапа.
Теперь осталось добавить скрипт для запуска по расписанию в crontab, чтобы бэкап создавался автоматически и перегрузить crontab:
sudo vim /etc/crontab sudo systemctl reload crond.service
Получится:
SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root # For details see man 4 crontabs # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed #backup DB PSQL (jira) 0 3 * * * root /var/backups/scripts/pg_backup_rotated.sh
Выражение 0 3 * * * означает запуск бэкапа каждый день в 03:00.
Автоматический бэкап БД настроен.
Backup директорий JIRA
Для бэкапа директорий JIRA напишем небольшой скрипт, который будет архивировать JIRA home directory и каталог conf (в данном каталоге, например, хранятся настройки reverse proxy в файле server.xml, который может "затираться" при обновлениях), а также удалять старые файлы (старше 7 дней):
cd /var/backups/scripts/ vim ./jira_backup_dir.sh chmod ug+x jira_backup_dir.sh
Получится:
#!/bin/bash TIME=`date +%d-%m-%Y` FILENAME=backup-jira-$TIME.tar.gz SRCDIR1=/var/atlassian/application-data/jira SRCDIR2=/opt/atlassian/jira/conf DESDIR=/var/backups/atlassian/jira/dir tar -cpzf $DESDIR/$FILENAME $SRCDIR1 $SRCDIR2 find $DESDIR/backup-* -mtime +7 -delete
Осталось добавить скрипт в crontab для автоматического бэкапа перегрузить:
sudo vim /etc/crontab sudo systemctl reload crond.service
Получится:
SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root # For details see man 4 crontabs # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed #backup DB PSQL (jira) 0 3 * * * root /var/backups/scripts/pg_backup_rotated.sh #backup home directory jira + directory conf 15 3 * * * root /var/backups/scripts/jira_backup_dir.sh
Выражение 15 3 * * * означает запуск бэкапа каждый день в 03:15.
Автоматический бэкап директорий настроен.
Бэкап JIRA настроен!
Восстановление JIRA
Остановим JIRA:
sudo systemctl stop jira
Восстановим домашний каталог (JIRA home directory) из бэкапа. Если после того, как был сделан бэкап, производились дополнительные установки (например, ставились плагины), то лучше предварительно удалить содержимое каталога:
cd /var/backups/atlassian/jira/dir sudo tar -xzf backup-jira-xx-xx-xx.tar.gz sudo cd /var/atlassian/application-data/jira/ sudo rm -Rf ./* sudo cp -Rpf /var/backups/atlassian/jira/dir/var/atlassian/application-data/jira/* ./
Если команда cp запрашивает подтверждение перезаписи файлов, проверьте в ~/.bashrc прописан ли alias cp='cp -i' - если да, уберите ключ -i.
Если вы бэкапили каталог, где установлена JIRA, то для его восстановления необходимо также выполнить команду cp, как указано выше. Например, для восстановления каталога conf:
sudo cd /opt/atlassian/jira/conf/ sudo cp -Rpf /var/backups/atlassian/jira/dir/opt/atlassian/jira/conf/* ./
Восстановим БД:
sudo -u postgres -i -bash-4.2$ psql psql (9.2.18) Введите "help", чтобы получить справку.
Изменим название БД JIRA на всякий случай (после успешного бэкапа удалим):
postgres=# ALTER DATABASE jiradb RENAME TO jiradbcorrupted;
Создадим новую БД JIRA:
postgres=#CREATE DATABASE jiradb WITH ENCODING='UTF8' OWNER=jiradbuser CONNECTION LIMIT=-1; postgres=#\q
Проверьте, что название БД JIRA изменилось (вы должны увидеть две БД - jiradbcorrupted и jiradb):
-bash-4.2$ psql -l
Восстановим БД из бэкапа:
-bash-4.2$ pg_restore --format=c -d jiradb -v /var/backups/atlassian/db/monthly/jiradb.custom
Если восстановление БД jiradb прошло без ошибок, можно удалить БД jiradbcorrupted и стартовать JIRA:
-bash-4.2$ psql -U postgres -c "drop database jiradbcorrupted" -bash-4.2$ exit sudo systemctl start jira
Когда восстанавливаете JIRA из бэкапа проверяйте, чтобы каталоги и БД соответствовали друг другу.