rustdrivesync 1.1.1

Production-ready CLI tool for one-way file synchronization with Google Drive. Features: dependency injection, rate limiting, retry with backoff, parallel uploads, and comprehensive documentation.
Documentation
# config.toml - Configuração completa do RustDriveSync
#
# PERFIS DE CONFIGURAÇÃO RECOMENDADOS:
#
# 📄 PERFIL 1: Documentos e Fotos (Arquivos Pequenos)
#    - max_file_size_mb: 100
#    - chunk_size_mb: 5
#    - max_concurrent_uploads: 4-8
#    - max_attempts: 3
#
# 💾 PERFIL 2: Backups Médios (100 MB - 1 GB)
#    - max_file_size_mb: 1024
#    - chunk_size_mb: 16
#    - max_concurrent_uploads: 2-4
#    - max_attempts: 4
#
# 🗄️ PERFIL 3: Backups SQL Grandes (6-8 GB) - CONFIGURAÇÃO ATUAL
#    - max_file_size_mb: 10240 (10 GB)
#    - chunk_size_mb: 32
#    - max_concurrent_uploads: 1-2
#    - max_attempts: 5
#    - max_delay_seconds: 120
#
# 🎥 PERFIL 4: Vídeos e Arquivos Muito Grandes (> 10 GB)
#    - max_file_size_mb: 50000 (50 GB)
#    - chunk_size_mb: 64
#    - max_concurrent_uploads: 1
#    - max_attempts: 7
#    - max_delay_seconds: 180
#
# Este arquivo está configurado para o PERFIL 3 (Backups SQL Grandes)
# Ajuste conforme sua necessidade!

#===============================================================================
# CONFIGURAÇÕES GERAIS
#===============================================================================
[general]
# Nível de log: trace, debug, info, warn, error
log_level = "info"

# Arquivo de log (deixe vazio para apenas stdout)
# log_file = "./logs/rustdrivesync.log"

# Formato do log: "text" ou "json"
log_format = "text"

#===============================================================================
# PASTA DE ORIGEM
#===============================================================================
[source]
# Caminho absoluto da pasta a sincronizar
path = "/home/usuario/documentos"

# Incluir subpastas recursivamente
recursive = true

# Ignorar arquivos ocultos (começam com .)
ignore_hidden = true

# Seguir links simbólicos
follow_symlinks = false

# Padrões de arquivos/pastas a ignorar (glob patterns)
ignore_patterns = [
    # Arquivos temporários
    "*.tmp",
    "*.temp",
    "*.swp",
    "*~",

    # Logs
    "*.log",

    # Build artifacts
    "target/",
    "node_modules/",
    "__pycache__/",
    "*.pyc",
    ".venv/",

    # Version control
    ".git/",
    ".svn/",
    ".hg/",

    # IDE/Editor
    ".idea/",
    ".vscode/",
    "*.sublime-*",

    # OS files
    ".DS_Store",
    "Thumbs.db",
    "desktop.ini",
]

#===============================================================================
# GOOGLE DRIVE
#===============================================================================
[google_drive]
# Arquivo com credenciais OAuth2 (baixado do Google Console)
credentials_file = "./credentials.json"

# Arquivo onde tokens serão salvos
token_file = "./token.json"

# ID da pasta de destino no Google Drive (encontre na URL do Drive)
# Exemplo: https://drive.google.com/drive/folders/1ABC123xyz
target_folder_id = "1ABC123xyz"

# OU nome da pasta (será criada na raiz se não existir)
# target_folder_name = "Backup-Documentos"

# Escopos OAuth2 necessários
scopes = [
    "https://www.googleapis.com/auth/drive.file"
]

#===============================================================================
# SINCRONIZAÇÃO
#===============================================================================
[sync]
# Modo de operação: "once" (única vez) ou "watch" (monitoramento contínuo)
mode = "once"

# Intervalo entre verificações em modo watch (segundos)
interval_seconds = 300

# Como resolver conflitos quando arquivo já existe no Drive
# - "overwrite": substitui o arquivo no Drive
# - "skip": mantém o arquivo do Drive, não faz upload
# - "rename": renomeia o arquivo local antes do upload (arquivo_1.txt)
conflict_resolution = "overwrite"

# Tamanho máximo de arquivo para upload (MB)
# IMPORTANTE: Ajuste conforme seu caso de uso
# - Documentos/Fotos pequenas: 100 (padrão)
# - Backups médios: 1024 (1 GB)
# - Backups SQL grandes: 10240 (10 GB)
# - Vídeos/Arquivos muito grandes: 50000 (50 GB)
# Limite do Google Drive: 5 TB (5.120.000 MB)
max_file_size_mb = 10240

# Tamanho do chunk para upload resumível (MB)
# IMPORTANTE: Chunks maiores = uploads mais rápidos para arquivos grandes
# - Arquivos pequenos (< 100 MB): 5 (padrão)
# - Arquivos médios (100 MB - 1 GB): 16
# - Arquivos grandes (> 1 GB): 32-64
# Recomendação para backups SQL: 32
chunk_size_mb = 32

# Número máximo de uploads simultâneos
# IMPORTANTE: Arquivos grandes consomem mais banda
# - Arquivos pequenos: 4-8 (padrão)
# - Arquivos médios: 2-4
# - Backups grandes (6-8 GB): 1-2 (evita saturar conexão)
max_concurrent_uploads = 2

# Verificar integridade após upload (compara MD5)
verify_upload = true

# Manter estrutura de pastas no destino
# - true: preserva hierarquia de diretórios local no Google Drive
#   Exemplo: projeto/src/main.rs → RustDriveSync/projeto/src/main.rs
# - false: todos os arquivos ficam na pasta raiz
#   Exemplo: projeto/src/main.rs → RustDriveSync/main.rs
preserve_folder_structure = true

# Deletar arquivos no Drive quando deletados localmente
# CUIDADO: pode causar perda de dados!
delete_remote_on_local_delete = false

#===============================================================================
# RETRY E RESILIÊNCIA
#===============================================================================
[retry]
# Número máximo de tentativas por arquivo
# IMPORTANTE: Arquivos grandes têm mais chance de timeout
# - Arquivos pequenos: 3 (padrão)
# - Backups grandes: 5-7 (recomendado)
max_attempts = 5

# Delay inicial entre tentativas (segundos)
# IMPORTANTE: Dar mais tempo para recuperação em arquivos grandes
initial_delay_seconds = 2

# Fator de multiplicação do delay (exponential backoff)
# 2.0 = dobra o delay a cada tentativa (2s → 4s → 8s → 16s → 32s)
backoff_multiplier = 2.0

# Delay máximo entre tentativas (segundos)
# IMPORTANTE: Aumentar para arquivos grandes (permite mais tempo de recuperação)
# - Arquivos pequenos: 60
# - Backups grandes: 120-180
max_delay_seconds = 120

#===============================================================================
# NOTIFICAÇÕES (Opcional)
#===============================================================================
[notifications]
# Habilitar notificações
enabled = false

# Notificar quando sync completar com sucesso
on_complete = true

# Notificar em caso de erro
on_error = true

# Tipo de notificação: "desktop" ou "webhook"
notification_type = "desktop"

# URL do webhook (se type = "webhook")
# webhook_url = "https://hooks.slack.com/services/..."

#===============================================================================
# ESTADO E CACHE
#===============================================================================
[state]
# Arquivo de estado (rastreia arquivos sincronizados)
state_file = "./state.json"

# Salvar estado a cada N arquivos sincronizados
save_interval = 10

# Limpar estado de arquivos deletados após N dias
cleanup_after_days = 30