Linux Shell脚本之Gitlab远程备份

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://dgd2010.blog.51cto.com/1539422/1686043

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

这一篇可以说是上一篇《Linux Shell脚本之Atlassian confluence远程备份方法》的姊妹篇。其说明和原理是和上一篇是一样的,其核心原理都是core dump、scp、ssh和find+rm,但也有不同。

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

#!/bin/bash

# This shell script will execute on A Server

 

# SHELL=/bin/bash

# PATH=/sbin:/bin:/usr/sbin:/usr/bin

# MAILTO=root

# HOME=/

# 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

# m h  dom mon dow   command

# execute on 11:59 per sunday

# 59 11 * * */0 $0 >/tmp/gitlab_backup_$(date -d "yesterday" +"%Y%m%d%H%M%S").log

# execute on 23:59 per day

# 59 23 * * * $0 >/tmp/gitlab_backup_$(date -d "yesterday" +"%Y%m%d%H%M%S").log

 

#    xxx.xxx.xxx.xxx                xxx.xxx.xxx.xxx

#           |         ssh tunnel          |

#    xxx.xxx.xxx.xxx  <==========>  xxx.xxx.xxx.xxx

#           |                             |

# ----------+-----------------------------+-------

#           |                             |

#     +-----+-----+                +------+------+

#     |     A     |                |      B      |

#     +-----------+                +-------------+ 

#     gitlab server                backups clinet

#

# A and B passed ssh Authentication

# A-->B: ssh lan_ip

# A-->B: ssh wan_ip

# B-->A: ssh lan_ip

# B-->A: ssh wan_ip

# A-->A: ssh lan_ip

# A-->A: ssh wan_ip

# B-->B: ssh lan_ip

# B-->B: ssh wan_ip

 

# Run as root, of course.

[ $UID -eq 0 ] || ( echo "Must be root to run this script." && exit 1 )

save_days=5

[ $? -eq 1 ] && exit 1

gitlab_internal_backup_directory=/data/var/opt/gitlab/backups

# 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

backup_server_ipaddress_public=xxx.xxx.xxx.xxx

backup_server_ipaddress_private=xxx.xxx.xxx.xxx

# select lan ip first for transmission speed

backup_server_hostname=${backup_server_ipaddress_private:-$backup_server_ipaddress_public}

backup_server_ssh_username=root

#backup_server_ssh_port=$(awk '/Port/ {print $2}' /etc/ssh/sshd_config)

backup_server_ssh_port=$(netstat -anop | awk '/sshd/ && /LISTEN/ {print $4}' awk -F ':' '{print $2}')

backup_server_ssh_hostname=$backup_server_hostname

backup_path=/data/gitlab_backup_directory

backup_path_time_uniq=$(date -d "yesterday" +"%Y%m%d")

[ -d $backup_path/$backup_path_time_uniq ] || mkdir -p $backup_path/$backup_path_time_uniq

# sudo -u gitlab_ci -H bundle exec rake backup:create RAILS_ENV=production

echo "GitLab is executing backup operation, please hold on! "

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

[ $? -ne 0 ] && echo "Local backup failed! " && exit 1;echo "Local backup successfully! "

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

[ -f $gitlab_internal_backup_directory/$backuped_tar_file ] && echo "Find backuped tar file successfully! "

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

[ $? -ne 0 ] && echo "Remote backup directory creation failed! " && exit 1;echo "Remote backup directory creation successfully! "

scp -P$port $gitlab_internal_backup_directory/$backuped_tar_file $backup_server_ssh_username@$backup_server_ssh_hostname:$backup_path/$backup_path_time_uniq 

[ $? -ne 0 ] && echo "Remote backup transmission failed! " && exit 1;echo "Remote backup transmission successfully! "

find $gitlab_internal_backup_directory -mtime +$save_days -exec rm -rf {} \;

[ $? -ne 0 ] && echo "Local expired backup remove skipped! ";echo "Local expired backup remove successfully! "

find $backup_path -mtime +$save_days -exec rm -rf {} \;

[ $? -ne 0 ] && echo "Local expired tempdir remove skipped! ";echo "Local expired tempdir remove successfully! "

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

[ $? -ne 0 ] && echo "Remote expired backup remove skipped! ";echo "Remote expired backup remove successfully! "

参考:   
GitLab.org / GitLab Community Edition / Backup restore     https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/raketasks/backup_restore.md    
GitLab.org / GitLab CI / Backup restore     https://gitlab.com/gitlab-org/gitlab-ci/blob/master/doc/raketasks/backup_restore.md

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

--end--

本文出自 “通信,我的最爱” 博客,请务必保留此出处http://dgd2010.blog.51cto.com/1539422/1686043

时间: 2024-09-17 00:13:52

Linux Shell脚本之Gitlab远程备份的相关文章

