Last active
February 22, 2025 18:18
-
-
Save vinicius73/ed09c822ff87516814ab6a5f462b01fe to your computer and use it in GitHub Desktop.
dockge rclone script
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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