Despliegue de un Servidor de Minecraft Modificado con Forge, Fabric utilizando Docker-Compose en Google Cloud (En este caso, BetterMC Forge: BMC3)
Desde mi perspectiva, considero que esta es una excelente oportunidad para comenzar a utilizar Google Cloud, Docker y Docker Compose y aprender algo nuevo en el proceso. Google Cloud ofrece alrededor de 300 dólares en créditos, y pues... se pueden usar igual para seguir aprendiendo a usar este servicio de nube y ya más adelante emplear esos créditos en otra cosa :). Sin embargo, cada persona tiene su propia perspectiva ;).
El siguiente diagrama de flujo intenta explicar la arquitectura detrás de todo el proceso de montar este servidor.

En este repo, utilizamos la imagen de Docker proporcionada por itzg, la cual es muy completa y facilita el despliegue de un servidor de Minecraft vanilla o con mods. itzg explica de manera clara cómo montar un servidor de Minecraft vanilla utilizando esta imagen en su propio repositorio y en su sitio web.
Sin embargo, es importante señalar que aunque la documentación es detallada, pueden perderse algunos detalles, especialmente cuando se trata de montar un servidor con mods, forge o fabric. Aunque esta funcionalidad está explicada, puede ser un poco confusa para aquellos que son nuevos en estas tecnologías.
Dicho esto, todo el crédito por la imagen de Docker debe ir a itzg. Puedes encontrar más información sobre la imagen y su funcionamiento en el repositorio oficial: Perfil de Github de itzg, Repo de itzg, Documentación.
Dicho esto, en este repositorio busca explicar desde cómo montar el servidor en el servicio de Google Cloud hasta las configuraciones del docker-compose para instalar el paquete de mods de tu elección. Esa clase de cosas que no las encuentras en un mismo repositorio :)
En primer lugar, me gustaría mencionar que entre las opciones de servicios en la nube disponibles actualmente, casi todas ofrecen una prueba gratuita por un cierto período de tiempo o proporcionan créditos para utilizar su plataforma. En el caso de Google Cloud, ofrecen una prueba de $300 dólares, lo que equivale aproximadamente a 6300 pesos mexicanos. El costo mensual varía dependiendo de la instancia que utilices y de cuánto la emplees. Es importante destacar que la configuración de la instancia que se utiliza en Google Cloud tiende a ser similar en otros servicios de nube.
Con estos $300 dólares, podrías financiar aproximadamente 8 meses de servidor para el juego, más o menos.
Ahora que hemos explicado esto, continuemos.
- Lo primero es crear una cuenta en Google.... acceder a Google Cloud y registrarte para obtener los créditos. Es necesario agregar una tarjeta de crédito, pero no se realizará ningún cargo; puedes eliminarla más adelante si lo deseas.
Si todo salió bien, estarás en una interfaz como esta:
Ahora, crearemos un proyecto nuevo (ponle el nombre que gustes).

Al terminar nos quedara una interfaz como esta:

Luego, nos dirigimos a Compute Engine y hacemos clic en Instancias de VM (Virtual Machine (Máquina Virtual en español)) .

O puedes acceder a las instancias de VM desde la interfaz después de crear el proyecto.
Tendremos que activar esta API "Compute Engine API", para crear y ejecutar máquinas virtuales en Google Cloud Platform.

Ahora, creamos la instancia. Le damos click en CREAR INSTANCIA
Ponemos el nombre que gustemos y seleccionamos la regios y zona que mas nos convenga.
Luego en configuracion de la maquina, elegimos una instancia EC2

Luego personalizamos el procedor y la ram, en este caso, usamos 4 nucleos y 8 gb de ram

Luego nos vamos a Disco de arranque y le damos en CAMBIAR, esto es importante para que la generacion de mundo sea rapido tanto para el sever, como para tus jugadores.
Nos mandará a esta interfaz, en la cual elegiremos el espacio de disco que consideremos. En este caso, lo dejé en 10 GB. Elige el sistema operativo Ubuntu, la versión 24.04 LTS y el tipo de disco de arranque "Disco persistente estándar".

Luego bajamos más y nos vamos a Firewall y marcamos con un check Permitir tráfico HTTP y Permitir tráfico HTTPS. El balanceo de cargas nos podría servir si mostráramos más de un servidor en la misma instancia, pero en este caso pasaremos de ello.

Ahora nos vamos en opciones en avanzadas
Herramientas de redes y ponemos una etiqueta de red que nos servirá más adelante.

Le damos en Crear. Esto tomará un poco de tiempo, ya que quede, debería verse algo así.

Ahora, nos vamos en configurar reglas de Firewall.

Le pondremos un nombre significativo, para que no olvidemos para qué sirve.
Prioridad en 1000, etiqueta de destino, le ponemos la misma etiqueta que pusimos en "Herramientas de redes". (Sé que la de la captura de pantalla anterior es diferente a esta, así que calma).
Luego en Filtro de origen, seleccionamos rangos de de IPv4 y
Rangos de IPv4 de origen 0.0.0.0/4, esto significa que cualquier dirección IP puede acceder al servidor de Minecraft.

Y ahora, para que estas IPs accedan, es importante activar el protocolo TCP en el puerto 25565. Este puerto en particular se elige porque es el puerto predeterminado al montar el servidor (esto en las configuraciones del contenedor y el archivo server.properties ).
Una vez que hayas terminado de hacer los ajustes, simplemente guarda los cambios y espera un momento mientras se aplican.
Luego de que estas se apliquen, regresaremos al apartado de instancias VM. Y le daremos en SSH (Secure Shell) para conectarnos a la Maquina virtual.

