Skip to content

Instantly share code, notes, and snippets.

@vinicius73
Last active February 22, 2025 18:18
Show Gist options
  • Save vinicius73/ed09c822ff87516814ab6a5f462b01fe to your computer and use it in GitHub Desktop.
Save vinicius73/ed09c822ff87516814ab6a5f462b01fe to your computer and use it in GitHub Desktop.
dockge rclone script
#!/bin/bash
# Para o script se qualquer comando falhar
set -e
# Caminho para o arquivo de log
readonly LOG_FILE="/var/log/dockge_backup.log"
# Variáveis de configuração (somente leitura para evitar alterações acidentais)
readonly TMP_DIR="/tmp/rclone/dockge" # Diretório temporário para backup local
readonly BASE_DOCKGE_DIR="/path/to/dockge" # Diretório base do Dockge
readonly BACKUP_DIR="$BASE_DOCKGE_DIR/.backups" # Diretório para armazenar backups
readonly ZIP_FILE="$BACKUP_DIR/dockge-$(date +%Y%m%d-%H%M%S).tar.gz" # Nome do arquivo ZIP com timestamp
readonly DAYS_TO_KEEP=15 # Número de dias para manter backups antigos
# Destinos remotos para sincronização
readonly REMOTE_TARGETS=(
"proton:/rclone/dockge"
"dropbox:rclone/dockge"
)
# Função para registrar mensagens no log e na saída padrão
log() {
local message="$1"
echo "$(date '+%Y-%m-%d %H:%M:%S') - $message" | tee -a "$LOG_FILE"
}
# Verifica se as dependências estão instaladas
check_dependencies() {
for cmd in rclone tar filen; do
if ! command -v "$cmd" &> /dev/null; then
log "Erro: $cmd não está instalado."
exit 1
fi
done
}
# Cria os diretórios necessários
create_directories() {
log "Criando diretórios necessários"
mkdir -p "$TMP_DIR" || { log "Erro ao criar $TMP_DIR"; exit 1; }
mkdir -p "$BACKUP_DIR" || { log "Erro ao criar $BACKUP_DIR"; exit 1; }
}
# Cria um backup local usando rclone sync para maior eficiência
create_local_backup() {
log "💾 Criando backup local"
rclone sync "$BASE_DOCKGE_DIR" "$TMP_DIR" \
--exclude="**/dockge-*.gz" \
--exclude="*.log" \
--exclude="*ipc-socket*" \
--exclude="**/qBittorrent/BT_backup/**" \
--exclude="*.log.bak*" \
--exclude="**/cache/**" \
--exclude="**/.cache/**" \
--exclude="stacks/jellyfin/config/**" \
--exclude="stacks/homarr/appdata/redis/**" \
--checksum \
--update \
--fast-list \
-P -v >> "$LOG_FILE" 2>&1 || { log "Erro ao criar backup local"; exit 1; }
}
# Função para listar backups no disco com detalhes e resumo
list_backups() {
log "📋 Listando backups no disco"
if [ -d "$BACKUP_DIR" ]; then
local backup_files=("$BACKUP_DIR"/*.tar.gz)
if [ ${#backup_files[@]} -gt 0 ] && [ -e "${backup_files[0]}" ]; then
log "Backups encontrados:"
for file in "${backup_files[@]}"; do
local size=$(du -h "$file" | cut -f1)
log " - $(basename "$file") : $size"
done
local num_backups=${#backup_files[@]}
local total_size=$(du -sh "$BACKUP_DIR" | cut -f1)
log "Total de backups: $num_backups"
log "Espaço total ocupado pelo diretório de backups: $total_size"
else
log "Nenhum backup encontrado em $BACKUP_DIR"
fi
else
log "Diretório de backups não encontrado: $BACKUP_DIR"
fi
}
# Deleta backups antigos
delete_old_backups() {
log "🗑️ Deletando backups antigos (mais de $DAYS_TO_KEEP dias)"
find "$BACKUP_DIR" -type f -mtime "+$DAYS_TO_KEEP" -exec rm -fv {} \; >> "$LOG_FILE" 2>&1
}
# Cria um arquivo zipado do backup
build_zipped_archive() {
log "🗜️ Criando arquivo zipado $ZIP_FILE"
tar -czf "$ZIP_FILE" --checkpoint=.100 -C /tmp/rclone dockge >> "$LOG_FILE" 2>&1 || { log "Erro ao criar $ZIP_FILE"; exit 1; }
log "✅ $ZIP_FILE criado"
ls -lh "$BACKUP_DIR" >> "$LOG_FILE" 2>&1
}
# Sincroniza com o Filen Cloud
sync_to_filen_cloud() {
log "⏩ Enviando para Filen Cloud"
if ! filen sync "${BACKUP_DIR}:localToCloud:/dockge/backups" >> "$LOG_FILE" 2>&1; then
log "⚠️ Falha ao sincronizar com Filen Cloud"
else
log "✅ Sincronizado com Filen Cloud"
fi
}
# Sincroniza com destinos remotos
sync_to_remote_targets() {
log "⏩ Sincronizando com destinos remotos"
for target in "${REMOTE_TARGETS[@]}"; do
rclone sync "$BASE_DOCKGE_DIR" "$target" \
--exclude="*.log" \
--exclude="*ipc-socket*" \
--exclude="**/qBittorrent/BT_backup/**" \
--exclude="*.log.bak*" \
--exclude="**/cache/**" \
--exclude="**/.cache/**" \
--exclude="**/.flatnotes/**" \
--exclude="stacks/jellyfin/config/**" \
--exclude="stacks/homarr/appdata/redis/**" \
--checksum \
--update \
--fast-list \
-P -v >> "$LOG_FILE" 2>&1 || { log "Erro ao sincronizar com $target"; exit 1; }
log "✅ Sincronizado com $target"
done
}
# Função principal
main() {
log "⚙️ Iniciando execução do script em $(date)"
start_time=$SECONDS
check_dependencies
create_directories
create_local_backup
delete_old_backups
build_zipped_archive
list_backups
sync_to_filen_cloud
sync_to_remote_targets
elapsed_time=$((SECONDS - start_time))
log "⏳ Tempo total gasto: $elapsed_time segundos"
log "✅ Concluído"
log "💡 Para revisar o log, execute: cat $LOG_FILE"
log "🔍 Para listar backups, execute: ls -lh $BACKUP_DIR"
log "🔥 Para limpar backups antigos, execute: find $BACKUP_DIR -type f -mtime +$DAYS_TO_KEEP -exec rm -fv {} \;"
}
# Executa a função principal
main "$@"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment