На одном из проектов, в которых мы участвовали, отсутствовал корпоративный мессенджер. Поэтому было принято решение, что нужно получать уведомления о создании бэкапов GitLab в Telegram. 

Что нужно для этого предпринять?

В первую очередь займемся ботом с минимальными возможностями. Для этого находим специальный бот BotFather, через который и будет происходить все управление, и нажимаем на кнопку “start” и видим следующее:

I can help you create and manage Telegram bots. If you're new to the Bot API, please see the manual.


You can control me by sending these commands:

/newbot - create a new bot

/mybots - edit your bots

Edit Bots

/setname - change a bot's name

/setdescription - change bot description

/setabouttext - change bot about info

/setuserpic - change bot profile photo

/setcommands - change the list of commands

/deletebot - delete a bot

Bot Settings

/token - generate authorization token

/revoke - revoke bot access token

/setinline - toggle inline mode

/setinlinegeo - toggle inline location requests

/setinlinefeedback - change inline feedback settings

/setjoingroups - can your bot be added to groups?

/setprivacy - toggle privacy mode in groups


Web Apps

/myapps - edit your web apps

/newapp - create a new web app

/listapps - get a list of your web apps

/editapp - edit a web app

/deleteapp - delete an existing web app

Games

/mygames - edit your games

/newgame - create a new game

/listgames - get a list of your games

/editgame - edit a game

/deletegame - delete an existing game

Для создания бота выбираем опцию /newbot - create a new bot, указываем имя и username, который должен заканчиваться на bot. 

На следующее сообщение, которое пришлет BotFather, нужно обратить особенно пристальное внимание. Там содержится HTTP API access token, который будет использоваться в дальнейшем скрипте. Именно этот токен позволяет полностью контролировать бот. С его хранением и передачей стоит быть предельно внимательными.

Уже после создания бота его можно смело модифицировать: добавить описание, аватарку, управление токенами и так далее. 

Затем нужно создать telegram-группу, куда добавляем бот и членов команды, которым важны уведомления. И приступаем к следующему шагу 一 отправляем сообщение следующего вида  @your_bot /start и переходим по ссылке https://api.telegram.org/bot<YourBOTToken>/getUpdates.

В ссылку не забудьте вставить access token вашего бота. В полученном ответе находим графу chat, из которой копируем id и сохраняем его. 

Сам бэкап создается bash-скриптом и раскатывается через ansible. Поэтому в представленном далее коде могут часть встречаться шаблоны jinja2. 

 Следующий шаг 一 модификация скрипта, чтобы тот смог присылать уведомления в группу. Первое, что добавляем 一 ID чата, в который отправляем сообщение и acess token для нашего бота:

  • 1

  • 2

TG_CHAT_ID="{{ gitlab_backup_chat_id }}"

TG_BOT_TOKEN="{{ gitlab_backup_tg_token }}"

Далее 一 функция по отправке сообщений в Telegram:

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

# Send message to telegram function

sendTelegram() {

    local MESSAGE="$1"

    curl -s -X POST "https://api.telegram.org/bot$TG_BOT_TOKEN/sendMessage" \

         -d "chat_id=$TG_CHAT_ID" \

         -d "text=$MESSAGE" > /dev/null

}

Каждую из выполняемых частей скрипта мы сделали с неким условием. Например, с проверкой свободного места на диске:

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

# Check for free disk space

FREE_SPACE=$(df "$BACKUP_DIR" | awk 'NR==2 {print $4}')

if [ "$FREE_SPACE" -lt "$THRESHOLD" ]; then

  log "[ERROR] Not enough free space in $TARGET_DIR. Minimum required: 60 GB. Gitlab backup aborted."

  sendTelegram "[ERROR] Not enough free space in $TARGET_DIR. Minimum required: 60 GB. Gitlab backup aborted."

  exit 1

fi

Показываем создание самого бэкапа:

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

# Create a backup

log "[INFO] Starting GitLab backup creation."

docker exec -t gitlab gitlab-backup create >> "$LOG_FILE" 2>&1

if [ $? -ne 0 ]; then

  log "[ERROR] GitLab backup creation failed."

  sendTelegram "[ERROR] GitLab backup creation failed."

  exit 1

fi

И про загрузку бэкапа в бакет:

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

s3cmd put "$LATEST_BACKUP" s3://$YC_BUCKET/$YC_FOLDER/ >> "$LOG_FILE" 2>&1

if [ $? -ne 0 ]; then

  log "[ERROR] Failed to upload backup to Yandex Cloud bucket $YC_BUCKET."

  sendTelegram "[ERROR] Failed to upload backup to Yandex Cloud bucket $YC_BUCKET."

  exit 1

fi

За счет того, что все создано через условия, можно своевременно получать уведомления о том, что что-то пошло не так буквально на каждом этапе скрипта. 

Например, мы посылаем сообщения о том, что бэкап успешно создался, каждый день, хотя это и не обязательно. А другой вариант 一 настройка сообщений исключительно на ошибки. 

Комментарии (0)