SSD Nodes Learn
Guías Matt ConnorPor Matt Connor · Actualizado 2026-07-24

Cómo montar un servidor Minecraft en un VPS

Guía para instalar Paper en Ubuntu 24.04 con Java 21 y systemd. Configura el puerto 25565, gestiona la RAM y evita errores de corrupción en el mundo.

Qué vas a construir

Un servidor de Minecraft Java Edition de alta disponibilidad: Paper sobre Ubuntu 24.04, ejecutándose como un usuario dedicado minecraft bajo systemd con Restart=on-failure, con la whitelist activada, el puerto 25565 abierto en ambos firewalls situados entre los jugadores y la JVM, y copias de seguridad realizadas sin corromper el mundo que deben proteger. El servidor consiste en un archivo jar y un comando java; todo lo que diferencia a un servidor donde tus amigos juegan durante un año de uno que falla el primer fin de semana reside en la configuración de ese comando, y eso es lo que cubre esta guía.

Dos advertencias importantes antes de gastar dinero. Primero, Minecraft consume mucha memoria y es mayoritariamente de un solo hilo: un VPS de 1 GB no podrá ejecutar un servidor jugable, y un núcleo rápido es mejor que cuatro núcleos lentos. Segundo, esto es Java Edition. Los jugadores de Bedrock (consolas, teléfonos, la aplicación Windows Bedrock) no pueden unirse a un servidor Java; Bedrock requiere un software de servidor distinto en el puerto UDP 19132, o el plugin Geyser, que no se trata en esta guía.

Necesitas un VPS KVM con Ubuntu 24.04 recién instalado con acceso root o sudo, y aproximadamente treinta minutos.

Dimensionamiento: lo que un servidor para amigos realmente necesita

La RAM es el factor determinante, y las cifras reales son menores de lo que sugieren los foros de modpacks:

  • 2 GB permite jugar vanilla para 2–5 jugadores con una distancia de visión moderada. Es jugable, pero sin margen de maniobra.
  • 4 GB es el tamaño ideal para un servidor de amigos: permite unos diez jugadores simultáneos en Paper con algunos plugins, dejando suficiente memoria para el OS.
  • 8 GB o más es el rango para modpacks y más de 20 jugadores; en este caso, también debe importar la velocidad de un solo núcleo de la CPU, ya que el bucle principal del juego se ejecuta en un solo hilo.

El mundo también ocupa más espacio en disco a medida que los jugadores exploran —un mundo de supervivencia muy explorado alcanza varios gigabytes— así que deje espacio suficiente para el mundo y sus backups.

¿Vanilla o Paper? Paper es un reemplazo directo para el jar oficial: usa los mismos mundos, los mismos clientes y no requiere mods en el lado del cliente. Optimiza las rutas más lentas del servidor —carga de chunks, ticking de entidades, hoppers— y añade una API de plugins. La única razón para usar vanilla es si necesita mecánicas de vanilla exactas para granjas técnicas de redstone que las optimizaciones de Paper puedan alterar; para todos los demás, Paper ofrece más jugadores por gigabyte. Todo lo mencionado anteriormente funciona para ambos.

Paso 1: instalar Java 21

Minecraft 1.20.5 y todas las versiones posteriores (todas las 1.21.x) requieren Java 21. Ubuntu 24.04 lo incluye en sus repositorios predeterminados. La versión headless omite las librerías de escritorio que un servidor no utilizará:

sudo apt update && sudo apt install -y openjdk-21-jre-headless
java -version

Resultado correcto: la primera línea debe mostrar openjdk version "21.0.x". Si muestra 17 o 11, hay otra JRE instalada con prioridad; corrígelo con sudo update-alternatives --config java y selecciona la entrada que contiene java-21.

Omitir esta comprobación causará el error de servidor de Minecraft más buscado en Google. Con Java 17, el archivo jar del servidor fallará inmediatamente con:

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.0

Los números indican el error de versión: class file version 65.0 es Java 21, 61.0 es Java 17, 60.0 es Java 16. Sea cual sea la combinación que aparezca, la solución es la misma: instala la JRE más reciente y vuelve a ejecutar update-alternatives.

Paso 2: un usuario dedicado, nunca root

El servidor ejecuta código de plugins y procesa entradas de red de cualquier usuario con acceso al puerto. Si ocurre un error, un compromiso ejecutándose como root toma el control de su VPS; un compromiso ejecutándose como minecraft solo toma el control de un mundo de juego.

sudo adduser --system --group --home /opt/minecraft minecraft

--system crea una cuenta sin contraseña que no puede iniciar sesión vía SSH, con /opt/minecraft como su directorio de trabajo y home. Cada comando que interactúe con el servidor a partir de este punto se ejecutará bajo este usuario.

Paso 3: descargar el jar del servidor desde la fuente oficial

Solo dos sitios deben proporcionar un jar del servidor: la página oficial de descargas de Minecraft en minecraft.net para vanilla, o la página de descargas en papermc.io para Paper. Los "hubs de descarga" de terceros que empaquetan jars de servidores son un canal de malware recurrente; un jar de servidor es código arbitrario que se ejecutará las 24 horas del día, los 7 días de la semana, en un equipo conectado a internet.

Copie el enlace de descarga de la versión actual desde la página oficial (la URL cambia con cada versión y build, por lo que no se debe usar una dirección fija aquí), luego:

cd /opt/minecraft
sudo -u minecraft wget -O server.jar 'PASTE-THE-COPIED-URL-HERE'

Resultado correcto: un server.jar de aproximadamente 50 MB propiedad de minecraft, confirmado con ls -lh /opt/minecraft/server.jar.

Paso 4: primera ejecución, el EULA y la autogestión de permisos

Ejecute el servidor de forma interactiva una vez antes de configurar systemd; la primera ejecución requiere una consola activa para dos tareas específicas.

cd /opt/minecraft
sudo -u minecraft java -Xms1G -Xmx1G -jar server.jar nogui

El proceso termina en pocos segundos —Paper tarda un poco más mientras aplica sus parches— y el log finaliza con la línea que todos encuentran:

[ServerMain/INFO]: You need to agree to the EULA in order to run the server. Go to eula.txt for more info.

Esto no es un error; es un bloqueo de licencia. El proceso escribió eula.txt junto al archivo jar. Lea el EULA en el enlace si no lo ha hecho, y luego active el flag:

sudo -u minecraft sed -i 's/eula=false/eula=true/' /opt/minecraft/eula.txt

Ejecute el mismo comando java nuevamente. Esta vez generará el mundo —tardará uno o dos minutos en el primer arranque— y se detendrá en:

[Server thread/INFO]: Done (9.204s)! For help, type "help"

Ahora tiene una consola activa. Úsela para la segunda tarea: escriba op YourMinecraftName (su nombre de usuario exacto del juego) y el servidor lo registrará en ops.json; así, cuando no haya una consola conectada, podrá ejecutar todos los comandos de administrador desde el juego. Luego escriba stop para guardar y salir correctamente.

Paso 5: server.properties, y por qué online-mode debe permanecer en true

La primera ejecución también generó server.properties. La mayoría de los valores predeterminados son correctos; estas son las líneas que requieren una configuración deliberada:

online-mode=true
white-list=true
enforce-whitelist=true
view-distance=8
max-players=10
motd=A private server for people I actually know

online-mode=true hace que el servidor verifique cada nombre de usuario que se conecta contra los servidores de sesión de Mojang, confirmando que el jugador posee la cuenta. Configurarlo en false —el interruptor para "cracked servers"— significa que el servidor acepta la identidad que el cliente declare: cualquier persona puede entrar con cualquier nombre, incluido el tuyo. Dado que los permisos de op y las whitelists se gestionan por nombre, un impostor podría entrar con tus permisos de operador. La única razón legítima para establecerlo en false es cuando se usa un proxy de autenticación como Velocity, que realiza la verificación de los jugadores. En un servidor normal, debe permanecer en true.