Linux Shell脚本之利用mysqldump备份MySQL数据库(详细注解)

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://dgd2010.blog.51cto.com/1539422/1678653 设计该脚本的一些设计.编写考虑: 该脚本适用于编译安装mysql和通过yum或apt-get等安装方式 该脚本可以反复执行,不会重复覆盖数据 可增加,删除N天前的备份以节省磁盘空间 充分利用mysqldump的自带锁表功能.刷新日志.复制等功能 利用mysqldump命令备份MySQL数据库的脚本(不带

面向 DBA 的 Linux Shell 脚本简介

http://www.itpub.net/showthread.php?s=&threadid=720028 面向 DBA 的 Linux Shell 脚本简介 7 年前,Oracle 发布了 Linux 上的第一个商业数据库.从那时起,Oracle.Red Hat 和 Novell/SUSE 就不断地合作更改 Linux 内核,从而提高数据库和应用程序的性能.正因为这样,用于 Linux 的 Oracle 数据库 10g 才包含了与操作系统紧密相关的许多增强功能.DBA 比以往任何时候更需要了

Linux shell脚本基础学习详细介绍(完整版)

Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提. 1. Linux 脚本编写基础 ◆1.1 语法基本介绍1.1.1 开头 程序必须以下面的行开始(必须方在文件的第一行): #!/bin/sh 符号#!用来告诉系统它后面的参数是用来执行该文件的程序.在这个例子中我们使用/bin/sh来执行程序. 当编辑好脚本时,如果要执行该脚本,还必须使其可执行. 要使脚本可

Linux Shell脚本查看NUMA信息

  这篇文章主要介绍了Linux Shell脚本查看NUMA信息,本文直接给出脚本实现代码,需要的朋友可以参考下 Nova在NFV场景下会提供NUMA相关高级特性,这里提供一个脚本查看计算节点的NUMA相关信息. ? 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

Linux Shell脚本系列教程(一):Shell入门

  这篇文章主要介绍了Linux Shell脚本系列教程(一):Shell入门,本文讲解了Shell简介.Shell基本操作.如何打开Shell终端.Shell脚本的概念.如何运行Shell脚本.Shell脚本的注释等基础知识,需要的朋友可以参考下 一.Shell简介 诸多类Unix操作系统的设计令人惊叹.即便是在数十年后的今天,Unix式的操作系统架构仍是有史以来最佳的设计之一.这种架构最重要的一个特性就是命令行界面或者shell.shell环境使得用户能与操作系统的核心功能进行交互.术语脚本

Linux Shell脚本系列教程(二):终端打印命令详解

  这篇文章主要介绍了Linux Shell脚本系列教程(二):终端打印命令详解,本文着重讲解了echo终端打印.printf终端打印两个打印出输出命令,需要的朋友可以参考下 终端打印 终端是交互式工具,用户可以通过它与shell环境进行交互.在终端中打印文本是大多数shell脚本和工具日常需要执行的基本任务.通过终端打印,人们可以知道系统的运行状态,这对用户来说是至关重要的. echo终端打印 代码如下: echo "Welcome to Bash" echo 'Welcome to

Linux Shell脚本系列教程(三):变量和环境变量

  这篇文章主要介绍了Linux Shell脚本系列教程(三):变量和环境变量,本文讲解了普通变量.获取字符串的长度.环境变量等内容,需要的朋友可以参考下 一.玩转变量和环境变量 变量是任何一种编程语言都必不可少的组成部分,用于存放各种类型的变量.脚本语言大多是弱类型语言(动态语言),也就是说在使用变量时,不需要事先声明变量的类型,只需要直接赋值就可以.在Bash中,每一个变量的值都是字符串.无论你给变量赋值时有没有使用引号,值都会以字符串的形式存储.有一些特殊的变量会被shell环境和操作系统

Linux Shell脚本系列教程(四):使用函数添加环境变量

  这篇文章主要介绍了Linux Shell脚本系列教程(四):使用函数添加环境变量,本文对环境变量的一知识作了介绍,并给出普通添加环境变量和使用函数添加环境变量的方法,需要的朋友可以参考下 一.简介 环境变量通常用于存储路径列表,这些路径用于搜索可执行文件.库文件等.例如:$PATH.$LD_LIBRARY_PATH,它们通常看起来像这样: 代码如下: PATH=/usr/bin;bin LD_LIBRARY_PATH=/usr/lib;lib 这意味着只要shell需要运行二进制可执行文件时

Linux Shell脚本系列教程(五):数学运算

  这篇文章主要介绍了Linux Shell脚本系列教程(五):数学运算,本文讲解了使用let.(())和[]进行算术运算.使用expr进行算术运算.使用bc进行算术运算三种方法,需要的朋友可以参考下 在任何一种编程语言中,算术运算都是必不可少的,shell也不例外. 一. 使用let.(())和[]进行算术运算 可以使用普通变量赋值方法定义数值,这是,它会被保存为字符串.我们可以通过使用let.(()).[]等操作符,使得这些变量进行算术运算.例如: 代码如下: #!/bin/bash no1