注: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 >/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 >/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 <==========> 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-->b: ssh lan_ip</code>
<code># a-->b: ssh wan_ip</code>
<code># b-->a: ssh lan_ip</code>
<code># b-->a: ssh wan_ip</code>
<code># a-->a: ssh lan_ip</code>
<code># a-->a: ssh wan_ip</code>
<code># b-->b: ssh lan_ip</code>
<code># b-->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>&& </code><code>exit</code> <code>1 )</code>
<code>save_days=5</code>
<code>[ $? -</code><code>eq</code> <code>1 ] && </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/ && /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 >$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>&1</code>
<code>[ $? -</code><code>ne</code> <code>0 ] && </code><code>echo</code> <code>"local backup failed! "</code> <code>&& </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 ] && </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 ] && </code><code>echo</code> <code>"remote backup directory creation failed! "</code> <code>&& </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 ] && </code><code>echo</code> <code>"remote backup transmission failed! "</code> <code>&& </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 ] && </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 ] && </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 ] && </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--