天天看点

Linux Shell脚本之Atlassian confluence远程备份方法

注:atlassian confluence是一个较专业的wiki程序,由java语言写成,其详细介绍可以google it(一点美中不足,java占用内存还是比较大的)。

该脚本的设计思路是根据atlassian confluence官方提供的文档说明写的,主要是备份一些配置文件,上传的一些附件之类的其他文件以及数据库,其数据库支持多种数据库,这次我采用的是postgresql数据库,你可以使用自己熟悉的数据库,如mysql。

1.为什么不使用rsync而是使用scp作为远程文件传输方法?

2.为什么要在备份机上执行该脚本?

其实这个脚本在备机还是atlassian confluence机器上运行都是可以的,但是为了减少ssh执行远程命令的次数,将其放在备份机器上执行比较好一些。

3.find后的todo是为啥?

在实际测试过程中发现,即使find没有进行任何删除操作,也会返回0,即成功。因此后面的校验和提示信息并不能完整的体现find的执行结果。如果日后有了更好的方法,再添加进去。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

<code>#!/bin/bash</code>

<code># touch confluence_backup.sh</code>

<code># chmod +x confluence_backup.sh</code>

<code># vim confluence_backup.sh</code>

<code># crontabs -- configuration and scripts for running periodical jobs</code>

<code># shell=/bin/bash</code>

<code># path=/sbin:/bin:/usr/sbin:/usr/bin</code>

<code># mailto=root</code>

<code># home=/</code>

<code># for details see man 4 crontabs</code>

<code># example of job definition:</code>

<code># .---------------- minute (0 - 59)</code>

<code># |  .------------- hour (0 - 23)</code>

<code># |  |  .---------- day of month (1 - 31)</code>

<code># |  |  |  .------- month (1 - 12) or jan,feb,mar,apr ...</code>

<code># |  |  |  |  .---- day of week (0 - 6) (sunday=0 or 7) or sun,mon,tue,wed,thu,fri,sat</code>

<code># |  |  |  |  |</code>

<code># *  *  *  *  * user-name command to be executed</code>

<code># m h  dom mon dow   command</code>

<code># execute on 11:59 per sunday</code>

<code># 59 11 * * */0 $0 &gt;/tmp/confluence_backup_$(date -d "yesterday" +"%y%m%d%h%m%s").log</code>

<code># or</code>

<code># execute on 23:59 per day</code>

<code># 59 23 * * * $0 &gt;/tmp/confluence_backup_$(date -d "yesterday" +"%y%m%d%h%m%s").log</code>

<code>#     xxx.xxx.xxx.xxx                xxx.xxx.xxx.xxx</code>

<code>#           |         ssh tunnel          |</code>

<code>#     xxx.xxx.xxx.xxx  &lt;==========&gt;  xxx.xxx.xxx.xxx</code>

<code>#           |                             |</code>

<code># ----------+-----------------------------+-------</code>

<code>#     +-----+-----+                +------+------+</code>

<code>#     |     a     |                |      b      |</code>

<code>#     +-----------+                +-------------+ </code>

<code>#     gitlab server                backups clinet</code>

<code>#</code>

<code># this shell script will execute on b server</code>

<code># a and b passed ssh authentication</code>

<code># a--&gt;b: ssh lan_ip</code>

<code># a--&gt;b: ssh wan_ip</code>

<code># b--&gt;a: ssh lan_ip</code>

<code># b--&gt;a: ssh wan_ip</code>

<code># a--&gt;a: ssh lan_ip</code>

<code># a--&gt;a: ssh wan_ip</code>

<code># b--&gt;b: ssh lan_ip</code>

<code># b--&gt;b: ssh wan_ip</code>

<code># run with root</code>

<code># [ $(id -u) -eq 0 ] || exit 1</code>

<code># run as root, of course.</code>

<code>[ $uid -</code><code>eq</code> <code>0 ] || ( </code><code>echo</code> <code>"must be root to run this script."</code> <code>&amp;&amp; </code><code>exit</code> <code>1 )</code>

<code># save 10 days</code>

<code>save_days=10</code>

<code># which directory to backup to</code>

<code>backup_path=</code><code>/data/confluence_backup_directory</code>

<code># make backups uniqure and backup per day</code>

<code># backup_path_time_uniq=$(date -d "yesterday" +"%y%m%d%h%m%s")</code>

<code>backup_path_time_uniq=$(</code><code>date</code> <code>-d </code><code>"yesterday"</code> <code>+</code><code>"%y%m%d"</code><code>)</code>

<code>confluence_home_directory=</code><code>/data/var/atlassian/application-data/confluence</code>

<code># if you have both wan ip and lan ip, you can fill it with all, if you have one ip, you can fill it just with lan ip</code>

<code>confluence_server_ipaddress_public=xxx.xxx.xxx.xxx</code>

<code>confluence_server_ipaddress_private=xxx.xxx.xxx.xxx</code>

<code># select lan ip first for transmission speed</code>

<code>confluence_server_hostname=${confluence_server_ipaddress_private:-$confluence_server_ipaddress_public}</code>

<code>confluence_server_ssh_username=root</code>

<code>#confluence_server_ssh_port=$(awk '/port/ {print $2}' /etc/ssh/sshd_config)</code>

