Backup Servidor Minecraft Fabric

Você cria um servidor de Minecraft pra você e seus amigos, vocês passam longas horas se dedicando ao jogo, meu servidor com meus amigos foi criado há mais de 4 anos, desde o começo eu fazia backups ocasionais do servidor.

Em um dado momento, o servidor que rodava no meu desktop sofreu uma queda de energia e corrompeu o mundo, eu tinha o backup do servidor, porém o último backup era de vários dias atrás, foi uma grande perda, pois todos nós estavamos empenhados naquela semana e parte do que construimos foi perdido.

Backup local

Hoje meu servidor roda com o modloader Fabric, a intenção de usar Fabric para um servidor vanila é colocar mods que melhoram a performance do jogo e, principalmente, mod de backup automático.

De todas as opções de mods que encotrei, o Textile Backup foi de longe o mais completo, então o escolhi para essa tarefa.

A instalação do Textile Backup requer 2 mods extras, são eles:

Basta ir nos links (ou pesquisa-los no modrinth) e procurar os arquivos para Fabric na versão correspondente do seu servidor.

Com os arquivos baixados, basta copia-los para a pasta mods no seu servidor. Minha pasta de mods ficou assim, com os 3 mods:

cloth-config-15.0.140-fabric.jar
fabric-api-0.102.0+1.21.jar
textile_backup-3.1.3-1.21.jar

Agora inicio o servidor, para que o Textile Backup crie o seu arquivo de configuração, logo quando o servidor terminar de iniciar, fecho o servidor, para que eu possa editar como o Textile Backup fará os backups.

O arquivo de configuração do Textile Backup fica localizado em confis/textile_backup.json5.

O arquivo é um JSON com comentários, segue a minha configuração:

Eu alterei algumas configurações para a minha preferência, são elas:

  • perWorldBackup: Prefiro 1 arquivo de backup contendo os dados de todos os mundos.
  • backupInterval: 3600 segundos, ou seja, um backup será feito automaticamente de hora em hora.
  • doBackupsOnEmptyServer: Desativo essa opção para não fazer backups demasiadamente, se alguém entrou no servidor, os backups serão feito de hora em hora, quando o último jogador sair, será feito mais um backup de hora em hora e não será feito mais backups até que um jogador entre no jogo novamente.
  • shutdownBackup: Não quero que um backup seja iniciado toda vez que eu fechar o servidor.
  • path: A pasta onde ficará os arquivos de backup, eu gosto de deixa-la em plural, "backups".
  • backupsToKeep: Manter somente os 10 últimos backups pra mim é um bom equilibrio entre segurança e espaço em disco.
  • format: "GZIP" é um formato conhecido e funciona melhor com o multithread na versão que estou usando do mod.
  • dateTimeFormat: Mudo só os traços para deixar do jeito que pra mim é mais fácil de identificar.
{
	"perWorldBackup": false,
	"backupInterval": 3600,
	"restoreDelay": 0,
	"doBackupsOnEmptyServer": false,
	"shutdownBackup": false,
	"backupOldWorlds": true,
	"path": "backups/",
	"fileBlacklist": [],
	"deleteOldBackupAfterRestore": false,
	"backupsToKeep": 10,
	"maxAge": 0,
	"maxSize": 0,
	"compression": 9,
	"compressionCoreCountLimit": 0,
	"format": "GZIP",
	"permissionLevel": 4,
	"alwaysSingleplayerAllowed": false,
	"playerWhitelist": [],
	"playerBlacklist": [],
	"broadcastBackupStart": true,
	"broadcastBackupDone": true,
	"dateTimeFormat": "yyyy-MM-dd-HH-mm-ss",
	"integrityVerificationMode": "STRICT"
}

configs/textile_backup.json5

Após salvar o arquivos de configuração do Textile Backup, posso iniciar o servidor e os backups automáticos serão feitos localmente e salvos na pasta backups.

Backup para o OneDrive

Amigos meus pagaram uma host de Minecraft e faziam o backup local do mundo com certa frequência, em algum momento aconteceu uma falha no pagamento da host que acabou resultando na perda do servidor e todos os seus arquivos, incluindo os backups locais que eles tinham.

Para que isso nunca ocorra procuro sempre automatizar o envio dos backups para o OneDrive (OneDrive é a melhor opção pra mim, pois já pago por mais espaço e uso pra tudo)

Textile Backup é o mod mais completo que encontrei, porém nem ele tem uma implementação para enviar os backups para a alguma núvem, incluindo o OneDrive.

Minha primeira tentativa de fazer essa automação foi um script em Python que rodava agendado em uma Github Action e enviava os arquivos para o Google Drive, usando a API do Pterodactyl, painel que a host utilizava. Se tiver interesse vc pode conferir a Action e o código aqui.

Não ficou uma implementação muito bonita além de usar as horas gratuitas de Actions que eu tenho. Ao procurar um jeito melhor de fazer essa automação, decidi utilizar um serviço que tenho self hosted, o n8n, com ele posso criar vários tipos de automações e integrações com infinitos serviços, incluindo OneDrive.

