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"
- O browser abre automaticamente
- Faça login com a conta Google que tem acesso à pasta compartilhada
- Autorize o rclone
- 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.