Skip to content

Instantly share code, notes, and snippets.

@rsmartins78
Last active May 11, 2018 19:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rsmartins78/1c626f7fa767a6804e1fe7aee35454e6 to your computer and use it in GitHub Desktop.
Save rsmartins78/1c626f7fa767a6804e1fe7aee35454e6 to your computer and use it in GitHub Desktop.
Script for Gitlab in Docker backup. It collects de Container ID, make an Docker exec, and move the file created in origin to destiny choosed.
#!/bin/bash
#############################################################################
## Nome: Gitlab-Backup ##
## Função: SCRIPT PARA AUTOMAÇÃO DE BACKUP DE ##
## UM GITLAB SERVER EXECUTADO EM DOCKER. ##
## PODE SER UTILIZADO PARA USO EM CRONTAB, POIS COLETA A ID CONTAINER. ##
## Linguagem: Shell Script ##
## ##
## OBRIGADO PELO APOIO ##
#############################################################################
local=false
externo=false
function usage() {
echo "Script para backup do Gitlab em Container"
echo "Como usar:"
echo "$0 -l ou -e -o path/de/origem -d path/de/destino"
echo "-l para backup local"
echo "-e para backup externo"
echo "-h exibe este menu"
echo "-r remove todos os arquivos da pasta de origem"
echo "USE A OPÇÃO -r COM CAUTELA, ELA APAGA TUDO DA ORIGEM DEFINIDA"
echo ""
echo "Exemplos:"
echo "$0 -t local -o /devops/gitlab/backup -d /backup/"
echo "$0 -t externo -o /devops/gitlab/backup -d root@10.10.10.10:/backup"
echo ""
echo "ATENÇÃO"
echo "CASO O PARAMETRO ESCOLHIDO PARA -t SEJA 'externo', FAVOR CRIAR ~/.ssh/config,"
echo "especificando endereço do host e path da chave."
echo "Mais informações em https://www.cyberciti.biz/faq/force-ssh-client-to-use-given-private-key-identity-file/"
}
function backup_local() {
echo "Realizando Backup"
docker exec -t ${CONTAINERID} bash -c 'gitlab-rake gitlab:backup:create'
echo "Copiando ao Destino ${DESTINO}"
rsync -azvh --progress ${ORIGEM} ${DESTINO}
}
function backup_externo() {
if [ ! -f ${HOME}/.ssh/config ]; then
echo "Para realizar o backup externo é necessário criar um arquivo ~/.ssh/config"
echo "Com os parametros de acesso SSH ao destino"
echo ""
echo "Use a opção -h para ajuda"
exit 2
fi
echo "Realizando Backup"
docker exec -t ${CONTAINERID} bash -c 'gitlab-rake gitlab:backup:create'
echo "Copiando ao Destino ${DESTINO}"
rsync -Cravzpte ssh --progress ${ORIGEM} ${DESTINO}
}
function limpa_origem() {
rm -rf ${ORIGEM}/*
}
function testa_ssh() {
SSH=$( echo ${DESTINO} | cut -d: -f1 )
TSSH=$( ssh -o ConnectTimeout=10 -o StrictHostKeyChecking=no $SSH > /dev/null )
if [ $TSSH != true ]; then
echo "Falha na conexão SSH com ${SSH}"
exit 2
fi
}
function start() {
#Definindo opção de limpar origem = false
deleta=false
#COLETANDO A ID DO CONTAINER DO GITLAB-SERVER
CONTAINERID=$(docker ps | grep -i gitlab-server | awk '{print $1'})
if [ -z $CONTAINERID ]; then
echo "ID do Container não identificada"
echo "Verifique se o mesmo existe ou está sendo executado"
exit 2
fi
echo "A ID do Container é ${CONTAINERID}"
#VERIFICA SE DESTINO CONTEM CARACTERE '@'
TDESTINO=$( echo ${DESTINO} | sed 's/@//g' )
#Verifica o target, e se as opções origem e destino foram setadas, em caso de externo, valida se contem um @.
if [ ${externo} = true ] && [ ${DESTINO} == ${TDESTINO} ]; then
#Caso as validações acima retornem falso, irá printar como usar.
echo "Target, Origem ou Destino Inválido !!"
echo "Em caso de target externo, o destino deve conter o formato de uma conexão SSH"
echo "DEBUG ABAIXO"
echo "Local? ${local}"
echo "Externo? ${externo}"
echo "Origem: ${ORIGEM}"
echo "Destino: ${TDESTINO}"
echo ""
echo "Use a opção -h para ajuda"
exit 1
elif [ ${local} = true ]; then
echo "Escolhida a opção de backup local"
#Executa função de backup local caso verdadeiro.
backup_local
#Caso seja escolhida opção -r, será executada função para limpar origem.
if [ $deleta = true ]; then
echo "Eliminando conteúdo da pasta de origem: ${ORIGEM}"
limpa_origem
fi
exit 0
else
echo "Escolhida a opção de backup externo (via SSH)"
#Executa função de backup externo caso verdadeiro.
testa_ssh
backup_externo
#Caso seja escolhida opção -r, será executada função para limpar origem.
if [ $deleta = true ]; then
echo "Eliminando conteúdo da pasta de origem: ${ORIGEM}"
limpa_origem
fi
exit 0
fi
}
function error_local() {
echo "Favor informar o tipo de backup !"
echo "-l para local ou -e para externo (via SSH)"
echo ""
echo "Local? ${local}"
echo "Externo? ${externo}"
echo "Use a opção -h para ajuda"
exit 1
}
#Abaixo é coletado os parâmetros solicitados, junto com seus respectivos argumentos.
while getopts :hrleo:d: OPTION; do
case "${OPTION}" in
o)
# Gravando origem na variável.
ORIGEM="${OPTARG}"
;;
d)
# Gravando destino na variável.
DESTINO="${OPTARG}"
;;
r)
# Informando que a origem deverá ser limpa.
deleta=true
;;
l)
# Definindo target
local=true
;;
e)
# Definindo target
externo=true
;;
h)
# Exibindo menu de ajuda.
usage
exit 1
;;
*)
# No caso de opção inválida, é emitido alerta.
echo "Opção inválida !"
echo "Verifique como usar com -h"
exit 1
;;
esac
done
# Abaixo está sendo realizada uma validação se os parâmetros obrigatórios foram passado antes de iniciar aplicação.
if [ $local = true ] && [ $externo = true ]; then
error_local
elif [ $local = false ] && [ $externo = false ]; then
error_local
fi
if [ -n $ORIGEM ] && [ -n $DESTINO ]; then
start
else
echo "Favor informar Origem e Destino"
echo "Origem ${ORIGEM}"
echo "Destino ${DESTINO}"
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment