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 из бэкапа проверяйте, чтобы каталоги и БД соответствовали друг другу.

JIRA восстановлена!