Pular para conteúdo

Backup e Restore — Google Drive

Backup automático diário do banco de dados e configuração para o Google Drive usando rclone.

Visão Geral

Item Valor
Ferramenta rclone v1.73.0
Destino Google Drive (pasta compartilhada)
Frequência Diário às 19h
Retenção 30 dias
O que é salvo Dump do PostgreSQL + .env

Instalação do rclone

O rclone está instalado localmente (sem sudo) no servidor:

# Já instalado em:
~/bin/rclone

# Verificar versão
~/bin/rclone version

Instalar do zero (se necessário)

mkdir -p ~/bin
curl -O https://downloads.rclone.org/rclone-current-linux-amd64.zip
unzip rclone-current-linux-amd64.zip
cp rclone-*-linux-amd64/rclone ~/bin/
chmod +x ~/bin/rclone
rm -rf rclone-*-linux-amd64*

# Adicionar ao PATH (se não estiver)
echo 'export PATH="$HOME/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc

Configurar Google Drive

O servidor laser-estoque tem desktop com browser, então a autenticação pode ser feita diretamente nele. Se preferir, também pode gerar o token no notebook e colar no servidor.

Passo 1 — Gerar token (se configurando do zero)

No servidor laser-estoque (tem desktop/browser) ou no notebook de desenvolvimento:

# Instalar rclone localmente se não tiver
# macOS: brew install rclone
# Linux: curl https://rclone.org/install.sh | sudo bash

# Gerar token de autorização
rclone authorize "drive"
  1. O browser abre automaticamente
  2. Faça login com a conta Google que tem acesso à pasta compartilhada
  3. Autorize o rclone
  4. Copie o token JSON que aparece no terminal (bloco entre {...})

Passo 2 — Configurar remote no servidor

ssh laser@100.88.89.90

~/bin/rclone config

Responda:

n                          # New remote
gdrive                     # Nome
drive                      # Storage type (Google Drive)
<Enter>                    # client_id (vazio)
<Enter>                    # client_secret (vazio)
1                          # scope: Full access
<Enter>                    # service_account_file (vazio)
n                          # Edit advanced config? No
n                          # Use auto config? No (headless)
<colar o token do Passo 1>
n                          # Configure as team drive? No
y                          # Confirm
q                          # Quit config

Verificar conexão

~/bin/rclone lsd gdrive:

Deve listar as pastas do Google Drive. Para listar uma pasta específica:

~/bin/rclone ls gdrive:LASERLAB-Sis/Backups/

Script de Backup

Criar o script em /opt/laserlab/backup.sh:

#!/bin/bash
# ===========================================
# LASERLAB-Sis — Backup diário
# Faz dump do PostgreSQL + copia .env
# Upload para Google Drive com retenção 30 dias
# ===========================================

set -euo pipefail

# --- Configuração ---
DEPLOY_DIR="/opt/laserlab"
RCLONE="$HOME/bin/rclone"
REMOTE="gdrive:LASERLAB-Sis/Backups"
RETENTION_DAYS=30
DATE=$(date +%Y-%m-%d_%H%M)
BACKUP_DIR="/tmp/laserlab-backup-$DATE"
LOG_FILE="/opt/laserlab/backup.log"

# --- Funções ---
log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG_FILE"; }

cleanup() { rm -rf "$BACKUP_DIR"; }
trap cleanup EXIT

# --- Início ---
log "=== Backup iniciado ==="
mkdir -p "$BACKUP_DIR"

# 1. Dump do PostgreSQL
log "Fazendo dump do banco de dados..."
docker exec laserlab_db pg_dump \
    -U "${POSTGRES_USER:-laserlab}" \
    -d "${POSTGRES_DB:-laserlab}" \
    --format=custom \
    --compress=9 \
    > "$BACKUP_DIR/laserlab-$DATE.dump"

log "Dump criado: $(du -h "$BACKUP_DIR/laserlab-$DATE.dump" | cut -f1)"

# 2. Copiar .env
log "Copiando .env..."
cp "$DEPLOY_DIR/.env" "$BACKUP_DIR/env-$DATE.txt"

# 3. Upload para Google Drive
log "Enviando para Google Drive..."
$RCLONE copy "$BACKUP_DIR" "$REMOTE/" --log-file="$LOG_FILE" --log-level INFO

log "Upload concluído."

# 4. Limpar backups antigos (> 30 dias)
log "Removendo backups com mais de $RETENTION_DAYS dias..."
$RCLONE delete "$REMOTE/" \
    --min-age "${RETENTION_DAYS}d" \
    --log-file="$LOG_FILE" \
    --log-level INFO

log "=== Backup finalizado com sucesso ==="

Tornar executável:

chmod +x /opt/laserlab/backup.sh

Testar manualmente

cd /opt/laserlab
source .env  # carrega variáveis POSTGRES_USER, POSTGRES_DB
bash backup.sh

Verificar no Google Drive se os arquivos chegaram:

~/bin/rclone ls gdrive:LASERLAB-Sis/Backups/

Crontab

Agendar execução diária às 19h:

crontab -e

Adicionar a linha:

0 19 * * * cd /opt/laserlab && source .env && /opt/laserlab/backup.sh >> /opt/laserlab/backup.log 2>&1

Verificar:

crontab -l

Restore

Restore completo do banco

# 1. Baixar o dump do Google Drive
~/bin/rclone copy "gdrive:LASERLAB-Sis/Backups/laserlab-2026-02-09_1900.dump" /tmp/

# 2. Parar o container web (evitar conexões ativas)
cd /opt/laserlab
docker compose -f docker-compose.prod.yml stop web nginx

# 3. Restaurar o dump
docker exec -i laserlab_db pg_restore \
    -U laserlab \
    -d laserlab \
    --clean \
    --if-exists \
    --no-owner \
    < /tmp/laserlab-2026-02-09_1900.dump

# 4. Reiniciar tudo
docker compose -f docker-compose.prod.yml up -d

Restore do .env

~/bin/rclone copy "gdrive:LASERLAB-Sis/Backups/env-2026-02-09_1900.txt" /tmp/
cp /tmp/env-2026-02-09_1900.txt /opt/laserlab/.env

Listar backups disponíveis

~/bin/rclone ls "gdrive:LASERLAB-Sis/Backups/" | sort

Troubleshooting

rclone: token expirado

O token do Google Drive expira periodicamente. Reautorizar:

# No computador com browser:
rclone authorize "drive"
# Copiar o novo token

# No servidor:
~/bin/rclone config update gdrive token '<novo_token_json>'

pg_dump falha: "connection refused"

O container laserlab_db não está rodando:

docker compose -f docker-compose.prod.yml up -d db
sleep 5
bash backup.sh

Backup log

Verificar o log em /opt/laserlab/backup.log.