<code>confluence_server_ssh_port=$(</code><code>netstat</code> <code>-anop | </code><code>awk</code> <code>'/sshd/ &amp;&amp; /listen/ {print $4}'</code> <code>| </code><code>awk</code> <code>-f </code><code>':'</code> <code>'{print $2}'</code><code>)</code>

<code>confluence_server_ssh_hostname=$confluence_server_hostname</code>

<code># which files and directory backup</code>

<code>#backup_files=(confluence.cfg.xml attachments config index)</code>

<code>backup_files=(confluence.cfg.xml attachments index)</code>

<code>backup_files_num=${</code><code>#backup_files[@]}</code>

<code>[ -d $backup_path/$backup_path_time_uniq ] || </code><code>mkdir</code> <code>-p $backup_path/$backup_path_time_uniq</code>

<code># do ssh copy</code>

<code>for</code> <code>(( i = 0; i &lt; $backup_files_num; i++ )); </code><code>do</code>

<code>    </code><code>scp</code> <code>-r -p$confluence_server_ssh_port $confluence_server_ssh_username@$confluence_server_ssh_hostname:$confluence_home_directory/${backup_files[i]} $backup_path/$backup_path_time_uniq &gt;</code><code>/dev/null</code> <code>2&gt;&amp;1</code>

<code>    </code><code>[ $? -</code><code>ne</code> <code>0 ] &amp;&amp; </code><code>echo</code> <code>"$confluence_home_directory/${backup_files[i]} backup failed! "</code> <code>&amp;&amp; </code><code>exit</code> <code>1;</code><code>echo</code> <code>"$confluence_home_directory/${backup_files[i]} backup successfully! "</code>

<code>done</code>

<code># excution postgresql dump</code>

<code># postgresql 9.3.9 documentation::31.14. environment variables</code>

<code># pghost=127.0.0.1</code>

<code># pghostaddr=127.0.0.1</code>

<code># pgport=5432</code>

<code># pgdatabase=confluence</code>

<code># pguser=confluence</code>

<code># pgpassword=yoursecret</code>

<code># postgresql 9.3.9 documentation::31.15. the password file</code>

<code>#cat &gt; ~/.pgpass &lt;&lt;eof</code>

<code>#127.0.0.1:5432:confluence:confluence:yoursecret</code>

<code>#eof</code>

<code># warning: password file "/root/.pgpass" has group or world access; permissions should be u=rw (0600) or less</code>

<code>#chmod 600 /root/.pgpass</code>

<code>#pg_dump -u confluence -d confluence -h 127.0.0.1 -o | head</code>

<code># important: if your database schema relies on oids (for instance, as foreign keys) you must instruct pg_dump to dump the oids as well. to do this, use the -o command-line option.</code>

<code>echo</code> <code>"postgresql is executing backup operation, please hold on! "</code>

<code>ssh</code> <code>-p$confluence_server_ssh_port $confluence_server_ssh_username@$confluence_server_ssh_hostname </code><code>"pg_dump -u confluence -d confluence -h 127.0.0.1 -o &gt;/tmp/tmp_confluence_postgresql.sql"</code>

<code>[ $? -</code><code>ne</code> <code>0 ] &amp;&amp; </code><code>echo</code> <code>"postgresql dump failed! "</code> <code>&amp;&amp; </code><code>exit</code> <code>1;</code><code>echo</code> <code>"postgresql dump successfully! "</code>

<code>scp</code> <code>-p$confluence_server_ssh_port $confluence_server_ssh_username@$confluence_server_ssh_hostname:</code><code>/tmp/tmp_confluence_postgresql</code><code>.sql $backup_path/$backup_path_time_uniq</code><code>/confluence_postgresql_</code><code>$(</code><code>date</code> <code>-d </code><code>"yesterday"</code> <code>+</code><code>"%y%m%d"</code><code>).sql &gt;</code><code>/dev/null</code> <code>2&gt;&amp;1</code>

<code>[ $? -</code><code>ne</code> <code>0 ] &amp;&amp; </code><code>echo</code> <code>"postgresql file transmission failed! "</code> <code>&amp;&amp; </code><code>exit</code> <code>1;</code><code>echo</code> <code>"postgresql file transmission successfully! "</code>

<code># delete old backups</code>

<code>find</code> <code>$backup_path -mtime +$save_days -</code><code>exec</code> <code>rm</code> <code>-rf {} \;</code>

<code># todo</code>

<code># returned code always is 0, from find or rm ???</code>

<code># how to express real result?</code>

<code>[ $? -</code><code>ne</code> <code>0 ] &amp;&amp; </code><code>echo</code> <code>"local expired backups remove skipped! "</code><code>;</code><code>echo</code> <code>"local expired backups remove successfully! "</code>

其他一些官方的建议和变量用词:

perform_backups                     enable   

backupfilename(sample)           backup-2015_08_17    

backup file prefix                     backup-    

backup file date pattern           yyyy_mm_dd    

backup path                            /data/var/atlassian/application-data/confluence/backups    

confluence home directory        /data/var/atlassian/application-data/confluence/

tag:confluence备份脚本,confluence备份方法,如何备份confluence,远程备份confluence,远程备份脚本

--end--