Criando backups de forma simples e enviando para o Telegram ou servidor via SSH


Vamos aprender a criar scripts simples para fazer backups que podem ser úteis no nosso dia dia, vamos enviar eles para um servidor ou no telegram que aceita arquivos de até 2Gb #chupawhatsapp

Criando Bot no telegram

Abra o Telegram e procure por @BotFather.
Inicie a conversa com ele.

– Digite o comando /newbot para iniciar a criação de um novo bot.
– Após o comando você vai dar um nome para seu bot. Ex.: “Bot Legal RR”.
– Em seguida é necessário digitar o nome de usuário para o bot, sendo obrigatório terminar com bot. Ex.: “legallrr_bot”.
– Ao finalizar você receber informações com seu TOKEN, que vamos utilizar em seguida.

Neste exemplo nosso token para acessar a API HTTP ficou:
757396508:AAHpaoyVN-95maOCax1vDPDQBnSaZd9P5r0

Procure pelo seu bot e comece uma conversa com ele e envie uma mensagem de teste para o mesmo, pois vamos precisar descobrir o ID do seu usuário, para que ele possa lhe enviar as mensagens.

Abra em seu seu navegador a seguinte URL https://api.telegram.org/botTOKEN/getUpdates para descobrir o ID do usuário que enviou a mensagem ou de um grupo.
Ex.: https://api.telegram.org/bot757396508:AAHpaoyVN-95maOCax1vDPDQBnSaZd9P5r0/getUpdates

:: Chat privado ::

{"ok":true,"result":[{
	"update_id":649208620,"message":{
		"message_id":2,"from":{"id":221122111,"is_bot":false,"first_name":"Rudimar","last_name":"Remontti","username":"remontti","language_code":"pt-br"},
		"chat":{"id":999999999,"first_name":"Rudimar","last_name":"Remontti","username":"remontti","type":"private"},
		"date":1541210279,"text":"Testando"
	}
}]}

ID do chat privado: 999999999

Se desejar criar um grupo também, basta adicionar seu bot a ele, após adiciona-lo envia uma mensagem como /teste para que possamos coletar o ID do grupo.

:: Chat em Grupo ::