view-distance es el principal factor de rendimiento en el archivo; el consumo de CPU y RAM escala aproximadamente de forma cuadrática con este valor. 8 es un valor predeterminado razonable para un VPS; 10 es el valor predeterminado de vanilla y es notablemente más pesado.

white-list=true junto con enforce-whitelist=true restringe el acceso a usuarios desconocidos, algo que la sección de seguridad a continuación indica que no es opcional. Añade jugadores usando /whitelist add TheirName dentro del juego con permisos de op.

Paso 6: flags de memoria — por qué -Xms y -Xmx deben coincidir

La JVM asigna su heap entre -Xms (tamaño inicial) y -Xmx (límite máximo). En un servidor de juegos dedicado, asígneles el mismo valor: el heap alcanzará el límite de todos modos, y aumentar su tamaño en etapas solo genera actividad innecesaria del garbage-collector durante el juego. En un VPS de 4 GB, el par correcto es:

/usr/bin/java -Xms3G -Xmx3G -jar server.jar nogui

-Xmx no es la memoria total que utiliza el proceso. La JVM añade overhead fuera del heap —thread stacks, JIT caches, direct buffers— de aproximadamente medio gigabyte o más, y Ubuntu también necesita espacio. La regla general: -Xmx como máximo, la RAM del VPS menos 1 GB. Si te excedes, ocurrirá uno de estos dos fallos. Si la asignación falla al inicio, el servidor no arrancará con:

Error: Could not reserve enough space for object heap

Este error es directo y evidente. La versión más problemática ocurre cuando el servidor inicia correctamente pero falla horas después, cuando el heap se llena bajo carga y el OOM killer del kernel selecciona el proceso más grande del sistema: la JVM. No aparecerá nada en el log del servidor; la evidencia está en sudo dmesg | grep -i oom, con una línea similar a Out of memory: Killed process 1234 (java). Si tu servicio se reinicia "aleatoriamente", revisa allí primero y reduce -Xmx.

Para Paper, el proyecto recomienda Aikar's flags —un conjunto de G1GC optimizado (-XX:+UseG1GC -XX:MaxGCPauseMillis=200 y otros parámetros)— que suaviza las pausas de garbage-collection en heaps grandes. Genera la línea completa desde la documentación de Paper; en un heap de 2–4 GB la mejora es modesta, pero los flags no causan problemas.

Paso 7: una unidad systemd con Restart=on-failure

Un servidor iniciado manualmente se detiene cuando finaliza la sesión SSH y permanece apagado tras un reinicio. Escriba /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.target
sudo systemctl daemon-reload
sudo systemctl enable --now minecraft
systemctl status minecraft
journalctl -u minecraft -f

Resultado correcto: status muestra active (running), y el journal —que ahora contiene la salida de la consola del servidor— termina de nuevo en la línea Done.

Dos decisiones deliberadas en esa unidad. Restart=on-failure reinicia el servidor tras un error, pero no tras un stop limpio, permitiendo así el mantenimiento. Y TimeoutStopSec=120 es más importante de lo que parece: systemctl stop envía SIGTERM, el servidor de Minecraft lo recibe y guarda cada mundo antes de salir; en mundos grandes, este guardado requiere tiempo. El timeout por defecto de systemd puede enviar un SIGKILL a la JVM durante el guardado, que es la causa exacta de la corrupción de los archivos de región. Asigne dos minutos.

Si el servicio falla repetidamente (flapping) y el journal muestra:

[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?

entonces algo ya está usando el puerto 25565; casi siempre es una ejecución previa en primer plano que sigue activa en otra sesión SSH. Identifíquelo con sudo ss -tlnp | grep 25565 y detenga esa copia; nunca ejecute dos servidores en el mismo puerto.

Paso 8: abrir 25565 en ambos firewalls

Minecraft Java utiliza únicamente TCP 25565 (UDP es solo el protocolo de consulta opcional, desactivado por defecto). En el VPS:

sudo ufw allow OpenSSH
sudo ufw allow 25565/tcp
sudo ufw enable

Ese es el primer firewall. La mayoría de los proveedores de VPS ejecutan un segundo firewall a nivel de red en su panel de control, y es el que la gente suele olvidar. Abra también el TCP 25565 allí. El síntoma de tener solo uno de los dos firewalls abiertos es muy poco específico: el cliente se queda bloqueado en "Connecting to the server..." y falla con Connection timed out: no further information — sin rechazo de conexión, sin error de servidor y sin registros en el journal, porque los paquetes nunca llegaron. Verifique desde una máquina ajena al VPS con nc -vz your.server.ip 25565; succeeded significa que ambos firewalls están abiertos; un bloqueo significa que al menos uno no lo está.

Mientras configura ufw, tenga en cuenta que el mismo servidor ejecuta SSH en una IP pública y el ruido de los logs por ataques de fuerza bruta comienza en cuestión de horas; configure Fail2ban para SSH en Ubuntu 24.04 antes de que lo olvide.

Ahora conéctese: Multiplayer, Direct Connection, la IP del servidor. Debido a que se dio permisos de operador en el paso 4, los comandos dentro del juego funcionan inmediatamente — /whitelist add FriendName para cada jugador, /gamemode creative si ese es el plan.

Paso 9: whitelist, porque internet detecta el puerto 25565

Dejar un servidor de Minecraft abierto a internet no es un riesgo teórico: los escáneres masivos recorren todo el espacio IPv4 buscando el puerto 25565 continuamente. Proyectos de griefing para aficionados han mapeado cientos de miles de servidores abiertos de esta forma. Un servidor sin whitelist recibe visitantes no deseados en cuestión de días o incluso horas. La whitelist del paso 5 es la solución: online-mode=true verifica la identidad y la whitelist restringe el acceso solo a las identidades que usted elija. Ese par constituye el modelo de seguridad completo y es suficiente para un servidor de amigos.

Para acceso por consola sin el juego —copias de seguridad programadas o tareas cron— habilite RCON en server.properties (enable-rcon=true, una rcon.password robusta, puerto 25575) y compile el pequeño cliente mcrcon desde su código fuente de GitHub directamente en el VPS; no está disponible en los repositorios de Ubuntu. No abra el puerto 25575 en ningún firewall: RCON envía la contraseña en texto plano, por lo que debe permanecer limitado a loopback.

Paso 10: copias de seguridad que no corrompen el mundo

La regla fundamental: nunca copie un directorio del mundo mientras el servidor está escribiendo en él. Los archivos de región se reescriben continuamente durante la sesión de juego; un tar que compita con una escritura produce un archivo con chunks incompletos y, al restaurarlo —el único momento en que una copia debe funcionar—, el log se llenará de errores de carga de chunks y el terreno tendrá huecos. Dos métodos evitan esto.

Stop-copy-start es el método sencillo, a costa de un minuto de inactividad:

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 las dimensiones en world, world_nether y world_the_end; un servidor vanilla mantiene todo en world, así que mueva las otras dos allí.)

Save-off realiza copias en caliente: mediante RCON, ejecute save-off (detenga el autoguardado), luego save-all flush (fuerce la escritura en disco y espere), cree el tar, y finalmente save-on. Esta es la versión para programar en cron a las 5 a.m.

En cualquier caso, una copia de seguridad alojada en el mismo VPS que el servidor no es una copia de seguridad real: use scp o rclone para mover los archivos fuera del servidor y mantenga más de una copia. Dado que no estará vigilando la consola cuando algo falle, configure una comprobación externa del puerto: Uptime Kuma en otro equipo realizando un check TCP contra el puerto 25565 le avisará de que el servidor está caído antes que sus jugadores.

Plugins y actualizaciones

En Paper, un plugin es un archivo jar colocado en /opt/minecraft/plugins/ seguido de un reinicio; ese es todo el proceso de instalación. Obtenga los plugins únicamente de sus páginas oficiales (Hangar, Modrinth, SpigotMC), por la misma razón que el jar del servidor: cada uno es código arbitrario que se ejecuta como el usuario minecraft.

Actualizar el servidor consiste en: detener, realizar una copia de seguridad, reemplazar server.jar por la versión para la nueva versión de Minecraft y arrancar. Dos advertencias. Las actualizaciones de mundos son unidireccionales: un mundo abierto por una versión más reciente no funcionará en una versión anterior, por lo que las copias de seguridad son esenciales. Además, los plugins suelen tardar días o semanas en adaptarse a un nuevo lanzamiento de Minecraft; verifique la compatibilidad antes de intentar actualizar el mismo día del lanzamiento.

Si prefiere gestionar todo esto como un contenedor —fijación de versiones, aceptación de EULA y flags de memoria como variables de entorno—, la imagen itzg/minecraft-server se utiliza ampliamente para ejecutar el mismo servidor Paper bajo Docker Compose en su VPS con la misma disciplina de firewall y copias de seguridad.

FAQ

¿Cuánta RAM necesita un servidor de Minecraft?

2 GB bastan para vanilla con 2–5 jugadores; 4 GB es suficiente para un servidor de amigos de unos diez jugadores usando Paper con algunos plugins; para modpacks y más de 20 jugadores se requieren 8 GB o más. Independientemente del tamaño del VPS, configure -Xmx con un máximo de la RAM total menos 1 GB; la JVM utiliza memoria adicional a la heap, y exceder este límite provoca Error: Could not reserve enough space for object heap o un OOM kill silencioso.

¿Por qué mis amigos no pueden conectarse a mi servidor de Minecraft?

Un bloqueo del cliente que termina en Connection timed out: no further information casi siempre indica un firewall, y existen dos: ufw en el VPS y el firewall de red de su proveedor en el panel de control. El puerto TCP 25565 debe estar abierto en ambos. Confirme que el servidor está escuchando con sudo ss -tlnp | grep 25565 en el equipo y luego pruebe desde fuera con nc -vz your.server.ip 25565.

¿Debo configurar online-mode=false en server.properties?

No. Con online-mode=false el servidor omite la autenticación de Mojang por completo, por lo que cualquier persona puede entrar con cualquier nombre de usuario —incluyendo el nombre de un op, heredando sus permisos— y las skins y los UUID estables fallan. El único uso legítimo es detrás de un proxy de autenticación como Velocity que verifique a los jugadores por sí mismo. Para un servidor normal, debe permanecer en true.

¿Es Paper mejor que el servidor vanilla de Minecraft?

Para casi todos, sí: Paper es un jar de sustitución que carga mundos vanilla, acepta clientes sin modificar, gestiona ticks de entidades y carga de chunks de forma mucho más eficiente, y añade el ecosistema de plugins. La excepción son las comunidades de redstone técnica que necesitan un comportamiento vanilla exacto, ya que algunas optimizaciones de Paper lo alteran. En un VPS pequeño, la eficiencia de Paper equivale a RAM extra gratuita.

¿Cómo hago una copia de seguridad de un mundo de Minecraft sin corromperlo?

Nunca archive el directorio del mundo mientras el servidor esté escribiendo en él; una copia que compita con la escritura de un region-file produce chunks corruptos que solo se detectarán al restaurar. Detenga el servidor, haga un tar de los directorios del mundo y reinícelo, o manténgalo activo usando save-off, save-all flush, tar y save-on vía RCON. Después, mueva el archivo a fuera del VPS.

#minecraft#game-server#java#ubuntu#self-hosting