### Requisitos 
1. Tener un equipo con ubuntu server
2.  Tener licencia de Minecraft.

### Instalación
Entramos a nuestro servidor, actualizamos todo el sistema con el comando:

```bash
sudo apt update && sudo apt upgrade -y
```

Para nuestra versión debemos instalar java en su versión 21, por lo tanto debes ejecutar el comando:

```bash
sudo apt install openjdk-21-jdk -y
```

Para verificar la versión instalada de java ejecutamos el comando:

```bash
java --version
```

La salida del comando debe ser algo como esta:

```
openjdk 21.0.6 2025-01-21
OpenJDK Runtime Environment (build 21.0.6+7-Ubuntu-124.04.1)
OpenJDK 64-Bit Server VM (build 21.0.6+7-Ubuntu-124.04.1, mixed mode, sharing)
```

Instalamos screen para poder ejecutar Minecraft en segundo plano y no tener que estar arrancando de forma manual el servidor de Minecraft cada vez que encendamos el servidor:

```bash
ya no aplica esto sudo apt install screen
```

Abrimos el puerto para permitir conexiones externas dentro de nuestra red local, por defecto el puerto para Minecraft es el 25565:

```bash
sudo ufw allow 25565
```

Descargamos la el archivo jar en la página oficial de [Minecraft](https://www.minecraft.net/es-es/download/server) , que para este caso en particular el comando es:

```bash
wget -O minecraft_server.1.21.5.jar https://piston-data.mojang.com/v1/objects/e6ec2f64e6080b9b5d9b471b291c33cc7f509733/server.jar
```

Del comando anterior:
- wget - Comando para descargar archivos de internet.
- -O nombre_archivo.extension - El archivo que descarga lo renombra **siempre debes considerar la extensión**, para este ejemplo lo renombra a *minecraft_server.1.21.4*.
- url - Es la ruta del archivo, para este ejemplo es https://piston-data.mojang.com/v1/objects/e6ec2f64e6080b9b5d9b471b291c33cc7f509733/server.jar

![[Pasted image 20250325192642.png]]

En la inspección del texto *minecraft_server_1.21.4.jar* verás el tag **a** con su atributo **href** copia ese contenido y será tu complemento de tu comando wget:

![[Pasted image 20250325192745.png]]

Una vez descargado el archivo vamos a crear una carpeta que se llame *Minecraft* , movemos el archivo jar dentro de la carpeta y nos movemos a la carpeta:

```bash
mkdir Minecraft
mv minecraft_server.1.21.5.jar Minecraft/
cd Minecraft/
```

Dentro de la carpeta ejecutamos el comando iniciar de forma manual el servidor de Minecraft:

```bash
java -Xmx1024M -Xms1024M -jar minecraft_server.1.21.5.jar nogui
```

Lo que hará el comando es:
- `-Xmx1024M` - Esté flag indica que el servidor iniciara con con 1024MB en la memoria RAM (1GB), puedes modificarlo si así lo deseas, considerando los recursos de la maquina, solo debes indicar con **M** para megabytes y **G** para gigabytes, por ejemplo -Xmx2G 
    
- `Xms1024M` - Esté flag indica que a lo mucho usará 1024 MB de RAM, puedes aumentarlo o disminuirlo con base en los recursos de la maquina y la sintaxis de los parámetros es igual al flag anterior.
    
- `jar` - esta bandera indica el nombre del archivo jar a ejecutar en el servidor.
    
- `nogui` - Está bandera indica que no mostrara interfaz gráfica (No Graphical User Interface) desde el servidor, lo que implica que reducirá la carga de trabajo considerablemente, ya que solo nos conectaremos de forma remota desde otra PC  o laptops.

Cuando termine de ejecutarse el comando anterior veremos varios logs del sistema, una vez que termine nos dirá que fallo la carga del archivo eula.txt y que debemo aceptar el acuerdo de eula para iniciar el servidor por lo tanto, en la terminal si ejecutamos un simple **ls -la**, veremos el archivo eula:

```bash
ls -la 
# archivos mostrados
# -rw-rw-r-- 1 web web      158 Mar 20 19:47 eula.txt
# drwxrwxr-x 8 web web     4096 Mar 20 19:47 libraries
# drwxrwxr-x 2 web web     4096 Mar 20 19:47 logs
# -rw-rw-r-- 1 web web 56880250 Dec  3 10:24 minecraft_server.1.21.5.jar
# -rw-rw-r-- 1 web web     1394 Mar 20 19:47 server.properties
# drwxrwxr-x 3 web web     4096 Mar 20 19:47 versions
```

Si vemos el contenido del archivo eula.txt con un simple cat veremos que tiene un parámetro llamado eula el cual tiene un valor de false:

```bash
cat eula.txt
# CONTENIDO DEL ARCHIVO eula.txt [comentado]
#By changing the setting below to TRUE you are indicating your agreement to our EULA (https://aka.ms/MinecraftEULA).
#Thu Mar 20 19:47:34 UTC 2025
#eula=false
```

Para modificar el archivo solo ejecutamos el comando nano y el valor de false lo cambiamos a true:

```bash
nano eula.txt
```

el archivo de aula.txt debe quedar así:
```text
#By changing the setting below to TRUE you are indicating your agreement to our EULA (https://aka.ms/MinecraftEULA).
#Sat Mar 29 12:27:53 CST 2025
eula=true
```

Guardamos con **CTRL + S**  y cerramos con **CTRL + X**.


Tambien debemos modificar el archivo llamado *server.properties* acorde a lo que queremos en nuestro juego, esta es mi configuración para dos usuarios en modo survival y el mundo se llama como mi gatita:

```bash
#Minecraft server properties
#Thu Mar 20 19:47:34 UTC 2025
accepts-transfers=false
allow-flight=false
allow-nether=true
broadcast-console-to-ops=true
broadcast-rcon-to-ops=true
bug-report-link=
difficulty=normal
enable-command-block=true
enable-jmx-monitoring=false
enable-query=true
enable-rcon=false
enable-status=true
enforce-secure-profile=true
enforce-whitelist=false
entity-broadcast-range-percentage=100
force-gamemode=false
function-permission-level=2
gamemode=survival
generate-structures=true
generator-settings={}
hardcore=false
hide-online-players=false
initial-disabled-packs=
initial-enabled-packs=vanilla
level-name=world_gorromina
level-seed=
level-type=minecraft\:normal
log-ips=true
max-chained-neighbor-updates=1000000
max-players=4
max-tick-time=60000
max-world-size=29999984
motd=A Minecraft Server
network-compression-threshold=256
online-mode=true
op-permission-level=4
pause-when-empty-seconds=60
player-idle-timeout=0
prevent-proxy-connections=false
pvp=true
query.port=25565
rate-limit=0
rcon.password=
rcon.port=25575
region-file-compression=deflate
require-resource-pack=false
resource-pack=
resource-pack-id=
resource-pack-prompt=
resource-pack-sha1=
server-ip=
server-port=25565
simulation-distance=10
spawn-monsters=true
spawn-protection=16
sync-chunk-writes=true
text-filtering-config=
text-filtering-version=0
use-native-transport=true
view-distance=10
white-list=false
```


Una vez modificado los dos archivo anteriores, volvemos a ejecutar el comando:
```bash
java -Xmx1024M -Xms1024M -jar minecraft_server.1.21.5.jar nogui
```
Veremos varios logs en la terminal que nos indican que ya se ha levantado el servidor, ejemplo logs:

```bash
web@web-s:~/Minecraft$ java -Xmx1024M -Xms1024M -jar minecraft_server.1.21.5.jar nogui
Starting net.minecraft.server.Main
[20:24:50] [ServerMain/INFO]: Environment: Environment[sessionHost=https://sessionserver.mojang.com, servicesHost=https://api.minecraftservices.com, name=PROD]
[20:24:51] [ServerMain/INFO]: No existing world data, creating new world
[20:24:52] [ServerMain/INFO]: Loaded 1370 recipes
[20:24:52] [ServerMain/INFO]: Loaded 1481 advancements
[20:24:52] [Server thread/INFO]: Starting minecraft server version 1.21.4
[20:24:52] [Server thread/INFO]: Loading properties
[20:24:52] [Server thread/INFO]: Default game type: SURVIVAL
[20:24:52] [Server thread/INFO]: Generating keypair
[20:24:52] [Server thread/INFO]: Starting Minecraft server on *:25565
[20:24:52] [Server thread/INFO]: Using epoll channel type
[20:24:52] [Server thread/INFO]: Preparing level "world_gorromina"
[20:24:57] [Server thread/INFO]: Preparing start region for dimension minecraft:overworld
[20:24:57] [Worker-Main-2/INFO]: Preparing spawn area: 2%
[20:24:57] [Worker-Main-3/INFO]: Preparing spawn area: 2%
[20:24:58] [Worker-Main-4/INFO]: Preparing spawn area: 2%
[20:24:58] [Worker-Main-2/INFO]: Preparing spawn area: 18%
[20:24:59] [Worker-Main-1/INFO]: Preparing spawn area: 18%
[20:24:59] [Worker-Main-5/INFO]: Preparing spawn area: 51%
[20:25:00] [Worker-Main-5/INFO]: Preparing spawn area: 51%
[20:25:00] [Server thread/INFO]: Time elapsed: 3246 ms
[20:25:00] [Server thread/INFO]: Done (7.914s)! For help, type "help"
[20:25:00] [Server thread/INFO]: Starting GS4 status listener
[20:25:00] [Server thread/INFO]: Thread Query Listener started
[20:25:00] [Query Listener #1/INFO]: Query running on 0.0.0.0:25565
[20:26:00] [Server thread/INFO]: Server empty for 60 seconds, pausing
```

Así desde nuestra laptop o PC nos conectamos a el servidor para necesitas la IP del servidor, en el juego de Minecraft para agregar un servidor es tan simple como ir a Multiplayer > Add Server > Ingresar el nombre del servidor > agregar la ip del servidor (No indicar puerto).

Una vez hecho eso cuando te conectes en los logs del servidor verás que un usuario se ha conectado, ahora si podemos continuar con la configuración para ejecutar el segundo plano el servicio y evitar estar haciendolo de forma manual.

Primero, desde el juego debes de desconectarte del servidor, en el servidor, donde se muestran los logs debes detenerlo con la combinación de teclas **CTRL + C** y espera un par de segundo.

Antes de crear el archivo de servicio debemos obtener la ruta de nuestro archivo jar de Minecraft, para ello ejecuta el comando:
```bash
pwd
# en mi caso la salida es: /home/dave/Minecraft
```
Ese comando te mostrara la ruta padre del archivo *minecraft_server.1.21.4.jar*, copia esa ruta que la usaras en la configuración del archivo de servicio, procedemos a crear un archivo de servicio mediante el comando:

```bash
sudo nano /etc/systemd/system/minecraft.service
```

Si seguiste los pasos anteriores donde creamos una carpeta dedicada al archivo jar de Minecraft entonces pega el siguiente contenido en minecraft.service, de lo contrario debes modificar las rutas:

```text
[Unit]
Description=Servidor de Minecraft
After=network.target

[Service]
# CAMBIA EL NOMBRE DEL USUARIO A TU USUARIO EN TU SERVIDOR
User=web
# RUTA PADRE DEL ARCHIVO JAR DE MINECRAFT
WorkingDirectory=/home/web/Minecraft
ExecStart=/usr/bin/java -Xmx1024M -Xms1024M -jar minecraft_server.1.21.5.jar nogui
Restart=on-failure

[Install]
WantedBy=multi-user.target
```

Guardamos con **CTRL + S** y cerramos con **CTRL + X**, recarga systemctrl para que cargue la nueva configuración del servicio:
```bash
sudo systemctl daemon-reload
```

Habilitemos el servicio para que se inicie automáticamente al arranque del servidor:
```bash
sudo systemctl enable minecraft.service
```

Por única ocasión iniciamos el servicio de forma manual:
```bash
sudo systemctl start minecraft.service
```
Verificamos que el servicio este activo con el comando:
```bash
sudo systemctl status minecraft.service
```
Del comando anterior la salida debe ser algo como esto:

```bash
● minecraft.service - Servidor de Minecraft
     Loaded: loaded (/etc/systemd/system/minecraft.service; enabled; preset: enabled)
     Active: active (running) since Thu 2025-03-20 21:11:25 UTC; 18s ago
 Invocation: 82d8418ca3d04d62bd41021c633dbf81
   Main PID: 4205 (java)
      Tasks: 44 (limit: 17919)
     Memory: 610.2M (peak: 612.7M)
        CPU: 33.404s
     CGroup: /system.slice/minecraft.service
             └─4205 /usr/bin/java -Xmx1024M -Xms1024M -jar minecraft_server.1.21.5.jar nogui

Mar 20 21:11:31 web-s java[4205]: [21:11:31] [Server thread/INFO]: Preparing start region for dimension minecraft:overworld
Mar 20 21:11:33 web-s java[4205]: [21:11:33] [Worker-Main-3/INFO]: Preparing spawn area: 0%
Mar 20 21:11:33 web-s java[4205]: [21:11:33] [Worker-Main-3/INFO]: Preparing spawn area: 0%
Mar 20 21:11:33 web-s java[4205]: [21:11:33] [Worker-Main-3/INFO]: Preparing spawn area: 0%
Mar 20 21:11:33 web-s java[4205]: [21:11:33] [Worker-Main-3/INFO]: Preparing spawn area: 0%
Mar 20 21:11:33 web-s java[4205]: [21:11:33] [Server thread/INFO]: Time elapsed: 1900 ms
Mar 20 21:11:33 web-s java[4205]: [21:11:33] [Server thread/INFO]: Done (2.128s)! For help, type "help"
Mar 20 21:11:33 web-s java[4205]: [21:11:33] [Server thread/INFO]: Starting GS4 status listener
Mar 20 21:11:33 web-s java[4205]: [21:11:33] [Server thread/INFO]: Thread Query Listener started
Mar 20 21:11:33 web-s java[4205]: [21:11:33] [Query Listener #1/INFO]: Query running on 0.0.0.0:25565
```
La salida del comando nos indica que el servicio esta activo y corriendo, así que cada vez que se reinicie el servidor el servicio se ejecutara de forma automática y podrás conectarte sin problemas, en caso de que quieras ver los logs solo ejecuta el comando:

```bash
journalctl -u minecraft.service -f
```

