Die Installation von JIRA auf Debian habe ich hier beschrieben. Mit diesen beiden How-To's kann man eine komplette JIRA Installation incl. Backup- und Restore-Workflows aufsetzen.

Die notwendigen Schritte im Überblick:

  • Datenbank dumpen
  • JIRA-Attachments im Filesystem dumpen
  • mit rsync auf eine andere Maschine synchronisieren
  • crontab die Arbeit erledigen lassen

Common Pitfall:
Das Datum in der Crontab darf nicht wie in einem typischen Shell-Command mit Backticks und %-Zeichen angegeben werden. Benutzt statt dieser

`date +%Y%m%d`

in der Crontab diese Syntax:

$(date +\%d-\%m-\%Y)

Bei den nachfolgenden Kommandos ist das Verzeichnis /JIRABACKUPS/serverbackups/jira/ unser Zielverzeichnis auf dem Backup-Server. Das lokale Backup-Verzeichnis ist /BACKUP/. In diesem wird alles vorbereitet, bevor es via rsync auf die andere Maschine geschrieben wird (in diesem Fall ein via NFS gemountetes Verzeichnis).
Erster Schritt (und gern vergessen 🙄): /BACKUP erstellen.

cd 
mkdir /BACKUP/ 

PRO TIPP
Hier habe ich die Installation und Konfiguration von autofs für robuste Backups beschrieben. Bindet man den externen Backup-Pfad nach dieser Anleitung ein, gibt es keine Probleme beim mounten.

MYSQL-DB Dumpen

Die JIRA Datenbank via mysqldump dumpen:

30 0 * * * mysqldump -u jirauser -p{password} --opt --single-transaction jiradb | gzip > "/var/atlassian/application-data/jira/export/"jira-dbbackup-$(date +\%d-\%m-\%Y).sql.gz

--single-transaction ist wichtig, um Permission Problemen zu entkommen.

Rsync Quell-Ordner vorbereiten und syncen

#FIND ALL JIRA FS BACKUPS AND MYSQLDUMPS OLDER  THAN 7 DAYS AND REMOVE THEM 
39 0 * * * find /var/atlassian/application-data/jira/export/* -mtime +7 -exec rm {} \; 

JIRA Backup Directory, dass alle mit JIRA in Zusammenhang stehenden Daten enthält: /var/atlassian/application-data/jira/export

JIRA Verzeichnis in lokales BACKUP Verzeichnis packen

tar -zcf /BACKUP/var-atlassian-application-data-jira-$(date +\%d-\%m-\%Y).tar.gz /var/atlassian/application-data/jira/ 

[Optional]: verify tar contents:

tar ztvf /BACKUP/var-atlassian-application-data-jira-data.tar.gz 

Sollen Datenverzeichnisse bestimmter Plugins nicht ins Backup übernommen werden, kann man sie mit dem exclude-Filter ausschließen. Hier mal Beispielhaft der Content eines GIT-Plugins:

tar -zcf /BACKUP/var-atlassian-application-data-jira-$(date +\%d-\%m-\%Y).tar.gz /var/atlassian/application-data/jira/ --exclude=/var/atlassian/application-data/jira/data/git-plugin &>/dev/null

Das &>/dev/null am Ende des Befehls dient nur dazu, eine Meldung des tar-Programms zu unterdrücken. Nämlich diese hier:

tar: Removing leading `/' from member names

Alternativ kann nur das JIRA Data-Verzeichnis in das tar gepackt werden.
/var/atlassian/application-data/jira/data anstatt
/var/atlassian/application-data/jira/ verwenden.

#RSYNC ALL FILES IN JIRA EXPORT DIR TO BACKUP LOCATION ON DISKSTATION 
40 0 * * * rsync -r --numeric-ids --delete /BACKUP/ /JIRABACKUP/serverbackups/jira/

-r anstatt -a, um Permission Problemen zu entkommen. -r sollte ausreichend sein.

Apache2 Config mit ins Backup schreiben

Soll auch die Apache2 Config in das Backup geschrieben werden (ist schon sinnvoll, da sie benötigt wird, um ein komplett funktionsfähiges Setup zu haben) - den rsync-Befehl um den Parameter --links erweitern:

rsync -r --numeric-ids --delete --links /BACKUP/ /JIRABACKUP/serverbackups/jira/

Putting it all together

crontab anpassen, bzw. erstellen

Die Einträge nun noch in die crontab packen und des Nächtens laufen lassen. Es empfiehlt sich, einige Minuten Abstand zwischen den einzelnen Commands zu lassen (vor Allem, wenn Daten kopieren oder Archive erstellt werden). crontab -e

#!/bin/bash
PATH=/opt/someApp/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

#MYSQL-DB DUMP AND COMPRESS
30 0 * * * mysqldump -u jirauser -p{password} --opt --single-transaction jiradb | gzip > "/var/atlassian/application-data/jira/export/"jira-dbbackup-$(date +\%d-\%m-\%Y).sql.gz 
   
#KOMPLETTES JIRA HOME DIRECTORY DUMPEN 
32 0 * * * tar -zcf /BACKUP/var-atlassian-application-data-jira-$(date +\%d-\%m-\%Y).tar.gz /var/atlassian/application-data/jira/ --exclude=/var/atlassian/application-data/jira/data/git-plugin &>/dev/null

#FIND ALL JIRA FS BACKUPS AND MYSQLDUMPS OLDER  THAN 7 DAYS AND REMOVE THEM 
39 0 * * * find /BACKUP/* -mtime +7 -exec rm {} \; 

#RSYNC ALL FILES IN LOCAL BACKUP DIR TO BACKUP LOCATION ON DISKSTATION  
#INCLUDE APACHE2 CONFIG [symlinks]
40 0 * * * rsync -r --numeric-ids --delete --links /BACKUP/ /JIRABACKUP/serverbackups/jira/ 

Ein dedizierter Post zum Restore von JIRA Software gibt es auch mal irgendwann (wenn ich meine alten Unterlagen wiederfinde 🤨)