Para gerenciar meu servidor de Minecraft, eu uso o MCSManager, ele, assim como praticamente qualquer outro painel de gestão de Minecraft, possui uma API que posso utilizar para obter os arquivos do meu servidor por uma automação qualquer.

API do MCSManager

Para me comunicar com o a API do MCSManager, preciso antes ter uma chave de acesso, para conseguir essa chave de acesso entro no MCSManager e clico no botão de perfil no topo direito da tela, a chave de acesso fica no final da modal de perfil.

Tela da chave acesso da API do MCSManager

Com a chave de acesso, posso fazer requisições para o MCSManager e obter informações sobre o servidor de Minecraft.

Para fazer a listagem de arquivos do servidor de Minecraft, preciso saber alguns identificadores, no caso do MCSManager preciso saber o ID da máquina onde o servidor está e o ID do servidor de Minecraft, o jeito mais simples de conseguir essas informações é abrindo a tela de terminal do servidor, aquela onde posso clicar para iniciar/para o servidor. O URL dessa página se parece com isso:

http://<host_do_painel>/#/instances/terminal?daemonId=<id_da_maquina>&instanceId=<id_do_servidor>

Repare que na URL tem daemonId e instanceId, daemonId é o ID da máquina onde se encontra o servidor e instanceId é o ID do servidor de Minecraft.

Com essas três informações podemos fazer todas as requisições que precisaremos para fazer automação.

Listagem dos backups

A primeria coisa que precisamos saber para a automação é a lista dos backups existentes localmente no servidor, para fazer isso podemos fazer a sequinte requeste para a API do MCSManager: (Usei o Insomnia para facilitar o entendimento)

Requisição no Insomnia para listagem de backups locais

Obter os arquivos locais

Agora que sei quais arquivos de backup existem, comparo com os backups no OneDrive e vejo que tem um arquivo de backup local novo que ainda não existe no OneDrive, então preciso baixa-lo do MCSManager temporariamente para poder envia-lo para o OneDrive.

Para baixar um arquivo pelo MCSManager é necessário fazer 2 requisições:

  1. Uma requisição para pedir um link temporário de download do arquivo
  2. Uma requisição com o link temporário para baixar o arquivo

Essa é a primeira requisição que devolve as informações para montar o link de download temporário:

Requisição no Insomnia para pedir o link temporário de download

Com a resposta da primeira requisição podemos montar o link para a segunda requisição que retornará o binário do arquivo, essa pode ser montada da seguinte maneira:

GET http(s)://{{data.ddr}}/download/{{data.password}}/{{file_name}}

Por exemplo:

GET http://localhost:24444/download/db8271f526...49468abd74/world.zip

n8n Automação

Aautomação com o n8n consiste em usar os seguintes blocos:

  1. Schedule Trigger: onde cofiguro a automação para ser executada de hora em hora.
  2. Listagem dos backups:
    1. Microsoft OneDrive -> Get items in a folder: este bloco obtem a lista de bakups que já estão salvos no OneDrive.
    2. HTTP Request: este bloco uso para obter a lista de backups locais no MCSManager
      1. Split Out: uso esse bloco para transformar o objeto que o MCSManager devolve em itens separados, sendo cada arquivo de backup local um item.
  3. Compare Datasets: Com a lista de backups no OneDrive e a lista de Backups locais uso esse bloco para comparar o nome dos arquivos e gerar uma ação para apagar os backups antigos demais do OneDrive e outra ação para enviar um backup local novo para o OneDrive, caso não exista.
    1. Microsoft OneDrive -> Delete a file: esse bloco deletará os backups antigos do OneDrive, para que não acumule infinitos backups no OneDrive.
  4. HTTP Request: Esse bloco é conectado na saída do bloco Compare Datasets onde fica a condição de "há arquivos locais que não existem no OneDrive" e é utilizado para obter o link de download do arquivo de backup local que não existe no OneDrive
  5. HTTP Requeset: Com o link de download do backup local, usamos outro bloco para fazer uma requisição para o OneDrive para iniciar o upload do backup novo.
  6. HTTP Request: Essa requisição usamos para baixar o arquivo local do MCSManager
  7. HTTPRequest: por último, uma requisição que vai enviar o backup novo baixado para o OneDrive usando o link de upload do OneDrive.
💡
Os passos 5 e 7 poderia ser simplificados com o bloco Microsoft OneDrive -> Upload a file, porém, na criação deste artigo esse bloco não suporta arquivos grandes.

Com esses blocos ordenados na ordem que os descrevi, o resultado será algo assim:

Automação de backup local para o OneDrive no n8n.

Conclusão

Com o Textile Backup cosigo fazer backups do meu servidor de Minecraft localmente sem nem precisar fechar o servidor.

Com o n8n consigo duplicar os backups locais para a núvem.

Mesmo que a energia acabe e corrompa o mundo, mesmo que meu ssd queime, mesmo que a host apague meus arquivos, terei um backup do meu servidor seguro na núvem.

Caso eu perca acesso a núvem? Ainda assim estou segura, pois não apago os backups locais.