SSD Nodes Learn Hosting plans →
Guías Matt ConnorPor Matt Connor

Cómo alojar un servidor de Minecraft en un VPS

Instala Paper en Ubuntu 24.04 con Java 25: calcula la RAM, configura systemd, abre el puerto 25565, activa la lista blanca y respalda el mundo.

Qué va a crear

Un servidor de Minecraft Java Edition que permanezca disponible: Paper en Ubuntu 24.04, ejecutándose como un usuario dedicado minecraft mediante systemd con Restart=on-failure, con la lista blanca activada, el puerto 25565 abierto en ufw y en el firewall de red de su proveedor si está habilitado, y copias de seguridad realizadas de forma que no dañen el mundo que deben proteger. El servidor en sí consta de un archivo jar y un comando java; todo lo que diferencia un servidor en el que sus amigos juegan durante un año de otro que deja de funcionar el primer fin de semana gira en torno a ese comando, y eso es lo que cubre esta guía.

Dos advertencias importantes antes de gastar dinero. Primero, Minecraft consume mucha memoria y utiliza principalmente un solo hilo: un VPS de 1 GB no ejecutará un servidor jugable, y un núcleo rápido es mejor que cuatro lentos. Segundo, esto corresponde a Java Edition. Los jugadores de Bedrock, las consolas, los teléfonos y la aplicación Windows Bedrock no pueden conectarse a un servidor Java; Bedrock necesita otro software de servidor en UDP 19132 o el plugin Geyser, que queda fuera del alcance de esta guía.

Necesita un VPS KVM nuevo con Ubuntu 24.04, acceso root o sudo y unos treinta minutos.

Tamaño: lo que realmente necesita un servidor para amigos

La RAM es el factor importante, y las cifras reales son inferiores a las que suelen indicar los foros de modpacks:

  • 2 GB permiten ejecutar vanilla para 2–5 jugadores con una distancia de renderizado moderada. Es jugable, pero no deja margen.
  • 4 GB es el tamaño adecuado para un servidor de amigos: unos diez jugadores simultáneos en Paper con varios plugins, y suficiente memoria para el sistema operativo.
  • 8 GB o más corresponden a modpacks y a más de 20 jugadores. En este caso también debe prestar atención a la velocidad de la CPU en un solo núcleo, porque el bucle principal del juego se ejecuta en un único hilo.

El mundo también ocupa cada vez más espacio en disco a medida que los jugadores exploran. Un mundo de supervivencia muy recorrido puede alcanzar varios gigabytes, así que deje margen para el mundo y sus copias de seguridad.

¿Vanilla o Paper? Paper es un reemplazo directo del archivo jar oficial: utiliza los mismos mundos y clientes, y no requiere mods en el cliente. Reescribe las rutas más lentas del servidor, como la carga de chunks, la actualización de entidades y los hoppers, y añade una API para plugins. La única razón para ejecutar vanilla es necesitar mecánicas idénticas a las de vanilla para granjas técnicas de redstone que las optimizaciones de Paper puedan modificar. Para los demás casos, Paper admite más jugadores por gigabyte. Todo lo que se explica a continuación funciona con ambos.

Paso 1: instalar Java 25

Minecraft 26.1 y todas las versiones posteriores requieren Java 25; Java 21 sólo cubre la rama anterior, de 1.20 a 1.21.11. Ubuntu 24.04 incluye Java 25 en sus repositorios de actualizaciones y seguridad. Instale el JRE completo, no la variante -headless: la guía de instalación de Java de Paper desaconseja las variantes headless porque no incluyen dependencias que Paper necesita.

sudo apt update && sudo apt install -y openjdk-25-jre
java -version

Resultado correcto: la primera línea muestra openjdk version "25.0.x". Si muestra 21, 17 u 11, hay otro JRE instalado y seleccionado; corríjalo con sudo update-alternatives --config java y elija la entrada que contenga java-25.

Si omite esta comprobación, más adelante aparecerá el error de Minecraft del que más resultados se buscan en Google. Con Java 21, el archivo jar del servidor termina 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 69.0),
	this version of the Java Runtime only recognizes class file versions up to 65.0

Los números muestran la incompatibilidad: la versión de archivo de clase 69.0 corresponde a Java 25, 65.0 corresponde a Java 21 y 61.0 corresponde a Java 17. Sea cual sea el par que aparezca, la solución es la misma: instale el JRE más reciente y vuelva a ejecutar update-alternatives.

Paso 2: un usuario dedicado, nunca root

El servidor ejecuta código de plugins y analiza entradas de red de cualquiera que pueda acceder al puerto. Si algo falla, un compromiso que se ejecute como root controla todo su VPS; uno que se ejecute como minecraft sólo controla 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 mediante SSH, con /opt/minecraft como directorio de inicio y de trabajo. A partir de ahora, todos los comandos que interactúen con el servidor se ejecutan con este usuario.

Paso 3: descargar el server jar desde la fuente oficial

Sólo dos lugares deben proporcionarle un server jar: la página oficial de descarga del servidor en minecraft.net para vanilla y la página de descargas de papermc.io para Paper. Los «centros de descargas» de terceros que vuelven a empaquetar server jars son un canal de malware activo desde hace años. Un server jar contiene código arbitrario que va a ejecutar las 24 horas del día, los 7 días de la semana, en un equipo expuesto a Internet.

Copie el enlace de descarga de la compilación actual desde la página oficial (la URL cambia con cada versión y compilación, por lo que escribir aquí una fija haría que quedara obsoleta) y ejecute:

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

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

Paso 4: primera ejecución, el EULA y conceder privilegios de operador

Ejecute el servidor de forma interactiva una vez antes de configurar systemd. La primera ejecución tiene dos objetivos que sólo una consola activa permite completar correctamente.

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

El proceso termina al cabo de unos segundos. Paper dedica unos instantes adicionales a aplicar primero sus parches. El registro termina con la línea que aparece en todas las instalaciones:

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

No se trata de un error, sino de una comprobación de la licencia. La ejecución ha creado eula.txt junto al archivo jar. Lea el EULA enlazado si aún no lo ha hecho y cambie el indicador:

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

Ejecute de nuevo el mismo comando java. Esta vez se genera el mundo, lo que puede tardar uno o dos minutos durante el primer arranque, y el servidor queda en:

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

Ahora dispone de una consola activa. Úsela para el segundo objetivo: escriba op YourMinecraftName (su nombre de usuario exacto dentro del juego) y el servidor lo añadirá a ops.json. Así, más adelante, cuando no haya una consola conectada, podrá ejecutar todos los comandos de administración desde el juego. Después, 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 escribió server.properties. La mayoría de los valores predeterminados son adecuados. Estas son las líneas que conviene decidir de forma 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 con los servidores de sesión de Mojang. Así demuestra que el jugador es propietario de la cuenta. Establecerlo en false, la opción de «servidor cracked», significa que el servidor acepta la identidad que declara cualquier cliente. Cualquiera puede conectarse con cualquier nombre, incluido el tuyo. Como los permisos de operador y las listas blancas se basan en el nombre, un suplantador obtiene tus permisos de operador. La única razón legítima para usar false es colocar el servidor detrás de un proxy con autenticación, como Velocity, que verifique a los jugadores por su cuenta. En un servidor normal debe permanecer en true, sin excepciones.

view-distance es el ajuste que más influye en el rendimiento del archivo. El consumo de CPU y RAM aumenta aproximadamente con su cuadrado. 8 es un valor predeterminado razonable para un VPS. 10 es el valor predeterminado de vanilla y requiere muchos más recursos.

white-list=true y enforce-whitelist=true impiden el acceso de usuarios desconocidos. La sección de seguridad siguiente explica por qué esto no es opcional. Añade jugadores con /whitelist add TheirName dentro del juego usando una cuenta con permisos de operador.

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

La JVM asigna el heap entre -Xms (tamaño inicial) y -Xmx (límite máximo). En un servidor de juegos dedicado, establezca ambos con el mismo valor: el heap alcanzará el límite máximo de todos modos, y aumentarlo por etapas sólo añade actividad del recolector de basura durante la partida. En un VPS de 4 GB, el par adecuado es:

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

-Xmx no es la memoria total que utiliza el proceso. La JVM añade sobrecarga fuera del heap, pilas de subprocesos, cachés JIT y búferes directos, que requieren aproximadamente medio gigabyte adicional o más. Ubuntu también necesita espacio. La regla práctica es: -Xmx como máximo, la RAM del VPS menos 1 GB. Si se excede ese valor, se produce uno de dos fallos. Si la asignación falla al principio, el servidor no se inicia y muestra:

Error: Could not reserve enough space for object heap

Este error es claro e inmediato. La versión más problemática se inicia correctamente y termina varias 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 aparece nada en el registro del servidor. La evidencia está en sudo dmesg | grep -i oom, en una línea como Out of memory: Killed process 1234 (java). Si el servicio se reinicia «aleatoriamente», compruebe primero ese archivo y reduzca -Xmx.

Para Paper, el proyecto documenta los indicadores de Aikar, un conjunto ajustado para G1GC (-XX:+UseG1GC -XX:MaxGCPauseMillis=200 y una docena más) que suaviza las pausas del recolector de basura en heaps grandes. Genere la línea completa a partir de la documentación de Paper. En un heap de 2–4 GB, la mejora es moderada, pero los indicadores no causan problemas.

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

Un servidor iniciado manualmente termina cuando finaliza la sesión SSH y permanece detenido después de reiniciar. 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.

Hay dos decisiones intencionadas en esa unidad. Restart=on-failure vuelve a iniciar el servidor después de un bloqueo, pero no después de un stop limpio, por lo que el mantenimiento sigue siendo posible. Y TimeoutStopSec=120 es más importante de lo que parece: systemctl stop envía SIGTERM, el servidor de Minecraft lo captura y guarda todos los mundos antes de salir, y ese guardado tarda tiempo en un mundo grande. El tiempo de espera predeterminado de systemd puede enviar SIGKILL a la JVM durante el guardado. Así es exactamente como se corrompen los archivos de regiones. Asigne dos minutos.

Si el servicio se reinicia continuamente 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 otro proceso ya usa 25565. Casi siempre se trata de la ejecución anterior en primer plano, que sigue activa en otra sesión SSH. Encuéntrela con sudo ss -tlnp | grep 25565 y detenga esa instancia. Nunca ejecute dos servidores en el mismo puerto.

Paso 8: abrir el puerto 25565 en ambos firewalls

Minecraft Java usa únicamente TCP 25565. UDP sólo se utiliza para el protocolo de consulta opcional, que está desactivado de forma predeterminada. En el VPS:

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

Ese es el primer firewall. Muchos proveedores de VPS también ofrecen un segundo firewall a nivel de red en el panel de control. Cuando está activo, suele ser el que se olvida. En SSD Nodes, es el complemento Advanced Firewall Groups, un extra de pago que se asigna durante la compra o desde el panel. Si el servidor tiene uno, abra también allí el puerto TCP 25565. El síntoma de que falta una regla en cualquiera de los dos es poco específico: el cliente se queda en "Connecting to the server..." y falla con Connection timed out: no further information. No hay rechazo, error del servidor ni mensajes en el journal porque los paquetes nunca llegaron. Verifique desde una máquina fuera del VPS con nc -vz your.server.ip 25565. succeeded significa que todos los firewalls de la ruta permiten la conexión. Si la conexión se queda esperando, normalmente uno de ellos sigue descartando los paquetes. Sin embargo, un host demasiado ocupado para aceptar conexiones también puede agotar el tiempo de espera. Por eso, confirme en el servidor que el servicio está escuchando con ss.

Mientras está en ufw, recuerde que el mismo servidor ejecuta SSH en una IP pública y que el ruido de los registros causado por ataques de fuerza bruta comienza en pocas horas. Configure Fail2ban para SSH en Ubuntu 24.04 antes de olvidarlo.

Ahora conéctese: Multiplayer, Direct Connection y la IP del servidor. Como se otorgó permisos de operador en el paso 4, los comandos del juego funcionan de inmediato: /whitelist add FriendName para cada jugador y /gamemode creative si ese es el plan.

Paso 9: lista blanca, 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 continuamente todo el espacio IPv4 en busca del puerto 25565, algunos proyectos de sabotaje de aficionados han identificado cientos de miles de servidores abiertos de esta forma y un servidor sin lista blanca recibe visitantes no autorizados en cuestión de días, a veces de horas. La lista blanca del paso 5 es la solución: online-mode=true demuestra la identidad y la lista blanca limita el acceso a las identidades que usted eligió. Ese conjunto constituye todo el modelo de seguridad y es suficiente para un servidor de amigos.

Para acceder a la consola sin usar el juego, ejecutar copias de seguridad mediante scripts o usar una tarea de cron, habilite RCON en server.properties (enable-rcon=true, una rcon.password segura y el puerto 25575) y compile el pequeño cliente mcrcon a partir de 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 sin cifrar, por lo que debe permanecer accesible sólo mediante loopback.

Paso 10: copias de seguridad que no corrompen el mundo

La regla principal es: nunca copie el directorio de un mundo mientras el servidor esté escribiendo en él. Los archivos de región se reescriben continuamente durante la partida; un tar que coincide con una escritura produce un archivo con chunks escritos sólo parcialmente. Cuando finalmente lo restaure, justo cuando la copia debe funcionar, el registro se llenará de errores al cargar chunks y el terreno tendrá huecos. Dos métodos evitan este problema.

Detener-copiar-iniciar es el método más sencillo, a cambio 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
sudo systemctl start minecraft

(Desde 26.1, Paper mantiene las tres dimensiones dentro de world/dimensions/, igual que vanilla, por lo que world contiene todo el mundo. Un servidor Paper que todavía use 1.21.11 o una versión anterior las separa en world, world_nether y world_the_end; añada esas dos rutas al tar en ese caso).

Save-off permite hacer copias de seguridad con el servidor activo: mediante RCON, ejecute save-off (detiene el guardado automático), después save-all flush (fuerza la escritura de todo en disco y espera), cree el tar y, por último, ejecute save-on. Esta es la versión que debe configurar en cron a las 5 a. m.

En cualquier caso, una copia de seguridad almacenada en el mismo VPS que el servidor no es una copia de seguridad. scp o rclone los archivos fuera del servidor y conserve más de una copia. Además, como no estará mirando la consola cuando ocurra un fallo, configure una comprobación externa del puerto: Uptime Kuma en otro equipo que realice una comprobación TCP contra 25565 le avisará de que el servidor está caído antes que sus jugadores.

Complementos y actualizaciones

En teoría, un complemento es un archivo jar que se copia en /opt/minecraft/plugins/ y va seguido de un reinicio. Eso completa la instalación. Obtenga complementos sólo desde las páginas oficiales de sus proyectos (Hangar, Modrinth, SpigotMC), por la misma razón que con el jar del servidor: cada uno es código arbitrario que se ejecuta como el usuario minecraft.

Actualizar el servidor consiste en detenerlo, hacer una copia de seguridad, reemplazar server.jar por la compilación correspondiente a la nueva versión de Minecraft y volver a iniciarlo. Hay dos precauciones. Las actualizaciones de mundos son unidireccionales: un mundo abierto por una versión más reciente no se abrirá en una versión anterior. Por eso las copias de seguridad son importantes. Además, los complementos suelen tardar días o semanas en adaptarse a una nueva versión de Minecraft. Compruebe la compatibilidad antes de instalar una versión el primer día. Pasar de 1.21.11 a 26.1 o posterior también requiere Java 25 (paso 1) y mueve las carpetas Nether y End de Paper a world/dimensions/.

Si prefiere gestionar todo esto como un contenedor, con el bloqueo de versiones, la aceptación de la EULA y las opciones de memoria como variables de entorno, la imagen itzg/minecraft-server, ampliamente utilizada, ejecuta el mismo servidor Paper mediante 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 permiten ejecutar Vanilla para 2–5 jugadores; 4 GB ofrecen un margen cómodo para un servidor de amigos de unos diez jugadores en Paper con algunos plugins; los modpacks y más de 20 jugadores requieren 8 GB o más. Sea cual sea el tamaño del VPS, establezca -Xmx como máximo en la RAM total menos 1 GB, porque la JVM usa memoria además del heap; superar ese límite termina en Error: Could not reserve enough space for object heap o en una terminación silenciosa por falta de memoria.

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

Un cliente que se queda bloqueado y termina en Connection timed out: no further information suele indicar un firewall: ufw en el VPS y el firewall de red del proveedor, si está habilitado en el panel de control. El puerto TCP 25565 debe estar abierto en todos los firewalls de la ruta. Confirme que el servidor está escuchando realmente con sudo ss -tlnp | grep 25565 en el equipo y pruebe desde fuera con nc -vz your.server.ip 25565.

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

No. Con online-mode=false, el servidor omite por completo la autenticación de Mojang. Cualquiera puede conectarse con cualquier nombre de usuario, incluido el nombre de un operador, y heredar sus permisos. Además, las skins y los UUID estables dejan de funcionar correctamente. El único uso legítimo es detrás de un proxy con autenticación, como Velocity, que verifica a los jugadores por su cuenta. En un servidor normal debe mantenerse true.

¿Es Paper mejor que el servidor Vanilla de Minecraft?

Para casi todos, sí. Paper es un archivo jar que se puede incorporar directamente, carga mundos Vanilla, acepta clientes sin modificar, procesa entidades y carga chunks de forma mucho más eficiente, y añade el ecosistema de plugins. La excepción son las comunidades técnicas de redstone que necesitan un comportamiento de Vanilla exacto bit a bit, ya que algunas optimizaciones de Paper lo modifican. En un VPS pequeño, la eficiencia de Paper equivale prácticamente a disponer de RAM adicional sin coste.

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

No archive nunca el directorio del mundo mientras el servidor escribe en él. Una copia que coincida con una escritura del archivo de regiones puede producir chunks corruptos que sólo descubrirá al restaurarlos. Detenga el servidor, cree un tar de los directorios de los mundos y vuelva a iniciarlo, o manténgalo activo con save-off, save-all flush, tar y save-on mediante RCON. Después, transfiera el archivo fuera del VPS.