commit 9e5a161d8e9819e41567ba2ea92c95922f696ef0 Author: Marco Costa Date: Thu Sep 17 20:44:26 2026 -0300 feat: add automatic backup script Add backup automation script with environment configuration files (.env, .env.example) and accompanying documentation. diff --git a/.env b/.env new file mode 100644 index 0000000..4393e8c --- /dev/null +++ b/.env @@ -0,0 +1,11 @@ +# ── Banco de Dados MariaDB ────────────────────────────────── +MYSQL_USER="root" +MYSQL_PASS="##njKt45?6byxZJtbl$$" + +# ── SFTP Remoto ───────────────────────────────────────────── +SFTP_HOST="170.231.184.32" +SFTP_USER="marco" +SFTP_PASS="$$Mega88ax$$" +SFTP_DIR="/home/marco/backups" + + diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..ee31055 --- /dev/null +++ b/.env.example @@ -0,0 +1,8 @@ +# ── Banco de Dados MariaDB ────────────────────────────────── +MYSQL_USER="root" +MYSQL_PASS="coloque_a_senha_aqui" + +# ── SFTP Remoto ───────────────────────────────────────────── +SFTP_HOST="170.231.184.32" +SFTP_USER="marco" +SFTP_DIR="/home/marco/backups" diff --git a/BackupAutomatico.txt b/BackupAutomatico.txt new file mode 100644 index 0000000..59ac5fe --- /dev/null +++ b/BackupAutomatico.txt @@ -0,0 +1,18 @@ +BackupAutomatico +================ + +09/2026 + +Servidores Debian 12 + + +Rodar no servidor que tem o backup: + +Comando para gerar key: + +ssh-keygen -t ed25519 -N "" -f ~/.ssh/id_ed25519 +ssh-copy-id -i ~/.ssh/id_ed25519.pub marco@170.231.184.32 + +Para testar: + +ssh -i ~/.ssh/id_ed25519 marco@170.231.184.32 "echo CONEXÃO OK" \ No newline at end of file diff --git a/backup_automatico.sh b/backup_automatico.sh new file mode 100755 index 0000000..80c67cc --- /dev/null +++ b/backup_automatico.sh @@ -0,0 +1,151 @@ +#!/usr/bin/env bash +set -euo pipefail +IFS=$'\n\t' + +# ══════════════════════════════════════════════════════════════ +# backup_automatico.sh — Backup automatizado do servidor +# ══════════════════════════════════════════════════════════════ + +# ── Carrega .env se existir ────────────────────────────────── +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +[ -f "$SCRIPT_DIR/.env" ] && set -a && source "$SCRIPT_DIR/.env" && set +a + +# ── Configuração ───────────────────────────────────────────── +MYSQL_USER="${MYSQL_USER:-root}" +MYSQL_PASS="${MYSQL_PASS:-}" +MYSQLDUMP="/usr/bin/mysqldump" + +SFTP_HOST="${SFTP_HOST:-}" +SFTP_USER="${SFTP_USER:-}" +SFTP_DIR="${SFTP_DIR:-}" + +DIRS_TO_BACKUP=( + "/var/www" + "/etc/nginx/sites-available" + "/opt" +) + +LOG_FILE="/var/log/backup_server.log" +LOCAL_RETENTION="${LOCAL_RETENTION:-3}" + +# ── Validações ─────────────────────────────────────────────── +if [[ $EUID -ne 0 ]]; then + echo "ERRO: execute como root (sudo)." >&2 + exit 1 +fi + +if [ -z "$MYSQL_PASS" ]; then + echo "ERRO: MYSQL_PASS nao definida. Defina no arquivo .env." >&2 + exit 1 +fi + +if [ -z "$SFTP_HOST" ] || [ -z "$SFTP_USER" ] || [ -z "$SFTP_DIR" ]; then + echo "ERRO: SFTP_HOST, SFTP_USER e SFTP_DIR devem estar definidas no .env." >&2 + exit 1 +fi + +if [ ! -x "$MYSQLDUMP" ]; then + echo "ERRO: mysqldump nao encontrado. Instale: apt-get install mariadb-client" >&2 + exit 1 +fi + +# ── Log (fallback para /tmp) ───────────────────────────────── +mkdir -p "$(dirname "$LOG_FILE")" 2>/dev/null || LOG_FILE="/tmp/backup_server.log" +touch "$LOG_FILE" 2>/dev/null || { LOG_FILE="/tmp/backup_server.log"; touch "$LOG_FILE"; } +log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"; } + +# ── Timestamp e dirs temporarios ───────────────────────────── +TIMESTAMP=$(date +"%Y%m%d_%H%M%S") +BACKUP_NAME="backup_server217_${TIMESTAMP}" +TMP_DIR="/tmp/${BACKUP_NAME}" +ARCHIVE="/tmp/${BACKUP_NAME}.tar.gz" +cleanup() { rm -rf "$TMP_DIR"; } +trap cleanup EXIT + +# ── Espaco em disco ────────────────────────────────────────── +AVAILABLE_MB=$(df --output=avail /tmp | tail -n1) +[ "$AVAILABLE_MB" -lt 2048 ] && { echo "ERRO: espaco insuficiente (${AVAILABLE_MB}MB)." >&2; exit 1; } + +log "Iniciando backup: $BACKUP_NAME" + +# ── PASSO 1 — Bancos de dados ──────────────────────────────── +log "PASSO 1 — Dump dos bancos MariaDB..." + +MYSQL_CNF="/tmp/.${BACKUP_NAME}_my.cnf" +cat > "$MYSQL_CNF" </dev/null \ + | grep -Ev "Database|information_schema|performance_schema|sys") + +DB_COUNT=0 +for DB in $DATABASES; do + "$MYSQLDUMP" --defaults-extra-file="$MYSQL_CNF" --single-transaction --routines --triggers --events \ + "$DB" > "${TMP_DIR}/databases/${DB}.sql" 2>/dev/null && { + log " OK: banco '$DB'" + DB_COUNT=$((DB_COUNT + 1)) + } || { + log " ERRO: falha no dump de '$DB'" + } +done + +log " Total de bancos exportados: $DB_COUNT" +rm -f "$MYSQL_CNF" + +# ── PASSO 2 — Diretorios ───────────────────────────────────── +log "PASSO 2 — Copiando diretorios..." + +for DIR in "${DIRS_TO_BACKUP[@]}"; do + [ -d "$DIR" ] || { log " PULANDO (nao existe): $DIR"; continue; } + cp -a "$DIR" "${TMP_DIR}/" 2>/dev/null || log " ERRO: falha ao copiar '$DIR'" +done + +# ── PASSO 3 — Compactacao ──────────────────────────────────── +log "PASSO 3 — Compactando em .tar.gz..." + +tar czpf "$ARCHIVE" -C "$TMP_DIR" . 2>/dev/null || { + log "ERRO: falha ao compactar." + exit 1 +} + +SIZE=$(du -h "$ARCHIVE" | cut -f1) +log " Arquivo criado: ${BACKUP_NAME}.tar.gz (${SIZE})" + +# ── PASSO 4 — Envio SFTP ───────────────────────────────────── +log "PASSO 4 — Enviando para ${SFTP_HOST}..." + +REMOTE_PATH="${SFTP_DIR}/${BACKUP_NAME}.tar.gz" + +SSH_OPTS=(-o ConnectTimeout=30 -o StrictHostKeyChecking=accept-new) + +ssh "${SSH_OPTS[@]}" "${SFTP_USER}@${SFTP_HOST}" "mkdir -p '${SFTP_DIR}' && chmod 755 '${SFTP_DIR}'" 2>/dev/null || { + log "ERRO: falha ao criar pasta remota ${SFTP_DIR}." + exit 1 +} + +sftp "${SSH_OPTS[@]}" -b - "${SFTP_USER}@${SFTP_HOST}" <<< "put $ARCHIVE $REMOTE_PATH" > /dev/null 2>&1 || { + log "ERRO: falha no envio SFTP." + exit 1 +} + +log " Enviado com sucesso para: sftp://${SFTP_USER}@${SFTP_HOST}${REMOTE_PATH}" + +# ── PASSO 5 — Limpeza local ────────────────────────────────── +rm -f "$ARCHIVE" +log " Arquivo local removido." + +if [ "$LOCAL_RETENTION" -gt 0 ]; then + cd /tmp + ls -1t backup_server217_*.tar.gz 2>/dev/null | tail -n +$((LOCAL_RETENTION + 1)) | while read -r f; do + log " Removendo backup antigo: $f" + rm -f "$f" + done +fi + +log "Backup finalizado com sucesso."