Al hacer click, tenemos varias opciones, pero por defecto debería abrirnos otra pestaña del navegador para acceder a la terminal de la VM.
Actualizamos el sistema desplegado.
sudo apt-get update
Luego instalamos docker.
sudo apt-get install docker.io --yes
Nos ponemos como usuario root.
sudo su
e instalamos docker-compose.
curl -L https://github.com/docker/compose/releases/download/1.28.5/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
Verificamos que todo esté instalado. Si Docker y Docker-compose están instalados, al ejecutar los siguientes comandos, obtendremos un listado de comandos disponibles.
docker
docker-compose
Ahora, gracias al archivo de docker-compose que está en este repositorio, con darle un docker-compose up -d, ya tendrías básicamente el servidor montado, siendo BetterMC Forge: BMC3 en su versión 1.19.2. Así que explicaremos eso y luego nos iremos a los detalles.
Primero copiamos este repo, en la terminal de la vm con (esto para tener el docker-compose)
git clone https://github.com/JESUSLUG/Servidor-de-Minecraft-Java-Utilizando-Docker-Compose-en-Google-Cloud-Forge-Fabric.git
Usaremos la API de Curseforge, esto se debe a que el contenedor accederá a esta API para descargar los mods de esta página. Accedemos a https://console.curseforge.com/?#/ Nos vamos a API KEY y copiamos.
Ya copiado, toca crear un archivo .env
nano .env
y pegamos CF_API_KEY=TUAPIDECURSEFORGE
Pulsamos Ctrl + X y luego Yes para guardar. Para confirmar si se guardó, volvemos a abrir el archivo con nano .env y lo que hemos escrito debería estar allí.
Ahora si. Levantamos el contenedor
docker-compose up -d
Esperamos... y escribimos lo siguiente para ver si está en nuestro listado de contenedores.
docker ps
Si todo está bien, debería salir algo así.
Ahora, como lo levantamos, este aún no estará listo. Pues está descargando los mods y toca la cosa. Así que para ver cómo va, copiamos el numero de CONTAINER ID y escribimos..
docker logs -f <nombre_del_contenedor_o_ID_del_contenedor>
En esto, veremos qué está haciendo el contenedor, qué está descargando y cómo va. Este proceso tardará unos 5 a 10 minutos.
Cuando esto termine, podremos acceder dentro del contenedor para modificar ciertas cosas. Esto ya depende de lo que quieras modificar.
docker exec -it <nombre_del_contenedor_o_ID_del_contenedor> /bin/bash
Dentro de este esta los archivos del mundo, ajustes del servidor del juego, etc.
Ahora, solo entra a tu minecraft y accede con la IP, esta ip se encuentra en la plataforma de Google Cloud- Instancias VM. IP EXTERNA
Ahora, hay varios detalles a destacar de la estructura de nuestro docker-compose, primero lo abriremos con:
nano docker-compose.yml
Este nos sirve para declarar la versión deseada del juego, VERSION: "1.19.2". Esto puede ser ignorado, ya que el Forge o Fabric que se descargue y la lógica de la imagen suelen saber qué versión se necesita. Sin embargo, lo agregué para evitar cualquier tipo de error. La versión del juego depende del Forge que vayas a usar.
Este, es lo que nos ayudo a llamar el .env para llamar la API de CuseForge CF_API_KEY: ${CF_API_KEY}.
Este nos sirve para declarar el nombre del paquete de mods que usarás CF_SLUG: better-mc-forge-bmc3, siendo el caso de Better Minecraft Forge BMC3.
El CF_FILENAME_MATCHER: v20 nos sirve como versión del Matcher. Si usamos otra que no sea del pack que estés descargando, te dará error...
Y el FORGE_VERSION: "43.3.5", nos sirve para declarar la versión que se descargará... el TYPE: FORGE depende de si es Forge o Fabric...
Toda esta información la sacarás del Forge o Fabric que vayas a usar, siempre y cuando esté descargado de Curse Forge.
Ejemplo, si queremos usar este:
Tendremos que identificar ciertos apartados. El primero es la URL: https://www.curseforge.com/minecraft/modpacks/better-mc-forge-bmc3/files/4889399 Para poder llenar CF_SLUG: con lo que queremos descargar, tenemos que identificar en la URL algo como esto: better-mc-forge-bmc3 Siendo que en la URL, está aquí: https://www.curseforge.com/minecraft/modpacks/**better-mc-forge-bmc3**/files/4889399
Y la Version del juego, se identifica con el zip que hay para descargar, siendo VERSION: "1.19.2", Better_MC_[FORGE]_1.19.2v20.zip Luego está el CF_FILENAME_MATCHER: v20. Como muestra la imagen, la versión se identifica al final del zip. Siendo en este caso, Better_MC[FORGE]1.19.2v20.zip
Ahora, para finalizar estos detalles, toca ver la versión del Forge. FORGE_VERSION: "43.3.5", este se encuentra en la parte de abajo: Recuerda que el TYPE: FORGE depende de si es Forge o Fabric.
Bien, para finalizar este repositorio, es importante explicar que algunos paquetes de mods tienden a modificar estos mods al descargarlos. El contenedor puede creer que necesita otras dependencias de mods que ya no están en el pack, lo que hace que falle al instalar y no se pueda montar correctamente.
Por ejemplo, el error al inicio de intentar montar este servidor era el siguiente:
Mod ID: 'spruceui', Requested by: 'ryoamiclights', Expected range: '*', Actual version: '[MISSING]'
Mod ID: 'jeresources', Requested by: 'jerintegration', Expected range: '[0.14.1.160,)', Actual version: '[MISSING]'
Lo que tenemos que hacer es decirle al contenedor que no queremos estos mods. Claro, para identificar qué mods son los que causan el error, tendremos que ejecutar el contenedor, revisar los logs y apuntar los nombres de esos mods. Luego, iremos al contenedor y en CF_EXCLUDE_MODS pondremos dichos mods que causan el problema.
CF_EXCLUDE_MODS: |
ryoamiclights
jer-integration
CF_FORCE_SYNCHRONIZE: "true"
Y para resolver el problema sin tener que detener y matar el contenedor, usamos CF_FORCE_SYNCHRONIZE: "true" para garantizar que se limpien las modificaciones excluidas.
DATOS
CUANDO HAGAS CAMBIOS EN EL COMPOSE, VUELVE A CORRERLO CON
docker-compose up -d
DOCKER SE EJECUTA DESDE SUPER USARIO, SI VUELVES A HACER CAMBIOS TIENES QUE ENTRAR COMO USARIO ROOT O SIEMPRE PONER sudo docker ...