{"ok":true,"result":[{
	"update_id":649208622,"message":{"message_id":4,"from":{
		"id":221122111,"is_bot":false,"first_name":"Rudimar","last_name":"Remontti","username":"remontti","language_code":"pt-br"},
		"chat":{"id":-1000000000000,"title":"Grupo Legal","type":"group","all_members_are_administrators":true
	},"date":1541210975,"text":"/teste","entities":[{"offset":0,"length":6,"type":"bot_command"}
}]}

ID do chat grupo: -1000000000000

Agora que já temos o Token e o ID do chat/grupo vamos ao script de backup. Se ainda estiver com dificuldade no vídeo onde ensino integrar com o zabbix aos 52 min explico como criar o bot.

Não esqueça q para o bot enviar algo para você é necessários iniciar uma conversa com o mesmo.
Antes faça um teste abrindo no seu navegador https://api.telegram.org/botTOKEN/sendMessage?chat_id=ID&text=Mensagem ou diretamente pelo terminal com curl.

# apt install curl 

Ex.: Enviando mensagem para um usuário

# curl --silent -X POST \
 --data-urlencode "chat_id=8888888" \
 --data-urlencode "text=Enviando para usuário" \
 "https://api.telegram.org/bot757396508:AAHpaoyVN-95maOCax1vDPDQBnSaZd9P5r0/sendMessage"

Ex.: Enviando mensagem para um grupo (Não torne o grupo público para sua segurança)

# curl --silent -X POST \
 --data-urlencode "chat_id=-1000000000000" \
 --data-urlencode "text=Enviando para o Grupo" \
 "https://api.telegram.org/bot757396508:AAHpaoyVN-95maOCax1vDPDQBnSaZd9P5r0/sendMessage"

Se as mensagens chegaram estamos preparados para fazer nossos backups com o telegram.


Scripts

Pacotes requeridos:

# apt install curl wget zip unzip

Para ficar algo organizado vou criar uma pasta onde colocarei todos os scripts

# mkdir /etc/backups/

Como normalmente eu uso o telegram mesmo que seja apenas para notificar que um backup foi feto, vou criar uma pasta chamada para fazer toda a configuração do bot nela, criei um novo script com base no código que utilizei no tutorial do Fastnetmon, assim toda vez que for chamar telegram para enviar mensagem ou arquivo basta executa-lo sem sofrimero e varias linhas. Bora prepara-ló!

Preparando o script do telegram (bot)

# wget https://raw.githubusercontent.com/remontti/telegramBotShell/master/telegram -O /bin/telegram
# chmod +x /bin/telegram

Alterando o TOKEN:

# vim /bin/telegram

Altere o TOKEN e o formato da compactação (zip ou tar)
Altere o token:

TOKEN="000000000:0000000000000-0000000000000000000000000000000"

Escolha o metodo de compactação tar/zip

COMPAC='tar'

Como usar?

-m: Para enviar uma mensagem

# telegram -m "-ID Chat" "Mensagem linha 1" "Mensagem linha 2" "Mensagem linha 3"
# telegram -m "ID Usuário" "Mensagem linha 1" "Mensagem linha 2" "Mensagem linha 3"

-f: Para enviar um arquivo

# telegram -f "-100000000" "/diretorio/arquivo" "nome do arquivo compactado" "Comentário"
# telegram -f "12345689" "/var/log/syslog" "syslog" "Logs do sistema"

Faça seu testes! Vale lembrar que toda vez que o script do telegram envia um arquivo ele irá compactar e remover este arquivo do servidor após envio.

Preparando o script para envido do backup via SSH

# apt install sshpass
# wget https://raw.githubusercontent.com/remontti/backupSSH/master/backup -O /bin/backup
# chmod +x /bin/backup

Como usar?
Ex.:

# backup "nome para o arquivo" "diretório ou diretórios a salvar"  "usuário ssh" "senha ssh" "IP Serv" "Porta ssh" "diretorio de destino"
# backup "etc" "/etc/*"  "jose" "123456" "192.168.0.200" "22" "/home/jose/backup"

Backups Telegram


♥ Backup de um diretório

Vamos imaginar que gostaríamos de salvar o diretório /etc/frr/*

# vim /etc/backups/backup_frr_telegram.sh

Adicionaremos apenas o ID usuário ou grupo (lembre-se que grupo sempre tem um “-” antes do ID) ex:

#!/bin/bash
/bin/telegram -f "200000000" "/etc/frr/*" "frr" "Backup FRR"

De permissão para execução:

# chmod +x /etc/backups/backup_frr_telegram.sh

Basta rodar agora o script

# /etc/backups/backup_frr_telegram.sh

Já já vamos ver como adiciona-lo no CRON (Agenda) para tornar isso automático.


♥ Backup de múltiplos diretórios

Vamos imaginar que gostaríamos de salvar todos os diretórios do bind9, para isso basta adicionar todos os diretórios/arquivos entre aspas “/etc/bind/* /usr/share/dns/* /var/cache/bind/*”

# vim /etc/backups/backup_bind_telegram.sh

Altere o ID usuário/grupo (lembre-se que grupo sempre tem um “-” antes do ID) ex:

#!/bin/bash
/bin/telegram -f "200000000" "/etc/bind/* /usr/share/dns/* /var/cache/bind/*" "ns1" "Backup Bind"

De permissão para execução:

# chmod +x /etc/backups/backup_bind_telegram.sh

Basta rodar agora o script

# /etc/backups/backup_bind_telegram.sh

♥ Backup de um banco de dados Mysql/MariaDB

Neste exemplo vamos fazer backup do banco de dados “radius”. Altere as variáveis informando usuário/senha do seu banco de dados bem como nome do banco e ID do telegram.

#!/bin/bash
# Autor: remontti.com.br
# --------------------------------------
# USUARIO  DO BANCO DE DADOS
USER_DB='root'
# SENHA DO BANCO DE DADOS
SENHA_DB='senha'
# NOME DO BANCO DE DADOS
NOME_BANCO='radius'
# NOME PARA O BACKUP
NOME_DO_BKP='Freeradius'
# ID TELEGRAM
ID_TELEGRAM='-123456789000'
# --------------------------------------
DATABKP=`date +%Y-%m-%d`
NOME_BD="/tmp/${NOME_BANCO}.${DATABKP}.tar.gz"
mysqldump -h 127.0.0.1 -u ${USER_DB} -p${SENHA_DB} -B ${NOME_BANCO} > /tmp/${NOME_BANCO}.${DATABKP}.sql 
/bin/telegram -f "${ID_TELEGRAM}" "/tmp/${NOME_BANCO}.${DATABKP}.sql" "${NOME_DO_BKP}" "${NOME_BANCO}" &>/dev/null
rm -f /tmp/*.sql &>/dev/null

♥ Backup de “todos” os banco de dados Mysql/MariaDB

Neste exemplo vamos fazer backup de “todos” os bancos de dados do servidor.
Perceba que o comando:

# ls -d /var/lib/mysql/*/ |cut -d / -f 5

Listará todas as bases, porém o com “grep -v” ignoro alguns bancos que não acho necessário.

# ls -d /var/lib/mysql/*/ |cut -d / -f 5 |grep -v mysql |grep -v performance_schema

Altere as variáveis informando usuário/senha do seu banco de dados bem como ID do telegram.

#!/bin/bash
# Autor: remontti.com.br
# --------------------------------------
# USUARIO  DO BANCO DE DADOS
USER_DB='root'
# SENHA DO BANCO DE DADOS
SENHA_DB='senha'
# NOME PARA O BACKUP
NOME_DO_BKP='ServidorWeb'
# ID TELEGRAM
ID_TELEGRAM='-123456789000'
# --------------------------------------

for BANCO in `ls -d /var/lib/mysql/*/ |cut -d / -f 5 |grep -v mysql |grep -v performance_schema`
do
    DATABKP=`date +%Y-%m-%d`
    NOME_BD="/tmp/${BANCO}.${DATABKP}.tar.gz"
    mysqldump -h 127.0.0.1 -u ${USER_DB} -p${SENHA_DB} -B ${BANCO} > /tmp/${BANCO}.${DATABKP}.sql 
done;
/bin/telegram -f "${ID_TELEGRAM}" "/tmp/*.sql" "${NOME_DO_BKP}" "Backup BDs" 
rm -f /tmp/*.sql &>/dev/null

♥ Backup do Zabbix-Server (Apenas do que interessa)

Para o backup do zabbix utilizo um script do maxhq que faz um dump apenas da parte da base que nos interessa, isso significa que você não terá salvo o historio das “coisa”! Porém realizei um fork do projeto qual fiz alguns ajustes para dar suporte ao zabbix 5.
Vamos baixa-lo em nosso diretório:

# cd /etc/backups/ 
# wget https://raw.githubusercontent.com/remontti/zabbix-backup/master/zabbix-dump
# chmod +x /etc/backups/zabbix-dump

Crie seu script

# vim /etc/backups/backup_zbx.sh
#!/bin/bash
# ----Config ----
ID_TELEGRAM='-123456789000'
# ---------------
/etc/backups/zabbix-dump -o /tmp &>/dev/null
/bin/telegram -f "${ID_TELEGRAM}" "/tmp/zabbix_cfg*.gz" "zabbix" "Backup Bind"
rm -f /tmp/*.gz

Permissões:

# chmod +x /etc/backups/backup_zbx.sh

Execute:

# /etc/backups/backup_zbx.sh

Backups SSH


Neste caso tenho o um servidor que irá receber nossos backups, sendo:

IP: 172.16.0.100 
Porta SSH: 60321
Usuários: jose
Senha: 123456
Diretório onde ficará os backups: /home/jose/backup/

♥ Backup de um diretório

Vamos fazer o mesmo backup que fizemos anterior do “/etc/frr/*”.

# vim /etc/backups/backup_frr_ssh.sh
#!/bin/bash
# /bin/backup "todo_etc" "/etc/*" "jose" "123456" "172.16.0.100" "60321" "/home/jose/backup"

Permissão:

# chmod +x /etc/backups/backup_frr_ssh.sh

Execute:

# /etc/backups/backup_frr_ssh.sh

♥ Backup de múltiplos diretórios

Ex backup DNS bind9

# vim /etc/backups/backup_bind_ssh.sh
#!/bin/bash
# /bin/backup "ns1_dns" "/etc/bind/* /usr/share/dns/* /var/cache/bind/*" "jose" "123456" "172.16.0.100" "60321" "/home/jose/backup"

Permissão:

# chmod +x /etc/backups/backup_bind_ssh.sh

Execute:

# /etc/backups/backup_bind_ssh.sh

♥ Backup de um banco de dados Mysql/MariaDB

# vim /etc/backups/backup_bd_ssh.sh
#!/bin/bash
# Autor: remontti.com.br
# --------------------------------------
# USUARIO  DO BANCO DE DADOS
USER_DB='root'
# SENHA DO BANCO DE DADOS
SENHA_DB='senha'
# NOME DO BANCO DE DADOS
NOME_BANCO='radius'
# NOME PARA O BACKUP
NOME_DO_BKP='Freeradius'
# ID TELEGRAM
ID_TELEGRAM='-123456789000'
#----Servidor que recebe o Backup ------
# Usuários SSH
USER_SSH='jose'
# Senha SSH
PASS_SSH='senha'
# Porta SSH
PORT_SSH='22'
# Diretório onde ira salvar
DIR_SSH='/home/jose/backup'
# IP do servidor 
IP_SSH='172.16.0.100'
# --------------------------------------
DATABKP=`date +%Y-%m-%d`
NOME_BD="/tmp/${NOME_BANCO}.${DATABKP}.tar.gz"
mysqldump -h 127.0.0.1 -u ${USER_DB} -p${SENHA_DB} -B ${NOME_BANCO} > /tmp/${NOME_BANCO}.${DATABKP}.sql 
backup "${NOME_DO_BKP}" "/tmp/${NOME_BANCO}.${DATABKP}.sql" "${USER_SSH}" "${PASS_SSH}" "${IP_SSH}" "${PORT_SSH}" "${DIR_SSH}"
rm -f /tmp/*.sql &>/dev/null

Permissão:

# chmod +x /etc/backups/backup_bd_ssh.sh

Execute:

# /etc/backups/backup_bd_ssh.sh

♥ Backup de “todos” os banco de dados Mysql/MariaDB

# vim /etc/backups/backup_bdall_ssh.sh
#!/bin/bash
# Autor: remontti.com.br
# --------------------------------------
# USUARIO  DO BANCO DE DADOS
USER_DB='root'
# SENHA DO BANCO DE DADOS
SENHA_DB='senha'
# NOME PARA O BACKUP
NOME_DO_BKP='ServidorWeb'
# ID TELEGRAM
ID_TELEGRAM='-123456789000'
#----Servidor que recebe o Backup ------
# Usuários SSH
USER_SSH='jose'
# Senha SSH
PASS_SSH='senha'
# Porta SSH
PORT_SSH='22'
# Diretório onde ira salvar
DIR_SSH='/home/jose/backup'
# IP do servidor 
IP_SSH='172.16.0.100'
# --------------------------------------
 
for BANCO in `ls -d /var/lib/mysql/*/ |cut -d / -f 5 |grep -v mysql |grep -v performance_schema`
do
    DATABKP=`date +%Y-%m-%d`
    NOME_BD="/tmp/${BANCO}.${DATABKP}.tar.gz"
    mysqldump -h 127.0.0.1 -u ${USER_DB} -p${SENHA_DB} -B ${BANCO} > /tmp/${BANCO}.${DATABKP}.sql 
done;
backup "${NOME_DO_BKP}" "/tmp/*.sql" "${USER_SSH}" "${PASS_SSH}" "${IP_SSH}" "${PORT_SSH}" "${DIR_SSH}"
rm -f /tmp/*.sql &>/dev/null

Permissão:

# chmod +x /etc/backups/backup_bdall_ssh.sh

Execute:

# /etc/backups/backup_bdall_ssh.sh

♥ Backup do Zabbix-Server (Apenas do que interessa)

Para o backup do zabbix utilizo um script do maxhq que faz um dump apenas da parte da base que nos interessa, isso significa que você não terá salvo o historio das “coisa”! Porém realizei um fork do projeto qual fiz alguns ajustes para dar suporte ao zabbix 5.
Vamos baixa-lo em nosso diretório:

# cd /etc/backups/ 
# wget https://raw.githubusercontent.com/remontti/zabbix-backup/master/zabbix-dump
chmod +x /etc/backups/zabbix-dump

Crie seu script

# vim /etc/backups/backup_zbx_ssh.sh
#!/bin/bash
# Autor: remontti.com.br
#----Servidor que recebe o Backup ------
# Usuários SSH
USER_SSH='jose'
# Senha SSH
PASS_SSH='senha'
# Porta SSH
PORT_SSH='22'
# Diretório onde ira salvar
DIR_SSH='/home/jose/backup'
# IP do servidor 
IP_SSH='172.16.0.100'
# --------------------------------------
/etc/backups/zabbix-dump  -o /tmp &>/dev/null
backup "zabbix" "/tmp/zabbix_cfg*.gz" "${USER_SSH}" "${PASS_SSH}" "${IP_SSH}" "${PORT_SSH}" "${DIR_SSH}"
rm -f /tmp/*.gz

Permissões:

# chmod +x /etc/backups/backup_zbx_ssh.sh

Execute:

# /etc/backups/backup_zbx_ssh.sh

Bom com base nesses scripts e um pouco de imaginação acredito que você vai conseguir fazer muita coisa, mas como automatizar? Veremos isso agora!

Agendando o backup (Cron)

Vamos agendar nosso(s) scripts para serem feitos em algumas situações:

Execute o comando crontab -e.

# crontab -e

A primeira vez que você rodar o comando será solicitado qual editor você deseja, vou selecionar o nano “1” (ou apenas de Enter) por ser o mais fácil. Vale a leitura também: Agendamento CRON / CRONTAB e CronHowto

Select an editor.  To change later, run 'select-editor'.
  1. /bin/nano        <---- easiest
  2. /usr/bin/vim.basic
  3. /usr/bin/vim.tiny

Choose 1-3 [1]: 1 [ENTER]

Você precisa entender a ordem dos valores interpretado pelo cron:

# m h  dom mon dow   command
# * *  *   *   *     comando
# | |  |   |   |     |_ _ _ _ Comando a ser executado
# | |  |   |   |_ _ _ _ _ _ _ Semana (0-7 - domingo à domingo)
# | |  |   |_ _ _ _ _ _ _ _ _ Mês (01-12)
# | |  |_ _ _ _ _ _ _ _ _ _ _ Dia (01-31)
# | |_ _ _ _ _ _ _ _ _ _ _ _ _Hora (00-23)
# |_ _ _ _ _ _ _ _ _ _ _ _ _ _Minuto (00-59)
Alguns exemplos

Executar um backup todos os dias às 20h e 30min:

30 20  *   *   *     /etc/backups/backup_script.sh

Todo dia primeiro do mês às 00h e 45min:

45 00  1   *   *     /etc/backups/backup_script.sh

Toda segunda-feira às 04h:

00 04  *   1   *     /etc/backups/backup_script.sh

Curtiu o conteúdo? Quer me ajudar? 🙂

Participe do canal no telegram para ficar atualizado sempre que publicar um novo tutorial.

Se quiser fazer uma doação para o café ficarei muito feliz pelo seu reconhecimento!

Se não puder doar pode deixar seu agradecimento nos comentário também ficarei feliz em saber que ajudei. Se tiver qualquer pergunta deixe-a também. Se preferir entrar em Contato clique aqui.

Abraço!

Rudimar Remontti

Trabalho atualmente como Gerente de Redes em um Provedor de Internet no Rio Grande do Sul.

Você pode gostar...

6 Resultados

  1. CLAUDIO CABRAL disse:

    remontti fiz de tudo e sempre dando Erro ao compactar arquivo

  2. Leonardo Paixão disse:

    Boa noite Remontti!

    É possível fazer o backup dos Mikrotiks? Já tentou enviar o backup para Telegram?

  3. Lucas disse:

    Boa tarde, como faria o restore do banco de dados do zabbix a partir do arquivo gerado pelo backup?

  4. Rodrigo disse:

    Boa tarde, no script de backup onde esta “zip ${ARQUIVO} $5 &>/dev/null” e “tar -czpf ${ARQUIVO} $5 &>/dev/null” não seria $2 ?

  1. 24 de agosto de 2020

    […] Não esqueça de colocar o diretório em suas políticas de backups: /var/lib/krill/. Uma dica é o tutorial: Criando backups de forma simples e enviando para o Telegram ou servidor via SSH […]

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *