import os
import shutil
import datetime
import time
import sys
import logging
# --- CONFIGURAÇÕES ---
# Altere os caminhos conforme sua instalação
MINECRAFT_SERVER_WORLD_DIR = "/path/to/your/minecraft/server/world"
BACKUP_DESTINATION_DIR = "/path/to/your/backup/folder"
# Intervalo entre backups (segundos)
BACKUP_INTERVAL_SECONDS = 3600 # 1 hora
# Quantos dias manter backups antigos
DAYS_TO_KEEP_BACKUPS = 7
# ----------------------
# Configuração de logging em arquivo e console
[Link](
level=[Link],
format="%(asctime)s [%(levelname)s] %(message)s",
handlers=[
[Link]("minecraft_backup.log"),
[Link]([Link])
]
)
def create_backup(source_dir: str, backup_dir: str) -> bool:
"""
Cria um backup zip do diretório `source_dir` em `backup_dir`, retornando True
se bem-sucedido.
"""
if not [Link](source_dir):
[Link](f"Diretório de origem não encontrado: {source_dir}")
return False
[Link](backup_dir, exist_ok=True)
timestamp = [Link]().strftime("%Y%m%d_%H%M%S")
# Inclui nome da pasta de origem no nome do backup
world_name = [Link]([Link](source_dir))
backup_name = f"{world_name}_backup_{timestamp}"
backup_path = [Link](backup_dir, backup_name)
try:
shutil.make_archive(backup_path, 'zip', source_dir)
[Link](f"Backup criado: {backup_path}.zip")
return True
except Exception as e:
[Link](f"Erro ao criar backup: {e}")
return False
def clean_old_backups(backup_dir: str, days_to_keep: int) -> None:
"""
Remove arquivos .zip de backup com mais de `days_to_keep` dias em `backup_dir`.
"""
if not [Link](backup_dir):
[Link](f"Diretório de backup não encontrado: {backup_dir}")
return
cutoff = [Link]() - [Link](days=days_to_keep)
for fname in [Link](backup_dir):
fpath = [Link](backup_dir, fname)
if [Link](fpath) and [Link]("") and
[Link](".zip"):
try:
created = [Link]([Link](fpath))
if created < cutoff:
[Link](fpath)
[Link](f"Removido backup antigo: {fname}")
except Exception as e:
[Link](f"Erro ao remover {fname}: {e}")
def main():
# Validação das configurações iniciais
if not [Link](MINECRAFT_SERVER_WORLD_DIR):
[Link](f"Diretório do mundo inexistente:
{MINECRAFT_SERVER_WORLD_DIR}")
[Link](1)
if not [Link](BACKUP_DESTINATION_DIR):
[Link](f"Criando pasta de destino: {BACKUP_DESTINATION_DIR}")
try:
[Link](BACKUP_DESTINATION_DIR, exist_ok=True)
except Exception as e:
[Link](f"Falha ao criar destino: {e}")
[Link](1)
[Link]("--- Serviço de Backup Minecraft Iniciado ---")
[Link](f"Mundo: {MINECRAFT_SERVER_WORLD_DIR}")
[Link](f"Destino: {BACKUP_DESTINATION_DIR}")
[Link](f"Intervalo: {BACKUP_INTERVAL_SECONDS}s")
[Link](f"Retenção: {DAYS_TO_KEEP_BACKUPS} dias")
try:
while True:
[Link]("Iniciando ciclo de backup...")
if create_backup(MINECRAFT_SERVER_WORLD_DIR, BACKUP_DESTINATION_DIR):
clean_old_backups(BACKUP_DESTINATION_DIR, DAYS_TO_KEEP_BACKUPS)
else:
[Link]("Backup falhou neste ciclo.")
[Link](f"Próximo em {BACKUP_INTERVAL_SECONDS} segundos.")
[Link](BACKUP_INTERVAL_SECONDS)
except KeyboardInterrupt:
[Link]("Serviço de backup interrompido pelo usuário.")
except Exception as e:
[Link](f"Erro inesperado: {e}")
finally:
[Link]("Encerrando serviço de backup.")
if __name__ == "__main__":
main()