Devops's Blog

Backup в gitlab через api


Открываем gitlab.Идем User Settings → Access Tokens. Вводим Name , отмечаем api и нажимаем create personal Access Tokens

image

Наш токен

image

Запоминаем id нашего проекта

image

Создадим фаил test.txt в папке conf с содержимым "test_2019" , в ссылке после files, слеш(/) заменяется на '%2F'


[root@srv backup]# curl -s --request POST --header 'PRIVATE-TOKEN: rQgRBrr-3u2dmSXon7aQ' --header "Content-Type: application/json" --data '{"branch": "master", "author_email": "v.senkevich@s8.ru", "author_name": "v.senkevich","content": "test_2019", "commit_message": "create a new file"}' 'https://gitlab.web.s8.ru/api/v4/projects/36/repository/files/conf%2Ftest.text' | jq
{
  "file_path": "conf/test.text",
  "branch": "master"
}
image

Удалим созданный файл


[root@srv backup]# curl -s --request DELETE --header 'PRIVATE-TOKEN: rQgRBrr-3u2dmSXon7aQ' --header "Content-Type: application/json" --data '{"branch": "master", "author_email": "v.senkevich@s8.ru", "author_name": "v.senkevich","content": "test_2019", "commit_message": "create a new file"}' 'https://gitlab.web.s8.ru/api/v4/projects/36/repository/files/conf%2Ftest.text'

Заливаем конфиг файла


#!/bin/bash

content=$(cat /etc/sysconfig/iptables)

request_body='{
   "branch": "master",
   "author_email": "v.senkevich@s8.ru",
   "author_name": "v.senkevich",
   "content": "---this content will be replaced---",
   "commit_message": "backup_test"

}'
request_body=$(echo $request_body | jq ". + {content: \"$content\"}")

curl -s --request POST --header 'PRIVATE-TOKEN: rQgRBrr-3u2dmSXon7aQ' --header "Content-Type: application/json"  --data "$request_body" 'https://gitlab.web.s8.ru/api/v4/projects/36/repository/files/conf%2Fiptables' | jq


[root@srv backup]# ./backup.sh
{
  "file_path": "conf/iptables",
  "branch": "master"
}
image
Заливаем архивный фаил

Так как по одному конфигу делать upload не удобно, будем делать архив, но json не поддерживает binary файлы, значит будем делать кодирование в base64

The JSON format natively doesn't support binary data. The binary data has to be escaped so that it can be placed into a string element (i.e. zero or more Unicode chars in double quotes using backslash escapes) in JSON. An obvious method to escape binary data is to use Base64

  1. Выбираем нужные конфиги и сжимаем в архив tar.gz
  2. Кодируем архив в base64
  3. Подготавливаем json и записываем в файл(это обязательно в curl передать фаил, массив такого объема он не съест )
  4. Делаем Upload в gitlab
  5. Удаляем наш архив и в gitlab файлы старше 10 дней

#!/bin/bash
dst=$(hostname)_$(date +%d-%m-%Y).tar.gz
dst_10d=$(hostname)_$(date --date="10 days ago" +%d-%m-%Y).tar.gz
src1="/etc/sysconfig/iptables"
src2="/etc/haproxy"
src3="/etc/named.*"
src4="/var/named/slaves"
filename="/opt/backup/$dst"
/usr/bin/tar -zcf $filename $src1 $src2 $src3 $src4 > /opt/backup/log
massiv=$(base64 $filename | tr -d '\n' )


request_body='{
   "branch": "master",
   "author_email": "v.senkevich@s8.ru",
   "author_name": "v.senkevich",
   "content": "'"$massiv"'",
   "commit_message": "backup_conf"

}'

host="https://gitlab.web.s8.ru/api/v4/projects/36/repository/files/conf%2F$(hostname)%2F$dst"

echo $request_body > /opt/backup/backup.json
curl -s --request POST --header 'PRIVATE-TOKEN: rQgRBrr-3u2dmSXon7aQ' --header "Content-Type: application/json" --data @/opt/backup/backup.json "$host" >> /opt/backup/log

#delete
/bin/rm -rf $filename
host="https://gitlab.web.s8.ru/api/v4/projects/36/repository/files/conf%2F$(hostname)%2F$dst_10d"
curl -s --request DELETE --header 'PRIVATE-TOKEN: rQgRBrr-3u2dmSXon7aQ' --header "Content-Type: application/json" --data @/opt/backup/backup.json "$host" >> /opt/backup/log
image

Получаем наш фаил и делаем декодирование и проверку архива


[root@srv backup]# curl -s --request GET --header 'PRIVATE-TOKEN: rQgRBrr-3u2dmSXon7aQ' 'https://gitlab.web.s8.ru/api/v4/projects/36/repository/files/conf%2Fqa-rt-main-2%2Fqa-rt-main-2_29-08-2019.tar.gz/raw?ref=master' > base64_file

[root@srv backup]# base64 -d base64_file > test.tar.gz

[root@qa-rt-main-2 backup]# tar -tf test.tar.gz
etc/sysconfig/iptables
etc/haproxy/
etc/haproxy/haproxy.cfg
etc/haproxy/haproxy.cfg_08_08_19
etc/haproxy/haproxy.cfg_18_08_19
etc/haproxy/haproxy.cfg_19_08_19