На одном из проектов, в которых мы участвовали, отсутствовал корпоративный мессенджер. Поэтому было принято решение, что нужно получать уведомления о создании бэкапов 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
За счет того, что все создано через условия, можно своевременно получать уведомления о том, что что-то пошло не так буквально на каждом этапе скрипта.
Например, мы посылаем сообщения о том, что бэкап успешно создался, каждый день, хотя это и не обязательно. А другой вариант 一 настройка сообщений исключительно на ошибки.