天天看点

Linux Shell脚本之Gitlab远程备份

注:gitlab是一个git服务程序,有web图形界面和一系列管理工具,具体详细介绍可以google it。

1.gitlab本身提供了较好的备份方法,只是一个命令那么简单,并且它也支持远程备份(远程存储和云存储),例如它可以存储到aws的s3上。

2.本脚本运行在gitlab服务器上,不在备机上,上一篇的脚本是与运行在备机上。

脚本如下:

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

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

<code># this shell script will execute on a server</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/gitlab_backup_$(date -d "yesterday" +"%y%m%d%h%m%s").log</code>

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

<code># 59 23 * * * $0 &gt;/tmp/gitlab_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># 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 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_days=5</code>

<code>[ $? -</code><code>eq</code> <code>1 ] &amp;&amp; </code><code>exit</code> <code>1</code>

<code>gitlab_internal_backup_directory=</code><code>/data/var/opt/gitlab/backups</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>backup_server_ipaddress_public=xxx.xxx.xxx.xxx</code>

<code>backup_server_ipaddress_private=xxx.xxx.xxx.xxx</code>

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

<code>backup_server_hostname=${backup_server_ipaddress_private:-$backup_server_ipaddress_public}</code>

<code>backup_server_ssh_username=root</code>

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

<code>backup_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>backup_server_ssh_hostname=$backup_server_hostname</code>

<code>backup_path=</code><code>/data/gitlab_backup_directory</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>[ -d $backup_path/$backup_path_time_uniq ] || </code><code>mkdir</code> <code>-p $backup_path/$backup_path_time_uniq</code>

<code># sudo -u gitlab_ci -h bundle exec rake backup:create rails_env=production</code>

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

<code>/data/opt/gitlab/bin/gitlab-rake</code> <code>gitlab:backup:create &gt;$backup_path/$backup_path_time_uniq/$(</code><code>date</code> <code>-d </code><code>"yesterday"</code> <code>+</code><code>"%y%m%d"</code><code>).log 2&gt;&amp;1</code>

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

<code>backuped_tar_file=`</code><code>awk</code> <code>'/gitlab_backup.tar/ {print $4}'</code> <code>$backup_path</code><code>/backup_path_time_uniq/</code><code>$(</code><code>date</code> <code>-d </code><code>"yesterday"</code> <code>+</code><code>"%y%m%d"</code><code>).log`</code>

<code>[ -f $gitlab_internal_backup_directory/$backuped_tar_file ] &amp;&amp; </code><code>echo</code> <code>"find backuped tar file successfully! "</code>

<code>ssh</code> <code>$backup_server_ssh_username@$backup_server_ssh_hostname [ -d $backup_path/$backup_path_time_uniq ] || </code><code>mkdir</code> <code>-p $backup_path/$backup_path_time_uniq</code>

<code>[ $? -</code><code>ne</code> <code>0 ] &amp;&amp; </code><code>echo</code> <code>"remote backup directory creation failed! "</code> <code>&amp;&amp; </code><code>exit</code> <code>1;</code><code>echo</code> <code>"remote backup directory creation successfully! "</code>

<code>scp</code> <code>-p$port $gitlab_internal_backup_directory/$backuped_tar_file $backup_server_ssh_username@$backup_server_ssh_hostname:$backup_path/$backup_path_time_uniq </code>

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

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

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

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

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

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

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

参考:   

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

--end--

继续阅读