Como criar servidor Minecraft no Ubuntu 24.04
Guia para rodar Paper Minecraft no Ubuntu 24.04 com Java 21 e systemd. Aprenda a configurar a porta 25565, gerenciar RAM e evitar corrupção de arquivos.
O que você está construindo
Um servidor Minecraft Java Edition estável: Paper no Ubuntu 24.04, rodando como um usuário dedicado minecraft via systemd com Restart=on-failure, com whitelist ativada, porta 25565 aberta em ambos os firewalls entre os jogadores e a JVM, e backups realizados de forma a não corromper o mundo que eles protegem. O servidor em si consiste em um jar e um comando java; tudo o que diferencia um servidor onde seus amigos jogam por um ano de um que cai no primeiro fim de semana está em torno desse comando, e é isso que este guia aborda.
Dois avisos importantes antes de você gastar dinheiro. Primeiro, o Minecraft consome muita memória e é majoritariamente single-threaded: um VPS de 1 GB não rodará um servidor jogável, e um núcleo rápido é melhor que quatro núcleos lentos. Segundo, este é o Java Edition. Jogadores de Bedrock — consoles, celulares, o app Windows Bedrock — não podem entrar em um servidor Java; o Bedrock exige um software de servidor diferente na porta UDP 19132, ou o plugin Geyser, que não faz parte deste escopo.
Você precisa de um VPS KVM Ubuntu 24.04 recém-instalado com acesso root ou sudo, e cerca de trinta minutos.
Dimensionamento: o que o servidor para amigos realmente precisa
A RAM é o valor que importa, e os números reais são menores do que os fóruns de modpacks sugerem:
- 2 GB executa o vanilla para 2–5 jogadores com distância de visão moderada. Jogável, sem margem de sobra.
- 4 GB é o tamanho confortável para servidores de amigos: cerca de dez jogadores simultâneos no Paper com alguns plugins, e sobra o suficiente para o SO.
- 8 GB ou mais é para modpacks e mais de 20 jogadores, onde você também deve se preocupar com a velocidade do CPU single-core, pois o loop principal do jogo roda em uma única thread.
O mundo também cresce no disco conforme os jogadores exploram — um mundo de survival muito explorado atinge vários gigabytes — portanto, deixe margem para o mundo e para seus backups.
Vanilla ou Paper? O Paper é um substituto direto para o jar oficial: mesmos mundos, mesmos clients, sem necessidade de mods no lado do cliente. Ele reescreve os caminhos mais lentos do servidor — carregamento de chunks, ticking de entidades, hoppers — e adiciona uma API de plugins. O único motivo para rodar vanilla é se você precisar de mecânicas vanilla idênticas para farms técnicas de redstone que as otimizações do Paper possam alterar; para todos os outros, o Paper oferece mais jogadores por gigabyte. Tudo abaixo funciona para ambos.
Passo 1: instalar Java 21
O Minecraft 1.20.5 e todas as versões posteriores (todas da 1.21.x) exigem o Java 21. O Ubuntu 24.04 o fornece nos repositórios padrão, e a build headless remove as bibliotecas de desktop que um servidor nunca utilizará:
sudo apt update && sudo apt install -y openjdk-21-jre-headless
java -versionResultado correto: a primeira linha deve exibir openjdk version "21.0.x". Se exibir 17 ou 11, outra JRE está instalada e sendo priorizada; corrija com sudo update-alternatives --config java e selecione a entrada que contém java-21.
Pular esta verificação causa o erro de servidor Minecraft mais pesquisado no Google posteriormente. Com o Java 17, o jar do servidor falha instantaneamente com:
Error: LinkageError occurred while loading main class net.minecraft.bundler.Main
java.lang.UnsupportedClassVersionError: net/minecraft/bundler/Main has been
compiled by a more recent version of the Java Runtime (class file version 65.0),
this version of the Java Runtime only recognizes class file versions up to 61.0Os números indicam a incompatibilidade: class file version 65.0 é Java 21, 61.0 é Java 17, 60.0 é Java 16. Independentemente do par exibido, a solução é a mesma — instale a JRE mais recente e execute novamente o update-alternatives.
Passo 2: um usuário dedicado, nunca root
O servidor executa código de plugin e processa entradas de rede de qualquer um que consiga acessar a porta. Se ocorrer uma falha, um comprometimento rodando como root assume o controle do seu VPS; um rodando como minecraft assume apenas um mundo de jogo.
sudo adduser --system --group --home /opt/minecraft minecraftO --system cria uma conta sem senha que não permite login via SSH, utilizando /opt/minecraft como diretório home e de trabalho. Todo comando que interagir com o servidor a partir de agora será executado como este usuário.
Passo 3: baixe o jar do servidor da fonte oficial
Apenas dois locais devem fornecer um jar de servidor: a página oficial de download em minecraft.net para vanilla, ou a página de downloads em papermc.io para Paper. "Hubs de download" de terceiros que repackage jars de servidor são um canal recorrente de malware — um jar de servidor é código arbitrário que você executará 24/7 em uma máquina exposta à internet.
Copie o link de download da build atual da página oficial (a URL muda a cada versão e build, portanto, fixar uma aqui tornaria o guia obsoleto), então:
cd /opt/minecraft
sudo -u minecraft wget -O server.jar 'PASTE-THE-COPIED-URL-HERE'Resultado correto: um server.jar de aproximadamente 50 MB pertencente ao minecraft, confirmado com ls -lh /opt/minecraft/server.jar.
Passo 4: primeira execução, o EULA e a promoção a admin
Execute o servidor de forma interativa uma vez antes de configurar o systemd — a primeira execução realiza apenas duas tarefas que só um console ativo consegue processar corretamente.
cd /opt/minecraft
sudo -u minecraft java -Xms1G -Xmx1G -jar server.jar noguiO processo encerra em poucos segundos — o Paper leva um tempo extra aplicando patches — e o log termina com a linha que todos encontram:
[ServerMain/INFO]: You need to agree to the EULA in order to run the server. Go to eula.txt for more info.Isso não é um erro; é uma trava de licença. A execução criou eula.txt ao lado do jar. Leia o EULA no link se ainda não o fez, então ative a flag:
sudo -u minecraft sed -i 's/eula=false/eula=true/' /opt/minecraft/eula.txtExecute o mesmo comando java novamente. Desta vez ele gera o mundo — cerca de um ou dois minutos no primeiro boot — e para em:
[Server thread/INFO]: Done (9.204s)! For help, type "help"Você agora tem um console ativo. Use-o para a segunda tarefa: digite op YourMinecraftName (seu username exato do jogo) e o servidor o adicionará ao ops.json, para que futuramente — quando não houver um console conectado — você possa executar todos os comandos de admin de dentro do jogo. Em seguida, digite stop para salvar e sair corretamente.
Passo 5: server.properties, e por que online-mode deve permanecer true
A primeira execução também criou o arquivo server.properties. A maioria dos valores padrão está correta; estas linhas exigem decisão deliberada:
online-mode=true
white-list=true
enforce-whitelist=true
view-distance=8
max-players=10
motd=A private server for people I actually knowonline-mode=true faz com que o servidor verifique cada nome de usuário que entra nos servidores de sessão da Mojang, comprovando que o jogador possui a conta. Definir como false — o modo "cracked server" — significa que o servidor aceita qualquer afirmação do cliente sobre sua identidade: qualquer pessoa pode entrar com qualquer nome, inclusive o seu. Como as permissões de op e whitelists são baseadas no nome, um impostor pode entrar com seus privilégios de operador. O único motivo legítimo para este valor ser false é o uso de um proxy de autenticação como o Velocity, que realiza a verificação dos jogadores. Em um servidor comum, deve permanecer true.
view-distance é o principal parâmetro de desempenho no arquivo — o custo de CPU e RAM escala aproximadamente com o quadrado deste valor. 8 é um padrão razoável para VPS; 10 é o padrão vanilla e é consideravelmente mais pesado.
white-list=true somado a enforce-whitelist=true restringe o acesso do servidor a estranhos, o que a seção de segurança abaixo argumenta não ser opcional. Adicione jogadores usando o comando /whitelist add TheirName dentro do jogo como um op.
Passo 6: flags de memória — por que -Xms e -Xmx devem ser iguais
A JVM aloca o heap entre -Xms (tamanho inicial) e -Xmx (limite máximo). Em um servidor de jogo dedicado, defina ambos com o mesmo valor: o heap atingirá o limite de qualquer forma, e o crescimento gradual apenas aumenta o overhead do garbage-collector durante o jogo. Em um VPS de 4 GB, o par correto é:
/usr/bin/java -Xms3G -Xmx3G -jar server.jar nogui-Xmx não é a memória total utilizada pelo processo. A JVM adiciona overhead off-heap — thread stacks, JIT caches, direct buffers — de aproximadamente meio gigabyte ou mais, e o Ubuntu também precisa de espaço. A regra prática: -Xmx no máximo a RAM do VPS menos 1 GB. Se ultrapassar esse valor, você terá um de dois problemas. Se a alocação falhar de imediato, o servidor não iniciará com:
Error: Could not reserve enough space for object heapEste erro é direto e imediato. A versão pior ocorre quando o servidor inicia normalmente e trava horas depois, quando o heap enche sob carga e o OOM killer do kernel escolhe o maior processo da máquina — a JVM. Nada aparece no log do servidor; a evidência está no sudo dmesg | grep -i oom, em uma linha como Out of memory: Killed process 1234 (java). Se o seu serviço reiniciar "aleatoriamente", verifique isso primeiro e diminua o -Xmx.
Para o Paper, o projeto recomenda as Aikar's flags — um conjunto G1GC otimizado (-XX:+UseG1GC -XX:MaxGCPauseMillis=200 e outros parâmetros) que suaviza as pausas de garbage-collection em heaps maiores. Gere a linha completa a partir da documentação do Paper; em um heap de 2–4 GB o ganho é modesto, mas as flags não causam danos.
Passo 7: uma unit do systemd com Restart=on-failure
Um servidor iniciado manualmente morre quando sua sessão SSH termina e permanece offline após um reboot. Escreva /etc/systemd/system/minecraft.service:
[Unit]
Description=Minecraft server (Paper)
After=network-online.target
Wants=network-online.target
[Service]
User=minecraft
Group=minecraft
WorkingDirectory=/opt/minecraft
ExecStart=/usr/bin/java -Xms3G -Xmx3G -jar server.jar nogui
Restart=on-failure
RestartSec=10
TimeoutStopSec=120
[Install]
WantedBy=multi-user.targetsudo systemctl daemon-reload
sudo systemctl enable --now minecraft
systemctl status minecraft
journalctl -u minecraft -fResultado correto: status mostra active (running), e o journal — que agora contém a saída do console do servidor — termina na linha Done novamente.
Duas escolhas deliberadas nessa unit. Restart=on-failure reinicia o servidor após um crash, mas não após um stop limpo, permitindo a manutenção. E TimeoutStopSec=120 é mais importante do que parece: systemctl stop envia SIGTERM, o servidor Minecraft o captura e salva todos os mundos antes de sair; em mundos grandes, esse salvamento demora. O timeout padrão do systemd pode enviar um SIGKILL para a JVM durante o salvamento, que é exatamente como arquivos de region corrompem. Defina para dois minutos.
Se o serviço apresentar flapping e o journal mostrar:
[Server thread/WARN]: **** FAILED TO BIND TO PORT!
[Server thread/WARN]: The exception was: io.netty.channel.unix.Errors$NativeIoException: bind(..) failed: Address already in use
[Server thread/WARN]: Perhaps a server is already running on that port?então algo já está ocupando a porta 25565 — quase sempre é sua execução anterior em foreground ainda viva em outra sessão SSH. Localize o processo com sudo ss -tlnp | grep 25565 e pare essa cópia; nunca execute dois servidores na mesma porta.
Passo 8: abra a porta 25565 em ambos os firewalls
O Minecraft Java usa apenas TCP 25565 (UDP é apenas o protocolo de query opcional, desativado por padrão). No VPS:
sudo ufw allow OpenSSH
sudo ufw allow 25565/tcp
sudo ufw enableEste é o primeiro firewall. A maioria dos provedores de VPS utiliza um segundo firewall em nível de rede no painel de controle, e este é o que as pessoas esquecem. Abra a porta TCP 25565 lá também. O sintoma de ter apenas um dos dois firewalls aberto é extremamente vago: o cliente trava em "Connecting to the server..." e falha com Connection timed out: no further information — sem recusa de conexão, sem erro de servidor e sem registros no journal, pois os pacotes nunca chegaram. Verifique de uma máquina fora do VPS usando nc -vz your.server.ip 25565; succeeded significa que ambos os firewalls estão abertos; um travamento significa que pelo menos um não está.
Enquanto você estiver configurando o ufw, saiba que o mesmo servidor está rodando SSH em um IP público, e o log de tentativas de brute-force começa em poucas horas — configure o Fail2ban para SSH no Ubuntu 24.04 antes que você esqueça.
Agora conecte: Multiplayer, Direct Connection, o IP do servidor. Como você se deu permissões no passo 4, os comandos dentro do jogo funcionam imediatamente — /whitelist add FriendName para cada jogador, /gamemode creative se esse for o plano.
Passo 9: whitelist, pois a internet encontra a porta 25565
Deixar um servidor de Minecraft aberto para a internet não é um risco teórico: scanners de massa varrem todo o espaço IPv4 em busca da porta 25565 continuamente — projetos de griefing mapearam centenas de milhares de servidores abertos dessa forma — e um servidor sem whitelist recebe visitantes indesejados em poucos dias, às vezes horas. A whitelist do passo 5 é a solução: online-mode=true comprova a identidade, e a whitelist restringe a entrada apenas às identidades que você escolheu. Esse par é o modelo de segurança completo e é suficiente para um servidor de amigos.
Para acesso via console sem o jogo — backups automatizados, um cron job — habilite o RCON em server.properties (enable-rcon=true, uma rcon.password forte, porta 25575) e compile o pequeno cliente mcrcon a partir do código-fonte do GitHub diretamente na VPS; ele não está nos repositórios do Ubuntu. Não abra a porta 25575 em nenhum firewall: o RCON envia a senha em texto puro, portanto, ela deve permanecer apenas em loopback.
Passo 10: backups que não corrompem o mundo
A regra única: nunca copie um diretório de mundo enquanto o servidor estiver escrevendo nele. Arquivos de região são reescritos continuamente durante o jogo; um tar que ocorre durante uma escrita gera um arquivo com chunks incompletos e, quando você restaurar — o único momento em que um backup deve funcionar — o log ficará cheio de erros de carregamento de chunk e o terreno terá buracos. Duas disciplinas evitam isso.
Stop-copy-start é a mais simples, com o custo de um minuto de downtime:
sudo systemctl stop minecraft
sudo mkdir -p /opt/backups
sudo tar czf /opt/backups/world-$(date +%F-%H%M).tgz \
-C /opt/minecraft world world_nether world_the_end
sudo systemctl start minecraft(Paper divide as dimensões em world, world_nether e world_the_end; um servidor vanilla mantém tudo em world, então mova as outras duas para lá.)
Save-off faz o backup com o servidor rodando: via RCON, execute save-off (para o autosaver), depois save-all flush (força a escrita de tudo no disco e aguarda), gere o tar, e então execute save-on. Esta é a versão para configurar no cron às 5 a.m.
De qualquer forma, um backup armazenado no mesmo VPS do servidor não é um backup — use scp ou rclone para mover os arquivos para fora da máquina e mantenha mais de um. Como você não estará monitorando o console quando algo falhar, configure uma verificação externa na porta: Uptime Kuma em outra máquina realizando um check TCP na porta 25565 avisará que o servidor caiu antes dos seus jogadores.
Plugins e upgrades
No Paper, um plugin é um arquivo jar colocado em /opt/minecraft/plugins/ seguido de um restart — isso é todo o processo de instalação. Baixe plugins apenas em suas páginas oficiais (Hangar, Modrinth, SpigotMC), pelo mesmo motivo do jar do servidor: cada um é código arbitrário executado como o usuário minecraft.
Atualizar o servidor consiste em: parar, fazer backup, substituir server.jar pela build da nova versão do Minecraft e iniciar. Duas precauções. Upgrades de mundo são unidirecionais — um mundo aberto por uma versão mais recente não abrirá em uma versão antiga, o que exige o uso de backups. Além disso, plugins costumam atrasar em relação ao lançamento do Minecraft por dias ou semanas; verifique a compatibilidade antes de tentar atualizar no primeiro dia.
Se preferir gerenciar tudo isso como um container — fixação de versão, aceitação de EULA e flags de memória como variáveis de ambiente — a imagem itzg/minecraft-server é amplamente utilizada e executa o mesmo servidor Paper via Docker Compose no seu VPS com a mesma disciplina de firewall e backup.
FAQ
Quanto de RAM um servidor de Minecraft precisa?
2 GB rodam o vanilla para 2–5 jogadores; 4 GB é o ideal para um servidor de amigos com cerca de dez jogadores usando Paper e alguns plugins; modpacks e mais de 20 jogadores exigem 8 GB ou mais. Independentemente do tamanho do VPS, defina -Xmx para no máximo o total de RAM menos 1 GB — a JVM utiliza memória além do heap, e ultrapassar esse limite resulta em Error: Could not reserve enough space for object heap ou um OOM kill silencioso.
Por que meus amigos não conseguem se conectar ao meu servidor de Minecraft?
Um travamento do cliente resultando em Connection timed out: no further information quase sempre indica um firewall, e existem dois: o ufw no VPS e o firewall de rede do seu provedor no painel de controle. A porta TCP 25565 deve estar aberta em ambos. Confirme se o servidor está realmente escutando com sudo ss -tlnp | grep 25565 na máquina e, em seguida, teste externamente com nc -vz your.server.ip 25565.
Devo configurar online-mode=false em server.properties?
Não. Com online-mode=false o servidor pula a autenticação da Mojang completamente, permitindo que qualquer pessoa entre com qualquer nome de usuário — incluindo o nome de um op, herdando suas permissões — além de causar problemas com skins e UUIDs estáveis. O único uso legítimo é atrás de um proxy de autenticação como o Velocity que verifica os jogadores por conta própria. Para um servidor comum, mantenha como true.
O Paper é melhor que o servidor vanilla do Minecraft?
Para quase todos, sim: o Paper é um jar de substituição que carrega mundos vanilla, aceita clientes não modificados, processa ticks de entidades e carrega chunks de forma muito mais eficiente, além de adicionar o ecossistema de plugins. A exceção são comunidades de redstone técnica que precisam de comportamento vanilla bit-a-bit, o qual algumas otimizações do Paper alteram. Em um VPS pequeno, a eficiência do Paper equivale a RAM extra gratuita.
Como eu faço backup de um mundo de Minecraft sem corrompê-lo?
Nunca arquive o diretório do mundo enquanto o servidor estiver escrevendo nele — uma cópia em concorrência com a escrita de um region-file produz chunks corrompidos que você só descobrirá no momento do restore. Ou você para o servidor, faz o tar dos diretórios do mundo e inicia novamente, ou mantém o servidor online usando save-off, save-all flush, tar e save-on via RCON. Depois, mova o arquivo para fora do VPS.