Cómo montar un servidor de Minecraft en un VPS
Monta Paper en Ubuntu 24.04 con Java 21, systemd y listas blancas. Abre 25565 en ambos firewalls, ajusta la RAM y crea copias seguras del mundo.
Lo que va a crear
Un servidor de Minecraft Java Edition que permanezca activo: 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 los dos firewalls situados entre los jugadores y la JVM, y copias de seguridad realizadas de forma que no corrompan el mundo que deben proteger. El servidor sólo necesita un archivo jar y un comando java; todo lo que diferencia un servidor en el que sus amigos juegan durante un año de uno 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 antes de gastar dinero. En primer lugar, Minecraft consume mucha memoria y utiliza principalmente un solo hilo: un VPS de 1 GB no ejecutará un servidor con un rendimiento jugable, y un núcleo rápido es mejor que cuatro lentos. En segundo lugar, esto es 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 21
Minecraft 1.20.5 y todas las versiones posteriores (incluidas todas las versiones 1.21.x) requieren Java 21. Ubuntu 24.04 lo incluye en los repositorios predeterminados, y la compilación headless omite las bibliotecas de escritorio que un servidor nunca utilizará:
sudo apt update && sudo apt install -y openjdk-21-jre-headless
java -versionResultado correcto: la primera línea muestra openjdk version "21.0.x". Si muestra 17 u 11, hay otro JRE instalado que tiene prioridad. Corríjalo con sudo update-alternatives --config java y seleccione la entrada que contenga java-21.
Si omite esta comprobación, más adelante aparecerá el error de Minecraft que más se busca en Internet. Con Java 17, el archivo jar del servidor termina inmediatamente y muestra:
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.0Los números indican la incompatibilidad: la versión de archivo de clase 65.0 corresponde a Java 21, 61.0 corresponde a Java 17 y 60.0 corresponde a Java 16. Cualquiera que 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 jar del servidor desde la fuente oficial
Sólo dos sitios deben proporcionarle un jar del servidor: la página oficial de descargas 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 jars del servidor son un canal de malware activo desde hace años. Un jar del servidor es código arbitrario que va a ejecutar las 24 horas del día, los 7 días de la semana, en un sistema 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 incluir aquí una URL fija haría que quedara obsoleta. Después:
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 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 noguiEl 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.txtEjecute 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 knowonline-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 heapEste 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.targetsudo systemctl daemon-reload
sudo systemctl enable --now minecraft
systemctl status minecraft
journalctl -u minecraft -fResultado 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 sólo TCP 25565. UDP corresponde únicamente al protocolo de consulta opcional, que está desactivado de forma predeterminada. En el VPS:
sudo ufw allow OpenSSH
sudo ufw allow 25565/tcp
sudo ufw enableEse es el primer firewall. La mayoría de los proveedores de VPS ejecutan un segundo firewall a nivel de red en el panel de control. Es el que suele olvidarse. Abra también allí el puerto TCP 25565. Si sólo se abre uno de los dos, el síntoma es muy poco específico: el cliente se queda bloqueado 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 externa al VPS con nc -vz your.server.ip 25565. succeeded significa que ambos firewalls están abiertos. Si la conexión se bloquea, al menos uno de ellos no está abierto.
Mientras está en ufw, recuerde que el mismo equipo ejecuta SSH en una IP pública y que el ruido de los registros por intentos 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 concedió 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 única regla es la siguiente: no copie nunca un directorio de mundo mientras el servidor esté escribiendo en él. Los archivos de región se reescriben continuamente durante la partida; un tar que coincida con una escritura produce un archivo con chunks escritos parcialmente. Cuando finalmente lo restaure, justo cuando una copia de seguridad 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 la opción sencilla, aunque implica 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 guarda todo en world, así que coloque allí los otros dos).
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 el disco y espera), cree el tar y, a continuación, ejecute save-on. Esta es la versión que debe programar 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 de ese equipo 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 compruebe mediante TCP el puerto 25565 le avisará de que el servidor está caído antes que sus jugadores.
Complementos y actualizaciones
En Paper, un complemento es un archivo jar que se copia en /opt/minecraft/plugins/ y requiere reiniciar el servidor. Eso completa la instalación. Obtenga complementos únicamente de las páginas oficiales de sus proyectos (Hangar, Modrinth, SpigotMC), por la misma razón que se aplica al jar del servidor: cada uno es código arbitrario que se ejecuta con el usuario minecraft.
Actualizar el servidor consiste en detenerlo, crear una copia de seguridad, sustituir 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 con una versión más reciente no se abrirá con una versión anterior. Las copias de seguridad permiten recuperarlo. 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 nueva el primer día.
Si prefiere gestionar todo esto como un contenedor, con el bloqueo de versiones, la aceptación de la EULA y los indicadores de memoria definidos 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 configuración del firewall y la misma disciplina de copias de seguridad.
FAQ
¿Cuánta RAM necesita un servidor de Minecraft?
2 GB ejecutan Minecraft vanilla para 2–5 jugadores; 4 GB ofrecen un margen cómodo para un servidor de amigos de aproximadamente diez jugadores en Paper con algunos plugins; los modpacks y más de 20 jugadores requieren 8 GB o más. Independientemente del tamaño del VPS, establezca -Xmx como máximo en la RAM total menos 1 GB. La JVM utiliza memoria adicional fuera del heap, y superar este límite termina en Error: Could not reserve enough space for object heap o en la finalización silenciosa del proceso 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 casi siempre indica un firewall. Hay dos: ufw en el VPS y el firewall de red del proveedor, disponible en el panel de control. El puerto TCP 25565 debe estar abierto en ambos. Confirme que el servidor realmente está escuchando con sudo ss -tlnp | grep 25565 en el servidor y, después, 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 verifique 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 instalar 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 vanilla idéntico a nivel de bits, 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 escriba en él. Una copia que coincida con una escritura en un archivo de región puede producir chunks dañados que sólo se detectan al restaurar la copia. Puede detener el servidor, empaquetar los directorios del mundo con tar y volver a iniciarlo, o mantenerlo activo con save-off, save-all flush, tar y save-on a través de RCON. Después, transfiera el archivo fuera del VPS.